Fixed: Get property dups and register usage for namespaces

This commit is contained in:
Jindra Petřík
2021-02-02 18:03:16 +01:00
parent f6744eafb9
commit d7d6abb0c0

View File

@@ -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<Integer> 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<Integer> 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));
}