"ascii" option documented and used for both string and character literals

This commit is contained in:
Roman Shevchenko 2014-06-26 15:52:47 +02:00
parent b13dee2567
commit 4df7866a5c
3 changed files with 9 additions and 7 deletions

View File

@ -51,7 +51,8 @@ occ (0): ouput copyright comment
ner (1): assume return not throwing exceptions
den (1): decompile enumerations
rgn (1): remove getClass() invocation, when it is part of a qualified new statement
lit (0): output numeric and character literals "as-is"
lit (0): output numeric literals "as-is"
asc (0): encode non-ASCII characters in string and character literals as Unicode escapes
bto (1): interpret int 1 as boolean true (workaround to a compiler bug)
nns (1): allow for not set synthetic attribute (workaround to a compiler bug)
uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw)

View File

@ -77,7 +77,8 @@ public class DecompilerContext {
mapDefault.put(IFernflowerPreferences.FINALLY_DEINLINE, "1");
mapDefault.put(IFernflowerPreferences.REMOVE_GETCLASS_NEW, "1");
mapDefault.put(IFernflowerPreferences.LITERALS_AS_IS, "0");
mapDefault.put(IFernflowerPreferences.BOOLEAN_TRUE_ONE, "1");
mapDefault.put(IFernflowerPreferences.ASCII_STRING_CHARACTERS, "0");
mapDefault.put(IFernflowerPreferences.BOOLEAN_TRUE_ONE, "1");
mapDefault.put(IFernflowerPreferences.SYNTHETIC_NOT_SET, "1");
mapDefault.put(IFernflowerPreferences.UNDEFINED_PARAM_TYPE_OBJECT, "1");

View File

@ -102,6 +102,7 @@ public class ConstExprent extends Exprent {
public String toJava(int indent) {
boolean literal = DecompilerContext.getOption(IFernflowerPreferences.LITERALS_AS_IS);
boolean ascii = DecompilerContext.getOption(IFernflowerPreferences.ASCII_STRING_CHARACTERS);
if(consttype.type != CodeConstants.TYPE_NULL && value == null) {
return ExprProcessor.getCastTypeName(consttype);
@ -113,7 +114,7 @@ public class ConstExprent extends Exprent {
Integer val = (Integer)value;
String ret = escapes.get(val);
if(ret == null) {
if(literal || val.intValue() >= 32 && val.intValue() < 127) {
if(!ascii || val.intValue() >= 32 && val.intValue() < 127) {
ret = String.valueOf((char)val.intValue());
} else {
ret = InterpreterUtil.charToUnicodeLiteral(val);
@ -212,7 +213,7 @@ public class ConstExprent extends Exprent {
return "null";
case CodeConstants.TYPE_OBJECT:
if(consttype.equals(VarType.VARTYPE_STRING)) {
return "\""+convertStringToJava(value.toString())+"\"";
return "\""+convertStringToJava(value.toString(), ascii)+"\"";
} else if(consttype.equals(VarType.VARTYPE_CLASS)) {
String strval = value.toString();
@ -231,8 +232,7 @@ public class ConstExprent extends Exprent {
throw new RuntimeException("invalid constant type");
}
private String convertStringToJava(String value) {
private String convertStringToJava(String value, boolean ascii) {
char[] arr = value.toCharArray();
StringBuilder buffer = new StringBuilder(arr.length);
@ -263,7 +263,7 @@ public class ConstExprent extends Exprent {
buffer.append("\\\'");
break;
default:
if(!DecompilerContext.getOption(IFernflowerPreferences.ASCII_STRING_CHARACTERS) || (c >= 32 && c < 127)) {
if(!ascii || (c >= 32 && c < 127)) {
buffer.append(c);
} else {
buffer.append(InterpreterUtil.charToUnicodeLiteral(c));