From 263b401efc50d0c06a807b20d19e7b620d921b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 1 Dec 2022 15:25:23 +0100 Subject: [PATCH] Fixed #1888 Casts for missing types, cast handling for script local classes --- CHANGELOG.md | 2 + .../decompiler/flash/abc/avm2/AVM2Code.java | 8 +- .../abc/avm2/instructions/SetTypeIns.java | 2 +- .../construction/ConstructPropIns.java | 16 +- .../instructions/other/GetGlobalSlotIns.java | 3 +- .../avm2/instructions/other/GetLexIns.java | 13 +- .../instructions/other/GetPropertyIns.java | 17 +- .../avm2/instructions/other/GetSlotIns.java | 3 +- .../avm2/instructions/other/SetSlotIns.java | 3 +- .../avm2/instructions/types/CoerceIns.java | 5 +- .../flash/abc/avm2/model/CoerceAVM2Item.java | 3 + .../abc/avm2/model/ConstructPropAVM2Item.java | 9 +- .../abc/avm2/model/FullMultinameAVM2Item.java | 9 + .../operations/PreDecrementAVM2Item.java | 2 +- .../operations/PreIncrementAVM2Item.java | 2 +- .../parser/script/AVM2SourceGenerator.java | 16 +- .../abc/avm2/parser/script/AbcIndexing.java | 202 ++++++++++++++---- .../avm2/parser/script/PropertyAVM2Item.java | 40 +--- .../parser/script/UnresolvedAVM2Item.java | 8 +- .../operations/PreDecrementActionItem.java | 2 +- .../operations/PreIncrementActionItem.java | 2 +- .../com/jpexs/decompiler/graph/TypeItem.java | 32 ++- .../ActionScript3AssembledDecompileTest.java | 2 +- .../ActionScript3ClassicAirDecompileTest.java | 7 +- .../ActionScript3ClassicDecompileTest.java | 11 +- .../testdata/as3_new/bin/as3_new.air.swf | Bin 22803 -> 22875 bytes .../testdata/as3_new/bin/as3_new.flex.swf | Bin 29656 -> 29758 bytes .../testdata/as3_new/src/tests/TestConvert.as | 9 +- .../as3_new/src/tests/TestProperty.as | 2 +- 29 files changed, 291 insertions(+), 139 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e219c595..b91d9ece9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed +- [#1888] Casts for missing types, cast handling for script local classes ## [17.0.3] - 2022-11-30 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index afc22356a..7dcb0ddf5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1977,7 +1977,7 @@ public class AVM2Code implements Cloneable { if (!beginDeclaredSlotsNames.contains(traitName)) { Slot sl = new Slot(new NewActivationAVM2Item(null, null), abc.constants.getMultiname(traits.get(traitName).name_index)); TraitSlotConst tsc = (TraitSlotConst) traits.get(traitName); - GraphTargetItem type = PropertyAVM2Item.multinameToType(tsc.type_index, abc.constants); + GraphTargetItem type = AbcIndexing.multinameToType(tsc.type_index, abc.constants); DeclarationAVM2Item d = new DeclarationAVM2Item(new GetLexAVM2Item(null, null, sl.multiname, abc.constants, type, TypeItem.UNBOUNDED /*?*/, false), type); declaredSlotsDec.add(d); declaredSlots.add(sl); @@ -2044,7 +2044,7 @@ public class AVM2Code implements Cloneable { if (!declaredProperties.contains(propName.resolvedMultinameName)) { if (traits.containsKey(propName.resolvedMultinameName)) { TraitSlotConst tsc = traits.get(propName.resolvedMultinameName); - GraphTargetItem type = PropertyAVM2Item.multinameToType(tsc.type_index, abc.constants); + GraphTargetItem type = AbcIndexing.multinameToType(tsc.type_index, abc.constants); DeclarationAVM2Item d = new DeclarationAVM2Item(subItem, type); sp.setDeclaration(d); declaredPropsDec.add(d); @@ -2081,7 +2081,7 @@ public class AVM2Code implements Cloneable { if (index == -1) { GraphTargetItem type = TypeItem.UNBOUNDED; if (traits.containsKey(slotPropertyName)) { - type = PropertyAVM2Item.multinameToType(traits.get(slotPropertyName).type_index, abc.constants); + type = AbcIndexing.multinameToType(traits.get(slotPropertyName).type_index, abc.constants); } DeclarationAVM2Item d = new DeclarationAVM2Item(subItem, type); ssti.setDeclaration(d); @@ -2147,7 +2147,7 @@ public class AVM2Code implements Cloneable { } HashMap localRegTypes = new HashMap<>(); for (int i = 0; i < abc.method_info.get(methodIndex).param_types.length; i++) { - localRegTypes.put(i + 1, PropertyAVM2Item.multinameToType(abc.method_info.get(methodIndex).param_types[i], abc.constants)); + localRegTypes.put(i + 1, AbcIndexing.multinameToType(abc.method_info.get(methodIndex).param_types[i], abc.constants)); } //try { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/SetTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/SetTypeIns.java index 487cdcf31..fb500c55d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/SetTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/SetTypeIns.java @@ -60,7 +60,7 @@ public interface SetTypeIns { result.value = value; output.add(result); for (int i = 0; i < numDups; i++) { - stack.push(new LocalRegAVM2Item(null, localData.lineStartInstruction, regId, value, localData.localRegTypes.containsKey(regId) ? localData.localRegTypes.get(regId) : TypeItem.UNBOUNDED)); + stack.push(new LocalRegAVM2Item(null, localData.lineStartInstruction, regId, value, localData.localRegTypes.containsKey(regId) ? localData.localRegTypes.get(regId) : value.returnType())); } return; } else { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java index a57b42e3b..eb6ebd803 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; 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.instructions.other.GetPropertyIns; import com.jpexs.decompiler.flash.abc.avm2.model.ConstructPropAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; @@ -31,6 +32,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.StringAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.XMLAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.List; @@ -70,9 +72,7 @@ public class ConstructPropIns extends InstructionDefinition { } FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins); GraphTargetItem obj = stack.pop(); - if (obj instanceof FindPropertyAVM2Item) { - multiname.property = false; //can be type - } + if (multiname.isXML(localData.abc, localData.localRegNames, localData.fullyQualifiedNames, localData.seenMethods)) { if (args.size() == 1) { @@ -97,8 +97,16 @@ public class ConstructPropIns extends InstructionDefinition { stack.push(new RegExpAvm2Item(pattern, modifiers, ins, localData.lineStartInstruction)); return; } + + Reference isStatic = new Reference<>(false); + Reference type = new Reference<>(null); + Reference callType = new Reference<>(null); + GetPropertyIns.resolvePropertyType(localData, obj, multiname, isStatic, type, callType); - stack.push(new ConstructPropAVM2Item(ins, localData.lineStartInstruction, obj, multiname, args)); + if (obj instanceof FindPropertyAVM2Item) { + multiname.property = false; //can be type + } + stack.push(new ConstructPropAVM2Item(ins, localData.lineStartInstruction, obj, multiname, args, type.getVal())); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java index c4b76bb1c..8dc2a718b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.GetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GlobalAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AbcIndexing; import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.traits.Trait; @@ -56,7 +57,7 @@ public class GetGlobalSlotIns extends InstructionDefinition { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst)t; if (tsc.slot_id == slotIndex) { - slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + slotType = AbcIndexing.multinameToType(tsc.type_index, localData.abc.constants); break; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java index ef5864cce..04632288c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java @@ -55,8 +55,8 @@ public class GetLexIns extends InstructionDefinition { GraphTargetItem obj, int multinameIndex, Reference isStatic, Reference type, Reference callType) { - type.setVal(TypeItem.UNBOUNDED); - callType.setVal(TypeItem.UNBOUNDED); + type.setVal(TypeItem.UNKNOWN); + callType.setVal(TypeItem.UNKNOWN); String multinameStr = localData.abc.constants.getMultiname(multinameIndex).getName(localData.abc.constants, new ArrayList<>(), true, true); for (int b = localData.callStack.size() - 1; b >= 0; b--) { MethodBody body = localData.callStack.get(b); @@ -67,7 +67,7 @@ public class GetLexIns extends InstructionDefinition { tsc.getName(localData.abc).getName(localData.abc.constants, new ArrayList<>(), true, true), multinameStr )) { - GraphTargetItem ty = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + GraphTargetItem ty = AbcIndexing.multinameToType(tsc.type_index, localData.abc.constants); type.setVal(ty); callType.setVal(ty); return; @@ -82,9 +82,10 @@ public class GetLexIns extends InstructionDefinition { localData.abcIndex.findPropertyTypeOrCallType(localData.abc, new TypeItem(currentClassName), multinameStr, localData.abc.constants.getMultiname(multinameIndex).namespace_index, true, true, true, type, callType); } - if (type.getVal().equals(TypeItem.UNBOUNDED)) { - TypeItem ti = new TypeItem(localData.abc.constants.getMultiname(multinameIndex).getNameWithNamespace(localData.abc.constants, true)); - if (localData.abcIndex.findClass(ti) != null) { + if (type.getVal().equals(TypeItem.UNKNOWN)) { + //TypeItem ti = new TypeItem(localData.abc.constants.getMultiname(multinameIndex).getNameWithNamespace(localData.abc.constants, true)); + GraphTargetItem ti = AbcIndexing.multinameToType(multinameIndex, localData.abc.constants); + if (localData.abcIndex.findClass(ti, localData.abc, localData.scriptIndex) != null) { type.setVal(ti); callType.setVal(TypeItem.UNBOUNDED); isStatic.setVal(true); 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 b3235f8bc..8aa87504d 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 @@ -147,8 +147,8 @@ public class GetPropertyIns extends InstructionDefinition { GraphTargetItem obj, FullMultinameAVM2Item multiname, Reference isStatic, Reference type, Reference callType) { - type.setVal(TypeItem.UNBOUNDED); - callType.setVal(TypeItem.UNBOUNDED); + type.setVal(TypeItem.UNKNOWN); + callType.setVal(TypeItem.UNKNOWN); String multinameStr = localData.abc.constants.getMultiname(multiname.multinameIndex).getName(localData.abc.constants, new ArrayList<>(), true, true); if (obj instanceof FindPropertyAVM2Item) { FindPropertyAVM2Item fprop = (FindPropertyAVM2Item) obj; @@ -162,7 +162,7 @@ public class GetPropertyIns extends InstructionDefinition { tsc.getName(localData.abc).getName(localData.abc.constants, new ArrayList<>(), true, true), multinameStr )) { - GraphTargetItem ty = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + GraphTargetItem ty = AbcIndexing.multinameToType(tsc.type_index, localData.abc.constants); type.setVal(ty); callType.setVal(ty); return; @@ -171,16 +171,15 @@ public class GetPropertyIns extends InstructionDefinition { } } - if (type.getVal().equals(TypeItem.UNBOUNDED)) { + if (type.getVal().equals(TypeItem.UNKNOWN)) { if (localData.abcIndex != null) { String currentClassName = localData.classIndex == -1 ? null : localData.abc.instance_info.get(localData.classIndex).getName(localData.abc.constants).getNameWithNamespace(localData.abc.constants, true).toRawString(); - GraphTargetItem thisPropType = TypeItem.UNBOUNDED; if (currentClassName != null) { localData.abcIndex.findPropertyTypeOrCallType(localData.abc, new TypeItem(currentClassName), multinameStr, localData.abc.constants.getMultiname(multiname.multinameIndex).namespace_index, true, true, true, type, callType); } - if (type.getVal().equals(TypeItem.UNBOUNDED)) { - TypeItem ti = new TypeItem(localData.abc.constants.getMultiname(multiname.multinameIndex).getNameWithNamespace(localData.abc.constants, true)); - if (localData.abcIndex.findClass(ti) != null) { + if (type.getVal().equals(TypeItem.UNKNOWN)) { + GraphTargetItem ti = AbcIndexing.multinameToType(multiname.multinameIndex, localData.abc.constants);//new TypeItem(localData.abc.constants.getMultiname(multiname.multinameIndex).getNameWithNamespace(localData.abc.constants, true)); + if (localData.abcIndex.findClass(ti, localData.abc, localData.scriptIndex) != null) { type.setVal(ti); callType.setVal(TypeItem.UNBOUNDED); isStatic.setVal(true); @@ -205,7 +204,7 @@ public class GetPropertyIns extends InstructionDefinition { } else { if (localData.abcIndex != null) { GraphTargetItem receiverType = obj.returnType(); - if (!receiverType.equals(TypeItem.UNBOUNDED)) { + if (!receiverType.equals(TypeItem.UNBOUNDED) && !receiverType.equals(TypeItem.UNKNOWN)) { boolean parentStatic = false; if (obj instanceof GetLexAVM2Item) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java index dcf8a7ddb..b34d48245 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java @@ -23,6 +23,7 @@ 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.GetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AbcIndexing; import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.traits.Trait; @@ -59,7 +60,7 @@ public class GetSlotIns extends InstructionDefinition { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst)t; if (tsc.slot_id == slotIndex) { - slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + slotType = AbcIndexing.multinameToType(tsc.type_index, localData.abc.constants); break; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java index 646884851..e3b54513c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreDecrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreIncrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AbcIndexing; import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.traits.Trait; @@ -146,7 +147,7 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst)t; if (tsc.slot_id == slotIndex) { - slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + slotType = AbcIndexing.multinameToType(tsc.type_index, localData.abc.constants); break; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java index 3a07437f2..d13c3d0ff 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.abc.avm2.exceptions.AVM2TypeErrorException; 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.CoerceAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AbcIndexing; import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.ecma.EcmaScript; @@ -80,7 +81,7 @@ public class CoerceIns extends InstructionDefinition implements CoerceOrConvertT @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { int multinameIndex = ins.operands[0]; - stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), PropertyAVM2Item.multinameToType(multinameIndex, localData.getConstants()))); + stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), AbcIndexing.multinameToType(multinameIndex, localData.getConstants()))); } @Override @@ -96,6 +97,6 @@ public class CoerceIns extends InstructionDefinition implements CoerceOrConvertT @Override public GraphTargetItem getTargetType(AVM2ConstantPool constants, AVM2Instruction ins) { int multinameIndex = ins.operands[0]; - return PropertyAVM2Item.multinameToType(multinameIndex, constants); + return AbcIndexing.multinameToType(multinameIndex, constants); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java index 70515998a..999c127ce 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java @@ -108,6 +108,9 @@ public class CoerceAVM2Item extends AVM2Item { if (typeObj instanceof ApplyTypeAVM2Item) { return typeObj; } + if (typeObj instanceof TypeItem) { + return typeObj; + } return new TypeItem(typeObj.toString()); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConstructPropAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConstructPropAVM2Item.java index 8d31294f9..00869c12e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConstructPropAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConstructPropAVM2Item.java @@ -36,12 +36,15 @@ public class ConstructPropAVM2Item extends AVM2Item { public GraphTargetItem propertyName; public List args; + + public GraphTargetItem type; - public ConstructPropAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem propertyName, List args) { + public ConstructPropAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem propertyName, List args, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.object = object; this.propertyName = propertyName; this.args = args; + this.type = type; } @Override @@ -71,8 +74,8 @@ public class ConstructPropAVM2Item extends AVM2Item { } @Override - public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + public GraphTargetItem returnType() { + return type; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index 95844d39e..4b72ddc78 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -56,6 +56,9 @@ public class FullMultinameAVM2Item extends AVM2Item { this.namespace = null; this.property = property; this.resolvedMultinameName = resolvedMultinameName; + if (property == false) { + System.err.println("xxx"); + } } public FullMultinameAVM2Item(boolean property, GraphSourceItem instruction, GraphSourceItem lineStartIns, int multinameIndex, String resolvedMultinameName) { @@ -65,6 +68,9 @@ public class FullMultinameAVM2Item extends AVM2Item { this.name = null; this.namespace = null; this.property = property; + if (property == false) { + System.err.println("xxx"); + } } public FullMultinameAVM2Item(boolean property, GraphSourceItem instruction, GraphSourceItem lineStartIns, int multinameIndex, String resolvedMultinameName, GraphTargetItem name, GraphTargetItem namespace) { @@ -74,6 +80,9 @@ public class FullMultinameAVM2Item extends AVM2Item { this.namespace = namespace; this.property = property; this.resolvedMultinameName = resolvedMultinameName; + if (property == false) { + System.err.println("xxx"); + } } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java index f02e017e1..d95dc6250 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreDecrementAVM2Item.java @@ -34,7 +34,7 @@ import java.util.List; public class PreDecrementAVM2Item extends UnaryOpItem implements AssignmentAVM2Item { public PreDecrementAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object) { - super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "--", "Number"); + super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "--", "" /*"Number" Causes unneccessary ++Number(xx) when xx not number*/); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java index 88744a0f5..86def3d7f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/PreIncrementAVM2Item.java @@ -33,7 +33,7 @@ import java.util.List; public class PreIncrementAVM2Item extends UnaryOpItem { public PreIncrementAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object) { - super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "++", "Number"); + super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "++", "" /*"Number" Causes unneccessary ++Number(xx) when xx not number*/); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index d4ef4ab75..a2161a24b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -1304,7 +1304,7 @@ public class AVM2SourceGenerator implements SourceGenerator { parent = ((UnresolvedAVM2Item) parent).resolved; } if (parent instanceof TypeItem) { - ClassIndex ci = abcIndex.findClass(parent); + ClassIndex ci = abcIndex.findClass(parent, null, null/*FIXME?*/); if (ci != null) { int mi = ci.abc.class_info.get(ci.index).cinit_index; MethodBody pcinit = ci.abc.findBody(mi); @@ -1971,7 +1971,7 @@ public class AVM2SourceGenerator implements SourceGenerator { */ int parentConstMinAC = 0; - AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(superType)); + AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(superType), null, null/*FIXME?*/); if (ci != null) { MethodInfo pmi = ci.abc.method_info.get(ci.abc.instance_info.get(ci.index).iinit_index); @@ -2483,7 +2483,7 @@ public class AVM2SourceGenerator implements SourceGenerator { mbCode.add(ins(AVM2Instructions.PushNull)); } else { - AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(tc.class_info).name_index, constants)); + AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(tc.class_info).name_index, constants), null, null/*FIXME?*/); while (ci != null && ci.parent != null) { ci = ci.parent; Multiname origM = ci.abc.constants.getMultiname(ci.abc.instance_info.get(ci.index).name_index); @@ -2589,16 +2589,16 @@ public class AVM2SourceGenerator implements SourceGenerator { if (tsc.type_index == 0) { return TypeItem.UNBOUNDED; } - return PropertyAVM2Item.multinameToType(tsc.type_index, abc.getSelectedAbc().constants); + return AbcIndexing.multinameToType(tsc.type_index, abc.getSelectedAbc().constants); } if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) t; if (tmgs.kindType == Trait.TRAIT_GETTER) { - return PropertyAVM2Item.multinameToType(abc.getSelectedAbc().method_info.get(tmgs.method_info).ret_type, abc.getSelectedAbc().constants); + return AbcIndexing.multinameToType(abc.getSelectedAbc().method_info.get(tmgs.method_info).ret_type, abc.getSelectedAbc().constants); } if (tmgs.kindType == Trait.TRAIT_SETTER) { if (abc.getSelectedAbc().method_info.get(tmgs.method_info).param_types.length > 0) { - return PropertyAVM2Item.multinameToType(abc.getSelectedAbc().method_info.get(tmgs.method_info).param_types[0], abc.getSelectedAbc().constants); + return AbcIndexing.multinameToType(abc.getSelectedAbc().method_info.get(tmgs.method_info).param_types[0], abc.getSelectedAbc().constants); } else { return TypeItem.UNBOUNDED; } @@ -2662,7 +2662,7 @@ public class AVM2SourceGenerator implements SourceGenerator { } public static void parentNames(AbcIndexing abc, int name_index, List indices, List names, List namespaces, List outABCs) { - AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(abc.getSelectedAbc().constants.getMultiname(name_index).getNameWithNamespace(abc.getSelectedAbc().constants, true /*FIXME!!*/))); + AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(abc.getSelectedAbc().constants.getMultiname(name_index).getNameWithNamespace(abc.getSelectedAbc().constants, true /*FIXME!!*/)), null, null/*FIXME?*/); while (ci != null) { int ni = ci.abc.instance_info.get(ci.index).name_index; indices.add(ni); @@ -2761,7 +2761,7 @@ public class AVM2SourceGenerator implements SourceGenerator { }*/ ABC abc = abcIndex.getSelectedAbc(); AVM2ConstantPool constants = abc.constants; - AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(dname)); + AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(dname), null, null/*FIXME?*/); if (ci != null) { Multiname m = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants); if (m != null) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java index 6e9f172eb..8de221710 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java @@ -20,12 +20,14 @@ import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.model.ApplyTypeAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; import com.jpexs.decompiler.flash.abc.types.ClassInfo; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; @@ -43,6 +45,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.WeakHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Indexing of ABCs for faster access. Indexes ABC classes for faster class and @@ -311,6 +315,52 @@ public final class AbcIndexing { this.value = value; this.objType = objType; } + } + + private static class ClassDef { + public GraphTargetItem type; + public DottedChain pkg; + + public ClassDef(GraphTargetItem type, ABC abc, Integer scriptIndex) { + this.type = type; + if (scriptIndex != null) { + for (Trait t : abc.script_info.get(scriptIndex).traits.traits) { + Namespace ns = t.getName(abc).getNamespace(abc.constants); + if (ns.kind == Namespace.KIND_PACKAGE) { + pkg = ns.getName(abc.constants); + } + } + } + } + + @Override + public int hashCode() { + int hash = 3; + hash = 17 * hash + Objects.hashCode(this.type); + hash = 17 * hash + Objects.hashCode(this.pkg); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ClassDef other = (ClassDef) obj; + if (!Objects.equals(this.type, other.type)) { + return false; + } + return Objects.equals(this.pkg, other.pkg); + } + + + } public static class ClassIndex { @@ -320,20 +370,57 @@ public final class AbcIndexing { public ABC abc; public ClassIndex parent; + + public Integer scriptIndex; @Override public String toString() { return abc.constants.getMultiname(abc.instance_info.get(index).name_index).getNameWithNamespace(abc.constants, true).toPrintableString(true); } - public ClassIndex(int index, ABC abc, ClassIndex parent) { + public ClassIndex(int index, ABC abc, ClassIndex parent, Integer scriptIndex) { this.index = index; this.abc = abc; this.parent = parent; + this.scriptIndex = scriptIndex; } + + @Override + public int hashCode() { + int hash = 5; + hash = 37 * hash + this.index; + hash = 37 * hash + System.identityHashCode(this.abc); + hash = 37 * hash + Objects.hashCode(this.parent); + hash = 37 * hash + Objects.hashCode(this.scriptIndex); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ClassIndex other = (ClassIndex) obj; + if (this.index != other.index) { + return false; + } + if (this.abc != other.abc) { + return false; + } + if (!Objects.equals(this.parent, other.parent)) { + return false; + } + return Objects.equals(this.scriptIndex, other.scriptIndex); + } } - private final Map classes = new HashMap<>(); + private final Map classes = new HashMap<>(); private final Map instanceProperties = new HashMap<>(); @@ -343,23 +430,30 @@ public final class AbcIndexing { private final Map classNsProperties = new HashMap<>(); - private final Map scriptProperties = new HashMap<>(); - - public ClassIndex findClass(GraphTargetItem cls) { - if (!classes.containsKey(cls)) { - if (parent == null) { - return null; - } - return parent.findClass(cls); + private final Map scriptProperties = new HashMap<>(); + + public ClassIndex findClass(GraphTargetItem cls, ABC abc, Integer scriptIndex) { + ClassDef keyWithScriptIndex = new ClassDef(cls, abc, scriptIndex); + if (classes.containsKey(keyWithScriptIndex)) { + return classes.get(keyWithScriptIndex); } - return classes.get(cls); + + ClassDef keyWithNoScriptIndex = new ClassDef(cls, abc, null); + if (classes.containsKey(keyWithNoScriptIndex)) { + return classes.get(keyWithNoScriptIndex); + } + + if (parent == null) { + return null; + } + return parent.findClass(cls, abc, scriptIndex); } public void findPropertyTypeOrCallType(ABC abc, GraphTargetItem cls, String propName, int ns, boolean findStatic, boolean findInstance, boolean findProtected, Reference type, Reference callType) { TraitIndex traitIndex = findProperty(new PropertyDef(propName, cls, abc, ns), findStatic, findInstance, findProtected); if (traitIndex == null) { - type.setVal(TypeItem.UNBOUNDED); - callType.setVal(TypeItem.UNBOUNDED); + type.setVal(TypeItem.UNKNOWN); + callType.setVal(TypeItem.UNKNOWN); } else { type.setVal(traitIndex.returnType); callType.setVal(traitIndex.callReturnType); @@ -465,7 +559,7 @@ public final class AbcIndexing { } //now search parent class - AbcIndexing.ClassIndex ci = findClass(prop.parent); + AbcIndexing.ClassIndex ci = findClass(prop.parent, prop.abc, null); if (ci != null && ci.parent != null && (prop.abc == null || prop.propNsIndex == 0)) { AbcIndexing.ClassIndex ciParent = ci.parent; DottedChain parentClass = ciParent.abc.instance_info.get(ciParent.index).getName(ciParent.abc.constants).getNameWithNamespace(ciParent.abc.constants, true); @@ -495,23 +589,45 @@ public final class AbcIndexing { return null; } - public static GraphTargetItem multinameToType(int m_index, AVM2ConstantPool constants) { + private static GraphTargetItem multinameToType(Set visited, int m_index, AVM2ConstantPool constants) { + if (visited.contains(m_index)) { + Logger.getLogger(AbcIndexing.class.getName()).log(Level.WARNING, "Recursive typename detected"); + return null; + } if (m_index == 0) { return TypeItem.UNBOUNDED; } Multiname m = constants.getMultiname(m_index); if (m.kind == Multiname.TYPENAME) { - GraphTargetItem obj = multinameToType(m.qname_index, constants); + visited.add(m_index); + GraphTargetItem obj = multinameToType(visited, m.qname_index, constants); + if (obj == null) { + return null; + } List params = new ArrayList<>(); for (int pm : m.params) { - params.add(multinameToType(pm, constants)); + GraphTargetItem r = multinameToType(visited, pm, constants); + if (r == null) { + return null; + } + if (pm == 0) { + r = new NullAVM2Item(null, null); + } + params.add(r); } return new ApplyTypeAVM2Item(null, null, obj, params); } else { + if (m.namespace_index != 0 && m.getNamespace(constants).kind == Namespace.KIND_PRIVATE) { + return new TypeItem(m.getName(constants, new ArrayList<>(), true, true), "ns:"+m.namespace_index); + } return new TypeItem(m.getNameWithNamespace(constants, true)); } } + public static GraphTargetItem multinameToType(int m_index, AVM2ConstantPool constants) { + return multinameToType(new HashSet<>(), m_index, constants); + } + private static GraphTargetItem getTraitCallReturnType(ABC abc, Trait t) { if (t instanceof TraitSlotConst) { return TypeItem.UNBOUNDED; @@ -524,12 +640,12 @@ public final class AbcIndexing { if (tmgs.kindType == Trait.TRAIT_SETTER) { return TypeItem.UNBOUNDED; } - return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).ret_type, abc.constants); + return multinameToType(abc.method_info.get(tmgs.method_info).ret_type, abc.constants); } if (t instanceof TraitFunction) { TraitFunction tf = (TraitFunction) t; - return PropertyAVM2Item.multinameToType(abc.method_info.get(tf.method_info).ret_type, abc.constants); + return multinameToType(abc.method_info.get(tf.method_info).ret_type, abc.constants); } return TypeItem.UNBOUNDED; @@ -541,16 +657,16 @@ public final class AbcIndexing { if (tsc.type_index == 0) { return TypeItem.UNBOUNDED; } - return PropertyAVM2Item.multinameToType(tsc.type_index, abc.constants); + return multinameToType(tsc.type_index, abc.constants); } if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) t; if (tmgs.kindType == Trait.TRAIT_GETTER) { - return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).ret_type, abc.constants); + return multinameToType(abc.method_info.get(tmgs.method_info).ret_type, abc.constants); } if (tmgs.kindType == Trait.TRAIT_SETTER) { if (abc.method_info.get(tmgs.method_info).param_types.length > 0) { - return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).param_types[0], abc.constants); + return multinameToType(abc.method_info.get(tmgs.method_info).param_types[0], abc.constants); } else { return TypeItem.UNBOUNDED; } @@ -601,8 +717,8 @@ public final class AbcIndexing { public void removeAbc(ABC abc) { abcs.remove(abc); - Set gti_keys = new HashSet<>(classes.keySet()); - for (GraphTargetItem key : gti_keys) { + Set gti_keys = new HashSet<>(classes.keySet()); + for (ClassDef key : gti_keys) { if (classes.get(key).abc == abc) { classes.remove(key); } @@ -650,29 +766,39 @@ public final class AbcIndexing { return; } List addedClasses = new ArrayList<>(); + for (int i = 0; i < abc.instance_info.size(); i++) { - InstanceInfo ii = abc.instance_info.get(i); - if (ii.deleted) { - continue; - } - ClassInfo ci = abc.class_info.get(i); - ClassIndex cindex = new ClassIndex(i, abc, null); - addedClasses.add(cindex); - GraphTargetItem cname = multinameToType(ii.name_index, abc.constants); - classes.put(cname, cindex); - - indexTraits(abc, ii.name_index, ii.instance_traits, instanceProperties, instanceNsProperties); - indexTraits(abc, ii.name_index, ci.static_traits, classProperties, classNsProperties); + } - for (int i = 0; i < abc.script_info.size(); i++) { + for (int i = 0; i < abc.script_info.size(); i++) { indexTraits(abc, 0, abc.script_info.get(i).traits, null, scriptProperties); + for (int t = 0; t < abc.script_info.get(i).traits.traits.size(); t++) { + Trait tr = abc.script_info.get(i).traits.traits.get(t); + if (tr instanceof TraitClass) { + TraitClass tc = (TraitClass)tr; + InstanceInfo ii = abc.instance_info.get(tc.class_info); + if (ii.deleted) { + continue; + } + ClassInfo ci = abc.class_info.get(tc.class_info); + int nsKind = abc.constants.getMultiname(tc.name_index).getNamespace(abc.constants).kind; + Integer classScriptIndex = nsKind == Namespace.KIND_PACKAGE ? null : i; + ClassIndex cindex = new ClassIndex(tc.class_info, abc, null, classScriptIndex); + addedClasses.add(cindex); + GraphTargetItem cname = multinameToType(ii.name_index, abc.constants); + classes.put(new ClassDef(cname, abc, classScriptIndex), cindex); + + indexTraits(abc, ii.name_index, ii.instance_traits, instanceProperties, instanceNsProperties); + indexTraits(abc, ii.name_index, ci.static_traits, classProperties, classNsProperties); + } + } } for (ClassIndex cindex : addedClasses) { int parentClassName = abc.instance_info.get(cindex.index).super_index; if (parentClassName > 0) { TypeItem parentClass = new TypeItem(abc.constants.getMultiname(parentClassName).getNameWithNamespace(abc.constants, true)); - ClassIndex parentClassIndex = findClass(parentClass); + ClassIndex parentClassIndex = findClass(parentClass, abc, null); if (parentClassIndex == null) { //Parent class can be deleted, do not check. TODO: handle this better //throw new RuntimeException("Parent class " + parentClass + " definition not found!"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index 8d23c9e74..b9b3758bc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -104,41 +104,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { return abc.getSelectedAbc().constants.getNamespaceSetId(nssa, true); } - private static GraphTargetItem multinameToType(Set visited, int m_index, AVM2ConstantPool constants) { - if (visited.contains(m_index)) { - Logger.getLogger(PropertyAVM2Item.class.getName()).log(Level.WARNING, "Recursive typename detected"); - return null; - } - if (m_index == 0) { - return TypeItem.UNBOUNDED; - } - Multiname m = constants.getMultiname(m_index); - if (m.kind == Multiname.TYPENAME) { - visited.add(m_index); - GraphTargetItem obj = multinameToType(visited, m.qname_index, constants); - if (obj == null) { - return null; - } - List params = new ArrayList<>(); - for (int pm : m.params) { - GraphTargetItem r = multinameToType(visited, pm, constants); - if (r == null) { - return null; - } - if (pm == 0) { - r = new NullAVM2Item(null, null); - } - params.add(r); - } - return new ApplyTypeAVM2Item(null, null, obj, params); - } else { - return new TypeItem(m.getNameWithNamespace(constants, true)); - } - } - - public static GraphTargetItem multinameToType(int m_index, AVM2ConstantPool constants) { - return multinameToType(new HashSet<>(), m_index, constants); - } + public void resolve(boolean mustExist, SourceGeneratorLocalData localData, Reference isType, Reference objectType, Reference propertyType, Reference propertyIndex, Reference propertyValue, Reference propertyValueABC) throws CompilationException { Integer namespaceSuffixInt = null; @@ -217,7 +183,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { // super is special cause its static type is the super class, but it still allows access to protected members // so for super to work we need to also allow the protected namespace of the super class // however this namespace is in the ABC of the super class and not in abcIndex.getSelectedAbc() - AbcIndexing.ClassIndex ci = abcIndex.findClass(objType); + AbcIndexing.ClassIndex ci = abcIndex.findClass(objType, null, null/*FIXME?*/); int superProtectedNs = ci.abc.instance_info.get(ci.index).protectedNS; AbcIndexing.TraitIndex sp = abcIndex.findProperty(new AbcIndexing.PropertyDef(propertyName, objType, ci.abc, superProtectedNs), false, true, true); if (sp != null) { @@ -252,7 +218,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; objType = new TypeItem(DottedChain.FUNCTION); - propType = multinameToType(tsc.type_index, constants); + propType = AbcIndexing.multinameToType(tsc.type_index, constants); propIndex = tsc.name_index; if (!localData.traitUsages.containsKey(b)) { localData.traitUsages.put(b, new ArrayList<>()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java index b5e0690b2..d84c0f52a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java @@ -363,7 +363,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { DottedChain pkg = classChain.getWithoutLast(); TypeItem ti = new TypeItem(pkg.addWithSuffix(name.get(0))); - AbcIndexing.ClassIndex ci = abc.findClass(ti); + AbcIndexing.ClassIndex ci = abc.findClass(ti, null, null/*FIXME?*/); if (ci != null) { resolved = ti; @@ -412,7 +412,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { if (!isProperty) { for (int i = 0; i < name.size(); i++) { DottedChain fname = name.subChain(i + 1); - AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(fname)); + AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(fname), null, null/*FIXME?*/); if (ci != null) { if (!subtypes.isEmpty() && name.size() > i + 1) { continue; @@ -441,7 +441,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { n.resolveCustomNs(abcIndex, importedClasses, pkg, openedNamespaces, localData); Namespace ons = abc.getSelectedAbc().constants.getNamespace(n.getCpoolIndex(abc)); TypeItem ti = new TypeItem(ons.getName(abc.getSelectedAbc().constants).addWithSuffix(name.get(0))); - AbcIndexing.ClassIndex ci = abc.findClass(ti); + AbcIndexing.ClassIndex ci = abc.findClass(ti, null, null/*FIXME?*/); if (ci != null) { if (!subtypes.isEmpty() && name.size() > 1) { continue; @@ -471,7 +471,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { boolean isSuper = name.get(0).equals("super"); GraphTargetItem ntype = thisType; if (isSuper) { - AbcIndexing.ClassIndex ci = abc.findClass(thisType); + AbcIndexing.ClassIndex ci = abc.findClass(thisType, null, null/*FIXME?*/); if (ci == null) { throw new CompilationException("This class not found", line); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreDecrementActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreDecrementActionItem.java index 681c7bba8..056c08902 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreDecrementActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreDecrementActionItem.java @@ -45,7 +45,7 @@ import java.util.List; public class PreDecrementActionItem extends UnaryOpItem { public PreDecrementActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object) { - super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "--", "Number"); + super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "--", "" /*"Number" Causes unneccessary ++Number(xx) when xx not number*/); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreIncrementActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreIncrementActionItem.java index 28d5f8d36..951eba49b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreIncrementActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/PreIncrementActionItem.java @@ -45,7 +45,7 @@ import java.util.List; public class PreIncrementActionItem extends UnaryOpItem { public PreIncrementActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object) { - super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "++", "Number"); + super(instruction, lineStartIns, PRECEDENCE_UNARY, object, "++", "" /*"Number" Causes unneccessary ++Number(xx) when xx not number*/); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java index f8d923edb..43bb5ad70 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java @@ -53,29 +53,42 @@ public class TypeItem extends GraphTargetItem { public final DottedChain fullTypeName; public boolean printRaw = false; + + public String ns; public TypeItem(String s) { - this(s == null ? new DottedChain(new String[]{}, new String[]{""}) : DottedChain.parseWithSuffix(s)); + this(s, null); + } + public TypeItem(String s, String ns) { + this(s == null ? new DottedChain(new String[]{}, new String[]{""}) : DottedChain.parseWithSuffix(s), ns); } public TypeItem(DottedChain fullTypeName) { - this(fullTypeName, new ArrayList<>()); - } + this(fullTypeName, (String)null); + } + public TypeItem(DottedChain fullTypeName, String ns) { + this(fullTypeName, new ArrayList<>(), ns); + } - public TypeItem(DottedChain fullTypeName, List subtypes) { + public TypeItem(DottedChain fullTypeName, List subtypes, String ns) { super(null, null, NOPRECEDENCE); this.fullTypeName = fullTypeName; + this.ns = ns; } @Override public int hashCode() { - int hash = 7; - hash = 83 * hash + Objects.hashCode(fullTypeName); + int hash = 5; + hash = 17 * hash + Objects.hashCode(this.fullTypeName); + hash = 17 * hash + Objects.hashCode(this.ns); return hash; } @Override public boolean equals(Object obj) { + if (this == obj) { + return true; + } if (obj == null) { return false; } @@ -83,9 +96,14 @@ public class TypeItem extends GraphTargetItem { return false; } final TypeItem other = (TypeItem) obj; - return Objects.equals(fullTypeName, other.fullTypeName); + if (!Objects.equals(this.ns, other.ns)) { + return false; + } + return Objects.equals(this.fullTypeName, other.fullTypeName); } + + @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { boolean as3 = localData.constantsAvm2 != null; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java index c9f795375..172ea0c2b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java @@ -172,7 +172,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT @Test public void testSwitch() { - decompileMethod("assembled", "testSwitch", "switch(somevar)\r\n" + decompileMethod("assembled", "testSwitch", "switch(int(somevar))\r\n" + "{\r\n" + "case 0:\r\n" + "var _loc2_:String = \"X\";\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index a4a14f8d4..1fde6259a 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -264,7 +264,10 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"b\");\r\n" + "i = int(xlist[i].@id);\r\n" + "trace(\"c\");\r\n" - + "i = int(x.item[i].@id);\r\n", + + "i = int(x.item[i].@id);\r\n" + + "var lc:LocalClass;\r\n" + + "i = (lc = new LocalClass()).attr;\r\n" + + "s = String(lc.attr);\r\n", false); } @@ -1390,7 +1393,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testProperty() { - decompileMethod("classic_air", "testProperty", "var d:* = new TestClass1();\r\n" + decompileMethod("classic_air", "testProperty", "var d:TestClass1 = new TestClass1();\r\n" + "var k:int = 15;\r\n" + "if(k == 15)\r\n" + "{\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index a4c86a589..98d1c496b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -141,9 +141,9 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"arr[2] += 5\");\r\n" + "b[2] += 5;\r\n" + "trace(\"arr[call()] /= 5\");\r\n" - + "b[this.calc()] = b[this.calc()] / 5;\r\n" + + "b[this.calc()] = Number(b[this.calc()]) / 5;\r\n" + "trace(\"arr[call()][call()] &= 10;\");\r\n" - + "b[this.calc()][this.calc()] = b[this.calc()][this.calc()] & 10;\r\n" + + "b[this.calc()][this.calc()] = Number(b[this.calc()][this.calc()]) & 10;\r\n" + "try\r\n" + "{\r\n" + "trace(\"in try\");\r\n" @@ -263,7 +263,10 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"b\");\r\n" + "i = int(xlist[i].@id);\r\n" + "trace(\"c\");\r\n" - + "i = int(x.item[i].@id);\r\n", + + "i = int(x.item[i].@id);\r\n" + + "var lc:LocalClass = new LocalClass();\r\n" + + "i = lc.attr;\r\n" + + "s = String(lc.attr);\r\n", false); } @@ -1385,7 +1388,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes @Test public void testProperty() { - decompileMethod("classic", "testProperty", "var d:* = new TestClass1();\r\n" + decompileMethod("classic", "testProperty", "var d:TestClass1 = new TestClass1();\r\n" + "var k:* = 7 + 8;\r\n" + "if(k == 15)\r\n" + "{\r\n" diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf index e4c35de59c25adde00cd601308560b88683be2d1..e1f309e0225d12740de15362493c9e2fbfeca15b 100644 GIT binary patch literal 22875 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ø%9h=gF(k8TH;lvGZX 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 KDEtM6GG|E&6bd5% literal 22803 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 diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf index 73a1998202322ba81c604fac955541f0482a6e0f..2037716d6b37a0df9c9534877ade2bfab2115577 100644 GIT binary patch delta 29517 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

