"ascii" option documented and used for both string and character literals
This commit is contained in:
3
dist/docs/readme.txt
vendored
3
dist/docs/readme.txt
vendored
@@ -51,7 +51,8 @@ occ (0): ouput copyright comment
|
|||||||
ner (1): assume return not throwing exceptions
|
ner (1): assume return not throwing exceptions
|
||||||
den (1): decompile enumerations
|
den (1): decompile enumerations
|
||||||
rgn (1): remove getClass() invocation, when it is part of a qualified new statement
|
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)
|
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)
|
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)
|
uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw)
|
||||||
|
|||||||
@@ -77,7 +77,8 @@ public class DecompilerContext {
|
|||||||
mapDefault.put(IFernflowerPreferences.FINALLY_DEINLINE, "1");
|
mapDefault.put(IFernflowerPreferences.FINALLY_DEINLINE, "1");
|
||||||
mapDefault.put(IFernflowerPreferences.REMOVE_GETCLASS_NEW, "1");
|
mapDefault.put(IFernflowerPreferences.REMOVE_GETCLASS_NEW, "1");
|
||||||
mapDefault.put(IFernflowerPreferences.LITERALS_AS_IS, "0");
|
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.SYNTHETIC_NOT_SET, "1");
|
||||||
mapDefault.put(IFernflowerPreferences.UNDEFINED_PARAM_TYPE_OBJECT, "1");
|
mapDefault.put(IFernflowerPreferences.UNDEFINED_PARAM_TYPE_OBJECT, "1");
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ public class ConstExprent extends Exprent {
|
|||||||
|
|
||||||
public String toJava(int indent) {
|
public String toJava(int indent) {
|
||||||
boolean literal = DecompilerContext.getOption(IFernflowerPreferences.LITERALS_AS_IS);
|
boolean literal = DecompilerContext.getOption(IFernflowerPreferences.LITERALS_AS_IS);
|
||||||
|
boolean ascii = DecompilerContext.getOption(IFernflowerPreferences.ASCII_STRING_CHARACTERS);
|
||||||
|
|
||||||
if(consttype.type != CodeConstants.TYPE_NULL && value == null) {
|
if(consttype.type != CodeConstants.TYPE_NULL && value == null) {
|
||||||
return ExprProcessor.getCastTypeName(consttype);
|
return ExprProcessor.getCastTypeName(consttype);
|
||||||
@@ -113,7 +114,7 @@ public class ConstExprent extends Exprent {
|
|||||||
Integer val = (Integer)value;
|
Integer val = (Integer)value;
|
||||||
String ret = escapes.get(val);
|
String ret = escapes.get(val);
|
||||||
if(ret == null) {
|
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());
|
ret = String.valueOf((char)val.intValue());
|
||||||
} else {
|
} else {
|
||||||
ret = InterpreterUtil.charToUnicodeLiteral(val);
|
ret = InterpreterUtil.charToUnicodeLiteral(val);
|
||||||
@@ -212,7 +213,7 @@ public class ConstExprent extends Exprent {
|
|||||||
return "null";
|
return "null";
|
||||||
case CodeConstants.TYPE_OBJECT:
|
case CodeConstants.TYPE_OBJECT:
|
||||||
if(consttype.equals(VarType.VARTYPE_STRING)) {
|
if(consttype.equals(VarType.VARTYPE_STRING)) {
|
||||||
return "\""+convertStringToJava(value.toString())+"\"";
|
return "\""+convertStringToJava(value.toString(), ascii)+"\"";
|
||||||
} else if(consttype.equals(VarType.VARTYPE_CLASS)) {
|
} else if(consttype.equals(VarType.VARTYPE_CLASS)) {
|
||||||
String strval = value.toString();
|
String strval = value.toString();
|
||||||
|
|
||||||
@@ -231,8 +232,7 @@ public class ConstExprent extends Exprent {
|
|||||||
throw new RuntimeException("invalid constant type");
|
throw new RuntimeException("invalid constant type");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String convertStringToJava(String value) {
|
private String convertStringToJava(String value, boolean ascii) {
|
||||||
|
|
||||||
char[] arr = value.toCharArray();
|
char[] arr = value.toCharArray();
|
||||||
StringBuilder buffer = new StringBuilder(arr.length);
|
StringBuilder buffer = new StringBuilder(arr.length);
|
||||||
|
|
||||||
@@ -263,7 +263,7 @@ public class ConstExprent extends Exprent {
|
|||||||
buffer.append("\\\'");
|
buffer.append("\\\'");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if(!DecompilerContext.getOption(IFernflowerPreferences.ASCII_STRING_CHARACTERS) || (c >= 32 && c < 127)) {
|
if(!ascii || (c >= 32 && c < 127)) {
|
||||||
buffer.append(c);
|
buffer.append(c);
|
||||||
} else {
|
} else {
|
||||||
buffer.append(InterpreterUtil.charToUnicodeLiteral(c));
|
buffer.append(InterpreterUtil.charToUnicodeLiteral(c));
|
||||||
|
|||||||
Reference in New Issue
Block a user