From d3f0f94cc54801139e9a54c74990199a2f554d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 19 Jan 2021 22:33:03 +0100 Subject: [PATCH] goto detection improvements --- .../src/com/jpexs/decompiler/graph/Graph.java | 51 +++++++++++------- .../flashdevelop/bin/flashdevelop.swf | Bin 16375 -> 16729 bytes .../testdata/flashdevelop/src/Main.as | 2 + .../flashdevelop/src/tests/TestGotos2.as | 34 ++++++++++++ .../flashdevelop/src/tests/TestIfInIf.as | 34 ++++++++++++ 5 files changed, 103 insertions(+), 18 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestGotos2.as create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestIfInIf.as 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 afa5a9834..182f5c334 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -865,8 +865,17 @@ public class Graph { } + logger.fine("COMPARED PATHS:"); + for (int i = 0; i < comparedPaths.size(); i++) { + logger.fine("- " + (System.identityHashCode(comparedPaths.get(i))) + ": " + pathToString(comparedPaths.get(i))); + } + logger.fine("curren path: " + System.identityHashCode(branches)); + boolean isEndOfBlock = false; + Set partsToClose = new HashSet<>(); + + Map decisionToRemovedCount = new HashMap<>(); loopi: for (int i = 0; i < comparedPaths.size(); i++) { for (int j = 0; j < comparedPaths.size(); j++) { @@ -900,12 +909,14 @@ public class Graph { break; } } + decisionToRemovedCount.put(decision, removedCount); comparedPaths.get(i).remove(comparedPaths.get(i).size() - 1); } else { //remove last path component int last = i > j ? i : j; int first = i < j ? i : j; - comparedPaths.get(first).remove(comparedPaths.get(first).size() - 1); + comparedPaths.get(i).remove(comparedPaths.get(i).size() - 1); + comparedPaths.get(j).remove(comparedPaths.get(j).size() - 1); comparedPaths.remove(last); comparedPathsEdges.remove(last); } @@ -914,35 +925,31 @@ public class Graph { if (!closedBranches.contains(decision)) { logger.fine("on part " + p); logger.fine("normal closing branch " + decision); - closedBranches.add(decision); + partsToClose.add(decision); } else { logger.fine("branch already closed: " + decision); isEndOfBlock = true; } - closedBranches.add(decision); + partsToClose.add(decision); i = -1; continue loopi; } } } for (List cp : comparedPaths) { - logger.fine("- branches:" + pathToString(cp)); + logger.fine("- branches: " + System.identityHashCode(cp) + ": " + pathToString(cp)); } + logger.fine("current branches: " + System.identityHashCode(branches) + ": " + pathToString(branches)); if (comparedPaths.size() > 1) { - logger.fine("not a single path"); - for (int i = 0; i < comparedPaths.size(); i++) { - - } + logger.fine("not a single path - paths left: " + comparedPaths.size()); List prefix = getCommonPrefix(comparedPaths); - Set partsToClose = new HashSet<>(); + GraphPart decision = prefix.isEmpty() ? null : prefix.get(prefix.size() - 1); + int removedCount = decisionToRemovedCount.containsKey(decision) ? decisionToRemovedCount.get(decision) : 0; for (int i = 0; i < comparedPaths.size(); i++) { - for (int j = prefix.size() - 1; j < comparedPaths.get(i).size(); j++) { - if (j < 0) { - continue; - } + for (int j = prefix.size(); j < comparedPaths.get(i).size(); j++) { GraphPart partToClose = comparedPaths.get(i).get(j); GraphPartEdge edgeToClose = comparedPathsEdges.get(i); if (!closedBranches.contains(partToClose)) { @@ -956,21 +963,29 @@ public class Graph { } } } + /*if (decision != null) { logger.fine("closing branch 2: " + decision); closedBranches.add(decision); }*/ - closedBranches.addAll(partsToClose); branches = prefix; if (!branches.isEmpty()) { - branches.remove(branches.size() - 1); + logger.fine("removedCount before: " + removedCount); + removedCount += comparedPaths.size(); + if (partToNext.get(decision).size() > 2 && removedCount < partToNext.get(decision).size() - 1) { + //ignore + } else { + branches.remove(branches.size() - 1); + } } - + } else { + branches = comparedPaths.get(0); } + closedBranches.addAll(partsToClose); if (isEndOfBlock) { //GraphPart blockStartPart = getDominator(startPart, p, loops); - //logger.info("found breaks to to " + p); + logger.info("found breaks to " + p); //System.err.println("found breaks to to " + p); for (GraphPart r : p.refs) { gotoTargets.add(new GraphPartEdge(r, p)); @@ -1095,7 +1110,7 @@ public class Graph { if (!path.endsWith(".run")) { //return; } - //logger.info("------ " + path); + logger.info("------ " + path); //logger.info("GETTING precontinues of " + path + " ================="); Set opened = new HashSet<>(); Set closed = new HashSet<>(); diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf index 00772ff04469a138aeec63da48d52498af5caee0..8d9cf5ebea061505c9607e84273aa1db4601f180 100644 GIT binary patch literal 16729 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 5 && k <20) + { + trace("A"); + + if (k < 4) + { + return 1; + } + } + else if (k > 4 && k<10) + { + trace("B"); + if (k < 7) + { + return 2; + } + } + + trace("C"); + return 7; + } + + } + +} \ No newline at end of file