diff --git a/CHANGELOG.md b/CHANGELOG.md index 647469bd1..859bd4bdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ All notable changes to this project will be documented in this file. - [#2077] AS3 direct editation - incorrect slot names - [#2077] AS3 direct editation - switch statement missing offset - [#2077] AS3 allow star string as property name (XML access) +- [#2077] AS3 try..catch parts outside block +- AS3 try..catch inside loop unneccessary continue ### Changed - [#2070] String values inside SWF to XML export are backslash escaped 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 ddb92e670..8bdadc718 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 @@ -101,6 +101,7 @@ import com.jpexs.decompiler.graph.model.AnyItem; import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.CommaExpressionItem; import com.jpexs.decompiler.graph.model.ContinueItem; +import com.jpexs.decompiler.graph.model.DoWhileItem; import com.jpexs.decompiler.graph.model.ExitItem; import com.jpexs.decompiler.graph.model.FalseItem; import com.jpexs.decompiler.graph.model.GotoItem; @@ -934,6 +935,17 @@ public class AVM2Graph extends Graph { } } + private GraphPart findNearestPartOutsideCatch(GraphPart tryTarget, Set catchParts) { + for (GraphPart p : catchParts) { + for (GraphPart n : p.nextParts) { + if (!catchParts.contains(n)) { + return n; + } + } + } + return null; + } + private boolean checkTry(List currentRet, List foundGotos, Map> partCodes, Map partCodePos, Set visited, AVM2LocalData localData, GraphPart part, List stopPart, List stopPartKind, List loops, List throwStates, Set allParts, TranslateStack stack, int staticOperation, String path, int recursionLevel) throws InterruptedException { if (localData.parsedExceptions == null) { localData.parsedExceptions = new ArrayList<>(); @@ -1021,6 +1033,34 @@ public class AVM2Graph extends Graph { //System.err.println("oursidetrycatch: " + afterPart); } + //List catchedExceptionsAfter = new ArrayList<>(); + + List catchAfterParts = new ArrayList<>(); + + if (afterPart == null) { + + loope: + for (int e = 0; e < catchedExceptions.size(); e++) { + ABCException ex = catchedExceptions.get(e); + int eId = catchedExceptionIds.get(e); + for (ThrowState ts : throwStates) { + if (ts.exceptionId == eId) { + GraphPart possibleAfter = findNearestPartOutsideCatch(ts.targetPart, ts.catchParts); + if (possibleAfter != null) { + if (!stopPart.contains(possibleAfter)) { + catchAfterParts.add(possibleAfter); + } + } + } + } + } + if (catchAfterParts.size() == 1) { + afterPart = catchAfterParts.iterator().next(); + } else if (catchAfterParts.size() > 1) { + afterPart = getMostCommonPart(localData, catchAfterParts, loops, throwStates, stopPart); + } + } + GraphPart exAfterPart = afterPart; if (finallyException == null) { @@ -1195,6 +1235,11 @@ public class AVM2Graph extends Graph { stopPart2.add(defaultPart); stopPartKind2.add(StopPartKind.OTHER); } + + for (GraphPart p:catchAfterParts) { + stopPart2.add(p); + stopPartKind2.add(StopPartKind.OTHER); + } List currentCatchCommands = printGraph(foundGotos, partCodes, partCodePos, visited, localData2, st2, allParts, null, catchPart, stopPart2, stopPartKind2, loops, throwStates, staticOperation, path); /*if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(0) instanceof SetLocalAVM2Item)) { @@ -1422,13 +1467,30 @@ public class AVM2Graph extends Graph { } @Override - protected boolean checkPartOutput(List currentRet, List foundGotos, Map> partCodes, Map partCodePos, Set visited, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List stopPartKind, List loops, List throwStates, Loop currentLoop, int staticOperation, String path, int recursionLevel) throws InterruptedException { + protected boolean checkPartOutput(List currentRet, List foundGotos, + Map> partCodes, Map partCodePos, + Set visited, GraphSource code, + BaseLocalData localData, Set allParts, + TranslateStack stack, GraphPart parent, + GraphPart part, List stopPart, + List stopPartKind, List loops, + List throwStates, Loop currentLoop, + int staticOperation, String path, + int recursionLevel) throws InterruptedException { AVM2LocalData aLocalData = (AVM2LocalData) localData; return checkTry(currentRet, foundGotos, partCodes, partCodePos, visited, aLocalData, part, stopPart, stopPartKind, loops, throwStates, allParts, stack, staticOperation, path, recursionLevel); } @Override - protected List check(List currentRet, List foundGotos, Map> partCodes, Map partCodePos, Set visited, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List stopPartKind, List loops, List throwStates, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(List currentRet, List foundGotos, + Map> partCodes, Map partCodePos, + Set visited, GraphSource code, + BaseLocalData localData, Set allParts, + TranslateStack stack, GraphPart parent, + GraphPart part, List stopPart, + List stopPartKind, List loops, + List throwStates, List output, + Loop currentLoop, int staticOperation, String path) throws InterruptedException { List ret = null; /*if (ret != null) { @@ -1557,7 +1619,10 @@ public class AVM2Graph extends Graph { } @Override - protected GraphPart checkPartWithOutput(List output, TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart part, 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<>(); @@ -1986,6 +2051,45 @@ public class AVM2Graph extends Graph { protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData, String path) { super.finalProcessAfter(list, level, localData, path); for (int i = 0; i < list.size(); i++) { + + //Remove continues from all branches of try...catch block if its continue to parent loop + if (list.get(i) instanceof LoopItem) { + LoopItem li = (LoopItem) list.get(i); + if (li.hasBaseBody()) { + List loopCommands = li.getBaseBodyCommands(); + if (!loopCommands.isEmpty()) { + if (loopCommands.get(loopCommands.size() - 1) instanceof TryAVM2Item) { + TryAVM2Item ta = (TryAVM2Item) loopCommands.get(loopCommands.size() - 1); + for (List cc : ta.catchCommands) { + if (!cc.isEmpty()) { + if (cc.get(cc.size() - 1) instanceof ContinueItem) { + ContinueItem ci = (ContinueItem) cc.get(cc.size() - 1); + if (ci.loopId == li.loop.id) { + cc.remove(cc.size() - 1); + } + } + } + } + if (!ta.tryCommands.isEmpty()) { + if (ta.tryCommands.get(ta.tryCommands.size() - 1) instanceof ContinueItem) { + ContinueItem ci = (ContinueItem) ta.tryCommands.get(ta.tryCommands.size() - 1); + if (ci.loopId == li.loop.id) { + ta.tryCommands.remove(ta.tryCommands.size() - 1); + } + } + } + if (!ta.finallyCommands.isEmpty()) { + if (ta.finallyCommands.get(ta.finallyCommands.size() - 1) instanceof ContinueItem) { + ContinueItem ci = (ContinueItem) ta.finallyCommands.get(ta.finallyCommands.size() - 1); + if (ci.loopId == li.loop.id) { + ta.finallyCommands.remove(ta.finallyCommands.size() - 1); + } + } + } + } + } + } + } if (list.get(i) instanceof SetTypeAVM2Item) { if (((SetTypeAVM2Item) list.get(i)).getValue().getThroughDuplicate() instanceof ExceptionAVM2Item) { @@ -2319,12 +2423,12 @@ public class AVM2Graph extends Graph { } } } - + if (isSetLocUsage) { nextReferencedRegisters.add(regIndex); foundGetLoc = true; return; - } + } } } } @@ -2440,7 +2544,7 @@ public class AVM2Graph extends Graph { List ret = new ArrayList<>(); for (int e = 0; e < body.exceptions.length; e++) { - ThrowState ts = new ThrowState(); + ThrowState ts = new ThrowState(); ts.exceptionId = e; ts.state = 0; ts.targetPart = searchPart(code.adr2pos(body.exceptions[e].target), allParts); @@ -2477,7 +2581,7 @@ public class AVM2Graph extends Graph { //Search all parts which have same or greater scope level, these all belong to catch Set catchParts = new HashSet<>(); if (scopePos > -1) { - walkCatchParts(avm2LocalData.codeStats, part, ip, catchParts, scopePos); + walkCatchParts(avm2LocalData.codeStats, part, ip, catchParts, scopePos, allParts, body.exceptions[e].isFinally()); } else { logger.fine("No newcatch..pushscope found in catch, probably swftools"); part = ts.targetPart; @@ -2546,18 +2650,71 @@ public class AVM2Graph extends Graph { } } - private void walkCatchParts(CodeStats stats, GraphPart part, int startIp, Set catchParts, int scopePos) { + private void walkCatchParts(CodeStats stats, GraphPart part, int startIp, Set catchParts, int scopePos, Set allParts, boolean isFinally) { if (catchParts.contains(part)) { return; } - catchParts.add(part); for (int ip = startIp; ip <= part.end; ip++) { if (stats.instructionStats[ip].scopepos_after < scopePos) { + + //popscope can be followed by jump (break/continue), + //in such case, treat as single block + if (ip >= 0 && ip < code.size()) { + boolean onlyKillJump = true; + for (int j = ip + 1; j <= part.end; j++) { + AVM2Instruction ins = (AVM2Instruction) code.get(j); + if (ins.definition instanceof KillIns) { + continue; + } + if (ins.definition instanceof JumpIns) { + continue; + } + if (ins.definition instanceof DebugLineIns) { + continue; + } + onlyKillJump = false; + break; + } + if (onlyKillJump) { + catchParts.add(part); + return; + } + } + if (ip < part.end && !isFinally) { + //split part into half + GraphPart secondPart = new GraphPart(ip + 1, part.end); + part.end = ip; + for (GraphPart n : part.nextParts) { + n.refs.remove(part); + n.refs.add(secondPart); + } + secondPart.nextParts.addAll(part.nextParts); + part.nextParts.clear(); + part.nextParts.add(secondPart); + secondPart.refs.add(part); + + secondPart.type = GraphPart.TYPE_NONE; + secondPart.discoveredTime = part.discoveredTime; + secondPart.closedTime = part.closedTime; + secondPart.finishedTime = part.finishedTime; + secondPart.iloop_header = part.iloop_header; + secondPart.irreducible = part.irreducible; + secondPart.level = part.level; + secondPart.numBlocks = part.numBlocks; + secondPart.order = part.order; + secondPart.path = part.path; + secondPart.posX = part.posX; + secondPart.posY = part.posY; + secondPart.traversed = true; + allParts.add(secondPart); + } + catchParts.add(part); return; } } + catchParts.add(part); for (GraphPart n : part.nextParts) { - walkCatchParts(stats, n, n.start, catchParts, scopePos); + walkCatchParts(stats, n, n.start, catchParts, scopePos, allParts, isFinally); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java index b0f47fb4e..11538e919 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java @@ -166,4 +166,14 @@ public class ForEachInAVM2Item extends LoopItem implements Block { public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { return ((AVM2SourceGenerator) generator).generate(localData, this); } + + @Override + public boolean hasBaseBody() { + return true; + } + + @Override + public List getBaseBodyCommands() { + return commands; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java index 423d62503..5337f78b9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java @@ -150,4 +150,14 @@ public class ForInAVM2Item extends LoopItem implements Block { public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { return ((AVM2SourceGenerator) generator).generate(localData, this); } + + @Override + public boolean hasBaseBody() { + return true; + } + + @Override + public List getBaseBodyCommands() { + return commands; + } } 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 2b3f4f522..dff7f99dc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -643,6 +643,10 @@ public class Graph { int ret = o.level - level; if (ret == 0) { ret = part.closedTime - o.part.closedTime; + + if (ret == 0) { //some nodes may be split in half and thus have same closedTime - like in try..catch + return part.start - o.part.start; + } } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java index eb1f7062a..59ecf893a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java @@ -64,9 +64,7 @@ public class GraphPart implements Serializable { public List refs = new ArrayList<>(); public boolean ignored = false; - - public List forContinues = new ArrayList<>(); - + public int level; public int discoveredTime; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java index 03217c18c..03b0bf165 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java @@ -154,4 +154,14 @@ public class DoWhileItem extends LoopItem implements Block { public GraphTargetItem returnType() { return TypeItem.UNBOUNDED; } + + @Override + public boolean hasBaseBody() { + return true; + } + + @Override + public List getBaseBodyCommands() { + return commands; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java index f7401530f..7255ce591 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java @@ -171,4 +171,14 @@ public class ForItem extends LoopItem implements Block { public GraphTargetItem returnType() { return TypeItem.UNBOUNDED; } + + @Override + public boolean hasBaseBody() { + return true; + } + + @Override + public List getBaseBodyCommands() { + return commands; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java index 838a3b23c..3db0094a5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.graph.model; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; +import java.util.List; /** * @@ -32,4 +33,8 @@ public abstract class LoopItem extends GraphTargetItem { super(src, lineStartItem, NOPRECEDENCE); this.loop = loop; } + + public abstract boolean hasBaseBody(); + + public abstract List getBaseBodyCommands(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SwitchItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SwitchItem.java index 0b0e2c147..f6656b4ef 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SwitchItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SwitchItem.java @@ -175,4 +175,14 @@ public class SwitchItem extends LoopItem implements Block { public GraphTargetItem returnType() { return TypeItem.UNBOUNDED; } + + @Override + public boolean hasBaseBody() { + return false; + } + + @Override + public List getBaseBodyCommands() { + return null; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java index c2ac8cc07..502e6b34f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java @@ -150,4 +150,14 @@ public class WhileItem extends LoopItem implements Block { public GraphTargetItem returnType() { return TypeItem.UNBOUNDED; } + + @Override + public boolean hasBaseBody() { + return true; + } + + @Override + public List getBaseBodyCommands() { + return commands; + } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java index 75916aa84..fe69ac390 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java @@ -64,6 +64,7 @@ public class ActionScript3DeobfuscatorTest extends ActionScriptTestBase { Configuration.decompilationTimeoutSingleMethod.set(Integer.MAX_VALUE); Configuration.padAs3PCodeInstructionName.set(false); Configuration.useOldStyleGetSetLocalsAs3PCode.set(false); + Configuration.labelOnSeparateLineAs3PCode.set(true); swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index feff1eae7..ee70974bd 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -1899,8 +1899,8 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "return 4;\r\n" - + "}\r\n", + + "}\r\n" + + "return 4;\r\n", false); } @@ -2138,11 +2138,9 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "catch(e:EOFError)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "}\r\n", false); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index d82c9a2a7..e9e8e4d2d 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -1883,8 +1883,8 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "return 4;\r\n" - + "}\r\n", + + "}\r\n" + + "return 4;\r\n", false); } @@ -2128,11 +2128,9 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "catch(e:EOFError)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "}\r\n", false); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java index 6704ade5b..c1d673536 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java @@ -155,11 +155,9 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "catch(e:EOFError)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "}\r\n", false); @@ -216,8 +214,8 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "catch(e:Error)\r\n" + "{\r\n" + "trace(\"in catch\");\r\n" - + "a++;\r\n" + "}\r\n" + + "a++;\r\n" + "}\r\n" + "return \"OK\";\r\n", false); @@ -242,8 +240,8 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "catch(e:Error)\r\n" + "{\r\n" + "trace(\"in catch2\");\r\n" - + "trace(\"a=\" + a);\r\n" + "}\r\n" + + "trace(\"a=\" + a);\r\n" + "}\r\n" + "trace(\"after\");\r\n", false); @@ -342,8 +340,8 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "catch(e:Error)\r\n" + "{\r\n" + "trace(\"in catch\");\r\n" - + "trace(\"a=\" + a);\r\n" + "}\r\n" + + "trace(\"a=\" + a);\r\n" + "}\r\n" + "trace(\"after\");\r\n", false); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java index 35a2994ab..02a2c744d 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java @@ -146,11 +146,9 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "catch(e:EOFError)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "continue;\r\n" + "}\r\n" + "}\r\n", false); @@ -246,7 +244,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "_loc1_ = 0;\r\n" + "var _loc2_:int = 0;\r\n" + "_loc2_ = 5;\r\n" - + "while(_loc1_ < 10)\r\n" + + "for(; _loc1_ < 10; _loc1_++)\r\n" + "{\r\n" + "try\r\n" + "{\r\n" @@ -260,7 +258,6 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "throw new Error(\"Problem: \" + _loc3_);\r\n" + "}\r\n" + "}\r\n" - + "_loc1_++;\r\n" + "}\r\n" + "trace(\"after\");\r\n", false);