diff --git a/trunk/src/com/jpexs/decompiler/flash/action/Action.java b/trunk/src/com/jpexs/decompiler/flash/action/Action.java index f69a55b9f..0782c3757 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/Action.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/Action.java @@ -1010,15 +1010,15 @@ public class Action implements GraphSourceItem { } if ((parts.get(pos) instanceof SetMemberTreeItem) && ((SetMemberTreeItem) parts.get(pos)).object instanceof SetTypeTreeItem) { //int tmp = classReg; - SetMemberTreeItem smt=(SetMemberTreeItem)parts.get(pos); + SetMemberTreeItem smt = (SetMemberTreeItem) parts.get(pos); SetTypeTreeItem stt = (SetTypeTreeItem) ((SetMemberTreeItem) parts.get(pos)).object; instanceReg = stt.getTempRegister(); - + parts.remove(pos); - parts.add(pos+0, new StoreRegisterTreeItem(null, new RegisterNumber(instanceReg), stt.getValue(), false)); - parts.add(pos+1, (GraphTargetItem) stt); + parts.add(pos + 0, new StoreRegisterTreeItem(null, new RegisterNumber(instanceReg), stt.getValue(), false)); + parts.add(pos + 1, (GraphTargetItem) stt); smt.object = new DirectValueTreeItem(null, 0, new RegisterNumber(instanceReg), null); - parts.add(pos+2, smt); + parts.add(pos + 2, smt); } if (parts.get(pos) instanceof StoreRegisterTreeItem) { diff --git a/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 4c236d581..7e6e11748 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -146,7 +146,9 @@ public class ActionGraph extends Graph { int pos = 0; StrictEqTreeItem set = (StrictEqTreeItem) stack.pop(); caseValuesMap.put(pos, set.rightSide); - + if (set.leftSide instanceof StoreRegisterTreeItem) { + switchedObject = ((StoreRegisterTreeItem) set.leftSide).value; + } //GraphPart switchLoc = part.nextParts.get(1).nextParts.get(0); List caseBodyParts = new ArrayList(); caseBodyParts.add(part.nextParts.get(0)); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index 018f58619..4a017a31a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -193,7 +193,7 @@ public class ActionPush extends Action { case ASMParsedSymbol.TYPE_COMMENT: break; default: - throw new ParseException("Arguments expected, "+symb.type+" "+symb.value+" found", lexer.yyline()); + throw new ParseException("Arguments expected, " + symb.type + " " + symb.value + " found", lexer.yyline()); } @@ -290,34 +290,34 @@ public class ActionPush extends Action { } } /*if (o instanceof RegisterNumber) { - if (regNames.containsKey(((RegisterNumber) o).number)) { - ((RegisterNumber) o).name = regNames.get(((RegisterNumber) o).number); - } else if (output.size() >= 2) { //chained assignments:, ignore for class prototype assignment - GraphTargetItem last = output.get(output.size() - 1); - GraphTargetItem prev = output.get(output.size() - 2); - if (last instanceof SetTypeTreeItem) { - if (prev instanceof StoreRegisterTreeItem) { - StoreRegisterTreeItem str = (StoreRegisterTreeItem) prev; - if (str.register.number == ((RegisterNumber) o).number) { - SetTypeTreeItem stt = (SetTypeTreeItem) last; - stt.setTempRegister(((RegisterNumber) o).number); - if ((stt.getValue() instanceof IncrementTreeItem) && (((IncrementTreeItem) stt.getValue()).object.equals(stt.getObject()))) { - stack.push(new PreIncrementTreeItem(this, stt.getObject())); - } else if ((stt.getValue() instanceof DecrementTreeItem) && (((DecrementTreeItem) stt.getValue()).object.equals(stt.getObject()))) { - stack.push(new PreDecrementTreeItem(this, stt.getObject())); - } else { - //stack.push(last); - continue; - } - output.remove(output.size() - 1); - output.remove(output.size() - 1); - pos++; - continue; - } - } - } - } - }*/ + if (regNames.containsKey(((RegisterNumber) o).number)) { + ((RegisterNumber) o).name = regNames.get(((RegisterNumber) o).number); + } else if (output.size() >= 2) { //chained assignments:, ignore for class prototype assignment + GraphTargetItem last = output.get(output.size() - 1); + GraphTargetItem prev = output.get(output.size() - 2); + if (last instanceof SetTypeTreeItem) { + if (prev instanceof StoreRegisterTreeItem) { + StoreRegisterTreeItem str = (StoreRegisterTreeItem) prev; + if (str.register.number == ((RegisterNumber) o).number) { + SetTypeTreeItem stt = (SetTypeTreeItem) last; + stt.setTempRegister(((RegisterNumber) o).number); + if ((stt.getValue() instanceof IncrementTreeItem) && (((IncrementTreeItem) stt.getValue()).object.equals(stt.getObject()))) { + stack.push(new PreIncrementTreeItem(this, stt.getObject())); + } else if ((stt.getValue() instanceof DecrementTreeItem) && (((DecrementTreeItem) stt.getValue()).object.equals(stt.getObject()))) { + stack.push(new PreDecrementTreeItem(this, stt.getObject())); + } else { + //stack.push(last); + continue; + } + output.remove(output.size() - 1); + output.remove(output.size() - 1); + pos++; + continue; + } + } + } + } + }*/ DirectValueTreeItem dvt = new DirectValueTreeItem(this, pos, o, constantPool); stack.push(dvt); if (o instanceof RegisterNumber) { diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java index 5b6c098eb..d5fe374d7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java @@ -71,8 +71,8 @@ public class ActionSetProperty extends Action { } } } - if(value instanceof StoreRegisterTreeItem){ - ((StoreRegisterTreeItem)value).define=false; + if (value instanceof StoreRegisterTreeItem) { + ((StoreRegisterTreeItem) value).define = false; } output.add(new SetPropertyTreeItem(this, target, indexInt, value)); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java index 964168f39..dbce2bd95 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java @@ -83,8 +83,8 @@ public class ActionSetVariable extends Action { } } } - if(value instanceof StoreRegisterTreeItem){ - ((StoreRegisterTreeItem)value).define=false; + if (value instanceof StoreRegisterTreeItem) { + ((StoreRegisterTreeItem) value).define = false; } SetVariableTreeItem svt = new SetVariableTreeItem(this, name, value); output.add(svt); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java index 0f66345e1..149b4100b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java @@ -86,8 +86,8 @@ public class ActionSetMember extends Action { } } } - if(value instanceof StoreRegisterTreeItem){ - ((StoreRegisterTreeItem)value).define=false; + if (value instanceof StoreRegisterTreeItem) { + ((StoreRegisterTreeItem) value).define = false; } output.add(new SetMemberTreeItem(this, object, memberName, value)); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java index 00da133c6..2fe386cc2 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java @@ -78,16 +78,16 @@ public class ActionStoreRegister extends Action { item.moreSrc.add(new GraphSourceItemPos(this, 0)); boolean define = !variables.containsKey("__register" + registerNumber); variables.put("__register" + registerNumber, item); - if(item instanceof DirectValueTreeItem){ - if(((DirectValueTreeItem)item).value instanceof RegisterNumber){ - if(((RegisterNumber)((DirectValueTreeItem)item).value).number==registerNumber){ + if (item instanceof DirectValueTreeItem) { + if (((DirectValueTreeItem) item).value instanceof RegisterNumber) { + if (((RegisterNumber) ((DirectValueTreeItem) item).value).number == registerNumber) { stack.push(item); return; } } } - if(item instanceof StoreRegisterTreeItem){ - if(((StoreRegisterTreeItem)item).register.number==registerNumber){ + if (item instanceof StoreRegisterTreeItem) { + if (((StoreRegisterTreeItem) item).register.number == registerNumber) { stack.push(item); return; } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostDecrementTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostDecrementTreeItem.java index 71b110b64..88471e25c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostDecrementTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostDecrementTreeItem.java @@ -16,12 +16,14 @@ */ package com.jpexs.decompiler.flash.action.treemodel; +import com.jpexs.decompiler.flash.action.treemodel.operations.SubtractTreeItem; import com.jpexs.decompiler.flash.graph.GraphSourceItem; import com.jpexs.decompiler.flash.graph.GraphTargetItem; -public class PostDecrementTreeItem extends TreeItem { +public class PostDecrementTreeItem extends TreeItem implements SetTypeTreeItem { public GraphTargetItem object; + private int tempRegister = -1; public PostDecrementTreeItem(GraphSourceItem instruction, GraphTargetItem object) { super(instruction, PRECEDENCE_POSTFIX); @@ -37,4 +39,29 @@ public class PostDecrementTreeItem extends TreeItem { public boolean hasSideEffect() { return true; } + + @Override + public GraphTargetItem getObject() { + return object; + } + + @Override + public GraphTargetItem getValue() { + return new SubtractTreeItem(null, object, new DirectValueTreeItem(null, 0, new Long(1), null)); + } + + @Override + public void setTempRegister(int regIndex) { + tempRegister = regIndex; + } + + @Override + public int getTempRegister() { + return tempRegister; + } + + @Override + public void setValue(GraphTargetItem value) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostIncrementTreeItem.java b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostIncrementTreeItem.java index ea59fed1a..1cefef6c2 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostIncrementTreeItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/treemodel/PostIncrementTreeItem.java @@ -16,12 +16,14 @@ */ package com.jpexs.decompiler.flash.action.treemodel; +import com.jpexs.decompiler.flash.action.treemodel.operations.AddTreeItem; import com.jpexs.decompiler.flash.graph.GraphSourceItem; import com.jpexs.decompiler.flash.graph.GraphTargetItem; -public class PostIncrementTreeItem extends TreeItem { +public class PostIncrementTreeItem extends TreeItem implements SetTypeTreeItem { public GraphTargetItem object; + private int tempRegister = -1; public PostIncrementTreeItem(GraphSourceItem instruction, GraphTargetItem object) { super(instruction, PRECEDENCE_POSTFIX); @@ -37,4 +39,29 @@ public class PostIncrementTreeItem extends TreeItem { public boolean hasSideEffect() { return true; } + + @Override + public GraphTargetItem getObject() { + return object; + } + + @Override + public GraphTargetItem getValue() { + return new AddTreeItem(null, object, new DirectValueTreeItem(null, 0, new Long(1), null)); + } + + @Override + public void setTempRegister(int regIndex) { + tempRegister = regIndex; + } + + @Override + public int getTempRegister() { + return tempRegister; + } + + @Override + public void setValue(GraphTargetItem value) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java b/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java index cff99c66c..bdf49eb61 100644 --- a/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java +++ b/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java @@ -1014,8 +1014,9 @@ public class Graph { body = printGraph(prepareBranchLocalData(localData), stack, allParts, part, next, stopPart, loops, forFinalCommands); } retw.addAll(body); - - retx.add(new WhileItem(null, whileTrueLoop, new TrueItem(null), retw)); + List tr = new ArrayList(); + tr.add(new TrueItem(null)); + retx.add(new WhileItem(null, whileTrueLoop, tr, retw)); next = null; } else { retx.add(new IfItem(null, expr, onTrue, onFalse)); @@ -1105,11 +1106,19 @@ public class Graph { loopBody.remove(loopBody.size() - 1); } } - ret.add(new DoWhileItem(null, currentLoop, loopBody, expr)); - ret.addAll(addIf); + if ((!addIf.isEmpty()) && (addIf.get(addIf.size() - 1) instanceof ContinueItem) && (((ContinueItem) addIf.get(addIf.size() - 1)).loopId == currentLoop.id)) { + loopBody.add(expr); + checkContinueAtTheEnd(addIf, currentLoop); + ret.add(new WhileItem(null, currentLoop, loopBody, addIf)); + } else { + ret.add(new DoWhileItem(null, currentLoop, loopBody, expr)); + ret.addAll(addIf); + } } else { - ret.add(new WhileItem(null, currentLoop, expr, loopBody)); + List ex = new ArrayList(); + ex.add(expr); + ret.add(new WhileItem(null, currentLoop, ex, loopBody)); } } } diff --git a/trunk/src/com/jpexs/decompiler/flash/graph/WhileItem.java b/trunk/src/com/jpexs/decompiler/flash/graph/WhileItem.java index a695e3f85..a81ccc47c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/graph/WhileItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/graph/WhileItem.java @@ -21,7 +21,7 @@ import java.util.List; public class WhileItem extends LoopItem implements Block { - public GraphTargetItem expression; + public List expression; public List commands; @Override @@ -31,7 +31,7 @@ public class WhileItem extends LoopItem implements Block { return ret; } - public WhileItem(GraphSourceItem src, Loop loop, GraphTargetItem expression, List commands) { + public WhileItem(GraphSourceItem src, Loop loop, List expression, List commands) { super(src, loop); this.expression = expression; this.commands = commands; @@ -41,7 +41,17 @@ public class WhileItem extends LoopItem implements Block { public String toString(List localData) { String ret = ""; ret += "loop" + loop.id + ":\r\n"; - ret += hilight("while(") + (expression == null ? "null" : expression.toString(localData)) + hilight(")") + "\r\n{\r\n"; + String expStr = ""; + for (int i = 0; i < expression.size(); i++) { + if (expression.get(i).isEmpty()) { + continue; + } + if (i > 0) { + expStr += ", "; + } + expStr += expression.get(i).toString(localData); + } + ret += hilight("while(") + expStr + hilight(")") + "\r\n{\r\n"; for (GraphTargetItem ti : commands) { if (!ti.isEmpty()) { ret += ti.toStringSemicoloned(localData) + "\r\n";