From 787d87fd25584b783f9694d4ed095e8c5e287c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Tue, 12 Mar 2013 06:16:56 +0100 Subject: [PATCH] Issue #40, AS1/2 For..in decompilation --- .../decompiler/flash/action/ActionGraph.java | 7 +- .../action/treemodel/DefineLocalTreeItem.java | 7 +- .../action/treemodel/SetMemberTreeItem.java | 2 +- .../action/treemodel/SetPropertyTreeItem.java | 2 +- .../action/treemodel/SetTypeTreeItem.java | 4 +- .../action/treemodel/SetVariableTreeItem.java | 2 +- .../treemodel/StoreRegisterTreeItem.java | 2 +- .../treemodel/clauses/ForEachTreeItem.java | 73 ------------------- .../treemodel/clauses/ForInTreeItem.java | 6 +- 9 files changed, 21 insertions(+), 84 deletions(-) delete mode 100644 trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForEachTreeItem.java diff --git a/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 032d5b090..709dbe6ae 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.action.swf4.Null; import com.jpexs.decompiler.flash.action.swf5.ActionEquals2; import com.jpexs.decompiler.flash.action.treemodel.DirectValueTreeItem; import com.jpexs.decompiler.flash.action.treemodel.EnumerateTreeItem; +import com.jpexs.decompiler.flash.action.treemodel.SetTypeTreeItem; import com.jpexs.decompiler.flash.action.treemodel.StoreRegisterTreeItem; import com.jpexs.decompiler.flash.action.treemodel.clauses.ForInTreeItem; import com.jpexs.decompiler.flash.action.treemodel.operations.NeqTreeItem; @@ -79,8 +80,8 @@ public class ActionGraph extends Graph { GraphTargetItem it = list.get(t); if (it instanceof WhileItem) { WhileItem wi = (WhileItem) it; - if ((!wi.commands.isEmpty()) && (wi.commands.get(0) instanceof StoreRegisterTreeItem)) { - StoreRegisterTreeItem srt = (StoreRegisterTreeItem) wi.commands.get(0); + if ((!wi.commands.isEmpty()) && (wi.commands.get(0) instanceof SetTypeTreeItem)) { + SetTypeTreeItem sti = (SetTypeTreeItem) wi.commands.get(0); if (wi.expression instanceof NeqTreeItem) { NeqTreeItem ne = (NeqTreeItem) wi.expression; if (ne.rightSide instanceof DirectValueTreeItem) { @@ -90,7 +91,7 @@ public class ActionGraph extends Graph { EnumerateTreeItem eti = (EnumerateTreeItem) ne.leftSide; list.remove(t); wi.commands.remove(0); - list.add(t, new ForInTreeItem(null, wi.loop, new DirectValueTreeItem(null, 0, srt.register, new ArrayList()), eti.object, wi.commands)); + list.add(t, new ForInTreeItem(null, wi.loop, sti.getObject(), eti.object, wi.commands)); } } } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/DefineLocalTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/DefineLocalTreeItem.java index 7ccbb7387..467b3eb54 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/DefineLocalTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/DefineLocalTreeItem.java @@ -20,7 +20,7 @@ import com.jpexs.decompiler.flash.graph.GraphSourceItem; import com.jpexs.decompiler.flash.graph.GraphTargetItem; import java.util.List; -public class DefineLocalTreeItem extends TreeItem { +public class DefineLocalTreeItem extends TreeItem implements SetTypeTreeItem{ public GraphTargetItem name; public GraphTargetItem value; @@ -46,4 +46,9 @@ public class DefineLocalTreeItem extends TreeItem { ret.addAll(name.getNeededSources()); return ret; } + + @Override + public GraphTargetItem getObject() { + return new DefineLocalTreeItem(src, name, null); + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetMemberTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetMemberTreeItem.java index dbddf62db..52e8d7c77 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetMemberTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetMemberTreeItem.java @@ -39,7 +39,7 @@ public class SetMemberTreeItem extends TreeItem implements SetTypeTreeItem { } @Override - public TreeItem getObject() { + public GraphTargetItem getObject() { return new GetMemberTreeItem(src, object, objectName); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetPropertyTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetPropertyTreeItem.java index e54235881..3b8cac2cb 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetPropertyTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetPropertyTreeItem.java @@ -43,7 +43,7 @@ public class SetPropertyTreeItem extends TreeItem implements SetTypeTreeItem { } @Override - public TreeItem getObject() { + public GraphTargetItem getObject() { return new GetPropertyTreeItem(src, target, propertyIndex); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetTypeTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetTypeTreeItem.java index ab177f875..c2f63df54 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetTypeTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetTypeTreeItem.java @@ -16,11 +16,13 @@ */ package com.jpexs.decompiler.flash.action.treemodel; +import com.jpexs.decompiler.flash.graph.GraphTargetItem; + /** * * @author JPEXS */ public interface SetTypeTreeItem { - public TreeItem getObject(); + public GraphTargetItem getObject(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetVariableTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetVariableTreeItem.java index ea30b5903..1e32e1817 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetVariableTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/SetVariableTreeItem.java @@ -37,7 +37,7 @@ public class SetVariableTreeItem extends TreeItem implements SetTypeTreeItem { } @Override - public TreeItem getObject() { + public GraphTargetItem getObject() { return new GetVariableTreeItem(src, value); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/StoreRegisterTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/StoreRegisterTreeItem.java index a75c2548f..7739d316d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/StoreRegisterTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/StoreRegisterTreeItem.java @@ -38,7 +38,7 @@ public class StoreRegisterTreeItem extends TreeItem implements SetTypeTreeItem { } @Override - public TreeItem getObject() { + public GraphTargetItem getObject() { return new DirectValueTreeItem(src, -1, register, null); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForEachTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForEachTreeItem.java deleted file mode 100644 index 3a275ef0e..000000000 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForEachTreeItem.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2010-2013 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.action.treemodel.clauses; - -import com.jpexs.decompiler.flash.action.Action; -import com.jpexs.decompiler.flash.action.treemodel.ConstantPool; -import com.jpexs.decompiler.flash.action.treemodel.EachTreeItem; -import com.jpexs.decompiler.flash.graph.Block; -import com.jpexs.decompiler.flash.graph.ContinueItem; -import com.jpexs.decompiler.flash.graph.GraphTargetItem; -import com.jpexs.decompiler.flash.graph.Loop; -import java.util.ArrayList; -import java.util.List; - -public class ForEachTreeItem extends LoopTreeItem implements Block { - - public EachTreeItem expression; - public List commands; - - @Override - public List> getSubs() { - List> ret = new ArrayList>(); - ret.add(commands); - return ret; - } - - public ForEachTreeItem(Action instruction, Loop loop, EachTreeItem expression, List commands) { - super(instruction, loop); - this.expression = expression; - this.commands = commands; - } - - @Override - public String toString(ConstantPool constants) { - String ret = ""; - ret += "loop" + loop.id + ":\r\n"; - ret += hilight("for ") + expression.toString(constants) + "\r\n{\r\n"; - for (GraphTargetItem ti : commands) { - ret += ti.toString(constants) + "\r\n"; - } - ret += hilight("}") + "\r\n"; - ret += ":loop" + loop.id; - return ret; - } - - @Override - public List getContinues() { - List ret = new ArrayList(); - for (GraphTargetItem ti : commands) { - if (ti instanceof ContinueItem) { - ret.add((ContinueItem) ti); - } - if (ti instanceof Block) { - ret.addAll(((Block) ti).getContinues()); - } - } - return ret; - } -} diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForInTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForInTreeItem.java index 7ad3c6e4b..c99061795 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForInTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/clauses/ForInTreeItem.java @@ -17,7 +17,9 @@ package com.jpexs.decompiler.flash.action.treemodel.clauses; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; import com.jpexs.decompiler.flash.action.treemodel.ConstantPool; +import com.jpexs.decompiler.flash.action.treemodel.DirectValueTreeItem; import com.jpexs.decompiler.flash.graph.Block; import com.jpexs.decompiler.flash.graph.ContinueItem; import com.jpexs.decompiler.flash.graph.GraphTargetItem; @@ -49,9 +51,9 @@ public class ForInTreeItem extends LoopTreeItem implements Block { public String toString(ConstantPool constants) { String ret = ""; ret += "loop" + loop.id + ":\r\n"; - ret += hilight("for(") + stripQuotes(variableName) + " in " + enumVariable.toString(constants) + ")\r\n{\r\n"; + ret += hilight("for(") + ((variableName instanceof DirectValueTreeItem)&&(((DirectValueTreeItem)variableName).value instanceof RegisterNumber)?"var ":"")+stripQuotes(variableName) + " in " + enumVariable.toString(constants) + ")\r\n{\r\n"; for (GraphTargetItem ti : commands) { - ret += ti.toString(constants) + "\r\n"; + ret += ti.toStringSemicoloned(constants) + "\r\n"; } ret += hilight("}") + "\r\n"; ret += ":loop" + loop.id;