From e908703b95b6c293cc9cfebf52b806c508311e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 30 Mar 2014 22:34:38 +0200 Subject: [PATCH] AS3 parser - increment, decrement, body stats fix --- .../decompiler/flash/abc/avm2/AVM2Code.java | 4 +- .../instructions/other/FindPropertyIns.java | 5 +- .../other/FindPropertyStrictIns.java | 5 +- .../abc/avm2/model/IntegerValueAVM2Item.java | 2 +- .../abc/avm2/model/PostDecrementAVM2Item.java | 8 +- .../abc/avm2/model/PostIncrementAVM2Item.java | 10 +- .../operations/PreDecrementAVM2Item.java | 10 +- .../operations/PreIncrementAVM2Item.java | 8 +- .../parser/script/AVM2SourceGenerator.java | 2 - .../parser/script/ActionScriptParser.java | 2 +- .../parser/script/AssignableAVM2Item.java | 91 +++++- .../abc/avm2/parser/script/NameAVM2Item.java | 270 +++++++----------- .../avm2/parser/script/PropertyAVM2Item.java | 123 ++++---- .../flash/abc/avm2/parser/script/todo.txt | 4 +- 14 files changed, 284 insertions(+), 260 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 317bce2e1..7a4969fd1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1859,14 +1859,16 @@ public class AVM2Code implements Serializable { int stackDelta = ins.definition.getStackDelta(ins, abc); stack += stackDelta; int scopeDelta = ins.definition.getScopeStackDelta(ins, abc); - //System.out.println(""+ins+" stack:"+(stackDelta>0?"+"+stackDelta:stackDelta)+" scope:"+(scopeDelta>0?"+"+scopeDelta:scopeDelta)); scope += scopeDelta; + if (stack > stats.maxstack) { stats.maxstack = stack; } if (scope > stats.maxscope) { stats.maxscope = scope; } + //System.out.println(""+ins+" deltaStack:"+(stackDelta>0?"+"+stackDelta:stackDelta)+" deltaScope:"+(scopeDelta>0?"+"+scopeDelta:scopeDelta)+" stack:"+stack+" scope:"+scope); + if ((ins.definition instanceof DXNSIns) || (ins.definition instanceof DXNSLateIns)) { stats.has_set_dxns = true; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyIns.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyIns.java index fcb9e0a20..76598d5b7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyIns.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyIns.java @@ -56,13 +56,14 @@ public class FindPropertyIns extends InstructionDefinition { @Override public int getStackDelta(AVM2Instruction ins, ABC abc) { int ret = 1; - int multinameIndex = ins.operands[0]; + //FLEX does not calculate following: + /*int multinameIndex = ins.operands[0]; if (abc.constants.getMultiname(multinameIndex).needsName()) { ret--; } if (abc.constants.getMultiname(multinameIndex).needsNs()) { ret--; - } + }*/ return ret; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyStrictIns.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyStrictIns.java index 3da8ee078..8f8fdb64d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyStrictIns.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/FindPropertyStrictIns.java @@ -55,13 +55,14 @@ public class FindPropertyStrictIns extends InstructionDefinition { @Override public int getStackDelta(AVM2Instruction ins, ABC abc) { int ret = 1; - int multinameIndex = ins.operands[0]; + //FLEX does not calculate following: + /*int multinameIndex = ins.operands[0]; if (abc.constants.getMultiname(multinameIndex).needsName()) { ret--; } if (abc.constants.getMultiname(multinameIndex).needsNs()) { ret--; - } + }*/ return ret; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java index e11396b5a..77068ab76 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java @@ -71,7 +71,7 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return new TypeItem("int"); } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostDecrementAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostDecrementAVM2Item.java index d0b00256d..0658737dc 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostDecrementAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostDecrementAVM2Item.java @@ -63,9 +63,7 @@ public class PostDecrementAVM2Item extends AVM2Item implements AssignmentAVM2Ite @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) { if (object instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator, - new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0]) - ), true); + return ((AssignableAVM2Item) object).toSourceChange(localData, generator, true, true, true); } return new ArrayList<>(); //? } @@ -73,9 +71,7 @@ public class PostDecrementAVM2Item extends AVM2Item implements AssignmentAVM2Ite @Override public List toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) { if (object instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator, - new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0]) - ), false); + return ((AssignableAVM2Item) object).toSourceChange(localData, generator, true, true, false); } return new ArrayList<>(); //? } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostIncrementAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostIncrementAVM2Item.java index 03ac078cf..9f06957f5 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostIncrementAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/PostIncrementAVM2Item.java @@ -69,12 +69,10 @@ public class PostIncrementAVM2Item extends AVM2Item implements AssignmentAVM2Ite return true; } - @Override + @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) { if (object instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator, - new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0]) - ), true); + return ((AssignableAVM2Item) object).toSourceChange(localData, generator, true, false, true); } return new ArrayList<>(); //? } @@ -82,9 +80,7 @@ public class PostIncrementAVM2Item extends AVM2Item implements AssignmentAVM2Ite @Override public List toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) { if (object instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator, - new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0]) - ), false); + return ((AssignableAVM2Item) object).toSourceChange(localData, generator, true, false, false); } return new ArrayList<>(); //? } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java index 336ff61f5..715cb68fd 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java @@ -43,9 +43,7 @@ public class PreDecrementAVM2Item extends UnaryOpItem implements AssignmentAVM2I @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) { if (value instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator, - new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0]) - ), null, true); + return ((AssignableAVM2Item) value).toSourceChange(localData, generator, false, true, true); } return new ArrayList<>(); //? } @@ -53,13 +51,11 @@ public class PreDecrementAVM2Item extends UnaryOpItem implements AssignmentAVM2I @Override public List toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) { if (value instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator, - new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0]) - ), null, false); + return ((AssignableAVM2Item) value).toSourceChange(localData, generator, false, true, false); } return new ArrayList<>(); //? } - + @Override public GraphTargetItem returnType() { return value.returnType(); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java index 6968ed4c8..421696853 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java @@ -41,9 +41,7 @@ public class PreIncrementAVM2Item extends UnaryOpItem { @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) { if (value instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator, - new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0]) - ), null, true); + return ((AssignableAVM2Item) value).toSourceChange(localData, generator, false, false, true); } return new ArrayList<>(); //? } @@ -51,9 +49,7 @@ public class PreIncrementAVM2Item extends UnaryOpItem { @Override public List toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) { if (value instanceof AssignableAVM2Item) { - return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator, - new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0]) - ), null, false); + return ((AssignableAVM2Item) value).toSourceChange(localData, generator, false, false, false); } return new ArrayList<>(); //? } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 9b4668c39..4a57e4dc0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -1081,9 +1081,7 @@ public class AVM2SourceGenerator implements SourceGenerator { } mb.code.code.add(ins(new ReturnVoidIns())); - System.out.println("---------------script---------------"); mb.autoFillStats(abc, documentClass ? 1 : 0); - System.out.println("/--------------script---------------"); abc.addMethodBody(mb); si.init_index = mb.method_info; generateTraitsPhase2(traitScope, pkg, null, null, false, localData, commands, si.traits, traitArr); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java index dd480f279..423bcaee3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java @@ -118,7 +118,7 @@ import java.util.logging.Logger; public class ActionScriptParser { private long uniqLast = 0; - private final boolean debugMode = true; + private final boolean debugMode = false; private static final String AS3_NAMESPACE = "http://adobe.com/AS3/2006/builtin"; private ABC abc; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java index 72ba1ff12..eff0a0b09 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java @@ -17,6 +17,19 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal0Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal1Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal2Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal3Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocalIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.KillIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal0Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal1Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal2Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal3Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.DupIns; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -41,7 +54,7 @@ public abstract class AssignableAVM2Item extends AVM2Item { this.assignedValue = storeValue; } - public abstract List toSourceChange(SourceGeneratorLocalData localData, SourceGenerator generator, List pre, List post, boolean needsReturn); + public abstract List toSourceChange(SourceGeneratorLocalData localData, SourceGenerator generator, boolean post,boolean decrement, boolean needsReturn); public GraphTargetItem getAssignedValue() { return assignedValue; @@ -51,4 +64,80 @@ public abstract class AssignableAVM2Item extends AVM2Item { this.assignedValue = storeValue; } + protected List dupSetTemp(SourceGeneratorLocalData localData, SourceGenerator generator, Reference register) { + register.setVal(getFreeRegister(localData, generator)); + List ret = new ArrayList<>(); + ret.add(ins(new DupIns())); + ret.add(generateSetLoc(register.getVal())); + return ret; + } + + protected List setTemp(SourceGeneratorLocalData localData, SourceGenerator generator, Reference register) { + register.setVal(getFreeRegister(localData, generator)); + List ret = new ArrayList<>(); + ret.add(generateSetLoc(register.getVal())); + return ret; + } + + protected List getTemp(SourceGeneratorLocalData localData, SourceGenerator generator, Reference register) { + if (register.getVal() < 0) { + return new ArrayList<>(); + } + List ret = new ArrayList<>(); + ret.add(generateGetLoc(register.getVal())); + return ret; + } + + /*protected List getAndKillTemp(SourceGeneratorLocalData localData, SourceGenerator generator, Reference register) { + killRegister(localData, generator, register.getVal()); + List ret = new ArrayList<>(); + ret.add(generateGetLoc(register.getVal())); + ret.add(ins(new KillIns(), register.getVal())); + return ret; + }*/ + + @SuppressWarnings("unchecked") + protected List killTemp(SourceGeneratorLocalData localData, SourceGenerator generator, List> registers) { + List ret = new ArrayList<>(); + for (Reference register : registers) { + if (register.getVal() < 0) { + continue; + } + killRegister(localData, generator, register.getVal()); + + ret.add(ins(new KillIns(), register.getVal())); + } + return ret; + } + + protected AVM2Instruction generateSetLoc(int regNumber) { + switch (regNumber) { + case 0: + return ins(new SetLocal0Ins()); + case 1: + return ins(new SetLocal1Ins()); + case 2: + return ins(new SetLocal2Ins()); + case 3: + return ins(new SetLocal3Ins()); + default: + return ins(new SetLocalIns(), regNumber); + } + } + + protected AVM2Instruction generateGetLoc(int regNumber) { + switch (regNumber) { + case 0: + return ins(new GetLocal0Ins()); + case 1: + return ins(new GetLocal1Ins()); + case 2: + return ins(new GetLocal2Ins()); + case 3: + return ins(new GetLocal3Ins()); + default: + return ins(new GetLocalIns(), regNumber); + } + } + } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index ae4ea601d..37d14c4fb 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -19,17 +19,10 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal0Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal1Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal2Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal3Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocalIns; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.KillIns; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal0Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal1Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal2Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocal3Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.DecrementIIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.DecrementIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.FindPropertyStrictIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetPropertyIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.SetPropertyIns; @@ -38,10 +31,8 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PopIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.types.CoerceAIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.types.CoerceIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.types.CoerceSIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.types.ConvertDIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.types.ConvertSIns; -import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.types.NamespaceSet; @@ -52,6 +43,7 @@ import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -156,36 +148,6 @@ public class NameAVM2Item extends AssignableAVM2Item { return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); } - private AVM2Instruction generateSetLoc(int regNumber) { - switch (regNumber) { - case 0: - return ins(new SetLocal0Ins()); - case 1: - return ins(new SetLocal1Ins()); - case 2: - return ins(new SetLocal2Ins()); - case 3: - return ins(new SetLocal3Ins()); - default: - return ins(new SetLocalIns(), regNumber); - } - } - - private AVM2Instruction generateGetLoc(int regNumber) { - switch (regNumber) { - case 0: - return ins(new GetLocal0Ins()); - case 1: - return ins(new GetLocal1Ins()); - case 2: - return ins(new GetLocal2Ins()); - case 3: - return ins(new GetLocal3Ins()); - default: - return ins(new GetLocalIns(), regNumber); - } - } - private AVM2Instruction generateCoerce(SourceGenerator generator, String type) { AVM2Instruction ins; switch (type) { @@ -211,82 +173,58 @@ public class NameAVM2Item extends AssignableAVM2Item { return new ArrayList<>(); } AVM2SourceGenerator g = (AVM2SourceGenerator) generator; + Reference ns_temp = new Reference<>(-1); + Reference index_temp = new Reference<>(-1); + Reference ret_temp = new Reference<>(-1); if (variableName == null && ns != null && index != null) { if (assignedValue != null) { - List ret = toSourceMerge(localData, generator, + return toSourceMerge(localData, generator, ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), - ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), assignedValue); - int tempReg = -1; - if (needsReturn) { - tempReg = getFreeRegister(localData, generator); - ret.add(ins(new DupIns())); - ret.add(generateSetLoc(tempReg)); - } - ret.addAll(toSourceMerge(localData, generator, - ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)) - )); - if (needsReturn) { - ret.add(generateGetLoc(tempReg)); - ret.add(ins(new KillIns(), tempReg)); - killRegister(localData, generator, tempReg); - } - return ret; + ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), assignedValue, + needsReturn ? dupSetTemp(localData, generator, ret_temp) : null, + ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), + needsReturn ? getTemp(localData, generator, ret_temp) : null, + killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) + ); } else { return toSourceMerge(localData, generator, ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), - needsReturn ? null : ins(new PopIns()) + needsReturn ? null : ins(new PopIns()), + killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) ); } } if (variableName != null && ns != null && index == null) { if (assignedValue != null) { - List ret = toSourceMerge(localData, generator, + return toSourceMerge(localData, generator, ns, generateCoerce(generator, "Namespace"), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), - ns, generateCoerce(generator, "Namespace"), assignedValue); - int tempReg = -1; - if (needsReturn) { - tempReg = getFreeRegister(localData, generator); - ret.add(ins(new DupIns())); - ret.add(generateSetLoc(tempReg)); - } - ret.addAll(toSourceMerge(localData, generator, - ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)) - )); - if (needsReturn) { - ret.add(generateGetLoc(tempReg)); - ret.add(ins(new KillIns(), tempReg)); - killRegister(localData, generator, tempReg); - } - return ret; + ns, generateCoerce(generator, "Namespace"), assignedValue, + needsReturn ? dupSetTemp(localData, generator, ret_temp) : null, + ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), + needsReturn ? getTemp(localData, generator, ret_temp) : null, + killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) + ); } else { return toSourceMerge(localData, generator, ns, generateCoerce(generator, "Namespace"), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), ns, generateCoerce(generator, "Namespace"), ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), - needsReturn ? null : ins(new PopIns()) + needsReturn ? null : ins(new PopIns()), + killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) ); } } if (index != null) { if (assignedValue != null) { - List ret = toSourceMerge(localData, generator, - generateGetLoc(regNumber), index, assignedValue); - int tempReg = -1; - if (needsReturn) { - tempReg = getFreeRegister(localData, generator); - ret.add(ins(new DupIns())); - ret.add(generateSetLoc(tempReg)); - } - ret.addAll(toSourceMerge(localData, generator, ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)) - )); - if (needsReturn) { - ret.add(generateGetLoc(tempReg)); - ret.add(ins(new KillIns(), tempReg)); - killRegister(localData, generator, tempReg); - } - return ret; + return toSourceMerge(localData, generator, + generateGetLoc(regNumber), index, assignedValue, + needsReturn ? dupSetTemp(localData, generator, ret_temp) : null, + ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + needsReturn ? getTemp(localData, generator, ret_temp) : null, + killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) + ); } else { return toSourceMerge(localData, generator, generateGetLoc(regNumber), index, @@ -297,7 +235,7 @@ public class NameAVM2Item extends AssignableAVM2Item { } if (assignedValue != null) { - return toSourceMerge(localData, generator, assignedValue, generateCoerce(generator, type.toString()), needsReturn + return toSourceMerge(localData, generator, assignedValue, (!(assignedValue.returnType().toString().equals("int")&&type.toString().equals("int")))?generateCoerce(generator, type.toString()):null, needsReturn ? ins(new DupIns()) : null, generateSetLoc(regNumber)); } else { return toSourceMerge(localData, generator, generateGetLoc(regNumber), @@ -348,101 +286,107 @@ public class NameAVM2Item extends AssignableAVM2Item { if (index != null) { return TypeItem.UNBOUNDED; } + if(type == null){ + return TypeItem.UNBOUNDED; + } return type; } @Override - public List toSourceChange(SourceGeneratorLocalData localData, SourceGenerator generator, List pre, List post, boolean needsReturn) { + public List toSourceChange(SourceGeneratorLocalData localData, SourceGenerator generator, boolean post, boolean decrement, boolean needsReturn) { if (redirect != null) { - return ((AssignableAVM2Item) redirect).toSourceChange(localData, generator, pre, post, needsReturn); + return ((AssignableAVM2Item) redirect).toSourceChange(localData, generator, post, decrement, needsReturn); } AVM2SourceGenerator g = (AVM2SourceGenerator) generator; + Reference ns_temp = new Reference<>(-1); + Reference name_temp = new Reference<>(-1); + Reference index_temp = new Reference<>(-1); + Reference ret_temp = new Reference<>(-1); + boolean isInteger = returnType().toString().equals("int"); + /* + + + */ if (variableName == null && ns != null && index != null) { - List ret = toSourceMerge(localData, generator, - ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), + return toSourceMerge(localData, generator, ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), + ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), + dupSetTemp(localData, generator, name_temp), + ns, generateCoerce(generator, "Namespace"), + dupSetTemp(localData, generator, ns_temp), + //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), getTemp(localData, generator, index_temp), ins(new ConvertSIns()), //Start get original - ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), - ns, generateCoerce(generator, "Namespace"), index, ins(new ConvertSIns()), ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), + //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), getTemp(localData, generator, index_temp), ins(new ConvertSIns()), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)), + //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), getTemp(localData, generator, index_temp), ins(new ConvertSIns()), + ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + !isInteger ? ins(new ConvertDIns()) : null, //End get original - pre); - int tempReg = -1; - if (needsReturn) { - tempReg = getFreeRegister(localData, generator); - ret.add(ins(new DupIns())); - ret.add(generateSetLoc(tempReg)); - } - ret.addAll(toSourceMerge(localData, generator, - post, - ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0, 0, new ArrayList()), true)) - )); - if (needsReturn) { - ret.add(generateGetLoc(tempReg)); - ret.add(ins(new KillIns(), tempReg)); - killRegister(localData, generator, tempReg); - } - return ret; + (!post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + needsReturn ? ins(new DupIns()) : null, + (post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + setTemp(localData, generator, ret_temp), + getTemp(localData, generator, name_temp), + getTemp(localData, generator, ns_temp), + getTemp(localData, generator, ret_temp), + ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + killTemp(localData, generator, Arrays.asList(ret_temp, name_temp, ns_temp))); } if (variableName != null && ns != null && index == null) { - List ret = toSourceMerge(localData, generator, - ns, generateCoerce(generator, "Namespace"), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), + return toSourceMerge(localData, generator, ns, generateCoerce(generator, "Namespace"), + ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), + dupSetTemp(localData, generator, name_temp), + ns, generateCoerce(generator, "Namespace"), + dupSetTemp(localData, generator, ns_temp), //Start get original - ns, generateCoerce(generator, "Namespace"), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), - ns, generateCoerce(generator, "Namespace"), ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), + //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), ins(new FindPropertyStrictIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), + //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), + ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + !isInteger ? ins(new ConvertDIns()) : null, //End get original - pre); - int tempReg = -1; - if (needsReturn) { - tempReg = getFreeRegister(localData, generator); - ret.add(ins(new DupIns())); - ret.add(generateSetLoc(tempReg)); - } - ret.addAll(toSourceMerge(localData, generator, - post, - ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)) - )); - if (needsReturn) { - ret.add(generateGetLoc(tempReg)); - ret.add(ins(new KillIns(), tempReg)); - killRegister(localData, generator, tempReg); - } - return ret; + (!post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + needsReturn ? ins(new DupIns()) : null, + (post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + setTemp(localData, generator, ret_temp), + getTemp(localData, generator, name_temp), + getTemp(localData, generator, ns_temp), + getTemp(localData, generator, ret_temp), + ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + killTemp(localData, generator, Arrays.asList(ret_temp, name_temp, ns_temp)) + ); } if (index != null) { - List ret = toSourceMerge(localData, generator, - generateGetLoc(regNumber), index, + return toSourceMerge(localData, generator, + generateGetLoc(regNumber), dupSetTemp(localData, generator, name_temp), index, dupSetTemp(localData, generator, index_temp), //Start get original - generateGetLoc(regNumber), index, + //generateGetLoc(regNumber), getTemp(localData, generator, index_temp), ins(new GetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + !isInteger ? ins(new ConvertDIns()) : null, //End get original - pre); - int tempReg = -1; - if (needsReturn) { - tempReg = getFreeRegister(localData, generator); - ret.add(ins(new DupIns())); - ret.add(generateSetLoc(tempReg)); - } - ret.addAll(toSourceMerge(localData, generator, - post, - ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)) - )); - if (needsReturn) { - ret.add(generateGetLoc(tempReg)); - ret.add(ins(new KillIns(), tempReg)); - killRegister(localData, generator, tempReg); - } - return ret; + (!post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + needsReturn ? ins(new DupIns()) : null, + (post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + setTemp(localData, generator, ret_temp), + getTemp(localData, generator, name_temp), + getTemp(localData, generator, index_temp), + getTemp(localData, generator, ret_temp), + ins(new SetPropertyIns(), g.abc.constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abc), 0, new ArrayList()), true)), + killTemp(localData, generator, Arrays.asList(ret_temp, name_temp, index_temp)) + ); } return toSourceMerge(localData, generator, //Start get original generateGetLoc(regNumber), //End get original - pre, generateCoerce(generator, type.toString()), needsReturn - ? ins(new DupIns()) : null, post, generateSetLoc(regNumber)); + !isInteger ? ins(new ConvertDIns()) : null, + //End get original + (!post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + needsReturn ? ins(new DupIns()) : null, + (post) ? (decrement ? ins(isInteger ? new DecrementIIns() : new DecrementIns()) : ins(isInteger ? new IncrementIIns() : new IncrementIns())) : null, + generateSetLoc(regNumber)); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index 2a8074860..605c736bf 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -19,14 +19,20 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.DecrementIIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.DecrementIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocalIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.KillIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.FindPropertyStrictIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetPropertyIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.SetPropertyIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ThrowIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.DupIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PopIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.types.ConvertDIns; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; @@ -46,6 +52,7 @@ import com.jpexs.decompiler.graph.TypeFunctionItem; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -256,48 +263,20 @@ public class PropertyAVM2Item extends AssignableAVM2Item { public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator, boolean needsReturn) { int propertyId = resolveProperty(); - Object obj = object; - if (obj == null) { - - String cname; - String pkgName = ""; - cname = localData.currentClass; - if (cname.contains(".")) { - pkgName = cname.substring(0, cname.lastIndexOf(".")); - cname = cname.substring(cname.lastIndexOf(".") + 1); - } - Reference outName = new Reference<>(""); - Reference outNs = new Reference<>(""); - Reference outPropNs = new Reference<>(""); - Reference outPropNsKind = new Reference<>(1); - if (AVM2SourceGenerator.searchProperty(abcs, pkgName, cname, propertyName, outName, outNs, outPropNs, outPropNsKind)) { - NameAVM2Item nobj = new NameAVM2Item(new TypeItem(localData.currentClass), 0/*?*/, "this", null, false, openedNamespaces, openedNamespacesKind); - nobj.setRegNumber(0); - obj = nobj; - } else { - obj = ins(new FindPropertyStrictIns(), propertyId); - } - } + Object obj = resolveObject(localData, generator); + Reference ret_temp=new Reference<>(0); if (assignedValue != null) { - int temp_reg = getFreeRegister(localData, generator); String targetType = resolvePropertyType().toString(); String srcType = assignedValue.returnType().toString(); GraphTargetItem st = assignedValue; if (!targetType.equals(srcType)) { st = new CoerceAVM2Item(null, assignedValue, targetType); } - List ret = toSourceMerge(localData, generator, obj, index, st); - if (needsReturn) { - ret.add(ins(new DupIns())); - ret.add(ins(new SetLocalIns(), temp_reg)); - } - ret.add(ins(new SetPropertyIns(), propertyId)); - if (needsReturn) { - ret.add(ins(new GetLocalIns(), temp_reg)); - ret.add(ins(new KillIns(), temp_reg)); - killRegister(localData, generator, temp_reg); - } - return ret; + return toSourceMerge(localData, generator, obj, index, st, + needsReturn?dupSetTemp(localData, generator, ret_temp):null, + ins(new SetPropertyIns(), propertyId), + needsReturn?getTemp(localData, generator, ret_temp):null, + killTemp(localData, generator, Arrays.asList(ret_temp))); } else { return toSourceMerge(localData, generator, obj, index, ins(new GetPropertyIns(), propertyId), @@ -321,37 +300,63 @@ public class PropertyAVM2Item extends AssignableAVM2Item { return true; } - @Override - public List toSourceChange(SourceGeneratorLocalData localData, SourceGenerator generator, List pre, List post, boolean needsReturn) { - int propertyId = resolveProperty(); + + private Object resolveObject(SourceGeneratorLocalData localData, SourceGenerator generator){ Object obj = object; - if (obj == null) { - obj = ins(new FindPropertyStrictIns(), propertyId); + int propertyId = resolveProperty(); + if(obj==null){ + String cname; + String pkgName = ""; + cname = localData.currentClass; + if (cname.contains(".")) { + pkgName = cname.substring(0, cname.lastIndexOf(".")); + cname = cname.substring(cname.lastIndexOf(".") + 1); + } + Reference outName = new Reference<>(""); + Reference outNs = new Reference<>(""); + Reference outPropNs = new Reference<>(""); + Reference outPropNsKind = new Reference<>(1); + if (AVM2SourceGenerator.searchProperty(abcs, pkgName, cname, propertyName, outName, outNs, outPropNs, outPropNsKind)) { + NameAVM2Item nobj = new NameAVM2Item(new TypeItem(localData.currentClass), 0/*?*/, "this", null, false, openedNamespaces, openedNamespacesKind); + nobj.setRegNumber(0); + obj = nobj; + } else { + obj = ins(new FindPropertyStrictIns(), propertyId); + } } + return obj; + } + + @Override + public List toSourceChange(SourceGeneratorLocalData localData, SourceGenerator generator, boolean post,boolean decrement, boolean needsReturn) { + int propertyId = resolveProperty(); + Object obj = resolveObject(localData, generator); - int temp_reg = getFreeRegister(localData, generator); - - List ret = toSourceMerge(localData, generator, obj, index, + Reference ret_temp = new Reference<>(-1); + Reference obj_temp = new Reference<>(-1); + Reference index_temp = new Reference<>(-1); + + boolean isInteger = resolvePropertyType().toString().equals("int"); + + + List ret= toSourceMerge(localData, generator, obj, dupSetTemp(localData, generator, obj_temp), index,index!=null?dupSetTemp(localData, generator, index_temp):null, //Start get original - obj, - index, + //getTemp(localData, generator, obj_temp), + //index!=null?getTemp(localData, generator, index_temp):null, ins(new GetPropertyIns(), propertyId), + !isInteger?ins(new ConvertDIns()):null, //End get original - pre - ); - if (needsReturn) { - ret.add(ins(new DupIns())); - ret.add(ins(new SetLocalIns(), temp_reg)); - } - ret.addAll(post); - ret.add(ins(new SetPropertyIns(), propertyId)); - if (needsReturn) { - ret.add(ins(new GetLocalIns(), temp_reg)); - ret.add(ins(new KillIns(), temp_reg)); - killRegister(localData, generator, temp_reg); - } + (!post)?(decrement?ins(isInteger?new DecrementIIns():new DecrementIns()):ins(isInteger?new IncrementIIns():new IncrementIns())):null, + needsReturn?ins(new DupIns()):null, + (post)?(decrement?ins(isInteger?new DecrementIIns():new DecrementIns()):ins(isInteger?new IncrementIIns():new IncrementIns())):null, + setTemp(localData, generator, ret_temp), + getTemp(localData, generator, obj_temp), + index!=null?getTemp(localData, generator, index_temp):null, + getTemp(localData, generator, ret_temp), + ins(new SetPropertyIns(), propertyId), + //needsReturn?getTemp(localData, generator, ret_temp):null, + killTemp(localData, generator, Arrays.asList(ret_temp,obj_temp,index_temp))); return ret; - } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/todo.txt b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/todo.txt index 868f37b3a..6b205382f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/todo.txt +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/todo.txt @@ -6,7 +6,7 @@ TODO List for AS3 parser/compiler: - for in/ for each - typenames (Vectors) - inner functions (activation, slots, etc.) -- pre/post in/decrements - with - delete property -- default xml namespace \ No newline at end of file +- default xml namespace +- better private namespaces handling \ No newline at end of file