diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ba42c409..0b3973ecd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ All notable changes to this project will be documented in this file. - [#2480] AS1/2 P-code decompilation of try..catch with empty catch body at the end of function - [#2477] AS1/2 deobfuscation - and/or operators, jumps before function start, jumps to function end, jumps in for..in return/break +- [#2477] AS1/2 Switch in last statement of switch break labels ### Changed - Icon of "Deobfuscation options" menu from pile of pills to medkit 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 e21cde475..2c3f4e2ab 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 @@ -31,6 +31,7 @@ import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.LoopItem; @@ -168,6 +169,20 @@ public class ForEachInAVM2Item extends LoopItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } @Override public boolean hasReturnValue() { 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 e4b1fc33d..e5cadfa8a 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 @@ -31,6 +31,7 @@ import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.LoopItem; @@ -152,6 +153,20 @@ public class ForInAVM2Item extends LoopItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } @Override public boolean hasReturnValue() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java index 215f958f4..c6da6cda7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java @@ -33,6 +33,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; @@ -201,6 +202,40 @@ public class TryAVM2Item extends AVM2Item implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : tryCommands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + if (finallyCommands != null) { + for (GraphTargetItem ti : finallyCommands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + } + for (List commands : catchCommands) { + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + } + return ret; + } @Override public boolean needsSemicolon() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java index 55d32a579..51b904f94 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; @@ -186,6 +187,13 @@ public class ClassAVM2Item extends AVM2Item implements Block { List ret = new ArrayList<>(); return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + return ret; + } + @Override public boolean needsSemicolon() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java index 20cbdb5fb..091d02053 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java @@ -34,6 +34,7 @@ import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Helper; @@ -273,6 +274,12 @@ public class ClassActionItem extends ActionItem implements Block { List ret = new ArrayList<>(); return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + return ret; + } @Override public boolean needsSemicolon() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java index a06d5ed9c..ee0d51e61 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java @@ -43,6 +43,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; @@ -180,6 +181,20 @@ public class ForInActionItem extends LoopActionItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/IfFrameLoadedActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/IfFrameLoadedActionItem.java index 59c876a2d..ec07f9d5a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/IfFrameLoadedActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/IfFrameLoadedActionItem.java @@ -28,6 +28,7 @@ import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; @@ -96,6 +97,11 @@ public class IfFrameLoadedActionItem extends ActionItem implements Block { return new ArrayList<>(); } + @Override + public List getBreaks() { + return new ArrayList<>(); + } + @Override public List> getSubs() { List> ret = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TellTargetActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TellTargetActionItem.java index 71c19e51f..c1af21851 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TellTargetActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TellTargetActionItem.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphSourceItemPos; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; @@ -144,6 +145,20 @@ public class TellTargetActionItem extends ActionItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } @Override public List> getSubs() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java index f324626bd..7f725876b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java @@ -42,6 +42,7 @@ import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; @@ -191,6 +192,40 @@ public class TryActionItem extends ActionItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : tryCommands) { + if (ti instanceof ContinueItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + if (finallyCommands != null) { + for (GraphTargetItem ti : finallyCommands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + } + for (List commands : catchCommands) { + for (GraphTargetItem ti : commands) { + if (ti instanceof ContinueItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + } + return ret; + } @Override public boolean needsSemicolon() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Block.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Block.java index 7bc1cecf1..5253b3a70 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Block.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Block.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.graph; +import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import java.util.List; @@ -33,6 +34,13 @@ public interface Block { * @return List of continues */ public List getContinues(); + + /** + * Gets all sub breaks. + * + * @return List of breaks + */ + public List getBreaks(); /** * Gets all sub blocks. 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 5d507f94b..a9a7424a6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -1016,12 +1016,91 @@ public class Graph { } expandGotos(ret); processIfs(ret); + processSwitches2(ret); finalProcessStack(stack, ret, path); makeAllCommands(ret, stack); finalProcessAll(null, ret, 0, getFinalData(localData, loops, throwStates), path); return ret; } + + /** + * This is needed to avoid loop identifiers in AS1/2. AS3 supports them, but AS1/2 not. + * + * loop1: switch(a) { //has loop identifier + * case 1: + * trace("1"); + * break; + * case 2: //last case + * trace("2"); + * switch(b) { //last command is switch + * case 3: + * case 4: + * trace("4"); + * break loop1; //breaks parent loop + * case 5: + * trace("5"); + * break loop1; + * case 6: + * trace("6"); + * } + * } + * + * ==> + * + * switch(a) { + * case 1: + * trace("1"); + * break; + * case 2: + * trace("2"); + * switch(b) { + * case 3: + * case 4: + * trace("4"); + * break; + * case 5: + * trace("5"); + * break; + * case 6: + * trace("6"); + * } + * } + * @param list Items + */ + protected void processSwitches2(List list) { + for (int i = 0; i < list.size(); i++) { + GraphTargetItem item = list.get(i); + if (item instanceof Block) { + Block bl = (Block) item; + for (List subList : bl.getSubs()) { + processSwitches2(subList); + } + } + if (item instanceof SwitchItem) { + SwitchItem sw = (SwitchItem) item; + if (sw.caseCommands.isEmpty()) { + continue; + } + List lastCase = sw.caseCommands.get(sw.caseCommands.size() - 1); + if (lastCase.isEmpty()) { + continue; + } + if (!(lastCase.get(lastCase.size() - 1) instanceof SwitchItem)) { + continue; + } + SwitchItem swInner = (SwitchItem) lastCase.get(lastCase.size() - 1); + + List breaks = swInner.getBreaks(); + for (BreakItem br : breaks) { + if (br.loopId == sw.loop.id) { + br.loopId = swInner.loop.id; + } + } + } + } + } + /** * Prepares second pass data. Can return null when no second pass will * happen. Override this method to prepare second pass data. @@ -1051,7 +1130,7 @@ public class Graph { protected final void processSwitches(List list) { processSwitches(list, -1); } - + /* while(something){ 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 0a8904b22..dc265a0d9 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 @@ -158,6 +158,20 @@ public class DoWhileItem extends LoopItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { 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 e3bde30ad..c4ec77c33 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 @@ -185,6 +185,20 @@ public class ForItem extends LoopItem implements Block { return ret; } + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } + @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { return generator.generate(localData, this); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java index 305179222..42c2a5f82 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java @@ -115,6 +115,20 @@ public class GotoItem extends GraphTargetItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + if (targetCommands == null) { + return ret; + } + for (GraphTargetItem c : targetCommands) { + if (c instanceof BreakItem) { + ret.add((BreakItem) c); + } + } + return ret; + } @Override public List> getSubs() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java index b0a90f982..96dcf92b4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java @@ -194,6 +194,28 @@ public class IfItem extends GraphTargetItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : onTrue) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + for (GraphTargetItem ti : onFalse) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { 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 5a92e066a..1ecc33322 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 @@ -187,6 +187,23 @@ public class SwitchItem extends LoopItem implements Block { } return ret; } + + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + + for (List onecase : caseCommands) { + for (GraphTargetItem ti : onecase) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + } + return ret; + } @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { 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 73116c2f0..f6b03d421 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 @@ -151,6 +151,20 @@ public class WhileItem extends LoopItem implements Block { return ret; } + @Override + public List getBreaks() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof BreakItem) { + ret.add((BreakItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getBreaks()); + } + } + return ret; + } + @Override public boolean needsSemicolon() { return false; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index 66a0d3ded..cedfc6a62 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -2515,4 +2515,31 @@ public class ActionScript2Test extends ActionScript2TestBase { + "f(tst);\r\n" ); } + + @Test + public void frame93_Test() { + compareSrc(93, "trace(\"testInnerSwitchNoLabel\");\r\n" + + "var a;\r\n" + + "var b;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 4:\r\n" + + "trace(\"4\");\r\n" + + "break;\r\n" + + "case 7:\r\n" + + "trace(\"7\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "switch(b)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"2\");\r\n" + + "}\r\n" + + "}\r\n" + + "trace(\"end\");\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/as2.swf b/libsrc/ffdec_lib/testdata/as2/as2.swf index 9791b7a10..4f424d142 100644 Binary files a/libsrc/ffdec_lib/testdata/as2/as2.swf and b/libsrc/ffdec_lib/testdata/as2/as2.swf differ diff --git a/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml b/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml index bceacdb16..2d671e804 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml @@ -31,7 +31,7 @@ - + @@ -761,9 +761,9 @@ +!3054 7490[3050 7494 3050 7457!3050 7457[3050 7441 3159 7239!3159 7239[3270 7033 3327 6947!3327 6947[3353 6908 3412 6794!3412 6794[3470 6682 3500 6639!3500 6639[3602 6491 3649 6692!3649 6692|3713 6670!3713 6670[3760 6655 3782 6655!3782 + 6655[3942 6655 3985 6781!3985 6781[4007 6844 3996 6914!3996 6914[3996 6948 3999 6995!3999 6995[4000 7031 3993 7054!3993 7054[3976 7106 3860 7224!3860 7224[3847 7237 3741 7292!3741 7292[3638 7346 3616 7372!3616 7372[3594 7396 3511 7442 +!3511 7442[3435 7483 3427 7483!3427 7483[3409 7483 3407 7468!3407 7468[3405 7453 3386 7453!3386 7453[3361 7468 3330 7483!3330 7483[3270 7512 3235 7512!3235 7512[3220 7512 3156 7501!3156 7501[3091 7490 3054 7490"/> + + + + + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/NineSlice.xml b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/NineSlice.xml index 158791cc1..cea1a482b 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/NineSlice.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/NineSlice.xml @@ -37,23 +37,30 @@ + - - - - - + - - - - + + + + + + + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml index 56636e13c..32e670e1f 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml @@ -36,8 +36,8 @@ trace("init_blue"); - + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml index 37b2464a4..62f052019 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml @@ -5,8 +5,8 @@ xmlns:xmp="http://ns.adobe.com/xap/1.0/"> Adobe Flash CS4 Professional 2010-08-03T10:48:58+02:00 - 2025-05-25T02:00:38-07:00 - 2025-05-25T02:00:38-07:00 + 2025-07-11T12:02:19-07:00 + 2025-07-11T12:02:19-07:00 @@ -22,7 +22,7 @@ xmp.did:8DD71700DC9EDF1194ADAC9B23608190 xmp.did:F0EB4FF7CAC3ED11AC9DC078F41E1AA7 - xmp.iid:947ACAA0D438F0118613AED963F21DE9 + xmp.iid:6987AB0A835EF011A31DCCBA7D7D2943 xmp.did:8DD71700DC9EDF1194ADAC9B23608190 @@ -476,6 +476,12 @@ 2010-08-03T10:48:58+02:00 Adobe Flash Professional CS6 - build 481 + + created + xmp.iid:6987AB0A835EF011A31DCCBA7D7D2943 + 2010-08-03T10:48:58+02:00 + Adobe Flash Professional CS6 - build 481 + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache index a80d76d3a..f78263d21 100644 Binary files a/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache and b/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache differ