From 709e2c1205b4fc4433b26e7d1e54455f6d99ef0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 1 Feb 2021 12:51:00 +0100 Subject: [PATCH] Postincrement/decrement property in ASC2 --- .../localregs/GetLocalTypeIns.java | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java index 24542791e..2110eabf3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java @@ -30,6 +30,8 @@ import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IncrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.PostDecrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ScriptAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item; @@ -93,11 +95,42 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { //computedValue = new NotCompileTimeItem(ins, localData.lineStartInstruction, computedValue); } - //chained assignments FIXME!!! + //chained assignments and/or ASC post/pre increment if (!output.isEmpty()) { if ((output.get(output.size() - 1) instanceof SetTypeAVM2Item)) { GraphTargetItem setItem = output.get(output.size() - 1); - if (setItem.value.getNotCoerced() instanceof SetLocalAVM2Item) { + if ((setItem instanceof SetPropertyAVM2Item) + && ((setItem.value.getNotCoerced() instanceof DecrementAVM2Item) + || (setItem.value.getNotCoerced() instanceof IncrementAVM2Item))) { + boolean isIncrement = (setItem.value.getNotCoerced() instanceof IncrementAVM2Item); + GraphTargetItem val = setItem.value.getNotCoerced(); + if (val.value instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) val.value; + if (setLocal.regIndex == regId) { + if (setLocal.value.getNotCoerced() instanceof GetPropertyAVM2Item) { + SetPropertyAVM2Item setProp = (SetPropertyAVM2Item) setItem; + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocal.value.getNotCoerced(); + if (getProp.object.getThroughDuplicate() == setProp.object) { + if (((FullMultinameAVM2Item) setProp.propertyName).compareSame((FullMultinameAVM2Item) getProp.propertyName)) { + if (getProp.object instanceof DuplicateItem) { + getProp.object = getProp.object.value; + } + GraphTargetItem result; + if (isIncrement) { + result = new PostIncrementAVM2Item(setProp.getSrc(), localData.lineStartInstruction, getProp); + } else { + result = new PostDecrementAVM2Item(setProp.getSrc(), localData.lineStartInstruction, getProp); + } + output.remove(output.size() - 1); + stack.add(result); + return; + } + } + } + } + } + } + else if (setItem.value.getNotCoerced() instanceof SetLocalAVM2Item) { SetLocalAVM2Item setLocal = (SetLocalAVM2Item) setItem.value.getNotCoerced(); if (setLocal.regIndex == regId) { if ((setItem.value instanceof CoerceAVM2Item) || (setItem.value instanceof ConvertAVM2Item)) { @@ -120,9 +153,9 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { getProp.object = getProp.object.value; } if (isIncrement) { - setItem = new PreIncrementAVM2Item(null, localData.lineStartInstruction, getProp); + setItem = new PreIncrementAVM2Item(setProp.getSrc(), localData.lineStartInstruction, getProp); } else { - setItem = new PreDecrementAVM2Item(null, localData.lineStartInstruction, getProp); + setItem = new PreDecrementAVM2Item(setProp.getSrc(), localData.lineStartInstruction, getProp); } } }