#1070 Incorrect decompilation of switch statement fixed

This commit is contained in:
honfika@gmail.com
2015-12-03 09:40:26 +01:00
parent 35b917eca1
commit 507cc4c29b
4 changed files with 23 additions and 5 deletions

View File

@@ -1297,6 +1297,16 @@ public class AVM2Code implements Cloneable {
return ret;
}
public AVM2Instruction adr2ins(long address) throws ConvertException {
int pos = adr2pos(address, false);
if (pos == code.size()) {
// end
return null;
}
return code.get(pos);
}
public int adr2pos(long address) throws ConvertException {
return adr2pos(address, false);
}

View File

@@ -146,7 +146,6 @@ public class AVM2DeobfuscatorRegistersOld extends AVM2DeobfuscatorSimpleOld {
originalBody.exceptions = body.exceptions;
originalBody.setCode(body.getCode());
}
private int getFirstRegisterSetter(Reference<AVM2Instruction> assignment, int classIndex, boolean isStatic, int scriptIndex, ABC abc, MethodBody body, Set<Integer> ignoredRegisters, Set<Integer> ignoredGets) throws InterruptedException {

View File

@@ -383,6 +383,10 @@ public class AVM2Instruction implements Cloneable, GraphSourceItem {
return offset + 4 /*getBytesLength()*/ + operands[0];
}
public void setTargetOffset(int offset) {
operands[0] = offset;
}
@Override
public List<Integer> getBranches(GraphSource code) {
List<Integer> ret = new ArrayList<>();

View File

@@ -1793,22 +1793,27 @@ public class Graph {
hasExpr = true;
}
}
}
first = true;
pos = 0;
//This is tied to AS3 switch implementation which has nextparts switched from index 1. TODO: Make more universal
GraphPart defaultPart = hasExpr ? part.nextParts.get(1 + defaultBranch) : part.nextParts.get(0);
for (GraphPart p : part.nextParts) {
if (p != defaultPart) {
for (int i = 1; i < part.nextParts.size(); i++) {
if (hasExpr && i == 1 + defaultBranch) {
continue;
}
if (part.nextParts.get(i) != defaultPart) {
if (caseExpressions.containsKey(pos)) {
caseValues.add(caseExpressions.get(pos));
} else {
caseValues.add(new IntegerValueItem(null, localData.lineStartInstruction, pos));
}
pos++;
}
pos++;
}
first = true;