From 660e353eed2fa9f148b32d3fc31a30bf66c717e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 31 Jan 2021 11:11:16 +0100 Subject: [PATCH] try..catch..finally in ASC2 --- .../decompiler/flash/abc/AVM2LocalData.java | 8 +- .../flash/abc/avm2/graph/AVM2Graph.java | 278 +++++++++++------- .../instructions/other/ReturnValueIns.java | 11 +- .../decompiler/flash/action/ActionGraph.java | 2 +- .../src/com/jpexs/decompiler/graph/Graph.java | 16 +- .../testdata/cross_compile/bin/Main.air.swf | Bin 2753 -> 2760 bytes .../testdata/cross_compile/bin/Main.flex.swf | Bin 3629 -> 3635 bytes .../cross_compile/bin/Main.flex_apache.swf | Bin 3617 -> 3620 bytes .../cross_compile/bin/Main.swftools.swf | Bin 1525 -> 1529 bytes .../testdata/cross_compile/buildlog.air.txt | 3 - .../testdata/cross_compile/buildlog.flex.txt | 2 - .../cross_compile/buildlog.flex_apache.txt | 2 - .../cross_compile/buildlog.swftools.txt | 4 - .../TestTryFinallyDirectReturnInFinally.as | 2 +- 14 files changed, 206 insertions(+), 122 deletions(-) delete mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt delete mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt delete mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt delete mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java index acf1ace6e..eefda4df0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java @@ -66,11 +66,13 @@ public class AVM2LocalData extends BaseLocalData { */ public Map finallyJumps = new HashMap<>(); - //public Map ignoredSwitches; //exception index => switchPart public Map ignoredSwitches; - //public List ignoredSwitches2; + public Map switchedRegs = new HashMap<>(); + + //switchedPart -> index of nextpart + public Map defaultWays = new HashMap<>(); public Integer scriptIndex; @@ -123,6 +125,8 @@ public class AVM2LocalData extends BaseLocalData { thisHasDefaultToPrimitive = localData.thisHasDefaultToPrimitive; setLocalPosToGetLocalPos = localData.setLocalPosToGetLocalPos; codeStats = localData.codeStats; + defaultWays = localData.defaultWays; + switchedRegs = localData.switchedRegs; } public AVM2ConstantPool getConstants() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 99e330526..0defd7ea2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -37,6 +37,8 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.other.HasNext2Ins; import com.jpexs.decompiler.flash.abc.avm2.instructions.other2.DecLocalPIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other2.IncLocalPIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushByteIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.types.CoerceAIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.types.ConvertIIns; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FilteredCheckAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; @@ -201,8 +203,8 @@ public class AVM2Graph extends Graph { //probably inlined code in more parts, cannot do :-( } + GraphPart switchPart = null; if (finallyKind == FINALLY_KIND_STACK_BASED) { - /* Search for a lookupswitch which first pops from the stack */ @@ -213,7 +215,6 @@ public class AVM2Graph extends Graph { //int stackAfter = localData.codeStats.instructionStats[finallyPart.start].stackpos; findAllPops(localData, stackAfter, finallyPart, foundIps, foundParts, new HashSet<>()); int switchIp = -1; - GraphPart switchPart = null; for (int i = 0; i < foundIps.size(); i++) { int ip = foundIps.get(i); if (avm2code.code.get(ip).definition instanceof LookupSwitchIns) { @@ -221,37 +222,78 @@ public class AVM2Graph extends Graph { switchPart = foundParts.get(i); } } - if (switchIp > -1 && switchPart != null) { - for (GraphPart r : finallyPart.refs) { - for (int ip = r.end; ip >= r.start; ip--) { - AVM2Instruction ins = avm2code.code.get(ip); - if (ins.definition instanceof JumpIns) { - continue; - } else if (ins.definition instanceof PushByteIns) { - int val = ins.operands[0]; - if (val < 0 || val > switchPart.nextParts.size() - 2) { - localData.finallyJumps.put(r, switchPart.nextParts.get(0)); //default branch - } else { - localData.finallyJumps.put(r, switchPart.nextParts.get(1 + val)); + } else if (finallyKind == FINALLY_KIND_REGISTER_BASED) { + switchPart = findLookupSwitchWithGetLocal(switchedReg, finallyPart); + int startIp = code.adr2pos(ex.start); + GraphPart tryPart = null; + for (GraphPart p : allParts) { + if (startIp >= p.start && startIp <= p.end) { + tryPart = p; + break; + } + } + if (tryPart != null) { + List tryPartRefs = new ArrayList<>(tryPart.refs); + for (int i = tryPartRefs.size() - 1; i >= 0; i--) { + if (tryPartRefs.get(i).start < 0) { + tryPartRefs.remove(i); + } + } + if (tryPartRefs.size() == 1) { + GraphPart beforeTryPart = tryPartRefs.get(0); + if (beforeTryPart.getHeight() > 2) { + if (avm2code.code.get(beforeTryPart.end).definition instanceof SetLocalTypeIns) { + int setLocalRegister = ((SetLocalTypeIns) avm2code.code.get(beforeTryPart.end).definition).getRegisterId(avm2code.code.get(beforeTryPart.end)); + if (setLocalRegister == switchedReg) { + if (avm2code.code.get(beforeTryPart.end - 1).definition instanceof PushByteIns) { + if (switchPart != null) { + int defaultWay = avm2code.code.get(beforeTryPart.end - 1).operands[0]; + localData.defaultWays.put(switchPart, defaultWay); + } + } } } } } - - //return in finally block is joined after switch decision - for (GraphPart p : switchPart.nextParts) { - for (GraphPart r : p.refs) { - if (r != switchPart) { - localData.finallyJumps.put(r, p); + } + } + localData.switchedRegs.put(e, switchedReg); + if (switchPart != null) { + for (GraphPart r : finallyPart.refs) { + for (int ip = r.end; ip >= r.start; ip--) { + AVM2Instruction ins = avm2code.code.get(ip); + if (ins.definition instanceof JumpIns) { + continue; + } else if (ins.definition instanceof PushByteIns) { + int val = ins.operands[0]; + if (val < 0 || val > switchPart.nextParts.size() - 2) { + localData.finallyJumps.put(r, switchPart.nextParts.get(0)); //default branch + } else { + localData.finallyJumps.put(r, switchPart.nextParts.get(1 + val)); } + break; + } else if ((ins.definition instanceof SetLocalTypeIns) && (((SetLocalTypeIns) ins.definition).getRegisterId(ins) == switchedReg)) { + //ignore + } else if (ins.definition instanceof CoerceAIns) { + //ignore + } else { + break; } } - - localData.ignoredSwitches.put(e, switchPart); - } else { - //there is probably return in all branches and no other way outside finally } + //return in finally block is joined after switch decision + for (GraphPart p : switchPart.nextParts) { + for (GraphPart r : p.refs) { + if (r != switchPart) { + localData.finallyJumps.put(r, p); + } + } + } + + localData.ignoredSwitches.put(e, switchPart); + } else { + //there is probably return in all branches and no other way outside finally } } } @@ -453,6 +495,36 @@ public class AVM2Graph extends Graph { return result; } + private GraphPart findLookupSwitchWithGetLocal(int registerId, GraphPart part, Set visited) { + if (visited.contains(part)) { + return null; + } + visited.add(part); + if (part.getHeight() >= 3) { + if (avm2code.code.get(part.end).definition instanceof LookupSwitchIns) { + if (avm2code.code.get(part.end - 1).definition instanceof ConvertIIns) { + if (avm2code.code.get(part.end - 2).definition instanceof GetLocalTypeIns) { + int getLocalRegId = ((GetLocalTypeIns) avm2code.code.get(part.end - 2).definition).getRegisterId(avm2code.code.get(part.end - 2)); + if (getLocalRegId == registerId) { + return part; + } + } + } + } + } + for (GraphPart n : part.nextParts) { + GraphPart found = findLookupSwitchWithGetLocal(registerId, n, visited); + if (found != null) { + return found; + } + } + return null; + } + + private GraphPart findLookupSwitchWithGetLocal(int registerId, GraphPart part) { + return findLookupSwitchWithGetLocal(registerId, part, new HashSet<>()); + } + private void findAllPops(AVM2LocalData localData, int stackLevel, GraphPart part, List foundIps, List foundParts, Set visited) { if (visited.contains(part)) { return; @@ -470,7 +542,7 @@ public class AVM2Graph extends Graph { } } - private List checkTry(List output, List foundGotos, Map> partCodes, Map partCodePos, AVM2LocalData localData, GraphPart part, List stopPart, List loops, Set allParts, TranslateStack stack, int staticOperation, String path) throws InterruptedException { + private List checkTry(List currentRet, List output, List foundGotos, Map> partCodes, Map partCodePos, AVM2LocalData localData, GraphPart part, List stopPart, List loops, Set allParts, TranslateStack stack, int staticOperation, String path) throws InterruptedException { if (localData.parsedExceptions == null) { localData.parsedExceptions = new ArrayList<>(); } @@ -508,6 +580,12 @@ public class AVM2Graph extends Graph { } } } + + int switchedReg = -1; + if (finallyIndex != -1) { + switchedReg = localData.switchedRegs.containsKey(finallyIndex) ? localData.switchedRegs.get(finallyIndex) : -1; + } + if (catchedExceptions.size() > 0) { parsedExceptions.addAll(catchedExceptions); if (finallyException != null) { @@ -552,6 +630,12 @@ public class AVM2Graph extends Graph { currentCatchCommands.remove(0); } } + if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(currentCatchCommands.size() - 1) instanceof SetLocalAVM2Item)) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) currentCatchCommands.get(currentCatchCommands.size() - 1); + if (setLocal.regIndex == switchedReg) { + currentCatchCommands.remove(currentCatchCommands.size() - 1); + } + } catchCommands.add(currentCatchCommands); } @@ -599,7 +683,16 @@ public class AVM2Graph extends Graph { } if (switchPart != null) { finallyCommands.addAll(translatePart(localData, switchPart, stack, staticOperation, path)); - afterPart = switchPart.nextParts.get(0); //take the default branch + if (localData.defaultWays.containsKey(switchPart)) { + int defaultWay = localData.defaultWays.get(switchPart); + if (defaultWay < 0 || defaultWay > switchPart.nextParts.size() - 2) { + afterPart = switchPart.nextParts.get(0); + } else { + afterPart = switchPart.nextParts.get(1 + defaultWay); + } + } else { + afterPart = switchPart.nextParts.get(0); //take the default branch. TODO: detect actual value + } } stack.pop(); @@ -615,6 +708,17 @@ public class AVM2Graph extends Graph { if (catchCommands.isEmpty() && finallyCommands.isEmpty() && tryCommands.isEmpty()) { return null; } + + if (switchedReg > -1) { + //There is assignment to switched reg before entering try + if (!currentRet.isEmpty() && (currentRet.get(currentRet.size() - 1) instanceof SetLocalAVM2Item)) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) currentRet.get(currentRet.size() - 1); + if (setLocal.regIndex == switchedReg) { + currentRet.remove(currentRet.size() - 1); + } + } + } + List ret = new ArrayList<>(); ret.add(new TryAVM2Item(tryCommands, catchedExceptions, catchCommands, finallyCommands, "TODO")); @@ -627,11 +731,11 @@ public class AVM2Graph extends Graph { } @Override - protected List check(List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(List currentRet, List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { List ret = null; AVM2LocalData aLocalData = (AVM2LocalData) localData; - ret = checkTry(output, foundGotos, partCodes, partCodePos, aLocalData, part, stopPart, loops, allParts, stack, staticOperation, path); + ret = checkTry(currentRet, output, foundGotos, partCodes, partCodePos, aLocalData, part, stopPart, loops, allParts, stack, staticOperation, path); if (ret != null) { return ret; } @@ -751,7 +855,7 @@ public class AVM2Graph extends Graph { } @Override - protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart next, Set allParts) { + protected GraphPart checkPartWithOutput(List output, TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart part, Set allParts) { AVM2LocalData aLocalData = (AVM2LocalData) localData; if (aLocalData.finallyJumps == null) { aLocalData.finallyJumps = new HashMap<>(); @@ -765,80 +869,52 @@ public class AVM2Graph extends Graph { return null; } if (aLocalData.finallyJumps.containsKey(prev)) { + GraphPart switchPart = null; + int switchedReg = -1; + + for (GraphPart gp : aLocalData.finallyJumps.get(prev).refs) { + if (aLocalData.ignoredSwitches.containsValue(gp)) { + + int finallyIndex = -1; + for (int fi : aLocalData.ignoredSwitches.keySet()) { + if (aLocalData.ignoredSwitches.get(fi) == gp) { + finallyIndex = fi; + break; + } + } + + switchPart = gp; + + switchedReg = aLocalData.switchedRegs.containsKey(finallyIndex) ? aLocalData.switchedRegs.get(finallyIndex) : -1; + + break; + } + } + + if (output != null && switchedReg > -1) { + if (!output.isEmpty()) { + if (output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocal.regIndex == switchedReg) { + output.remove(output.size() - 1); + } + } + } + } + if (output != null && switchedReg == -1 && !stack.isEmpty() && (stack.peek() instanceof IntegerValueAVM2Item)) { + stack.pop(); + } else if (output != null && switchedReg == -1 && !output.isEmpty() && (output.get(output.size() - 1) instanceof IntegerValueAVM2Item)) { + output.remove(output.size() - 1); + } return aLocalData.finallyJumps.get(prev); } } + return part; + } - /*Map> finallyJumps = aLocalData.finallyJumps; - if (aLocalData.ignoredSwitches == null) { - aLocalData.ignoredSwitches = new HashMap<>(); - } - Map ignoredSwitches = aLocalData.ignoredSwitches; - GraphPart ret = next; - for (int f : finallyJumps.keySet()) {//int f = 0; f < finallyJumps.size(); f++) { - int swip = ignoredSwitches.get(f); - for (int fip : finallyJumps.get(f)) { - if (next.start == fip) { - if (stack != null && swip != -1) { - AVM2Instruction swIns = avm2code.code.get(swip); - GraphTargetItem t = stack.peek(); - Double dval = t.getResultAsNumber(); - int val = (int) (double) dval; - if (swIns.definition instanceof LookupSwitchIns) { - List branches = swIns.getBranches(code); - int nip = branches.get(0); - if (val >= 0 && val < branches.size() - 1) { - nip = branches.get(1 + val); - } - for (GraphPart p : allParts) { - if (avm2code.getIpThroughJumpAndDebugLine(p.start) == avm2code.getIpThroughJumpAndDebugLine(nip)) { - return p; - } - } - } - } - ret = null; - } - } - } - if (ret != next) { - return ret; - } - - int pos = next.start; - long addr = avm2code.getAddrThroughJumpAndDebugLine(avm2code.pos2adr(pos)); - for (int e = 0; e < body.exceptions.length; e++) { - if (body.exceptions[e].isFinally()) { - if (addr == avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].start)) { - if (true) { //afterCatchPos + 1 == code.adr2pos(this.code.fixAddrAfterDebugLine(body.exceptions[e].end))) { - AVM2Instruction jmpIns = avm2code.code.get(avm2code.adr2pos(avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end))); - if (jmpIns.definition instanceof JumpIns) { - int finStart = avm2code.adr2pos(avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); - if (!finallyJumps.containsKey(e)) { - finallyJumps.put(e, new ArrayList<>()); - } - finallyJumps.get(e).add(finStart); - if (!ignoredSwitches.containsKey(e)) { - ignoredSwitches.put(e, -1); - } - //ignoredSwitches.put(e, -1); - break; - } - } - } - } - } - - if (prev != null) { - for (int swip : ignoredSwitches.values()) { - if (swip > -1) { - if (prev.end == swip) { - return null; - } - } - } - }*/ - return next; + @Override + protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart part, Set allParts) { + return checkPartWithOutput(null, stack, localData, prev, part, allParts); } @Override @@ -1045,7 +1121,11 @@ public class AVM2Graph extends Graph { }*/ } + //FIXME: remove this with better alternative private boolean isIntegerOrPopInteger(GraphTargetItem item) { + if (true) { + return false; + } if (item instanceof IntegerValueAVM2Item) { return true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/ReturnValueIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/ReturnValueIns.java index 9e2785ef0..d55eb9b62 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/ReturnValueIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/ReturnValueIns.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions.other; import com.jpexs.decompiler.flash.abc.ABC; @@ -22,6 +23,7 @@ import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.ReturnValueAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import java.util.List; @@ -44,7 +46,12 @@ public class ReturnValueIns extends InstructionDefinition { @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - output.add(new ReturnValueAVM2Item(ins, localData.lineStartInstruction, stack.pop())); + GraphTargetItem value = stack.pop(); + //some local register left out, probably from try..finally..return + if (value instanceof SetLocalAVM2Item) { + value = value.value; + } + output.add(new ReturnValueAVM2Item(ins, localData.lineStartInstruction, value)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index b75277638..51d09513d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -288,7 +288,7 @@ public class ActionGraph extends Graph { } @Override - protected List check(List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(List currentRet, List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { if (!output.isEmpty()) { if (output.get(output.size() - 1) instanceof StoreRegisterActionItem) { StoreRegisterActionItem str = (StoreRegisterActionItem) output.get(output.size() - 1); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index c6871fc45..eac727366 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -1023,10 +1023,14 @@ public class Graph { return false; } - protected List check(List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(List currentRet, List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { return null; } + protected GraphPart checkPartWithOutput(List output, TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart part, Set allParts) { + return checkPart(stack, localData, prev, part, allParts); + } + protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart part, Set allParts) { return part; } @@ -1453,7 +1457,7 @@ public class Graph { if (part == null) { return ret; } - part = checkPart(stack, localData, parent, part, allParts); + part = checkPartWithOutput(ret, stack, localData, parent, part, allParts); if (part == null) { return ret; } @@ -1610,7 +1614,7 @@ public class Graph { } if (parseNext) { - List retCheck = check(foundGotos, partCodes, partCodePos, code, localData, allParts, stack, parent, part, stopPart, loops, output, currentLoop, staticOperation, path); + List retCheck = check(currentRet, foundGotos, partCodes, partCodePos, code, localData, allParts, stack, parent, part, stopPart, loops, output, currentLoop, staticOperation, path); if (retCheck != null) { if (!retCheck.isEmpty()) { currentRet.addAll(retCheck); @@ -2430,12 +2434,12 @@ public class Graph { if (p instanceof FunctionActionItem) { commands.add(clen, p); } else { - /*if (isExit) { + if (isExit) { //ASC2 leaves some function calls unpopped on stack before returning from a method commands.add(clen, p); - } else {*/ + } else { commands.add(clen, new PushItem(p)); - //} + } } } } diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf index 217d90f13f19563d3dbab2e3a7785f1d8a501176..2ada6378dcb87b270d1409e759eca1cb73bb35ae 100644 GIT binary patch delta 2643 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 B1%3bk delta 2636 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 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf index a327e86c89ef5e9562b0b26387f1b0036abcec73..948424409eb0fa0e261b92b092d2c60d3fc0679a 100644 GIT binary patch literal 3635 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 Fsr006*vbF^ literal 3629 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 literal 3617 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 npM3te diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf index 7c6ef7ed986d8f321ffb32cbf569ec66912df4e3..866fe6d15baa3adf5d61c89d93acf7e6de62b6e3 100644 GIT binary patch literal 1529 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 bTk9I(?}4TXqn^d!FaC(4MF9T+2yH=Yk@MhP diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt deleted file mode 100644 index 758330a34..000000000 --- a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt +++ /dev/null @@ -1,3 +0,0 @@ -Loading configuration: c:\air\frameworks\flex-config.xml - -2753 bytes written to C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\bin\Main.air.swf in 0,459 seconds diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt deleted file mode 100644 index f6277bc21..000000000 --- a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt +++ /dev/null @@ -1,2 +0,0 @@ -Loading configuration file C:\flex\frameworks\flex-config.xml -C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\asc2\bin\Main.flex.swf (1083 bytes) diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt deleted file mode 100644 index 258b0a3de..000000000 --- a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt +++ /dev/null @@ -1,2 +0,0 @@ -Loading configuration file C:\flex_apache\frameworks\flex-config.xml -C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\bin\Main.flex_apache.swf (3617 bytes) diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt deleted file mode 100644 index 18f232b14..000000000 --- a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt +++ /dev/null @@ -1,4 +0,0 @@ -Stack mismatch at pos 61 -Should be: 1:1, is: 0:1 -Stack mismatch at pos 61 -Should be: 1:1, is: 0:1 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as index 815c73f6c..66ff35d2d 100644 --- a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as @@ -21,7 +21,7 @@ package tests finally { trace("hi "); - if (5 == 4) + if (str == "check") { return str; }