"ascii" option documented and used for both string and character literals
This commit is contained in:
parent
b13dee2567
commit
4df7866a5c
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
|
||||
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)
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user