From 1a393854c0c97b78e7408594565b166a1eb561a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 31 Jan 2021 20:18:25 +0100 Subject: [PATCH] try..catch..finally of SWFTools AS3Compile --- CHANGELOG.md | 1 + .../decompiler/flash/abc/AVM2LocalData.java | 12 ++ .../decompiler/flash/abc/avm2/AVM2Code.java | 9 +- .../flash/abc/avm2/graph/AVM2Graph.java | 173 ++++++++++++++++-- .../abc/avm2/instructions/stack/PopIns.java | 13 +- .../avm2/model/clauses/ExceptionAVM2Item.java | 3 +- .../flash/abc/types/ABCException.java | 7 +- .../src/com/jpexs/decompiler/graph/Graph.java | 4 +- .../jpexs/decompiler/graph/model/AnyItem.java | 28 +++ .../testdata/cross_compile/bin/Main.air.swf | Bin 2872 -> 2872 bytes .../testdata/cross_compile/bin/Main.flex.swf | Bin 3856 -> 3846 bytes .../cross_compile/bin/Main.flex_apache.swf | Bin 3856 -> 3856 bytes .../cross_compile/src/tests/TestTryCatch.as | 4 +- .../cross_compile/src/tests/TestTryFinally.as | 2 +- 14 files changed, 223 insertions(+), 33 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/AnyItem.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 67082e317..d45a9baa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ All notable changes to this project will be documented in this file. - Improper initialization of ActiveX component when Flash not available causing FFDec not start - #1206 Switch with multiple default clauses - ASC2 §§push of function calls before returning from a method +- Support for ASC2 and swftools try..catch..finally block ### Changed - AS3 test methods separated to classes 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 eefda4df0..fb6dc3b65 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,6 +66,13 @@ public class AVM2LocalData extends BaseLocalData { */ public Map finallyJumps = new HashMap<>(); + /** + * Mapping from source part (as in finallyJumps) to finally exception index + */ + public Map finallyJumpsToFinallyIndex = new HashMap<>(); + + public Map finallyIndexToDefaultGraphPart = new HashMap<>(); + //exception index => switchPart public Map ignoredSwitches; @@ -90,6 +97,8 @@ public class AVM2LocalData extends BaseLocalData { public CodeStats codeStats; + public Set finallyIndicesWithDoublePush = new HashSet<>(); + public AVM2LocalData() { } @@ -127,6 +136,9 @@ public class AVM2LocalData extends BaseLocalData { codeStats = localData.codeStats; defaultWays = localData.defaultWays; switchedRegs = localData.switchedRegs; + finallyIndicesWithDoublePush = localData.finallyIndicesWithDoublePush; + finallyJumpsToFinallyIndex = localData.finallyJumpsToFinallyIndex; + finallyIndexToDefaultGraphPart = localData.finallyIndexToDefaultGraphPart; } public AVM2ConstantPool getConstants() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index d9ff67275..d2711db6d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -2447,6 +2447,9 @@ public class AVM2Code implements Cloneable { // check stack=0 return true; } + if (ins.definition instanceof ThrowIns) { + return true; + } if (ins.definition instanceof JumpIns) { try { pos = adr2pos(ins.getTargetAddress()); @@ -2518,7 +2521,7 @@ public class AVM2Code implements Cloneable { if (code.get(maxIp).definition instanceof JumpIns) { nextIp = adr2pos(pos2adr(nextIp) + code.get(maxIp).operands[0]); } - if (nextIp < stats.instructionStats.length) { + /*if (nextIp < stats.instructionStats.length) { InstructionStats nextIpStat = stats.instructionStats[nextIp]; int origScopePos = nextIpStat.scopepos; int origStackPos = nextIpStat.stackpos; @@ -2528,12 +2531,12 @@ public class AVM2Code implements Cloneable { stats.instructionStats[i].seen = false; } // Rerun rest with new scopePos, stackPos - if (!walkCode(stats, nextIp, origStackPos + 1/*magic!*/, scopePos - 1 /*magic!*/, abc, autoFill)) { + if (!walkCode(stats, nextIp, origStackPos + 1, scopePos - 1, abc, autoFill)) { return null; } scopePos--; } - } + }*/ prevStart = ex.start; } catch (ConvertException ex1) { // ignore 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 2a0580c0e..e3c9bb0ae 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 @@ -34,8 +34,11 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.IncLocalIIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.IncLocalIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalTypeIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.HasNext2Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.LabelIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.NopIns; 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.PopIns; 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; @@ -73,6 +76,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.AnyItem; import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.ExitItem; @@ -212,14 +216,40 @@ public class AVM2Graph extends Graph { List foundParts = new ArrayList<>(); int stackAfter = localData.codeStats.instructionStats[finallyTryTargetPart.end].stackpos_after; - //int stackAfter = localData.codeStats.instructionStats[finallyPart.start].stackpos; + //System.err.println("searching pops from stack size " + stackAfter); findAllPops(localData, stackAfter, finallyPart, foundIps, foundParts, new HashSet<>()); - int switchIp = -1; + loopFound: for (int i = 0; i < foundIps.size(); i++) { int ip = foundIps.get(i); if (avm2code.code.get(ip).definition instanceof LookupSwitchIns) { - switchIp = ip; switchPart = foundParts.get(i); + } else if (avm2code.code.get(ip).definition instanceof PopIns) { + //In swftools try..finally, there is dup before lookupswitch and pop in its branches + GraphPart popPart = searchPart(ip, allParts); + boolean isEmpty = true; + ip--; + loopEmpty: + while (isEmpty) { + for (int j = ip; j >= popPart.start; j--) { + if (avm2code.code.get(j).definition instanceof LookupSwitchIns) { + switchPart = searchPart(j, allParts); + localData.finallyIndicesWithDoublePush.add(e); + break loopFound; + } else if (avm2code.code.get(j).definition instanceof LabelIns) { + //okay + } else { + isEmpty = false; + break loopEmpty; + } + } + if (popPart.refs.size() == 1) { + popPart = popPart.refs.get(0); + ip = popPart.end; + } else { + break; + } + } + } } } else if (finallyKind == FINALLY_KIND_REGISTER_BASED) { @@ -270,10 +300,11 @@ public class AVM2Graph extends Graph { } else if (ins.definition instanceof PushByteIns) { int val = ins.operands[0]; if (val < 0 || val > switchPart.nextParts.size() - 2) { - localData.finallyJumps.put(rr, switchPart.nextParts.get(0)); //default branch + localData.finallyJumps.put(rr, switchPart.nextParts.get(0)); //default branch } else { localData.finallyJumps.put(rr, switchPart.nextParts.get(1 + val)); } + localData.finallyJumpsToFinallyIndex.put(rr, e); needsPrev = false; break; } else if ((ins.definition instanceof SetLocalTypeIns) && (((SetLocalTypeIns) ins.definition).getRegisterId(ins) == switchedReg)) { @@ -310,6 +341,7 @@ public class AVM2Graph extends Graph { for (GraphPart r : p.refs) { if (r != switchPart) { localData.finallyJumps.put(r, p); + localData.finallyJumpsToFinallyIndex.put(r, e); } } } @@ -553,7 +585,9 @@ public class AVM2Graph extends Graph { return; } visited.add(part); + //System.err.println("walk part " + part); for (int ip = part.start; ip <= part.end; ip++) { + //System.err.println("ip " + ip + ": " + avm2code.code.get(ip) + ": stackpos_after:" + localData.codeStats.instructionStats[ip].stackpos_after); if (localData.codeStats.instructionStats[ip].stackpos_after == stackLevel - 1) { foundIps.add(ip); foundParts.add(part); @@ -576,6 +610,9 @@ public class AVM2Graph extends Graph { } private GraphPart searchPart(int ip, Set allParts) { + if (ip < 0) { + return null; + } for (GraphPart p : allParts) { if (ip >= p.start && ip <= p.end) { return p; @@ -670,6 +707,27 @@ public class AVM2Graph extends Graph { } } } + if (defaultPushByte == null) { + if (getRealRefs(finallyEndPart).size() == 0) { + if (avm2code.code.get(finallyEndPart.start - 1).definition instanceof JumpIns) { + GraphPart prevPart = searchPart(finallyEndPart.start - 1, allParts); + finallyEndPart = prevPart.nextParts.get(0); + if (finallyEndPart.nextParts.size() == 1 && finallyEndPart.nextParts.get(0).refs.size() > 1) { + for (int j = finallyEndPart.start; j <= finallyEndPart.end; j++) { + AVM2Instruction ins = avm2code.code.get(j); + if (ins.definition instanceof NopIns) { + + } else if (ins.definition instanceof PushByteIns) { + defaultPushByte = ins.operands[0]; + break; + } else { + break; + } + } + } + } + } + } catchedExceptions.add(finallyException); } @@ -689,13 +747,17 @@ public class AVM2Graph extends Graph { List finallyCommands = new ArrayList<>(); GraphPart afterPart = null; - for (GraphPart p : allParts) { - if (endIp >= p.start && endIp <= p.end) { - afterPart = p; - break; + + GraphPart endIpPart = searchPart(endIp, allParts); + if (endIpPart != null && getRealRefs(endIpPart).isEmpty()) { //swftools - there is jump on previous ip + if (avm2code.code.get(endIpPart.start - 1).definition instanceof JumpIns) { + GraphPart prevPart = searchPart(endIpPart.start - 1, allParts); + endIpPart = prevPart.nextParts.get(0); } } + afterPart = endIpPart; + stack.clear(); //If the original code (before check()) had "if" in it, there would be something on stack if (switchedReg > -1) { @@ -716,6 +778,10 @@ public class AVM2Graph extends Graph { stopPart2.add(afterPart); tryCommands = printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, part, stopPart2, loops, staticOperation, path); } + + boolean inlinedFinally = false; + + List finallyTargetItems = new ArrayList<>(); GraphPart exAfterPart = afterPart; GraphPart defaultPart = null; if (finallyException != null) { @@ -732,6 +798,8 @@ public class AVM2Graph extends Graph { } } + localData.finallyIndexToDefaultGraphPart.put(finallyIndex, defaultPart); + afterPart = null; GraphPart finallyTryTargetPart = null; int targetPos = avm2code.adr2pos(finallyException.target); @@ -744,10 +812,55 @@ public class AVM2Graph extends Graph { GraphPart finallyPart = finallyTryTargetPart.nextParts.isEmpty() ? null : finallyTryTargetPart.nextParts.get(0); + List finallyTargetStopPart = new ArrayList<>(stopPart); + if (endIpPart != null) { + finallyTargetStopPart.add(endIpPart); + } + + TranslateStack st2 = (TranslateStack) stack.clone(); + st2.clear(); + st2.add(new ExceptionAVM2Item(finallyException)); + AVM2LocalData localData2 = new AVM2LocalData(localData); + localData2.scopeStack = new ScopeStack(); + finallyTargetItems = printGraph(foundGotos, partCodes, partCodePos, localData2, st2, allParts, null, finallyTryTargetPart, finallyTargetStopPart, loops, 0, path); + if (!finallyTargetItems.isEmpty() && (finallyTargetItems.get(finallyTargetItems.size() - 1) instanceof ThrowAVM2Item)) { + + //ignore some usual commands at the beginning - these are ignored in ffdec later, but we need to check it's empty + boolean isEmpty = true; + for (int i = 0; i < finallyTargetItems.size(); i++) { + GraphTargetItem it = finallyTargetItems.get(i); + if (it instanceof SetLocalAVM2Item) { + if (it.value.getNotCoerced() instanceof ExceptionAVM2Item) { + //okay + } else { + isEmpty = false; + break; + } + } else if (it instanceof ThrowAVM2Item) { + + } else if (it instanceof IntegerValueAVM2Item) { + } else { + isEmpty = false; + break; + } + } + + //inlined finally + if (!isEmpty) { //there must be at least single command before Throw + inlinedFinally = true; + } + } + List tryStopPart = new ArrayList<>(stopPart); if (finallyPart != null) { tryStopPart.add(finallyPart); } + + if (finallyPart == null) { + tryStopPart.add(endIpPart); + afterPart = endIpPart; + } + if (defaultPart != null) { tryStopPart.add(defaultPart); } @@ -825,27 +938,40 @@ public class AVM2Graph extends Graph { catchCommands.add(currentCatchCommands); } - /*if (tryCommands.size() == 1 - && (tryCommands.get(0) instanceof TryAVM2Item) - && catchCommands.isEmpty() - && ((TryAVM2Item) tryCommands.get(0)).finallyCommands.isEmpty()) { - catchCommands = ((TryAVM2Item) tryCommands.get(0)).catchCommands; - catchedExceptions = ((TryAVM2Item) tryCommands.get(0)).catchExceptions; - tryCommands = ((TryAVM2Item) tryCommands.get(0)).tryCommands; - }*/ - if (catchCommands.isEmpty() && finallyCommands.isEmpty() && tryCommands.isEmpty()) { + if (!inlinedFinally && catchCommands.isEmpty() && finallyCommands.isEmpty() && tryCommands.isEmpty()) { return null; } List ret = new ArrayList<>(); - if (catchedExceptions.isEmpty() && finallyCommands.isEmpty()) { + if (!inlinedFinally && catchedExceptions.isEmpty() && finallyCommands.isEmpty()) { ret.addAll(tryCommands); return ret; } - ret.add(new TryAVM2Item(tryCommands, catchedExceptions, catchCommands, finallyCommands, "TODO")); + TryAVM2Item tryItem = new TryAVM2Item(tryCommands, catchedExceptions, catchCommands, finallyCommands, ""); + if (inlinedFinally) { + List> parentCatchCommands = new ArrayList<>(); + parentCatchCommands.add(finallyTargetItems); + List parentCatchedExceptions = new ArrayList<>(); + parentCatchedExceptions.add(finallyException); + List parentTryCommands = new ArrayList<>(); + if (catchedExceptions.isEmpty() && finallyCommands.isEmpty()) { + parentTryCommands.addAll(tryCommands); + } else { + parentTryCommands.add(tryItem); + } + TryAVM2Item parentTryItem = new TryAVM2Item(parentTryCommands, parentCatchedExceptions, parentCatchCommands, new ArrayList<>(), ""); + ret.add(parentTryItem); + } else { + ret.add(tryItem); + } if (afterPart != null) { + + if (finallyIndex > -1 && localData.finallyIndicesWithDoublePush.contains(finallyIndex)) { + stack.push(new AnyItem()); + } + ret.addAll(printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, afterPart, stopPart, loops, staticOperation, path)); } return ret; @@ -1024,6 +1150,15 @@ public class AVM2Graph extends Graph { } } } + int finallyIndex = aLocalData.finallyJumpsToFinallyIndex.get(prev); + if (output != null && aLocalData.finallyIndicesWithDoublePush.contains(finallyIndex)) { + GraphPart defaultPart = aLocalData.finallyIndexToDefaultGraphPart.containsKey(finallyIndex) ? aLocalData.finallyIndexToDefaultGraphPart.get(finallyIndex) : null; + if (defaultPart == null) { + stack.push(new AnyItem()); + } else if (defaultPart != aLocalData.finallyJumps.get(prev)) { + stack.push(new AnyItem()); + } + } 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)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java index 8af6ab944..c20e803b8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.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.stack; import com.jpexs.decompiler.flash.abc.ABC; @@ -24,6 +25,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.MarkItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.AnyItem; import java.util.List; /** @@ -45,9 +47,14 @@ public class PopIns extends InstructionDefinition { @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { GraphTargetItem top = stack.pop(); - if ((!(top instanceof MarkItem))) { - output.add(top); + if (top instanceof AnyItem) { + return; } + if (top instanceof MarkItem) { + return; + } + + output.add(top); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java index c3f1ff79c..f3b1c436f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.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.model.clauses; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java index a4937cbdc..3c9651d7f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.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.types; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; @@ -39,6 +40,8 @@ public class ABCException implements Serializable, Cloneable { public int name_index; + public static final String DEFAULT_EXCEPTION_NAME = "_loc_e_"; + @Override public String toString() { return "Exception: startServer=" + Helper.formatAddress(start) + " end=" + Helper.formatAddress(end) + " target=" + target + " type_index=" + type_index + " name_index=" + name_index; @@ -62,7 +65,7 @@ public class ABCException implements Serializable, Cloneable { public String getVarName(AVM2ConstantPool constants, List fullyQualifiedNames) { if (name_index == 0) { - return ""; + return DEFAULT_EXCEPTION_NAME; } return constants.getMultiname(name_index).getName(constants, fullyQualifiedNames, false, true); } 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 eac727366..34ef527df 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -1595,13 +1595,13 @@ public class Graph { parts = ((GraphPartMulti) part).parts; } else { parts.add(part); - while (getNextParts(localData, part).size() == 1 && getNextParts(localData, part).get(0).refs.size() == 1) { + /*while (getNextParts(localData, part).size() == 1 && getNextParts(localData, part).get(0).refs.size() == 1) { if (stopPart.contains(getNextParts(localData, part).get(0))) { //it might be referenced with try statement break; } part = getNextParts(localData, part).get(0); parts.add(part); - } + }*/ } for (GraphPart p : parts) { int end = p.end; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/AnyItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/AnyItem.java new file mode 100644 index 000000000..43f08cffe --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/AnyItem.java @@ -0,0 +1,28 @@ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; + +/** + * + * @author JPEXS + */ +public class AnyItem extends GraphTargetItem { + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + return writer.append("§§any()"); + } + + @Override + public boolean hasReturnValue() { + return true; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + +} 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 1e837d9a9da90070e48cce3272d347b7c21ddcbd..f7d505c7caa8a84e655c8a634edc89e15915db6b 100644 GIT binary patch delta 102 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 delta 3339 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 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as index 18490e38a..1c7638b55 100644 --- a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as @@ -16,8 +16,8 @@ package tests } catch (e:Error) { - trace("in catch"); - } + trace("in catch"); + } trace("after"); } diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as index 33192f187..7b0358c65 100644 --- a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as @@ -16,7 +16,7 @@ package tests } catch (e:Error) { - trace("in catch"); + trace("in catch"); } finally {