|
|
@ -4,10 +4,12 @@ package org.jetbrains.java.decompiler.modules.decompiler.vars; |
|
|
|
import org.jetbrains.java.decompiler.code.CodeConstants; |
|
|
|
import org.jetbrains.java.decompiler.code.CodeConstants; |
|
|
|
import org.jetbrains.java.decompiler.main.DecompilerContext; |
|
|
|
import org.jetbrains.java.decompiler.main.DecompilerContext; |
|
|
|
import org.jetbrains.java.decompiler.main.collectors.CounterContainer; |
|
|
|
import org.jetbrains.java.decompiler.main.collectors.CounterContainer; |
|
|
|
|
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.AssignmentExprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.ConstExprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.ConstExprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.VarExprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.exps.VarExprent; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.DirectGraph; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.DirectGraph; |
|
|
|
|
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.DirectNode; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.FlattenStatementsHelper; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.FlattenStatementsHelper; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.SSAConstructorSparseEx; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.sforms.SSAConstructorSparseEx; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.stats.RootStatement; |
|
|
|
import org.jetbrains.java.decompiler.modules.decompiler.stats.RootStatement; |
|
|
@ -40,7 +42,7 @@ public class VarVersionsProcessor { |
|
|
|
|
|
|
|
|
|
|
|
typeProcessor.calculateVarTypes(root, graph); |
|
|
|
typeProcessor.calculateVarTypes(root, graph); |
|
|
|
|
|
|
|
|
|
|
|
//simpleMerge(typeProcessor, graph, method);
|
|
|
|
simpleMerge(typeProcessor, graph, method); |
|
|
|
|
|
|
|
|
|
|
|
// FIXME: advanced merging
|
|
|
|
// FIXME: advanced merging
|
|
|
|
|
|
|
|
|
|
|
@ -166,6 +168,39 @@ public class VarVersionsProcessor { |
|
|
|
|
|
|
|
|
|
|
|
for (int j = i + 1; j < lstVersions.size(); j++) { |
|
|
|
for (int j = i + 1; j < lstVersions.size(); j++) { |
|
|
|
VarVersionPair secondPair = new VarVersionPair(ent.getKey(), lstVersions.get(j)); |
|
|
|
VarVersionPair secondPair = new VarVersionPair(ent.getKey(), lstVersions.get(j)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// find all scopes the two variable versions are assigned in
|
|
|
|
|
|
|
|
Set<DirectNode> nodes = new HashSet<>(); |
|
|
|
|
|
|
|
for (DirectNode node : graph.nodes) { |
|
|
|
|
|
|
|
for (Exprent expr : node.exprents) { |
|
|
|
|
|
|
|
if (expr.type != Exprent.EXPRENT_ASSIGNMENT) { |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AssignmentExprent assignExpr = (AssignmentExprent) expr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Exprent leftExpr = assignExpr.getLeft(); |
|
|
|
|
|
|
|
if (leftExpr.type != Exprent.EXPRENT_VAR) { |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VarExprent varExpr = (VarExprent) leftExpr; |
|
|
|
|
|
|
|
int index = varExpr.getIndex(); |
|
|
|
|
|
|
|
int version = varExpr.getVersion(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (index == firstPair.var && version == firstPair.version) { |
|
|
|
|
|
|
|
nodes.add(node); |
|
|
|
|
|
|
|
} else if (index == secondPair.var && version == secondPair.version) { |
|
|
|
|
|
|
|
nodes.add(node); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// only merge variables if they're assigned in the same scope
|
|
|
|
|
|
|
|
if (nodes.size() > 1) { |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
VarType secondType = mapExprentMinTypes.get(secondPair); |
|
|
|
VarType secondType = mapExprentMinTypes.get(secondPair); |
|
|
|
|
|
|
|
|
|
|
|
if (firstType.equals(secondType) || |
|
|
|
if (firstType.equals(secondType) || |
|
|
|