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 3a7dcf7e6..67f35297b 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 @@ -105,7 +105,41 @@ public interface SetTypeIns { stack.push(result); return; } + + if (notCoercedValue instanceof DuplicateItem) { + GraphTargetItem insideDup = notCoercedValue.value; + if (!AVM2Item.mustStayIntact1(insideDup.getNotCoercedNoDup())) { + if (stack.peek().getThroughDuplicate() == insideDup.getThroughDuplicate()) { + stack.pop(); + + if ((insideDup instanceof DuplicateItem) && regId > -1) { + int numDups = 1; + while ((insideDup instanceof DuplicateItem) && !stack.isEmpty() && stack.peek().getThroughDuplicate() == insideDup.getThroughDuplicate()) { + insideDup = insideDup.value; + stack.pop(); + numDups++; + } + if ((value instanceof CoerceAVM2Item) || (value instanceof ConvertAVM2Item)) { + value.value = insideDup; + } else { + value = insideDup; + } + result.value = value; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetTemporaryItem) { + output.remove(output.size() - 1); + } + stack.addToOutput(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) : value.returnType())); + } + return; + } + } + } + } } + + stack.finishBlock(output); /*if (notCoercedValue instanceof DuplicateItem) { DuplicateItem d = (DuplicateItem) notCoercedValue; 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 bfae48081..d7762750c 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 @@ -143,9 +143,8 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT @Test public void testDoubleDup() { - decompileMethod("assembled", "testDoubleDup", "var _temp_1:* = myprop(_loc5_);\r\n" - + "var _loc10_:* = _temp_1;\r\n" - + "_temp_1.mymethod(-_temp_1.width,-_loc10_.height);\r\n", + decompileMethod("assembled", "testDoubleDup", "var _loc10_:Rectangle = myprop(_loc5_);\r\n" + + "_loc10_.mymethod(-_loc10_.width,-_loc10_.height);\r\n", false); }