diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java index 72021c0c8..f84d0a524 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions.other; import com.jpexs.decompiler.flash.abc.ABC; @@ -23,8 +24,11 @@ import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; import com.jpexs.decompiler.flash.abc.avm2.exceptions.AVM2ExecutionException; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; 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.LocalRegAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.ecma.ArrayType; import com.jpexs.decompiler.flash.ecma.EcmaScript; @@ -32,7 +36,9 @@ import com.jpexs.decompiler.flash.ecma.ObjectType; import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.DuplicateItem; import java.util.List; +import java.util.Set; /** * @@ -72,6 +78,49 @@ public class GetPropertyIns extends InstructionDefinition { int multinameIndex = ins.operands[0]; FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins); GraphTargetItem obj = stack.pop(); + //remove dups + if (obj instanceof FindPropertyAVM2Item) { + FindPropertyAVM2Item findProp = (FindPropertyAVM2Item) obj; + if (findProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item findPropName = (FullMultinameAVM2Item) findProp.propertyName; + if ((findPropName.name instanceof LocalRegAVM2Item) && (multiname.name instanceof LocalRegAVM2Item)) { + LocalRegAVM2Item getLocal1 = (LocalRegAVM2Item) findPropName.name; + LocalRegAVM2Item getLocal2 = (LocalRegAVM2Item) multiname.name; + if (!output.isEmpty() && (output.get(output.size() - 1) instanceof SetLocalAVM2Item)) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocal.regIndex == getLocal1.regIndex && setLocal.regIndex == getLocal2.regIndex) { + Set usage = localData.getSetLocalUsages(localData.code.adr2pos(setLocal.getSrc().getAddress())); + if (usage.size() == 2) { + findPropName.name = setLocal.value; + output.remove(output.size() - 1); + } + } + } + } + if (findPropName.name instanceof DuplicateItem) { + if (findPropName.name.value == multiname.name) { + findPropName.name = findPropName.name.value; + } + } + if (findPropName.namespace instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) findPropName.namespace; + if (multiname.namespace instanceof LocalRegAVM2Item) { + LocalRegAVM2Item getLocal = (LocalRegAVM2Item) multiname.namespace; + if (setLocal.regIndex == getLocal.regIndex) { + Set usage = localData.getSetLocalUsages(localData.code.adr2pos(setLocal.getSrc().getAddress())); + if (usage.size() == 1) { + findPropName.namespace = findPropName.namespace.value; + } + } + } + } + if (findPropName.namespace instanceof DuplicateItem) { + if (findPropName.namespace.value == multiname.namespace) { + findPropName.namespace = findPropName.namespace.value; + } + } + } + } stack.push(new GetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname)); }