From dbad866812ddf2b3cb2d1caa3462e4a8b7ad160d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 29 Jan 2021 20:14:32 +0100 Subject: [PATCH] correct continue in if handling, move continue down if possible (invert expression of if when needed) --- .../src/com/jpexs/decompiler/graph/Graph.java | 19 +- .../decompiler/flash/ActionScript2Test.java | 17 +- .../decompiler/flash/ActionScript3Test.java | 174 +++++++++--------- .../flashdevelop/bin/flashdevelop.swf | Bin 15666 -> 20100 bytes .../flashdevelop/flashdevelop.as3proj | 3 +- .../flashdevelop/obj/flashdevelopConfig.xml | 2 + 6 files changed, 115 insertions(+), 100 deletions(-) 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 7c34e7068..a4e445958 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -289,6 +289,9 @@ public class Graph { for (Loop l : loops) { if (l.phase == 1) { loopContinues.add(l.loopContinue); + if (l.loopPreContinue != null) { + loopContinues.add(l.loopPreContinue); + } } } @@ -327,6 +330,9 @@ public class Graph { } } if (common) { + if (loopContinues.contains(p)) { + return null; + } return p; } } @@ -889,12 +895,23 @@ public class Graph { } if ((!onTrue.isEmpty()) && (!onFalse.isEmpty())) { - if (onFalse.get(onFalse.size() - 1) instanceof ExitItem) { + if ((onFalse.get(onFalse.size() - 1) instanceof ExitItem) || (onFalse.get(onFalse.size() - 1) instanceof BreakItem)) { if (onTrue.get(onTrue.size() - 1) instanceof ContinueItem) { list.add(i + 1, onTrue.remove(onTrue.size() - 1)); } } } + + if (i < list.size() - 1) { + if ((list.get(i + 1) instanceof BreakItem) && onFalse.isEmpty()) { + if (!onTrue.isEmpty() && (onTrue.get(onTrue.size() - 1) instanceof ContinueItem)) { + ifi.expression = ifi.expression.invert(null); + list.addAll(i + 2, ifi.onTrue); + ifi.onTrue.clear(); + ifi.onTrue.add(list.remove(i + 1)); + } + } + } } } 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 83d8e5889..56947bf35 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.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; import com.jpexs.decompiler.flash.action.Action; @@ -603,13 +604,12 @@ public class ActionScript2Test extends ActionScript2TestBase { + "{\r\n" + "a++;\r\n" + "b = b + 2;\r\n" - + "if(c < 10)\r\n" + + "if(c >= 10)\r\n" + "{\r\n" + + "break;\r\n" + + "}\r\n" + "trace(c);\r\n" + "c++;\r\n" - + "continue;\r\n" - + "}\r\n" - + "break;\r\n" + "}\r\n" + "trace(\"konec\");\r\n" ); @@ -676,13 +676,12 @@ public class ActionScript2Test extends ActionScript2TestBase { + "while(true)\r\n" + "{\r\n" + "k++;\r\n" - + "if(k < 10)\r\n" + + "if(k >= 10)\r\n" + "{\r\n" + + "break;\r\n" + + "}\r\n" + "k = k * 5;\r\n" + "trace(k);\r\n" - + "continue;\r\n" - + "}\r\n" - + "break;\r\n" + "}\r\n" + "trace(\"end\");\r\n" ); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index 9c6bee680..aabbd2a7f 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -147,15 +147,14 @@ public class ActionScript3Test extends ActionScriptTestBase { @DataProvider private Object[][] standardSwfNamesProvider() { return new Object[][]{ - {"standard"}, - //{"standard_asc2"} + {"standard"}, //{"standard_asc2"} }; } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardArguments(String swfUsed) { decompileMethod(swfUsed, "testArguments", "return arguments[0];\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -174,7 +173,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"infinally\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -194,7 +193,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"ch\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -207,7 +206,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" + "this.traceIt(e.toString());\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -215,7 +214,7 @@ public class ActionScript3Test extends ActionScriptTestBase { decompileMethod(swfUsed, "testComplexExpressions", "var i:int = 0;\r\n" + "var j:int = 0;\r\n" + "j = i = i + (i = i + i++);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -271,16 +270,15 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "continue loop1;\r\n" + "}\r\n" - + "if(e == 8)\r\n" + + "if(e != 8)\r\n" + "{\r\n" - + "continue;\r\n" - + "}\r\n" + "break loop1;\r\n" + "}\r\n" + "}\r\n" + + "}\r\n" + "trace(\"hello\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -296,7 +294,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "}\r\n" + "k = 7;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -316,7 +314,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "vnumber = 0.5;\r\n" + "vnumber = 6;\r\n" + "vobject = vclass;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -334,7 +332,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"4\");\r\n" + "}\r\n" + "trace(\"after switch\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -346,7 +344,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "a++;\r\n" + "}\r\n" + "while(a < 20);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -367,7 +365,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "while(k < 9);\r\n" + "return 2;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -388,7 +386,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "arr[0]();\r\n" + "}\r\n" + "return i == 0;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -410,7 +408,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "return \"hu\" + str;\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -419,7 +417,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"a=\" + a);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -444,7 +442,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -457,7 +455,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"hello:\" + a);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -485,7 +483,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"part5\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -500,7 +498,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"item #\" + item);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -517,7 +515,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"item #\" + test[0]);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -531,7 +529,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"item #\" + this.testPriv);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -556,7 +554,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"C\");\r\n" + "}\r\n" + "trace(\"exit\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -571,7 +569,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(item);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -604,7 +602,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"C\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -636,7 +634,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"after\");\r\n" + "}\r\n" + "return 89;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -660,7 +658,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"E\");\r\n" + "}\r\n" + "return 5;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -687,7 +685,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"C\");\r\n" + "}\r\n" + "trace(\"return\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -708,7 +706,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "}\r\n" + "trace(\"return\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -732,7 +730,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "j++;\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -757,7 +755,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"D\");\r\n" + "}\r\n" + "trace(\"finish\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -786,13 +784,13 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"before loop end\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardHello(String swfUsed) { decompileMethod(swfUsed, "testHello", "trace(\"hello\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -802,7 +800,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"onTrue\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -816,7 +814,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"onFalse\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -840,7 +838,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"C\");\r\n" + "return 7;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -853,7 +851,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "b++;\r\n" + "var c:* = 1;\r\n" + "b = c++;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -892,7 +890,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "chars[index++] = 5;\r\n" + "trace(\"arr[++e]\");\r\n" + "chars[++index] = 5;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -914,7 +912,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "return first;\r\n" + "};\r\n" + "traceParameter(\"hello\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -930,7 +928,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "s = 8;\r\n" + "}\r\n" + "innerFunc(a);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -957,7 +955,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"b!=7\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -982,7 +980,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"finally block\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -996,14 +994,14 @@ public class ActionScript3Test extends ActionScriptTestBase { + "b = true;\r\n" + "}\r\n" + "b = (i == 0 || i == 1) && j == 0;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardManualConvert(String swfUsed) { decompileMethod(swfUsed, "testManualConvert", "trace(\"String(this).length\");\r\n" + "trace(String(this).length);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1020,7 +1018,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "default:\r\n" + "jj = 3;\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1036,7 +1034,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"onFalse\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1045,7 +1043,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "return (param1 as TestClass2).attrib1 == 5;\r\n" + "};\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1056,19 +1054,19 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var b:* = ns::[name];\r\n" + "trace(b.c);\r\n" + "var c:* = myInternal::neco;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardParamNames(String swfUsed) { decompileMethod(swfUsed, "testParamNames", "return firstp + secondp + thirdp;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardParamsCount(String swfUsed) { decompileMethod(swfUsed, "testParamsCount", "return firstp;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1085,7 +1083,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "a = 1 * 2 * 3;\r\n" + "a = 1 * 2 / 3;\r\n" + "trace(\"a=\" + a);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1095,7 +1093,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var c:* = 3;\r\n" + "var d:* = a << (b >>> c);\r\n" + "var e:* = a << b >>> c;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1106,7 +1104,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "d.method(d.attrib * 5);\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1115,14 +1113,14 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var a2:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" + "var b1:* = /[0-9AB]+/;\r\n" + "var b2:* = /[0-9AB]+/;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardRest(String swfUsed) { decompileMethod(swfUsed, "testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + "return firstp;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1132,7 +1130,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"is eight\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1141,7 +1139,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "this.traceIt(\"hello\" + 5 * 6);\r\n" + "this.traceIt(\"hello\" + (k - 1));\r\n" + "this.traceIt(\"hello\" + 5 + 6);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1151,7 +1149,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"backslash: \\\\ \");\r\n" + "trace(\"single quotes: \\'hello!\\'\");\r\n" + "trace(\"new line \\r\\n hello!\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1170,7 +1168,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "case 89:\r\n" + "trace(\"eightynine\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1187,7 +1185,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "case TestSwitchComma.X, \"C\":\r\n" + "trace(\"is C\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1209,7 +1207,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "default:\r\n" + "trace(\"default clause\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1220,7 +1218,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var d:* = 78;\r\n" + "var e:* = a == b?c == d?1:7:3;\r\n" + "trace(\"e=\" + e);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1245,7 +1243,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"Finally part\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1273,7 +1271,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "}\r\n" + "return 4;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1316,7 +1314,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"after\");\r\n" + "return \"X\";\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1350,7 +1348,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"after\");\r\n" + "return \"X\";\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1361,14 +1359,14 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var a:int = 5;\r\n" + "v[a * 8 - 39] = \"hi2\";\r\n" + "trace(v[0]);\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") public void testStandardVector2(String swfUsed) { decompileMethod(swfUsed, "testVector2", "var a:Vector.> = new Vector.>();\r\n" + "var b:Vector. = new [10,20,30];\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1382,7 +1380,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "a = 7;\r\n" + "b = 9;\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1404,7 +1402,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "trace(\"hello2\");\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1427,7 +1425,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "continue;\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1453,7 +1451,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"after_try\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test(dataProvider = "standardSwfNamesProvider") @@ -1569,20 +1567,20 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "]]>\r\n" + ";\r\n", - false); + false); } @Test public void testAssembledDoubleDup() { decompileMethod("assembled", "testDoubleDup", "var _loc10_:Rectangle = myprop(_loc5_);\r\n" + "_loc10_.mymethod(-_loc10_.width,-_loc10_.height);\r\n", - false); + false); } @Test public void testAssembledDup() { decompileMethod("assembled", "testDup", "return 1 - (var _loc1_:Number = 1 - _loc1_ / _loc4_) * _loc1_;\r\n", - false); + false); } @Test @@ -1593,7 +1591,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(_loc2_);\r\n" + "}\r\n", - false); + false); } @Test @@ -1609,7 +1607,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "}\r\n" + "_loc3_ = 0;\r\n", - false); + false); } @Test @@ -1618,14 +1616,14 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "_loc6_.methodname(_loc1_,_loc2_,_loc5_);\r\n" + "}\r\n", - false); + false); } @Test public void testAssembledIncrement() { decompileMethod("assembled", "testIncrement", "super();\r\n" + "b = a++;\r\n", - false); + false); } @Test @@ -1634,13 +1632,13 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "somemethod();\r\n" + "}\r\n", - false); + false); } @Test public void testAssembledIncrement3() { decompileMethod("assembled", "testIncrement3", "_loc1_.length--;\r\n", - false); + false); } @Test @@ -1648,13 +1646,13 @@ public class ActionScript3Test extends ActionScriptTestBase { decompileMethod("assembled", "testSetSlotDup", "var _loc5_:int = 5;\r\n" + "myname.somemethod(\"okay\",myslot = _loc5_);\r\n" + "myname.start();\r\n", - false); + false); } @Test public void testAssembledSetSlotFindProperty() { decompileMethod("assembled", "testSetSlotFindProperty", "return var myprop:int = 50;\r\n", - false); + false); } @Test @@ -1675,7 +1673,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "_loc2_ = \"C\";\r\n" + "}\r\n" + "_loc2_ = \"after\";\r\n", - false); + false); } @Test @@ -1698,7 +1696,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "default:\r\n" + "_loc2_ = 100;\r\n" + "}\r\n", - false); + false); } @Test diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf index f03ccb95a0b872636797794b8da7c7922e02160f..0fb90aceeea1f3fc1b289163dc087d75e2cfda01 100644 GIT binary patch literal 20100 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 literal 15666 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 - @@ -28,7 +27,7 @@