From 3f2e075ee90e37cee11d3a3e3b164079622a77f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 23 Jan 2021 12:55:13 +0100 Subject: [PATCH] Fixed goto/for detection --- .../flash/abc/avm2/graph/AVM2Graph.java | 2 +- .../decompiler/flash/action/ActionGraph.java | 4 +- .../src/com/jpexs/decompiler/graph/Graph.java | 110 ++++++++++++++---- .../decompiler/flash/ActionScript3Test.java | 59 +++++++++- .../flashdevelop/bin/flashdevelop.swf | Bin 17190 -> 17701 bytes .../testdata/flashdevelop/src/Main.as | 2 + .../flashdevelop/src/tests/TestGotos6.as | 35 ++++++ .../flashdevelop/src/tests/TestGotos7.as | 38 ++++++ 8 files changed, 220 insertions(+), 30 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos6.as create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos7.as 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 1b28e3363..100f70ad0 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 @@ -659,7 +659,7 @@ public class AVM2Graph extends Graph { } GraphPart breakPart = getMostCommonPart(localData, caseBodyParts, loops, new ArrayList<>()); - removeEdgeToFromList(gotoTargets, breakPart); + //removeEdgeToFromList(gotoTargets, breakPart); List> caseCommands = new ArrayList<>(); GraphPart next = breakPart; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index e4a975e75..1d5248dc7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -467,7 +467,7 @@ public class ActionGraph extends Graph { } GraphPart breakPart = getMostCommonPart(localData, caseBodyParts, loops, new ArrayList<>()); - removeEdgeToFromList(gotoTargets, breakPart); + //removeEdgeToFromList(gotoTargets, breakPart); List> caseCommands = new ArrayList<>(); GraphPart next = breakPart; @@ -482,7 +482,7 @@ public class ActionGraph extends Graph { for (int i = 0; i < caseValuesMap.size(); i++) { GraphPart cur = caseBodyParts.get(i); if (!caseBodies.contains(cur)) { - removeEdgeToFromList(gotoTargets, cur); + //removeEdgeToFromList(gotoTargets, cur); caseBodies.add(cur); } valuesMapping.add(caseBodies.indexOf(cur)); 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 9ee04d74a..6e261b927 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -542,6 +542,9 @@ public class Graph { System.err.println("");//*/ List gotos = new ArrayList<>(); List ret = printGraph(gotos, gotoTargets, new HashMap<>(), new HashMap<>(), localData, stack, allParts, null, heads.get(0), null, loops, staticOperation, path); + + processIfGotos(gotos, ret); + Map usages = new HashMap<>(); Map lastUsage = new HashMap<>(); for (GotoItem gi : gotos) { @@ -552,10 +555,12 @@ public class Graph { lastUsage.put(gi.labelName, gi); } for (String labelName : usages.keySet()) { + logger.fine("usage - " + labelName + ": " + usages.get(labelName)); if (usages.get(labelName) == 1) { lastUsage.get(labelName).labelName = null; } } + expandGotos(ret); processIfs(ret); finalProcessStack(stack, ret, path); @@ -735,6 +740,7 @@ public class Graph { } logger.fine("current branches: " + System.identityHashCode(branches) + ": " + pathToString(branches)); + List foundBreakEdges = new ArrayList<>(); if (comparedPaths.size() > 1) { logger.fine("not a single path - paths left: " + comparedPaths.size()); List prefix = getCommonPrefix(comparedPaths); @@ -754,6 +760,7 @@ public class Graph { logger.fine("branch already closed: " + partToClose); logger.fine("probably break edge: " + edgeToClose); if (ignoredBreakEdges.contains(edgeToClose)) { + foundBreakEdges.add(edgeToClose); logger.fine("NOT a break edge, it is standard break"); continue; } @@ -788,6 +795,10 @@ public class Graph { for (GraphPart r : p.refs) { gotoTargets.add(new GraphPartEdge(r, p)); } + /*for (GraphPartEdge be : foundBreakEdges) { + GraphPartEdge re = findGotoRestoreOrigEdge(be); + gotoTargets.add(re); + }*/ } } @@ -849,6 +860,24 @@ public class Graph { } } + /*private GraphPartEdge findGotoRestoreOrigEdge(GraphPartEdge e) { + for (GraphPart r : e.to.refs) { + if (r.equals(e.from)) { + return e; + } + } + for (GraphPart r : e.to.refs) { + GraphPart rr = r; + while (isPartEmpty(rr) && rr.refs.size() == 1) { + rr = rr.refs.get(0); + } + if (rr.equals(e.from)) { + return new GraphPartEdge(r, e.to); + } + } + return null; + }*/ + protected boolean isPartEmpty(GraphPart part) { return false; } @@ -1278,6 +1307,58 @@ public class Graph { } } + /** + * if (xxx) { y ; goto a } else { z ; goto a } + * + * => + * + * if (xxx) { y } else { z } goto a + * + */ + private void processIfGotos(List allGotos, List list) { + for (int i = 0; i < list.size(); i++) { + GraphTargetItem item = list.get(i); + if (item instanceof Block) { + List> subs = ((Block) item).getSubs(); + for (List sub : subs) { + processIfGotos(allGotos, sub); + } + } + if (item instanceof IfItem) { + IfItem ii = (IfItem) item; + if (!ii.onTrue.isEmpty() && !ii.onFalse.isEmpty()) { + if (ii.onTrue.get(ii.onTrue.size() - 1) instanceof GotoItem) { + if (ii.onFalse.get(ii.onFalse.size() - 1) instanceof GotoItem) { + GotoItem gotoOnTrue = (GotoItem) ii.onTrue.get(ii.onTrue.size() - 1); + GotoItem gotoOnFalse = (GotoItem) ii.onFalse.get(ii.onFalse.size() - 1); + if (gotoOnTrue.labelName.equals(gotoOnFalse.labelName)) { + String labelOnTrue = gotoOnTrue.labelName; + String labelOnFalse = gotoOnFalse.labelName; + if (labelOnTrue != null && labelOnFalse != null) { + if (labelOnTrue.equals(labelOnFalse)) { + GotoItem gotoMerged; + GotoItem gotoRemoved; + if (gotoOnTrue.targetCommands != null) { + gotoMerged = gotoOnTrue; + gotoRemoved = gotoOnFalse; + } else { + gotoMerged = gotoOnFalse; + gotoRemoved = gotoOnTrue; + } + ii.onTrue.remove(ii.onTrue.size() - 1); + ii.onFalse.remove(ii.onFalse.size() - 1); + list.add(i + 1, gotoMerged); + allGotos.remove(gotoRemoved); + } + } + } + } + } + } + } + } + } + private void processIfs(List list) { for (int i = 0; i < list.size(); i++) { GraphTargetItem item = list.get(i); @@ -1297,25 +1378,6 @@ public class Graph { IfItem ifi = (IfItem) item; List onTrue = ifi.onTrue; List onFalse = ifi.onFalse; - if ((!onTrue.isEmpty()) && (!onFalse.isEmpty())) { - if (onTrue.get(onTrue.size() - 1) instanceof GotoItem) { - if (onFalse.get(onFalse.size() - 1) instanceof GotoItem) { - GotoItem gotoOnTrue = (GotoItem) onTrue.get(onTrue.size() - 1); - GotoItem gotoOnFalse = (GotoItem) onFalse.get(onFalse.size() - 1); - String labelOnTrue = gotoOnTrue.labelName; - String labelOnFalse = gotoOnFalse.labelName; - if (labelOnTrue != null && labelOnFalse != null) { - if (labelOnTrue.equals(labelOnFalse)) { - GotoItem gotoMerged = gotoOnTrue.targetCommands != null ? gotoOnTrue : gotoOnFalse; - - onTrue.remove(onTrue.size() - 1); - onFalse.remove(onFalse.size() - 1); - list.add(i + 1, gotoMerged); - } - } - } - } - } if ((!onTrue.isEmpty()) && (!onFalse.isEmpty())) { if (onTrue.get(onTrue.size() - 1) instanceof ContinueItem) { if (onFalse.get(onFalse.size() - 1) instanceof ContinueItem) { @@ -2195,7 +2257,7 @@ public class Graph { gi.targetCommands.remove(cnt); l.precontinueCommands = gi.targetCommands; l.loopPreContinue = part; - removeEdgeToFromList(gotoTargets, part); + //removeEdgeToFromList(gotoTargets, part); ret.add(cnt); return ret; } @@ -2291,7 +2353,7 @@ public class Graph { List> caseCommands = new ArrayList<>(); List valueMappings = new ArrayList<>(); Loop swLoop = new Loop(loops.size(), null, next); - gotoTargets.remove(next); + //removeEdgeToFromList(gotoTargets, next); swLoop.phase = 1; loops.add(swLoop); boolean first = false; @@ -2383,7 +2445,7 @@ public class Graph { pos = 0; List nextCommands = new ArrayList<>(); for (int i = 1; i < part.nextParts.size(); i++) { - gotoTargets.remove(part.nextParts.get(i)); + //gotoTargets.remove(new GraphPartEdge(next, part.nextParts.get(i))); } for (int i = 1; i < part.nextParts.size(); i++) { GraphPart p = part.nextParts.get(i); @@ -3100,5 +3162,9 @@ public class Graph { edges.remove(i); } } + while (isPartEmpty(to) && !to.nextParts.isEmpty()) { + to = to.nextParts.get(0); + removeEdgeToFromList(edges, to); + } } } 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 1083b7d88..6cb3f954b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -31,16 +31,11 @@ import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.ScopeStack; import java.io.BufferedInputStream; -import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -729,6 +724,60 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } + @Test + public void testGotos6() { + decompileMethod("testGotos6", "var a:Boolean = true;\r\n" + + "var s:String = \"a\";\r\n" + + "if(a)\r\n" + + "{\r\n" + + "switch(s)\r\n" + + "{\r\n" + + "case \"a\":\r\n" + + "trace(\"is A\");\r\n" + + "break;\r\n" + + "case \"b\":\r\n" + + "trace(\"is B\");\r\n" + + "case \"c\":\r\n" + + "trace(\"is BC\");\r\n" + + "}\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"D\");\r\n" + + "}\r\n" + + "trace(\"finish\");\r\n", + false); + } + + @Test + public void testGotos7() { + decompileMethod("testGotos7", "for(var i:int = 0; i < 10; i++)\r\n" + + "{\r\n" + + "switch(i)\r\n" + + "{\r\n" + + "case 0:\r\n" + + "trace(\"zero\");\r\n" + + "continue;\r\n" + + "case 5:\r\n" + + "trace(\"five\");\r\n" + + "break;\r\n" + + "case 10:\r\n" + + "trace(\"ten\");\r\n" + + "break;\r\n" + + "case 1:\r\n" + + "if(i == 7)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"one\");\r\n" + + "default:\r\n" + + "trace(\"def\");\r\n" + + "}\r\n" + + "trace(\"before loop end\");\r\n" + + "}\r\n", + false); + } + @Test public void testHello() { decompileMethod("testHello", "trace(\"hello\");\r\n", diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf index 970e70d62f9e5cca4b582812e1eebfa617b52b69..b5034f1bb0cb339c4be54194dd6690aadbe8d9a9 100644 GIT binary patch literal 17701 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 diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as index bc80273ff..b406df078 100644 --- a/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as @@ -41,6 +41,8 @@ package TestGotos3; TestGotos4; TestGotos5; + TestGotos6; + TestGotos7; TestHello; TestIf; TestIfElse; diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos6.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos6.as new file mode 100644 index 000000000..5b8935f3e --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos6.as @@ -0,0 +1,35 @@ +package tests +{ + + public class TestGotos6 + { + + public function run():void + { + var a:Boolean = true; + var s:String = "a"; + + if (a) + { + switch (s) + { + case "a": + trace("is A"); + break; + case "b": + trace("is B"); + case "c": + trace("is BC"); + break; + } + } + else + { + trace("D"); + } + trace("finish"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos7.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos7.as new file mode 100644 index 000000000..0ed14381b --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos7.as @@ -0,0 +1,38 @@ +package tests +{ + + public class TestGotos7 + { + + public function run():void + { + + for (var i:int = 0; i < 10; i++) + { + switch (i) + { + case 0: + trace("zero"); + continue; + case 5: + trace("five"); + break; + case 10: + trace("ten"); + break; + case 1: + if (i == 7) + { + continue; + } + trace("one"); + default: + trace("def"); + } + trace("before loop end"); + } + } + + } + +} \ No newline at end of file