diff options
author | Stiver <stiver.mail@gmail.com> | 2014-07-21 14:28:40 +0200 |
---|---|---|
committer | Stiver <stiver.mail@gmail.com> | 2014-07-21 14:28:40 +0200 |
commit | 6606a474bf8a634e6ee5a525f338c06a40590712 (patch) | |
tree | e071182abd3099ab26f4db64039db355d5c0ed37 /src | |
parent | 58427deb498ba9a0caff72db129d4cf41791d8e6 (diff) | |
download | fernflower-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.java | 2 | ||||
-rw-r--r-- | src/de/fernflower/modules/decompiler/sforms/SSAUConstructorSparseEx.java | 78 |
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) { |