From 4df7866a5c5ef56c763f844848d24438bb4555e4 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 26 Jun 2014 15:52:47 +0200 Subject: [PATCH] "ascii" option documented and used for both string and character literals --- dist/docs/readme.txt | 3 ++- src/de/fernflower/main/DecompilerContext.java | 3 ++- .../modules/decompiler/exps/ConstExprent.java | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dist/docs/readme.txt b/dist/docs/readme.txt index d598032..daf05cf 100644 --- a/dist/docs/readme.txt +++ b/dist/docs/readme.txt @@ -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) diff --git a/src/de/fernflower/main/DecompilerContext.java b/src/de/fernflower/main/DecompilerContext.java index 7dd8616..63de9ba 100644 --- a/src/de/fernflower/main/DecompilerContext.java +++ b/src/de/fernflower/main/DecompilerContext.java @@ -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"); diff --git a/src/de/fernflower/modules/decompiler/exps/ConstExprent.java b/src/de/fernflower/modules/decompiler/exps/ConstExprent.java index 43aad3e..2d63fcb 100644 --- a/src/de/fernflower/modules/decompiler/exps/ConstExprent.java +++ b/src/de/fernflower/modules/decompiler/exps/ConstExprent.java @@ -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));