E5Uz}7)U1C<|k$;_Max0?L zkkr{3yEco@DSYPeIRm#DR!br4D9=7nsW5!TMI2)lxb_4Eu@lMiB2b{|bbO>l5znkErD%+Ms7eKm>Ld9tE{!P0nt>?DIXHv93?K7QV2Q~;f{ zpZC`(Dmoi&FR}%QHmT`ezy%{uk%_xDCI&ok5(3)(?(G;so~LNCS#T=O#@htZu;Z-UR$u6T$)7 zo?hMg4Tq`8OZ-FO5aua-*k{hX=%mf{nlw+%+OcQl>NoGtny05tg=zI(f7;Yd$la<4 jV|@STow!sFMP_yF|6=0cO$RmHKp|7>HGKIWOYe3ju@CNs diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as index 28bea5543..b6e0dbc2a 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as @@ -66,7 +66,14 @@ package tests i = int(xlist[i].@id); trace("c"); i = int(x.item[i].@id); - + + var lc:LocalClass = new LocalClass(); + i = lc.attr; + s = String(lc.attr); } } } + +class LocalClass{ + public var attr:int = 5; +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestProperty.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestProperty.as index 5cd36f06c..210d9a7b5 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestProperty.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestProperty.as @@ -5,7 +5,7 @@ package tests { public function run():* { - var d:* = new TestClass1(); + var d:TestClass1 = new TestClass1(); var k:* = 7 + 8; if (k == 15) {