summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStiver <stiver.mail@gmail.com>2014-07-21 14:28:40 +0200
committerStiver <stiver.mail@gmail.com>2014-07-21 14:28:40 +0200
commit6606a474bf8a634e6ee5a525f338c06a40590712 (patch)
treee071182abd3099ab26f4db64039db355d5c0ed37 /src
parent58427deb498ba9a0caff72db129d4cf41791d8e6 (diff)
downloadfernflower-6606a474bf8a634e6ee5a525f338c06a40590712.tar
fernflower-6606a474bf8a634e6ee5a525f338c06a40590712.tar.gz
fernflower-6606a474bf8a634e6ee5a525f338c06a40590712.tar.lz
fernflower-6606a474bf8a634e6ee5a525f338c06a40590712.tar.xz
fernflower-6606a474bf8a634e6ee5a525f338c06a40590712.zip
Fixed 'IDEA-127466: dup_x1 semantics broken'
Diffstat (limited to 'src')
-rw-r--r--src/de/fernflower/modules/decompiler/StackVarsProcessor.java2
-rw-r--r--src/de/fernflower/modules/decompiler/sforms/SSAUConstructorSparseEx.java78
2 files changed, 41 insertions, 39 deletions
diff --git a/src/de/fernflower/modules/decompiler/StackVarsProcessor.java b/src/de/fernflower/modules/decompiler/StackVarsProcessor.java
index e1f9218..0b64a97 100644
--- a/src/de/fernflower/modules/decompiler/StackVarsProcessor.java
+++ b/src/de/fernflower/modules/decompiler/StackVarsProcessor.java
@@ -206,6 +206,8 @@ public class StackVarsProcessor {
int[] ret = iterateExprent(lst, index, next, mapVarValues, ssa);
+ //System.out.println("***************** \r\n"+root.toJava());
+
if(ret[0] >= 0) {
index = ret[0];
} else {
diff --git a/src/de/fernflower/modules/decompiler/sforms/SSAUConstructorSparseEx.java b/src/de/fernflower/modules/decompiler/sforms/SSAUConstructorSparseEx.java
index 0fdcd47..32c07a9 100644
--- a/src/de/fernflower/modules/decompiler/sforms/SSAUConstructorSparseEx.java
+++ b/src/de/fernflower/modules/decompiler/sforms/SSAUConstructorSparseEx.java
@@ -247,45 +247,45 @@ public class SSAUConstructorSparseEx {
SFormsFastMapDirect varmap = varmaparr[0];
-// // field access
-// if(expr.type == Exprent.EXPRENT_FIELD) {
-//
-// int index;
-// if(mapFieldVars.containsKey(expr.id)) {
-// index = mapFieldVars.get(expr.id);
-// } else {
-// index = fieldvarcounter--;
-// mapFieldVars.put(expr.id, index);
-//
-// // ssu graph
-// ssuversions.createNode(new VarVersionPaar(index, 1));
-// }
-//
-// setCurrentVar(varmap, index, 1);
-//
-// } else if(expr.type == Exprent.EXPRENT_INVOCATION ||
-// (expr.type == Exprent.EXPRENT_ASSIGNMENT && ((AssignmentExprent)expr).getLeft().type == Exprent.EXPRENT_FIELD) ||
-// (expr.type == Exprent.EXPRENT_NEW && ((NewExprent)expr).getNewtype().type == CodeConstants.TYPE_OBJECT) ||
-// expr.type == Exprent.EXPRENT_FUNCTION) {
-//
-// boolean ismmpp = true;
-//
-// if(expr.type == Exprent.EXPRENT_FUNCTION) {
-//
-// ismmpp = false;
-//
-// FunctionExprent fexpr = (FunctionExprent)expr;
-// if(fexpr.getFunctype() >= FunctionExprent.FUNCTION_IMM && fexpr.getFunctype() <= FunctionExprent.FUNCTION_PPI) {
-// if(fexpr.getLstOperands().get(0).type == Exprent.EXPRENT_FIELD) {
-// ismmpp = true;
-// }
-// }
-// }
-//
-// if(ismmpp) {
-// varmap.removeAllFields();
-// }
-// }
+ // field access
+ if(expr.type == Exprent.EXPRENT_FIELD) {
+
+ int index;
+ if(mapFieldVars.containsKey(expr.id)) {
+ index = mapFieldVars.get(expr.id);
+ } else {
+ index = fieldvarcounter--;
+ mapFieldVars.put(expr.id, index);
+
+ // ssu graph
+ ssuversions.createNode(new VarVersionPaar(index, 1));
+ }
+
+ setCurrentVar(varmap, index, 1);
+
+ } else if(expr.type == Exprent.EXPRENT_INVOCATION ||
+ (expr.type == Exprent.EXPRENT_ASSIGNMENT && ((AssignmentExprent)expr).getLeft().type == Exprent.EXPRENT_FIELD) ||
+ (expr.type == Exprent.EXPRENT_NEW && ((NewExprent)expr).getNewtype().type == CodeConstants.TYPE_OBJECT) ||
+ expr.type == Exprent.EXPRENT_FUNCTION) {
+
+ boolean ismmpp = true;
+
+ if(expr.type == Exprent.EXPRENT_FUNCTION) {
+
+ ismmpp = false;
+
+ FunctionExprent fexpr = (FunctionExprent)expr;
+ if(fexpr.getFunctype() >= FunctionExprent.FUNCTION_IMM && fexpr.getFunctype() <= FunctionExprent.FUNCTION_PPI) {
+ if(fexpr.getLstOperands().get(0).type == Exprent.EXPRENT_FIELD) {
+ ismmpp = true;
+ }
+ }
+ }
+
+ if(ismmpp) {
+ varmap.removeAllFields();
+ }
+ }
if(varassign != null) {