diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java index 418f0573f..4236cbda1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java @@ -835,7 +835,7 @@ public abstract class InstructionDefinition implements Serializable { Reference callType = new Reference<>(null); GetPropertyIns.resolvePropertyType(localData, obj, multiname, isStatic, type, callType); - obj = obj.getThroughDuplicate(); + //obj = obj.getThroughDuplicate(); SetTypeAVM2Item result; if (init) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java index 2e8b1c391..12f9cc358 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java @@ -28,10 +28,13 @@ import com.jpexs.decompiler.flash.abc.avm2.model.GetLexAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; +import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.DuplicateSourceItem; import java.util.List; import java.util.Objects; @@ -101,7 +104,14 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns if (Objects.equals(obj.getThroughDuplicate(), propItem.object.getThroughDuplicate()) && Objects.equals(multiname, propItem.propertyName)) { result.setCompoundValue(binaryOp.getRightSide()); result.setCompoundOperator(binaryOp.getOperator()); - } + + if (result instanceof SetPropertyAVM2Item) { + SetPropertyAVM2Item sp = (SetPropertyAVM2Item) result; + if (sp.object instanceof DuplicateSourceItem) { + sp.object = sp.object.value; + } + } + } } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/SwapIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/SwapIns.java index 153f1da58..1106669d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/SwapIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/SwapIns.java @@ -130,6 +130,26 @@ public class SwapIns extends InstructionDefinition { return; } */ + /*int temp = localData.maxTempIndex.getVal() + 1; + localData.maxTempIndex.setVal(temp); + stack.finishBlock(output); + stack.addToOutput(new SetTemporaryItem(AVM2GraphTargetDialect.INSTANCE, ins, localData.lineStartInstruction, o2, temp, "swap")); + stack.finishBlock(output); + stack.push(o1); + stack.push(new TemporaryItem(AVM2GraphTargetDialect.INSTANCE, ins, localData.lineStartInstruction, o2, temp)); */ + + if (o2 instanceof TemporaryItem) { + stack.push(o1); + stack.push(o2); + return; + } + if (o2 instanceof DuplicateItem) { + stack.push(o1); + stack.push(o2); + return; + } + + int temp = localData.maxTempIndex.getVal() + 1; localData.maxTempIndex.setVal(temp); stack.finishBlock(output); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java index 400aad6b7..2dec81739 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java @@ -407,6 +407,42 @@ public class TranslateStack extends Stack { } public void allowSwap(List output) { + /* + if (!isEmpty()) { + return; + } + if (output.isEmpty()) { + return; + } + if (size() != 2) { + return; + } + + if (!(output.get(output.size() - 1) instanceof SetTemporaryItem)) { + return; + } + + if (!(peek() instanceof TemporaryItem)) { + return; + } + + TemporaryItem ti = (TemporaryItem) peek(); + + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 1); + + if (!"swap".equals(st.getSuffix())) { + return; + } + + if (st.getTempIndex() != ti.getTempIndex()) { + return; + } + + output.remove(output.size() - 1); + pop(); + push(ti.value); + + */ if (!isEmpty()) { return; } @@ -420,7 +456,7 @@ public class TranslateStack extends Stack { if (!(output.get(output.size() - 2) instanceof PushItem)) { return; } - + if (!(output.get(output.size() - 3) instanceof SetTemporaryItem)) { return; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java index 15bb51327..79cb73052 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java @@ -22,6 +22,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetDialect; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.SimpleValue; import com.jpexs.decompiler.graph.SourceGenerator; import java.util.List; @@ -145,4 +146,8 @@ public class DuplicateItem extends GraphTargetItem implements SimpleValue, HasTe public int getTempIndex() { return tempIndex; } + + @Override + public void visit(GraphTargetVisitorInterface visitor) { + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TemporaryItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TemporaryItem.java index 7bdfca456..5d0f89039 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TemporaryItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TemporaryItem.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetDialect; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.SimpleValue; import com.jpexs.decompiler.graph.SourceGenerator; import java.util.ArrayList; @@ -136,4 +137,7 @@ public class TemporaryItem extends GraphTargetItem implements SimpleValue, HasTe return tempIndex; } + @Override + public void visit(GraphTargetVisitorInterface visitor) { + } }