mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-05 18:34:45 +00:00
Fixed: Get property dups and register usage for namespaces
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user