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 49d9c28ed..699cb8955 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 @@ -250,6 +250,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.xml.EscXAttrIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.xml.EscXElemIns; import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item; +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.InitPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; @@ -1861,7 +1862,7 @@ public class AVM2Code implements Cloneable { return assignment; } - private void injectDeclarations(List items, int minreg, DeclarationAVM2Item[] declaredRegisters, List declaredSlots, List declaredSlotsDec, ABC abc, MethodBody body) { + private void injectDeclarations(List items, int minreg, DeclarationAVM2Item[] declaredRegisters, List declaredSlots, List declaredSlotsDec, List declaredProperties, List declaredPropsDec, ABC abc, MethodBody body) { for (int i = 0; i < items.size(); i++) { GraphTargetItem currentItem = items.get(i); List itemsOnLine = new ArrayList<>(); @@ -1905,6 +1906,38 @@ public class AVM2Code implements Cloneable { } } } + if (subItem instanceof SetPropertyAVM2Item) { + SetPropertyAVM2Item sp = (SetPropertyAVM2Item) subItem; + if (sp.object instanceof FindPropertyAVM2Item) { + if (sp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item propName = (FullMultinameAVM2Item) sp.propertyName; + if (!declaredProperties.contains(propName.resolvedMultinameName)) { + for (int t = 0; t < body.traits.traits.size(); t++) { + if (body.traits.traits.get(t).getName(abc).getName(abc.constants, new ArrayList(), true, false) + .equals(propName.resolvedMultinameName)) { + if (body.traits.traits.get(t) instanceof TraitSlotConst) { + GraphTargetItem type = PropertyAVM2Item.multinameToType(((TraitSlotConst) body.traits.traits.get(t)).type_index, abc.constants); + DeclarationAVM2Item d = new DeclarationAVM2Item(subItem, type); + sp.setDeclaration(d); + declaredPropsDec.add(d); + declaredProperties.add(propName.resolvedMultinameName); + if (subItem == currentItem) { + items.set(i, d); + } else { + d.showValue = false; + items.add(i, d); + i++; + } + } + } + } + } else { + int idx = declaredProperties.indexOf(propName.resolvedMultinameName); + sp.setDeclaration(declaredPropsDec.get(idx)); + } + } + } + } if (subItem instanceof SetSlotAVM2Item) { SetSlotAVM2Item ssti = (SetSlotAVM2Item) subItem; if (ssti.scope instanceof NewActivationAVM2Item) { @@ -1942,7 +1975,7 @@ public class AVM2Code implements Cloneable { if (currentItem instanceof Block) { Block blk = (Block) currentItem; for (List sub : blk.getSubs()) { - injectDeclarations(sub, minreg, declaredRegisters, declaredSlots, declaredSlotsDec, abc, body); + injectDeclarations(sub, minreg, declaredRegisters, declaredSlots, declaredSlotsDec, declaredProperties, declaredPropsDec, abc, body); } } } @@ -2088,7 +2121,7 @@ public class AVM2Code implements Cloneable { // //int minreg = abc.method_info.get(body.method_info).getMaxReservedReg() + 1; - injectDeclarations(list, 1, d, new ArrayList<>(), new ArrayList<>(), abc, body); + injectDeclarations(list, 1, d, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), abc, body); int lastPos = list.size() - 1; if (lastPos < 0) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java index 3416ad192..c200570d8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java @@ -16,12 +16,15 @@ */ package com.jpexs.decompiler.flash.abc.avm2.model.clauses; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetSlotAVM2Item; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.helpers.hilight.HighlightData; @@ -148,6 +151,39 @@ public class DeclarationAVM2Item extends AVM2Item { } return writer; } + + if (assignment instanceof SetPropertyAVM2Item) { + SetPropertyAVM2Item spti = (SetPropertyAVM2Item) assignment; + HighlightData srcData = getSrcData(); + srcData.localName = ((FullMultinameAVM2Item) spti.propertyName).resolvedMultinameName; + srcData.declaration = true; + + GraphTargetItem val = spti.value; + GraphTargetItem coerType = TypeItem.UNBOUNDED; + if (spti.value instanceof CoerceAVM2Item) { + coerType = ((CoerceAVM2Item) spti.value).typeObj; + } + if (spti.value instanceof ConvertAVM2Item) { + coerType = ((ConvertAVM2Item) spti.value).type; + } + //strip coerce if its declared as this type + if (coerType.equals(type) && !coerType.equals(TypeItem.UNBOUNDED)) { + val = val.value; + } + + srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : DottedChain.ALL; + writer.append("var "); + writer.append(IdentifiersDeobfuscation.printIdentifier(true, ((FullMultinameAVM2Item) spti.propertyName).resolvedMultinameName)); + writer.append(":"); + + type.appendTry(writer, localData); + if (showValue) { + writer.append(" = "); + val.toString(writer, localData); + } + return writer; + } + writer.append("var "); return assignment.toString(writer, localData); } 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 01cf0321f..104812b60 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 @@ -18,7 +18,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT @Test public void testActivationProps() { - decompileMethod("assembled", "testActivationProps", "\r\n", + decompileMethod("assembled", "testActivationProps", "var myvar2:int = 10;\r\n", false); } diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc index 0654c160d..14763b448 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc and b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc differ diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestActivationProps.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestActivationProps.class.asasm index f2e11ef7d..0a328bc06 100644 --- a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestActivationProps.class.asasm +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestActivationProps.class.asasm @@ -41,6 +41,10 @@ class slotid 1 type QName(PackageNamespace(""),"int") end ; trait + trait slot QName(PackageInternalNs("testing"),"myvar2") + slotid 2 + type QName(PackageNamespace(""),"int") + end ; trait code debug 1, "myvar", 0, 0 getlocal0 @@ -52,6 +56,9 @@ class findpropstrict QName(PackageInternalNs("testing"),"myvar") getlocal1 setproperty QName(PackageInternalNs("testing"),"myvar") + findpropstrict QName(PackageInternalNs("testing"),"myvar2") + pushbyte 10 + setproperty QName(PackageInternalNs("testing"),"myvar2") returnvoid end ; code end ; body diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf b/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf index 8025de6d4..3c7b02db7 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf and b/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf differ