From 49c8251e4de86e66b394c22c45b3fe2811850978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Wed, 20 Sep 2023 12:11:24 +0200 Subject: [PATCH] =?UTF-8?q?Fixed=20#2077=20Switch=20detection=20problems?= =?UTF-8?q?=20producing=20=C2=A7=C2=A7goto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 + .../src/com/jpexs/decompiler/graph/Graph.java | 138 +++++++++++++++-- .../com/jpexs/decompiler/graph/GraphPart.java | 2 + .../ActionScript3AssembledDecompileTest.java | 27 ++++ .../flash/generators/AS3Generator.java | 23 ++- .../as3_assembled-0/as3_assembled-0.main.abc | Bin 7834 -> 8374 bytes .../as3_assembled-0.main.asasm | 1 + .../tests/TestSwitchMostCommon.class.asasm | 145 ++++++++++++++++++ .../tests/TestSwitchMostCommon.script.asasm | 29 ++++ .../as3_assembled/bin/as3_assembled.swf | Bin 4701 -> 5027 bytes .../flash/gui/abc/DecompiledEditorPane.java | 5 + 11 files changed, 359 insertions(+), 13 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.script.asasm diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d659595a..2bea8b862 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ All notable changes to this project will be documented in this file. - [PR109] FLA export - large font size of DefineEditText - [PR110] FLA export - image instances - FLA export - missing AS linkage class for fonts +- [#2077] Switch detection problems producing §§goto ### Changed - [#2070] String values inside SWF to XML export are backslash escaped @@ -3083,6 +3084,7 @@ Major version of SWF to XML export changed to 2. [#2058]: https://www.free-decompiler.com/flash/issues/2058 [#2072]: https://www.free-decompiler.com/flash/issues/2072 [#2029]: https://www.free-decompiler.com/flash/issues/2029 +[#2077]: https://www.free-decompiler.com/flash/issues/2077 [#1998]: https://www.free-decompiler.com/flash/issues/1998 [#2038]: https://www.free-decompiler.com/flash/issues/2038 [#2028]: https://www.free-decompiler.com/flash/issues/2028 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 291587a30..61ccc6042 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -55,12 +55,15 @@ import com.jpexs.decompiler.graph.model.UniversalLoopItem; import com.jpexs.decompiler.graph.model.WhileItem; import com.jpexs.decompiler.graph.precontinues.GraphPrecontinueDetector; import com.jpexs.helpers.Reference; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -121,7 +124,94 @@ public class Graph { for (GraphPart head : heads) { time = head.setTime(time, ordered, visited); head.setNumblocks(1); + } + } + + /** + * Calculates time of closing the node. + * The node is closed when all its input edges are already visited + * (not counting back edges), then all its output edges are processed. + * + * This time is useful when sorting nodes according their occurence + * in getMostCommonPart method - used for switch detection + * + * @param loops Already calculated loops to get backedges from. + */ + private void calculateClosedTime(List loops) { + ArrayDeque openedNodes = new ArrayDeque<>(); + Set closedNodes = new HashSet<>(); + Set visitedEdges = new HashSet<>(); + openedNodes.addAll(heads); + for(GraphPart h:heads) { + for (GraphPart r:h.refs) { + visitedEdges.add(new LevelMapEdge(r, h)); + } } + for (Loop el:loops) { + for (GraphPart be:el.backEdges) { + visitedEdges.add(new LevelMapEdge(be, el.loopContinue)); + } + } + + int closedTime = 1; + + loopopened: while (!openedNodes.isEmpty()) { + GraphPart part = openedNodes.remove(); + if (closedNodes.contains(part)) { + continue; + } + for (GraphPart r:part.refs) { + if (!visitedEdges.contains(new LevelMapEdge(r, part))) { + continue loopopened; + } + } + for (GraphPart n:part.nextParts) { + openedNodes.add(n); + visitedEdges.add(new LevelMapEdge(part, n)); + } + closedNodes.add(part); + part.closedTime = closedTime++; + //System.err.println("part "+part+" closedTime: "+part.closedTime); + } + + } + + private class LevelMapEdge { + public GraphPart from; + public GraphPart to; + + public LevelMapEdge(GraphPart from, GraphPart to) { + this.from = from; + this.to = to; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 31 * hash + Objects.hashCode(this.from); + hash = 31 * hash + Objects.hashCode(this.to); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LevelMapEdge other = (LevelMapEdge) obj; + //use == comparison, not equals, as some parts may be equal + // (the refs to throw targets have -1,-1 as start/end) + if (this.from != other.from) { + return false; + } + return this.to == other.to; + } } public List getExceptions() { @@ -377,7 +467,31 @@ public class Graph { allReachable.add(p); allReachable.addAll(r1); } + Comparator comparator = new Comparator() { + @Override + public int compare(PartCommon o1, PartCommon o2) { + int levelCompare = o2.level - o1.level; + if (levelCompare == 0) { + try { + if (o1.part.leadsTo(localData, Graph.this, code, o2.part, loops, throwStates, false)) { + return -1; + } + if (o2.part.leadsTo(localData, Graph.this, code, o1.part, loops, throwStates, false)) { + return 1; + } + return 0; + } catch (InterruptedException ex) { + //ignore + return 0; + } + //return o1.part.discoveredTime - o2.part.discoveredTime; + } else { + return levelCompare; + } + } + }; Set commonSet = new TreeSet<>(); + for (GraphPart r : allReachable) { if (loopContinues.contains(r)) { continue; @@ -496,7 +610,12 @@ public class Graph { return null; } if (debugPrintLoopList) { - System.err.println("selected " + pc.part); + StringBuilder sb = new StringBuilder(); + for (GraphPart p : parts) { + sb.append(" "); + sb.append(p.toString()); + } + System.err.println("most common part of" + sb.toString() + " is " + pc.part); } return pc.part; } @@ -504,7 +623,7 @@ public class Graph { return null; } - private class PartCommon implements Comparable { + private class PartCommon implements Comparable { public GraphPart part; public int level; @@ -518,7 +637,7 @@ public class Graph { public int compareTo(PartCommon o) { int ret = o.level - level; if (ret == 0) { - ret = part.start - o.part.start; + ret = part.closedTime - o.part.closedTime; } return ret; } @@ -637,6 +756,7 @@ public class Graph { //TODO: Make getPrecontinues faster getBackEdges(localData, loops, throwStates); + calculateClosedTime(loops); new GraphPrecontinueDetector().detectPrecontinues(heads, allParts, loops, throwStates); if (debugPrintLoopList) { @@ -1732,16 +1852,16 @@ public class Graph { getLoopsWalk(localData, next, loops, throwStates, stopPart, false, visited, level); } } else if (part.nextParts.size() == 1) { - + if (!isLoop || currentLoop == null) { part = part.nextParts.get(0); first = false; continue loopwalk; //to avoid recursion - } else { + } else { getLoopsWalk(localData, part.nextParts.get(0), loops, throwStates, stopPart, false, visited, level); } } - + if (isLoop && currentLoop != null) { GraphPart found; @@ -2350,12 +2470,12 @@ public class Graph { List iiOnTrue = ii.onTrue; List iiOnFalse = ii.onFalse; if ((ii.expression instanceof EqualsTypeItem) || (ii.expression instanceof NotEqualsTypeItem)) { - + if (ii.expression instanceof NotEqualsTypeItem) { iiOnTrue = ii.onFalse; iiOnFalse = ii.onTrue; } - + if (!iiOnFalse.isEmpty() && !iiOnTrue.isEmpty() && iiOnTrue.get(iiOnTrue.size() - 1) instanceof PushItem && iiOnTrue.get(iiOnTrue.size() - 1).value instanceof IntegerValueTypeItem) { @@ -2390,7 +2510,7 @@ public class Graph { toOnTrue = to.onFalse; toOnFalse = to.onTrue; } - + if (toOnTrue instanceof IntegerValueTypeItem) { int cpos = ((IntegerValueTypeItem) toOnTrue).intValue(); caseExpressionLeftSides.put(cpos, ((BinaryOpItem) to.expression).getLeftSide()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java index 79b386e7b..eb1f7062a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java @@ -72,6 +72,8 @@ public class GraphPart implements Serializable { public int discoveredTime; public int finishedTime; + + public int closedTime; public int order; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java index 9015f9d6a..36d7c8be5 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java @@ -330,6 +330,33 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT false); } + @Test + public void testSwitchMostCommon() { + decompileMethod("assembled", "testSwitchMostCommon", "var _loc2_:int = 0;\r\n" + + "var _loc4_:* = undefined;\r\n" + + "if(something == null)\r\n" + + "{\r\n" + + "switch(param1.keyCode)\r\n" + + "{\r\n" + + "case 89:\r\n" + + "_loc2_ = 7;\r\n" + + "break;\r\n" + + "case 112:\r\n" + + "return;\r\n" + + "}\r\n" + + "switch(param1.charCode)\r\n" + + "{\r\n" + + "case 49:\r\n" + + "return;\r\n" + + "case 69:\r\n" + + "return;\r\n" + + "case 113:\r\n" + + "_loc2_ = 1;\r\n" + + "}\r\n" + + "}\r\n", + false); + } + @Test public void testTryCatchLoopBreakLevel2() { decompileMethod("assembled", "testTryCatchLoopBreakLevel2", "var a:int = 0;\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index 8a98bfc70..572ec557b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -61,6 +61,22 @@ public class AS3Generator { for (ScriptPack pack : scriptPacks) { sortedPacks.put(pack.getClassPath().toRawString(), pack); } + s.append("/*\r\n" + + " * Copyright (C) 2010-2023 JPEXS, All rights reserved.\r\n" + + " * \r\n" + + " * This library is free software; you can redistribute it and/or\r\n" + + " * modify it under the terms of the GNU Lesser General Public\r\n" + + " * License as published by the Free Software Foundation; either\r\n" + + " * version 3.0 of the License, or (at your option) any later version.\r\n" + + " * \r\n" + + " * This library is distributed in the hope that it will be useful,\r\n" + + " * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n" + + " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r\n" + + " * Lesser General Public License for more details.\r\n" + + " * \r\n" + + " * You should have received a copy of the GNU Lesser General Public\r\n" + + " * License along with this library.\r\n" + + " */\r\n"); s.append("package com.jpexs.decompiler.flash.as3decompile;\r\n"); s.append("\r\n"); s.append("import com.jpexs.decompiler.flash.ActionScript3DecompileTestBase;\r\n"); @@ -142,12 +158,12 @@ public class AS3Generator { MethodBody b = abc.findBody(((TraitMethodGetterSetter) t).method_info); List ts = new ArrayList<>(); ts.add(abc.instance_info.get(classId).instance_traits); - + Configuration.autoDeobfuscate.set(clsName.toLowerCase().contains("obfus")); - + List callStack = new ArrayList<>(); callStack.add(b); - b.convert(callStack, swf.getAbcIndex(),new ConvertData(), "", ScriptExportMode.AS, false, ((TraitMethodGetterSetter) t).method_info, pack.scriptIndex, classId, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), ts, true, new HashSet<>()); + b.convert(callStack, swf.getAbcIndex(), new ConvertData(), "", ScriptExportMode.AS, false, ((TraitMethodGetterSetter) t).method_info, pack.scriptIndex, classId, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), ts, true, new HashSet<>()); b.toString(callStack, swf.getAbcIndex(), "", ScriptExportMode.AS, abc, null, src, new ArrayList<>(), new HashSet<>()); String[] srcs = src.toString().split("[\r\n]+"); for (int i = 0; i < srcs.length; i++) { @@ -179,7 +195,6 @@ public class AS3Generator { Configuration.simplifyExpressions.set(false); Configuration.displayDupInstructions.set(true); - useFile("ActionScript3ClassicDecompileTest", new String[][]{{"testdata/as3_new/bin/as3_new.flex.swf", "classic"}}, false); useFile("ActionScript3ClassicAirDecompileTest", new String[][]{{"testdata/as3_new/bin/as3_new.air.swf", "classic_air"}}, false); diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc index 12597eff223d23978fc3845dcbd54f854a1ef08d..dcd6565efed4473ea719b1a7f47ff30290849d3c 100644 GIT binary patch delta 3262 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 TTDvLuvODB`lTC?ooTmB@;^Y>e diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm index a5f471b2d..5f2dcc9d5 100644 --- a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm @@ -32,5 +32,6 @@ program #include "tests/TestActivationProps.script.asasm" #include "tests/TestSwapAssignment.script.asasm" #include "tests/TestMutatingSwitch.script.asasm" + #include "tests/TestSwitchMostCommon.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.class.asasm new file mode 100644 index 000000000..8a61aff46 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.class.asasm @@ -0,0 +1,145 @@ +class + refid "tests:TestSwitchMostCommon" + instance QName(PackageNamespace("tests"), "TestSwitchMostCommon") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestSwitchMostCommon") + iinit + refid "tests:TestSwitchMostCommon/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestSwitchMostCommon/instance/run" + param QName(PackageNamespace("flash.events"),"KeyboardEvent") + returns QName(PackageNamespace(""), "void") + body + maxstack 10 + localcount 8 + initscopedepth 10 + maxscopedepth 11 + + code + getlocal0 + pushscope + pushbyte 0 + setlocal2 + pushundefined + coerce_a + setlocal 4 + getlex Multiname("something",[PrivateNamespace("*","111"),PackageNamespace("","9369"),PrivateNamespace("*","412"),PackageInternalNs(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("flash.text"),PackageNamespace("flash.external"),PackageNamespace("it.gotoandplay.smartfoxserver"),Namespace("com.facebook.graph"),ProtectedNamespace("Game"),StaticProtectedNs("Game"),StaticProtectedNs("flash.display:MovieClip"),StaticProtectedNs("flash.display:Sprite"),StaticProtectedNs("flash.display:DisplayObjectContainer"),StaticProtectedNs("flash.display:InteractiveObject"),StaticProtectedNs("flash.display:DisplayObject"),StaticProtectedNs("flash.events:EventDispatcher")]) + pushnull + equals + iffalse ofs00b5 + jump ofs0026 + ofs0017: + label + pushbyte 7 + setlocal2 + jump ofs006f + ofs001f: + label + returnvoid + ofs0021: + label + jump ofs006f + ofs0026: + getlocal1 + getproperty Multiname("keyCode",[PrivateNamespace("*","111"),PackageNamespace("","9369"),PrivateNamespace("*","412"),PackageInternalNs(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("flash.text"),PackageNamespace("flash.external"),PackageNamespace("it.gotoandplay.smartfoxserver"),Namespace("com.facebook.graph"),ProtectedNamespace("Game"),StaticProtectedNs("Game"),StaticProtectedNs("flash.display:MovieClip"),StaticProtectedNs("flash.display:Sprite"),StaticProtectedNs("flash.display:DisplayObjectContainer"),StaticProtectedNs("flash.display:InteractiveObject"),StaticProtectedNs("flash.display:DisplayObject"),StaticProtectedNs("flash.events:EventDispatcher")]) + setlocal 5 + pushbyte 89 + getlocal 5 + ifstrictne ofs003a + pushbyte 0 + jump ofs004a + ofs003a: + pushbyte 112 + getlocal 5 + ifstrictne ofs0048 + pushbyte 1 + jump ofs004a + ofs0048: + pushbyte 2 + ofs004a: + kill 5 + lookupswitch ofs0021, [ofs0017, ofs001f, ofs0021] + ofs005a: + label + returnvoid + ofs005c: + label + returnvoid + ofs005e: + label + pushbyte 1 + setlocal2 + jump ofs006b + ofs0066: + label + jump ofs006b + ofs006b: + jump ofs00b5 + ofs006f: + getlocal1 + getproperty Multiname("charCode",[PrivateNamespace("*","111"),PackageNamespace("","9369"),PrivateNamespace("*","412"),PackageInternalNs(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("flash.text"),PackageNamespace("flash.external"),PackageNamespace("it.gotoandplay.smartfoxserver"),Namespace("com.facebook.graph"),ProtectedNamespace("Game"),StaticProtectedNs("Game"),StaticProtectedNs("flash.display:MovieClip"),StaticProtectedNs("flash.display:Sprite"),StaticProtectedNs("flash.display:DisplayObjectContainer"),StaticProtectedNs("flash.display:InteractiveObject"),StaticProtectedNs("flash.display:DisplayObject"),StaticProtectedNs("flash.events:EventDispatcher")]) + setlocal 5 + pushbyte 49 + getlocal 5 + ifstrictne ofs0084 + pushbyte 0 + jump ofs00a2 + ofs0084: + pushbyte 69 + getlocal 5 + ifstrictne ofs0092 + pushbyte 1 + jump ofs00a2 + ofs0092: + pushbyte 113 + getlocal 5 + ifstrictne ofs00a0 + pushbyte 2 + jump ofs00a2 + ofs00a0: + pushbyte 3 + ofs00a2: + kill 5 + lookupswitch ofs0066, [ofs005a, ofs005c, ofs005e, ofs0066] + ofs00b5: + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestSwitchMostCommon/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.script.asasm new file mode 100644 index 000000000..fc6bb12d9 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSwitchMostCommon.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestSwitchMostCommon/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestSwitchMostCommon", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestSwitchMostCommon"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestSwitchMostCommon" + popscope + initproperty QName(PackageNamespace("tests"), "TestSwitchMostCommon") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestSwitchMostCommon") + #include "TestSwitchMostCommon.class.asasm" + end ; trait +end ; script diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf b/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf index 72ba7628195de53d6f918d7f378874563e8a94ac..c02438b40dc7ee5f3140bf78e5bdc1879e91628b 100644 GIT binary patch literal 5027 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 literal 4701 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 diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 034dddaea..21c385f28 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -47,6 +47,7 @@ import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.helpers.CancellableWorker; +import com.jpexs.helpers.Helper; import com.jpexs.helpers.Reference; import java.awt.Point; import java.awt.event.MouseEvent; @@ -881,11 +882,15 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL protected Void doInBackground() throws Exception { if (decompileNeeded) { + //long timeBefore = System.currentTimeMillis(); View.execInEventDispatch(() -> { setText("// " + AppStrings.translate("work.decompiling") + "..."); }); HighlightedText htext = SWF.getCached(scriptLeaf); + //long timeAfter = System.currentTimeMillis(); + //long delta = timeAfter - timeBefore; + //System.err.println("Finished in " + Helper.formatTimeSec(delta)); View.execInEventDispatch(() -> { setSourceCompleted(scriptLeaf, htext); });