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 b62f6efff..9f4eba8f7 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 @@ -1871,10 +1871,27 @@ public class AVM2Graph extends Graph { } List caseValuesMap = caseValuesMapLeft; - //Only handle switches with more than 2 branches - if (caseValuesMap.size() <= 2) { - stack.push(set); - return ret; + //It's not switch, it's an If + if (caseBodyParts.size() == 2) { + boolean isIf = false; + for (GraphPart r : part.refs) { + if (r != origPart && !origPart.leadsTo(localData, this, code, r, loops, throwStates, false)) { + isIf = true; + break; + } + } + if (!isIf) { + for (GraphPart r : caseBodyParts.get(1).refs) { + if (r != origPart && !origPart.leadsTo(localData, this, code, r, loops, throwStates, false)) { + isIf = true; + break; + } + } + } + if (isIf) { + stack.push(firstSet); + return ret; + } } //determine whether local register are on left or on right side of === operator 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 80e4a1b43..863a64d16 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 @@ -1246,6 +1246,24 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testIfInsteadSwitch() { + decompileMethod("classic_air", "testIfInsteadSwitch", "var a:int = 5;\r\n" + + "if(a > 5)\r\n" + + "{\r\n" + + "if(a === 0)\r\n" + + "{\r\n" + + "trace(\"X\");\r\n" + + "}\r\n" + + "}\r\n" + + "if(a === 1)\r\n" + + "{\r\n" + + "return \"A\";\r\n" + + "}\r\n" + + "return \"B\";\r\n", + false); + } + @Test public void testIfTry() { decompileMethod("classic_air", "testIfTry", "var c:int = 0;\r\n" 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 ee6451419..59ed22a8b 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 @@ -1245,6 +1245,24 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testIfInsteadSwitch() { + decompileMethod("classic", "testIfInsteadSwitch", "var a:int = 5;\r\n" + + "if(a > 5)\r\n" + + "{\r\n" + + "if(a === 0)\r\n" + + "{\r\n" + + "trace(\"X\");\r\n" + + "}\r\n" + + "}\r\n" + + "if(a === 1)\r\n" + + "{\r\n" + + "return \"A\";\r\n" + + "}\r\n" + + "return \"B\";\r\n", + false); + } + @Test public void testIfTry() { decompileMethod("classic", "testIfTry", "var c:int = 0;\r\n" diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf index 8abbca18d..df26b25dd 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf index 286a7fb28..5d97f0336 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index e2dd0e433..0e32e84dd 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -78,6 +78,7 @@ package TestIfElse; TestIfFinally; TestIfInIf; + TestIfInsteadSwitch; TestIfTry; TestIgnoreAndOr; TestImplicitCoerce; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIfInsteadSwitch.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIfInsteadSwitch.as new file mode 100644 index 000000000..c82b71a62 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIfInsteadSwitch.as @@ -0,0 +1,23 @@ +package tests +{ + + public class TestIfInsteadSwitch + { + public function run():* + { + var a:int = 5; + if(a > 5) + { + if(a === 0) + { + trace("X"); + } + } + if(a === 1) + { + return "A"; + } + return "B"; + } + } +}