From 4c1e2ab841277f168e16ee2d39c9a23fa4f1d7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sat, 6 Jul 2013 09:28:48 +0200 Subject: [PATCH] Issue #137, #179 AS3 hasNext / foreach problem --- .../flash/abc/avm2/graph/AVM2Graph.java | 42 +++++++++++++++++++ .../decompiler/flash/gui/abc/TraitsList.java | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index d6c081fbf..7fbf718bb 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -58,6 +58,7 @@ import com.jpexs.decompiler.flash.graph.GraphTargetItem; import com.jpexs.decompiler.flash.graph.IfItem; import com.jpexs.decompiler.flash.graph.Loop; import com.jpexs.decompiler.flash.graph.LoopItem; +import com.jpexs.decompiler.flash.graph.NotItem; import com.jpexs.decompiler.flash.graph.SwitchItem; import com.jpexs.decompiler.flash.graph.WhileItem; import java.util.ArrayList; @@ -653,6 +654,47 @@ public class AVM2Graph extends Graph { if (((SetTypeTreeItem) list.get(i)).getValue() instanceof ExceptionTreeItem) { list.remove(i); i--; + continue; + } + } + if (list.get(i) instanceof IfItem) { + IfItem ifi = (IfItem) list.get(i); + if (((ifi.expression instanceof HasNextTreeItem) + || ((ifi.expression instanceof NotItem) + && (((NotItem) ifi.expression).getOriginal() instanceof HasNextTreeItem)))) { + HasNextTreeItem hnt = null; + List body = new ArrayList<>(); + List nextbody = new ArrayList<>(); + if (ifi.expression instanceof NotItem) { + hnt = (HasNextTreeItem) ((NotItem) ifi.expression).getOriginal(); + body.addAll(ifi.onFalse); + for (int j = i + 1; j < list.size();) { + body.add(list.remove(i + 1)); + } + nextbody = ifi.onTrue; + } else { + hnt = (HasNextTreeItem) ifi.expression; + body = ifi.onTrue; + nextbody = ifi.onFalse; + } + if (!body.isEmpty()) { + if (body.get(0) instanceof SetTypeTreeItem) { + SetTypeTreeItem sti = (SetTypeTreeItem) body.remove(0); + GraphTargetItem gti = sti.getValue().getNotCoerced(); + GraphTargetItem repl = null; + + if (gti instanceof NextValueTreeItem) { + repl = new ForEachInTreeItem(ifi.src, new Loop(0, null, null), new InTreeItem(null, sti.getObject(), hnt.collection), body); + } else if (gti instanceof NextNameTreeItem) { + repl = new ForInTreeItem(ifi.src, new Loop(0, null, null), new InTreeItem(null, sti.getObject(), hnt.collection), body); + } + if (repl != null) { + list.remove(i); + list.add(i, repl); + list.addAll(i + 1, nextbody); + } + } + } } } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/TraitsList.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/TraitsList.java index f557d1ae8..c030db3f6 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/TraitsList.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/TraitsList.java @@ -59,7 +59,7 @@ public class TraitsList extends JList implements ListSelectionListener { @SuppressWarnings("unchecked") public void setClassIndex(int classIndex, int scriptIndex) { - if(classIndex>=abc.instance_info.length){ + if (classIndex >= abc.instance_info.length) { return; } this.classIndex = classIndex;