diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cc4e3174..08b1d797b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file. - AS3 - XML - get descendants operator parenthesis - Switch decompilation in some corner cases - [#1894] Switches vs loops decompilation (now with two passes) +- [#1894] AS3 - XML filters in some corner cases ## [17.0.2] - 2022-11-22 ### Fixed 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 637333a29..6472ee3bb 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 @@ -1656,6 +1656,9 @@ public class AVM2Graph extends Graph { @Override protected GraphTargetItem checkLoop(List output, LoopItem loopItem, BaseLocalData localData, List loops, List throwStates, TranslateStack stack) { + if (debugDoNotProcess) { + return loopItem; + } AVM2LocalData aLocalData = (AVM2LocalData) localData; if (loopItem instanceof WhileItem) { WhileItem w = (WhileItem) loopItem; @@ -1775,6 +1778,8 @@ public class AVM2Graph extends Graph { regIndex = setLocal.regIndex; } } + } else if (output.get(i) instanceof PushItem) { + //ignored } else { break; } @@ -1795,6 +1800,8 @@ public class AVM2Graph extends Graph { setLocalIp = avm2code.adr2pos(setLocal.getSrc().getAddress()); break; } + } else if (output.get(i) instanceof PushItem){ + //allowed } else { break; } @@ -1818,11 +1825,21 @@ public class AVM2Graph extends Graph { if (setLocal.regIndex == regIndex) { setLocal.value = filter; } + } else if (output.get(i) instanceof PushItem) { + //ignored } else { break; } } + for (int i = output.size() - 2 /*last is loop*/; i >= 0; i--) { + if (output.get(i) instanceof PushItem) { + PushItem pu = (PushItem)output.remove(i); + stack.push(pu.value); + } else { + break; + } + } if (usages.isEmpty()) { output.add(filter); } else { @@ -2010,7 +2027,9 @@ public class AVM2Graph extends Graph { @Override protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { - + if (debugDoNotProcess) { + return; + } if (level == 0) { if (!list.isEmpty()) { if (list.get(list.size() - 1) instanceof ReturnVoidAVM2Item) { 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 ad98a3ac1..905d8e119 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -90,6 +90,7 @@ public class Graph { private boolean debugPrintLoopList = false; private boolean debugGetLoops = false; private boolean debugPrintGraph = false; + protected boolean debugDoNotProcess = false; private static final Logger logger = Logger.getLogger(Graph.class.getName()); @@ -913,6 +914,9 @@ public class Graph { } private void finalProcessAll(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { + if (debugDoNotProcess) { + return; + } finalProcess(list, level, localData, path); for (GraphTargetItem item : list) { if (item instanceof Block) { @@ -1191,6 +1195,9 @@ public class Graph { } protected void processIfs(List list) { + if (debugDoNotProcess) { + return; + } for (int i = 0; i < list.size(); i++) { GraphTargetItem item = list.get(i); if ((item instanceof LoopItem) && (item instanceof Block)) { 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 ab3d56ca8..482b490b7 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 @@ -1875,6 +1875,9 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var all:String = myXML.@*.toXMLString();\r\n" + "k = myXML.book;\r\n" + "k = myXML.book.(@isbn == \"12345\");\r\n" + + "var list:Vector. = new Vector.();\r\n" + + "var i:int = Math.random();\r\n" + + "list[i] = myXML.book.(@isbn == i + 1);\r\n" + "var g:XML = ");