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

master
Roman Shevchenko 11 years ago
parent b13dee2567
commit 4df7866a5c
  1. 3
      dist/docs/readme.txt
  2. 1
      src/de/fernflower/main/DecompilerContext.java
  3. 10
      src/de/fernflower/modules/decompiler/exps/ConstExprent.java

@ -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,6 +77,7 @@ 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.ASCII_STRING_CHARACTERS, "0");
mapDefault.put(IFernflowerPreferences.BOOLEAN_TRUE_ONE, "1"); 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));

Loading…
Cancel
Save