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 0756ea708..31166bcf0 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 @@ -770,6 +770,10 @@ public abstract class InstructionDefinition implements Serializable { // ==> TestIncDec5 with result AIR is in GetLocalTypeIns //TestIncDec5 no result AIR + /* + var _temp_5:* = a; + _temp_5.attrib = _temp_5.attrib + 1; + */ if (value instanceof IncrementAVM2Item || value instanceof DecrementAVM2Item) { boolean isIncrement = value instanceof IncrementAVM2Item; @@ -796,6 +800,43 @@ public abstract class InstructionDefinition implements Serializable { } } } + + //TestIncDec6 no result AIR + //In air, this is *POST* inc/decrement + /* + var _temp_5:* = a; + _temp_5.attrib = _temp_5.attrib + 1; + */ + if (value instanceof IncrementAVM2Item + || value instanceof DecrementAVM2Item) { + boolean isIncrement = value instanceof IncrementAVM2Item; + if (value.value instanceof ConvertAVM2Item) { + if (value.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) value.value.value; + if (getProp.object instanceof DuplicateItem + && obj instanceof DuplicateSourceItem) { + if (getProp.object.getThroughDuplicate() == obj.getThroughDuplicate()) { + DuplicateItem d = (DuplicateItem) getProp.object; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 1); + if (st.tempIndex == d.tempIndex) { + output.remove(output.size() - 1); + getProp.object = st.value; + if (isIncrement) { + stack.addToOutput(new PostIncrementAVM2Item(value.getSrc(), value.lineStartItem, getProp)); + } else { + stack.addToOutput(new PostDecrementAVM2Item(value.getSrc(), value.lineStartItem, getProp)); + } + return; + } + } + } + } + } + } + } + + if (value instanceof LocalRegAVM2Item) { LocalRegAVM2Item valueLocalReg = (LocalRegAVM2Item) value; @@ -866,21 +907,21 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value; - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { break; } FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof TemporaryItem)) { + if (!(fm.name instanceof DuplicateSourceItem)) { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } - TemporaryItem tempName = (TemporaryItem) fm.name; + DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; if (tempName.tempIndex != setTempName.tempIndex) { break; } @@ -973,21 +1014,21 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value; - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { break; } FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof TemporaryItem)) { + if (!(fm.name instanceof DuplicateSourceItem)) { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } - TemporaryItem tempName = (TemporaryItem) fm.name; + DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; if (tempName.tempIndex != setTempName.tempIndex) { break; } @@ -1064,21 +1105,21 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value.getNotCoercedNoDup(); - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { break; } FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof TemporaryItem)) { + if (!(fm.name instanceof DuplicateSourceItem)) { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } - TemporaryItem tempName = (TemporaryItem) fm.name; + DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; if (tempName.tempIndex != setTempName.tempIndex) { break; } @@ -1167,21 +1208,21 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value; - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { break; } FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof TemporaryItem)) { + if (!(fm.name instanceof DuplicateSourceItem)) { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } - TemporaryItem tempName = (TemporaryItem) fm.name; + DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; if (tempName.tempIndex != setTempName.tempIndex) { break; } @@ -1259,7 +1300,7 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value; - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { @@ -1270,7 +1311,7 @@ public abstract class InstructionDefinition implements Serializable { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } @@ -1349,7 +1390,7 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value; - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { @@ -1359,7 +1400,7 @@ public abstract class InstructionDefinition implements Serializable { if (!fm.compareSame(multiname)) { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } @@ -1430,7 +1471,7 @@ public abstract class InstructionDefinition implements Serializable { boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value.getNotCoercedNoDup(); - if (!(getProp.object instanceof TemporaryItem)) { + if (!(getProp.object instanceof DuplicateSourceItem)) { break; } if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { @@ -1440,7 +1481,7 @@ public abstract class InstructionDefinition implements Serializable { if (!fm.compareSame(multiname)) { break; } - TemporaryItem tempObj = (TemporaryItem) getProp.object; + DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; if (tempObj.tempIndex != setTempObj.tempIndex) { break; } @@ -1541,8 +1582,8 @@ public abstract class InstructionDefinition implements Serializable { } return; } - } - + } + Reference isStatic = new Reference<>(false); Reference type = new Reference<>(null); Reference callType = new Reference<>(null); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java index ecd6577cc..1ea88173a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java @@ -209,6 +209,102 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { } while(false); } + //TestIncDec6 with result AIR + /* + //var _temp_4:* = trace; + //var _temp_3:* = global; + var _temp_1:* = a; + var _temp_2:* = _temp_1.attrib; + var _loc2_:* = _temp_2; + _temp_1.attrib = _temp_2 + 1; + _temp_4(_loc2_); + */ + expectedClasses = new Class[] { + SetTemporaryItem.class, + SetTemporaryItem.class, + SetLocalAVM2Item.class, + SetPropertyAVM2Item.class + }; + + 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; + } + } + + SetPropertyAVM2Item setProperty = (SetPropertyAVM2Item) output.get(output.size() - 1); + SetLocalAVM2Item setLocalValue = (SetLocalAVM2Item) output.get(output.size() - 2); + SetTemporaryItem setTempValue = (SetTemporaryItem) output.get(output.size() - 3); + SetTemporaryItem setTempObj = (SetTemporaryItem) output.get(output.size() - 4); + + + if (setLocalValue.regIndex != result.regIndex) { + break; + } + if (!(setProperty.object instanceof DuplicateSourceItem)) { + break; + } + if (!(setProperty.value instanceof IncrementAVM2Item + || setProperty.value instanceof DecrementAVM2Item)) { + break; + } + + if (!(setProperty.value.value instanceof DuplicateSourceItem)) { + break; + } + + if (!(setProperty.value.value.value.getNotCoercedNoDup() instanceof GetPropertyAVM2Item)) { + break; + } + boolean isIncrement = setProperty.value instanceof IncrementAVM2Item; + + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setProperty.value.value.value.getNotCoercedNoDup(); + if (!(getProp.object instanceof DuplicateItem)) { + break; + } + if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { + break; + } + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + FullMultinameAVM2Item setFm = (FullMultinameAVM2Item) setProperty.propertyName; + + if (!fm.compareSame(setFm)) { + break; + } + + if (!(setLocalValue.value instanceof DuplicateItem)) { + break; + } + DuplicateSourceItem dupSourceObj = (DuplicateSourceItem) setProperty.object; + DuplicateItem dupObj = (DuplicateItem) getProp.object; + if (dupObj.tempIndex != setTempObj.tempIndex + || dupSourceObj.tempIndex != setTempObj.tempIndex) { + break; + } + + DuplicateSourceItem dupValue = (DuplicateSourceItem) setProperty.value.value; + DuplicateItem dupSourceValue = (DuplicateItem) setLocalValue.value; + if (dupValue.tempIndex != setTempValue.tempIndex + || dupSourceValue.tempIndex != setTempValue.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.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); + } + stack.moveToStack(output); stack.push(result); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java index d9372cce8..9ee4e5e99 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java @@ -264,7 +264,7 @@ public class TranslateStack extends Stack { DuplicateSourceItem ds = (DuplicateSourceItem) pi.value; //connectedOutput.set(i, new SetTemporaryItem(pi.dialect, ds.getSrc(), ds.getLineStartItem(), ds.value, ds.tempIndex,"push")); connectedOutput.remove(i); - return new TemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), ds.value, ds.tempIndex); + return ds; //new TemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), ds.value, ds.tempIndex); } else if (pi.value instanceof DuplicateItem) { DuplicateItem d = (DuplicateItem) pi.value; //connectedOutput.remove(i);