From 73ea92f266f6d0df93760209f6cfc1e2cbfebb11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 16 Aug 2025 17:31:51 +0200 Subject: [PATCH] Fix TestIncDec5 --- .../instructions/InstructionDefinition.java | 179 +++++++++++++++++- 1 file changed, 175 insertions(+), 4 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java index 30cc1881b..c62890bf8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java @@ -967,9 +967,9 @@ public abstract class InstructionDefinition implements Serializable { } stack.moveToStack(output); if (isIncrement) { - stack.addToOutput(new PreIncrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + stack.addToOutput(new PreIncrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); } else { - stack.addToOutput(new PreDecrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + stack.addToOutput(new PreDecrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); } return; } while(false); @@ -1077,14 +1077,185 @@ public abstract class InstructionDefinition implements Serializable { } stack.moveToStack(output); if (isIncrement) { - stack.push(new PostIncrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + stack.push(new PostIncrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); } else { - stack.push(new PostDecrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + stack.push(new PostDecrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); } return; } while(false); } + //TestIncDec5 with result + expectedClasses = new Class[]{ + //PushItem.class, + SetTemporaryItem.class, + SetLocalAVM2Item.class, + SetTemporaryItem.class, + PushItem.class, + SetLocalAVM2Item.class + }; + + /* + //var _temp_3:* = §§findproperty(trace); + var _temp_1:* = a; + var _loc2_:* = _temp_1; + var _temp_2:* = _temp_1.attrib + 1; + var _loc3_:* = _temp_2; + _loc2_.attrib = _loc3_; + trace(_temp_2); + */ + + if (output.size() >= expectedClasses.length) { + + loopout: do { + for (int i = 0; i < expectedClasses.length; i++) { + if (!expectedClasses[expectedClasses.length - 1 - i].isAssignableFrom(output.get(output.size() - 1 - i).getClass())) { + break loopout; + } + } + + SetLocalAVM2Item setLocalValue = (SetLocalAVM2Item) output.get(output.size() - 1); + PushItem pushValue = (PushItem) output.get(output.size() - 2); + SetTemporaryItem setTempValue = (SetTemporaryItem) output.get(output.size() - 3); + SetLocalAVM2Item setLocalObj = (SetLocalAVM2Item) output.get(output.size() - 4); + SetTemporaryItem setTempObj = (SetTemporaryItem) output.get(output.size() - 5); + + + if (setLocalValue.regIndex != valueLocalReg.regIndex) { + break; + } + if (!(setLocalValue.value instanceof DuplicateItem)) { + break; + } + if (!(setLocalValue.value.value instanceof IncrementAVM2Item + || setLocalValue.value.value instanceof DecrementAVM2Item)) { + break; + } + if (!(setLocalValue.value.value.value instanceof GetPropertyAVM2Item)) { + break; + } + boolean isIncrement = setLocalValue.value.value instanceof IncrementAVM2Item; + + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value; + if (!(getProp.object instanceof TemporaryItem)) { + break; + } + if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { + break; + } + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (!fm.compareSame(multiname)) { + break; + } + + TemporaryItem tempObj = (TemporaryItem) getProp.object; + if (tempObj.tempIndex != setTempObj.tempIndex) { + break; + } + + DuplicateItem dupValue = (DuplicateItem) setLocalValue.value; + if (dupValue.tempIndex != setTempValue.tempIndex) { + break; + } + + if (!(pushValue.value instanceof DuplicateSourceItem)) { + break; + } + DuplicateSourceItem dupSourceValue = (DuplicateSourceItem) pushValue.value; + if (dupSourceValue.tempIndex != dupValue.tempIndex) { + break; + } + if (setLocalObj.regIndex != objLocalReg.regIndex) { + break; + } + + getProp.object = setTempObj.value; + for (int i = 0; i < expectedClasses.length; i++) { + output.remove(output.size() - 1); + } + stack.moveToStack(output); + if (isIncrement) { + stack.push(new PreIncrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + } else { + stack.push(new PreDecrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + } + return; + } while(false); + } + + //TestIncDec5 no result + expectedClasses = new Class[]{ + SetTemporaryItem.class, + SetLocalAVM2Item.class, + SetLocalAVM2Item.class + }; + + /* + var _temp_5:* = a; + var _loc2_:* = _temp_5; + var _loc3_:* = _temp_5.attrib + 1; + _loc2_.attrib = _loc3_; + */ + + if (output.size() >= expectedClasses.length) { + + loopout: do { + for (int i = 0; i < expectedClasses.length; i++) { + if (!expectedClasses[expectedClasses.length - 1 - i].isAssignableFrom(output.get(output.size() - 1 - i).getClass())) { + break loopout; + } + } + + SetLocalAVM2Item setLocalValue = (SetLocalAVM2Item) output.get(output.size() - 1); + SetLocalAVM2Item setLocalObj = (SetLocalAVM2Item) output.get(output.size() - 2); + SetTemporaryItem setTempObj = (SetTemporaryItem) output.get(output.size() - 3); + + + if (setLocalValue.regIndex != valueLocalReg.regIndex) { + break; + } + if (setLocalObj.regIndex != objLocalReg.regIndex) { + break; + } + if (!(setLocalValue.value instanceof IncrementAVM2Item + || setLocalValue.value instanceof DecrementAVM2Item)) { + break; + } + if (!(setLocalValue.value.value instanceof GetPropertyAVM2Item)) { + break; + } + boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; + + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value; + if (!(getProp.object instanceof TemporaryItem)) { + break; + } + if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { + break; + } + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (!fm.compareSame(multiname)) { + break; + } + TemporaryItem tempObj = (TemporaryItem) getProp.object; + if (tempObj.tempIndex != setTempObj.tempIndex) { + break; + } + + getProp.object = setTempObj.value; + for (int i = 0; i < expectedClasses.length; i++) { + output.remove(output.size() - 1); + } + stack.moveToStack(output); + if (isIncrement) { + stack.addToOutput(new PreIncrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); + } else { + stack.addToOutput(new PreDecrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); + } + return; + } while(false); + } + /*stack.moveToStack(output); if (!stack.isEmpty()) { GraphTargetItem checked = checkIncDec(false, multinameIndex, ins, localData, stack.peek(), valueLocalReg, nameLocalReg, objLocalReg);