summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>2014-06-26 15:52:47 +0200
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>2014-06-26 15:52:47 +0200
commit4df7866a5c5ef56c763f844848d24438bb4555e4 (patch)
treecbabdb053d1488c7e6e10316a8139b4583dae23e
parentb13dee2567853b059ff0c1125b78f860667f5bd7 (diff)
downloadfernflower-4df7866a5c5ef56c763f844848d24438bb4555e4.tar
fernflower-4df7866a5c5ef56c763f844848d24438bb4555e4.tar.gz
fernflower-4df7866a5c5ef56c763f844848d24438bb4555e4.tar.lz
fernflower-4df7866a5c5ef56c763f844848d24438bb4555e4.tar.xz
fernflower-4df7866a5c5ef56c763f844848d24438bb4555e4.zip
"ascii" option documented and used for both string and character literals
-rw-r--r--dist/docs/readme.txt3
-rw-r--r--src/de/fernflower/main/DecompilerContext.java3
-rw-r--r--src/de/fernflower/modules/decompiler/exps/ConstExprent.java10
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));