diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java index 7d97dee6a..bd2002540 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java @@ -21,7 +21,9 @@ import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.SecondPassData; import com.jpexs.helpers.Reference; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.Map; import java.util.Set; /** 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 558a99efe..a1b4695a3 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 @@ -767,11 +767,11 @@ public abstract class InstructionDefinition implements Serializable { - // ==> TestIncDec5 with result AIR is in GetLocalTypeIns + //TestIncDec5 no result AIR /* - var _temp_5:* = a; + var _temp_5:* = a; _temp_5.attrib = _temp_5.attrib + 1; */ if (value instanceof IncrementAVM2Item @@ -848,674 +848,393 @@ public abstract class InstructionDefinition implements Serializable { if (obj instanceof LocalRegAVM2Item) { LocalRegAVM2Item objLocalReg = (LocalRegAVM2Item) obj; - //TestIncDec3 with result - Class[] expectedClasses = new Class[]{ - //PushItem.class, - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - PushItem.class, - SetLocalAVM2Item.class - }; - /* - //var _temp_4:* = §§findproperty(trace); - var _temp_1:* = a; - var _loc2_:* = _temp_1; - var _temp_2:* = 2; - var _loc3_:int = _temp_2; - var _temp_3:* = _temp_1[_temp_2] + 1; - var _loc4_:* = _temp_3; + //var _temp_5:* = §§findproperty(trace); + var _loc4_:*; + var _loc2_:*; + var _loc3_:int; + var _temp_4:* = _loc4_ = (_loc2_ = a)[_loc3_ = 2] + 1; _loc2_[_loc3_] = _loc4_; - trace(_temp_3); + trace(_temp_4); */ - - 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; + if (!stack.isEmpty() && stack.peek() instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) stack.peek(); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocValue.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.name instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocName = (SetLocalAVM2Item) fm.name; + if (valueLocalReg.regIndex == setLocValue.regIndex + && objLocalReg.regIndex == setLocObj.regIndex + && nameLocalReg.regIndex == setLocName.regIndex) { + getProp.object = setLocObj.value; + fm.name = setLocName.value; + stack.pop(); + if (isIncrement) { + stack.push(new PreIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.push(new PreDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } } } - - 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 setLocalName = (SetLocalAVM2Item) output.get(output.size() - 4); - SetTemporaryItem setTempName = (SetTemporaryItem) output.get(output.size() - 5); - SetLocalAVM2Item setLocalObj = (SetLocalAVM2Item) output.get(output.size() - 6); - SetTemporaryItem setTempObj = (SetTemporaryItem) output.get(output.size() - 7); - - - 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 DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof DuplicateSourceItem)) { - break; - } - DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; - if (tempObj.tempIndex != setTempObj.tempIndex) { - break; - } - DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; - if (tempName.tempIndex != setTempName.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 (setLocalName.regIndex != nameLocalReg.regIndex) { - break; - } - if (setLocalObj.regIndex != objLocalReg.regIndex) { - break; - } - - fm.name = setTempName.value; - 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); + } } - - //TestIncDec3 no result - expectedClasses = new Class[]{ - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetLocalAVM2Item.class - }; - /* - var _temp_7:* = a; - var _loc2_:* = _temp_7; - var _temp_8:* = 2; - var _loc3_:int = _temp_8; - var _loc4_:* = _temp_7[_temp_8] + 1; + var _loc2_:* = a; + var _loc3_:int; + var _loc4_:* = _loc2_[_loc3_ = 2] + 1; _loc2_[_loc3_] = _loc4_; */ - 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; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocValue.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.name instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocName = (SetLocalAVM2Item) fm.name; + if (valueLocalReg.regIndex == setLocValue.regIndex + && objLocalReg.regIndex == setLocObj.regIndex + && nameLocalReg.regIndex == setLocName.regIndex) { + getProp.object = setLocObj.value; + fm.name = setLocName.value; + output.remove(output.size() - 1); + if (isIncrement) { + stack.addToOutput(new PreIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.addToOutput(new PreDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } } } - - SetLocalAVM2Item setLocalValue = (SetLocalAVM2Item) output.get(output.size() - 1); - SetLocalAVM2Item setLocalName = (SetLocalAVM2Item) output.get(output.size() - 2); - SetTemporaryItem setTempName = (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 (setLocalName.regIndex != nameLocalReg.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 DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof DuplicateSourceItem)) { - break; - } - DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; - if (tempObj.tempIndex != setTempObj.tempIndex) { - break; - } - DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; - if (tempName.tempIndex != setTempName.tempIndex) { - break; - } - fm.name = setTempName.value; - 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); + } } - //TestIncDec4 with result - expectedClasses = new Class[]{ - //PushItem.class - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - PushItem.class, - SetLocalAVM2Item.class - }; + //TestIncDec4 with result /* - //var _temp_4:* = §§findproperty(trace); - var _temp_1:* = a; - var _loc2_:* = _temp_1; - var _temp_2:* = 2; - var _loc3_:int = _temp_2; - var _temp_3:* = Number(_temp_1[_temp_2]); + var _temp_4:* = §§findproperty(trace); + var _loc2_:*; + var _loc3_:int; + var _temp_3:* = Number((_loc2_ = a)[_loc3_ = 2]); var _loc4_:* = _temp_3 + 1; _loc2_[_loc3_] = _loc4_; trace(_temp_3); */ - - 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; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof DuplicateItem) { + DuplicateItem d = (DuplicateItem) setLocValue.value.value; + if (output.size() >= 2 + && output.get(output.size() - 2) instanceof PushItem + && output.get(output.size() - 2).value instanceof DuplicateSourceItem) { + DuplicateSourceItem ds = (DuplicateSourceItem) output.get(output.size() - 2).value; + if (ds.tempIndex == d.tempIndex) { + if (output.size() >= 3 && output.get(output.size() - 3) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 3); + if (st.tempIndex == d.tempIndex) { + if (st.value instanceof ConvertAVM2Item) { + if (st.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) st.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.name instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocName = (SetLocalAVM2Item) fm.name; + if (valueLocalReg.regIndex == setLocValue.regIndex + && objLocalReg.regIndex == setLocObj.regIndex + && nameLocalReg.regIndex == setLocName.regIndex) { + getProp.object = setLocObj.value; + fm.name = setLocName.value; + output.remove(output.size() - 1); + output.remove(output.size() - 1); + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.push(new PostIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.push(new PostDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } + } + } + } + } + } + } } } - - 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 setLocalName = (SetLocalAVM2Item) output.get(output.size() - 4); - SetTemporaryItem setTempName = (SetTemporaryItem) output.get(output.size() - 5); - SetLocalAVM2Item setLocalObj = (SetLocalAVM2Item) output.get(output.size() - 6); - SetTemporaryItem setTempObj = (SetTemporaryItem) output.get(output.size() - 7); - - - if (setLocalValue.regIndex != valueLocalReg.regIndex) { - break; - } - if (!(setLocalValue.value instanceof IncrementAVM2Item - || setLocalValue.value instanceof DecrementAVM2Item)) { - break; - } - if (!(setLocalValue.value.value instanceof DuplicateItem)) { - break; - } - if (!(setLocalValue.value.value.value.getNotCoercedNoDup() instanceof GetPropertyAVM2Item)) { - break; - } - boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; - - GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value.getNotCoercedNoDup(); - if (!(getProp.object instanceof DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof DuplicateSourceItem)) { - break; - } - DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; - if (tempObj.tempIndex != setTempObj.tempIndex) { - break; - } - DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; - if (tempName.tempIndex != setTempName.tempIndex) { - break; - } - DuplicateItem dupValue = (DuplicateItem) setLocalValue.value.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 (setLocalName.regIndex != nameLocalReg.regIndex) { - break; - } - if (setLocalObj.regIndex != objLocalReg.regIndex) { - break; - } - - fm.name = setTempName.value; - 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 PostIncrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); - } else { - stack.push(new PostDecrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); - } - return; - } while(false); + } } - + //TestIncDec4 no result AIR - expectedClasses = new Class[]{ - //PushItem.class - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetLocalAVM2Item.class - }; - /* - var _temp_7:* = a; - var _loc2_:* = _temp_7; - var _temp_8:* = 2; - var _loc3_:int = _temp_8; - var _loc4_:* = Number(_temp_7[_temp_8]) + 1; + var _loc2_:* = a; + var _loc3_:int; + var _loc4_:* = Number(_loc2_[_loc3_ = 2]) + 1; _loc2_[_loc3_] = _loc4_; */ - - 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; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof ConvertAVM2Item) { + if (setLocValue.value.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocValue.value.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.name instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocName = (SetLocalAVM2Item) fm.name; + if (valueLocalReg.regIndex == setLocValue.regIndex + && objLocalReg.regIndex == setLocObj.regIndex + && nameLocalReg.regIndex == setLocName.regIndex) { + getProp.object = setLocObj.value; + fm.name = setLocName.value; + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.addToOutput(new PostIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.addToOutput(new PostDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } + } } } - - SetLocalAVM2Item setLocalValue = (SetLocalAVM2Item) output.get(output.size() - 1); - SetLocalAVM2Item setLocalName = (SetLocalAVM2Item) output.get(output.size() - 2); - SetTemporaryItem setTempName = (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 IncrementAVM2Item - || setLocalValue.value instanceof DecrementAVM2Item)) { - break; - } - if (!(setLocalValue.value.value instanceof ConvertAVM2Item)) { - break; - } - if (!(setLocalValue.value.value.value instanceof GetPropertyAVM2Item)) { - break; - } - boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; - - GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value; - if (!(getProp.object instanceof DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!(fm.name instanceof DuplicateSourceItem)) { - break; - } - DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; - if (tempObj.tempIndex != setTempObj.tempIndex) { - break; - } - DuplicateSourceItem tempName = (DuplicateSourceItem) fm.name; - if (tempName.tempIndex != setTempName.tempIndex) { - break; - } - if (setLocalName.regIndex != nameLocalReg.regIndex) { - break; - } - if (setLocalObj.regIndex != objLocalReg.regIndex) { - break; - } - - fm.name = setTempName.value; - 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 PostIncrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); - } else { - stack.addToOutput(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; + var _temp_4:* = §§findproperty(trace); + var _loc3_:*; + var _loc2_:*; + var _temp_3:* = _loc3_ = (_loc2_ = a).attrib + 1; _loc2_.attrib = _loc3_; - trace(_temp_2); + trace(_temp_3); */ - - 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; + if (!stack.isEmpty() && stack.peek() instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) stack.peek(); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocValue.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.compareSame(multiname)) { + if (valueLocalReg.regIndex == setLocValue.regIndex + && objLocalReg.regIndex == setLocObj.regIndex) { + getProp.object = setLocObj.value; + stack.pop(); + if (isIncrement) { + stack.push(new PreIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.push(new PreDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } } } - - 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 DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!fm.compareSame(multiname)) { - break; - } - - DuplicateSourceItem tempObj = (DuplicateSourceItem) 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; + var _loc2_:* = a; + var _loc3_:* = _loc2_.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; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocValue.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.compareSame(multiname)) { + if (valueLocalReg.regIndex == setLocValue.regIndex + && objLocalReg.regIndex == setLocObj.regIndex) { + getProp.object = setLocObj.value; + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.addToOutput(new PreIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.addToOutput(new PreDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } } } - - 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 DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!fm.compareSame(multiname)) { - break; - } - DuplicateSourceItem tempObj = (DuplicateSourceItem) 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); + } } - //TestIncDec6 with result - expectedClasses = new Class[]{ - //PushItem.class - SetTemporaryItem.class, - SetLocalAVM2Item.class, - SetTemporaryItem.class, - PushItem.class, - SetLocalAVM2Item.class - }; + //TestIncDec6 with result /* - //var _temp_3:* = §§findproperty(trace); - var _temp_1:* = a; - var _loc2_:* = _temp_1; - var _temp_2:* = Number(_temp_1.attrib); + var _temp_3:* = §§findproperty(trace); + var _loc2_:*; + var _temp_2:* = Number((_loc2_ = a).attrib); var _loc3_:* = _temp_2 + 1; _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; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof DuplicateItem) { + DuplicateItem d = (DuplicateItem) setLocValue.value.value; + if (output.size() >= 2 + && output.get(output.size() - 2) instanceof PushItem + && output.get(output.size() - 2).value instanceof DuplicateSourceItem) { + DuplicateSourceItem ds = (DuplicateSourceItem) output.get(output.size() - 2).value; + if (ds.tempIndex == d.tempIndex) { + if (output.size() >= 3 && output.get(output.size() - 3) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 3); + if (st.tempIndex == d.tempIndex) { + if (st.value instanceof ConvertAVM2Item) { + if (st.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) st.value.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.compareSame(multiname)) { + if (objLocalReg.regIndex == setLocObj.regIndex + && valueLocalReg.regIndex == setLocValue.regIndex) { + getProp.object = setLocObj.value; + output.remove(output.size() - 1); + output.remove(output.size() - 1); + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.push(new PostIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.push(new PostDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } + } + } + } + } + } + } } } - - 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 IncrementAVM2Item - || setLocalValue.value instanceof DecrementAVM2Item)) { - break; - } - if (!(setLocalValue.value.value instanceof DuplicateItem)) { - break; - } - if (!(setLocalValue.value.value.value.getNotCoercedNoDup() instanceof GetPropertyAVM2Item)) { - break; - } - boolean isIncrement = setLocalValue.value instanceof IncrementAVM2Item; - - GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocalValue.value.value.value.getNotCoercedNoDup(); - if (!(getProp.object instanceof DuplicateSourceItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - if (!fm.compareSame(multiname)) { - break; - } - DuplicateSourceItem tempObj = (DuplicateSourceItem) getProp.object; - if (tempObj.tempIndex != setTempObj.tempIndex) { - break; - } - - DuplicateItem dupValue = (DuplicateItem) setLocalValue.value.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 PostIncrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); - } else { - stack.push(new PostDecrementAVM2Item(setLocalValue.value.getSrc(), setLocalValue.value.lineStartItem, getProp)); - } - return; - } while(false); + } } + //TestIncDec10 with result + /* + var _temp_3:* = §§findproperty(trace); + var _loc1_:*; + var _temp_2:* = (_loc1_ = this).attrib; + var _loc2_:* = _temp_2 + 1; + _loc1_.attrib = _loc2_; + trace(_temp_2); + */ + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocValue = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocValue.value instanceof IncrementAVM2Item + || setLocValue.value instanceof DecrementAVM2Item) { + boolean isIncrement = setLocValue.value instanceof IncrementAVM2Item; + if (setLocValue.value.value instanceof DuplicateItem) { + DuplicateItem d = (DuplicateItem) setLocValue.value.value; + if (output.size() >= 2 + && output.get(output.size() - 2) instanceof PushItem + && output.get(output.size() - 2).value instanceof DuplicateSourceItem) { + DuplicateSourceItem ds = (DuplicateSourceItem) output.get(output.size() - 2).value; + if (ds.tempIndex == d.tempIndex) { + if (output.size() >= 3 && output.get(output.size() - 3) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 3); + if (st.tempIndex == d.tempIndex) { + if (st.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) st.value; + if (getProp.object instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocObj = (SetLocalAVM2Item) getProp.object; + if (getProp.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (fm.compareSame(multiname)) { + if (objLocalReg.regIndex == setLocObj.regIndex + && valueLocalReg.regIndex == setLocValue.regIndex) { + getProp.object = setLocObj.value; + output.remove(output.size() - 1); + output.remove(output.size() - 1); + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.push(new PostIncrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } else { + stack.push(new PostDecrementAVM2Item(setLocValue.value.getSrc(), setLocValue.value.getLineStartItem(), getProp)); + } + return; + } + } + } + } + } + } + } + } + } + } + } + } + + + /*stack.moveToStack(output); if (!stack.isEmpty()) { GraphTargetItem checked = checkIncDec(false, multinameIndex, ins, localData, stack.peek(), valueLocalReg, nameLocalReg, objLocalReg); 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 bc861d098..6d977358b 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 @@ -20,12 +20,19 @@ import com.jpexs.decompiler.flash.abc.AVM2LocalData; 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.DecrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.IncrementAVM2Item; 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.operations.PreDecrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreIncrementAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.DuplicateSourceItem; +import com.jpexs.decompiler.graph.model.SetTemporaryItem; import java.util.List; /** @@ -65,15 +72,48 @@ public interface SetTypeIns { * @param type Type */ public static void handleResult(GraphTargetItem value, TranslateStack stack, List output, AVM2LocalData localData, GraphTargetItem result, int regId, GraphTargetItem type) { + + GraphTargetItem notCoercedValue = value; + if ((value instanceof CoerceAVM2Item) || (value instanceof ConvertAVM2Item)) { + notCoercedValue = value.value; + } + + //TestChainedAssignments1 both AIR and nonair + if (notCoercedValue instanceof DuplicateItem) { + DuplicateItem d = (DuplicateItem) notCoercedValue; + stack.moveToStack(output); + if (!stack.isEmpty() && stack.peek() instanceof DuplicateSourceItem) { + DuplicateSourceItem ds = (DuplicateSourceItem) stack.peek(); + if (ds.tempIndex == d.tempIndex) { + GraphTargetItem newValue = d.value; + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 1); + if (st.tempIndex == ds.tempIndex) { + output.remove(output.size() - 1); + } + } + + if ((value instanceof CoerceAVM2Item) || (value instanceof ConvertAVM2Item)) { + result.value.value = newValue; + } else { + result.value = newValue; + } + + stack.pop(); + stack.moveToStack(output); + stack.push(result); + return; + } + } + stack.finishBlock(output); + } + stack.addToOutput(result); if (true) { //FIXME?? return; } // - GraphTargetItem notCoercedValue = value; - if ((value instanceof CoerceAVM2Item) || (value instanceof ConvertAVM2Item)) { - notCoercedValue = value.value; - } + if (notCoercedValue instanceof DuplicateItem) { GraphTargetItem insideDup = notCoercedValue.value; 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 2e4f8726c..539d2fdb5 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 @@ -124,189 +124,8 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { LocalRegAVM2Item result = new LocalRegAVM2Item(ins, localData.lineStartInstruction, regId, computedValue, type); - //TestIncDec5 with result AIR - /* - //var _temp_4:* = trace; - //var _temp_3:* = global; - var _temp_1:* = a; - var _temp_2:* = _temp_1.attrib + 1; - var _loc2_:* = _temp_2; - _temp_1.attrib = _temp_2; - _temp_4(_loc2_); - */ - stack.finishBlock(output); - Class[] 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 (!(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 DuplicateItem)) { - break; - } - if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { - break; - } - FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; - FullMultinameAVM2Item setFm = (FullMultinameAVM2Item) setProperty.propertyName; - - if (!fm.compareSame(setFm)) { - break; - } - - DuplicateItem dupObj = (DuplicateItem) getProp.object; - if (dupObj.tempIndex != setTempObj.tempIndex) { - break; - } - - DuplicateItem dupValue = (DuplicateItem) setLocalValue.value; - if (dupValue.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); - } - - //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); - } - //TestIncDec7 AIR if (!output.isEmpty()) { GraphTargetItem lastOutput = output.get(output.size() - 1); @@ -324,6 +143,137 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { } } + + //TestIncDec6 with result AIR + if (!output.isEmpty() && output.get(output.size() - 1) instanceof SetPropertyAVM2Item) { + SetPropertyAVM2Item setProp = (SetPropertyAVM2Item) output.get(output.size() - 1); + if (setProp.value instanceof IncrementAVM2Item + || setProp.value instanceof DecrementAVM2Item) { + boolean isIncrement = setProp.value instanceof IncrementAVM2Item; + if (setProp.value.value instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLoc = (SetLocalAVM2Item) setProp.value.value; + if (setLoc.regIndex == regId) { + if (setLoc.getSrc() instanceof AVM2Instruction) { + AVM2Instruction src = (AVM2Instruction) setLoc.getSrc(); + if (localData.getSetLocalUsages(localData.code.adr2pos(src.getAddress())).size() == 1) { + if (setLoc.value instanceof ConvertAVM2Item) { + if (setLoc.value.value instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLoc.value.value; + if (setProp.object instanceof DuplicateSourceItem) { + DuplicateSourceItem ds = (DuplicateSourceItem) setProp.object; + if (getProp.object instanceof DuplicateItem) { + DuplicateItem d = (DuplicateItem) getProp.object; + if (output.size() >= 2 && output.get(output.size() - 2) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 2); + if (st.tempIndex == d.tempIndex) { + getProp.object = st.value; + output.remove(output.size() - 1); + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.push(new PostIncrementAVM2Item(setProp.value.getSrc(), setProp.value.getLineStartItem(), getProp)); + } else { + stack.push(new PostDecrementAVM2Item(setProp.value.getSrc(), setProp.value.getLineStartItem(), getProp)); + } + return; + } + } + } + } + } + } + } + } + } + } + } + } + + //TestChainedAssignments1 + /* + trace("c = b = a = 5;"); + var a:int = 0; + var b:int = 0; + var c:int = 0; + var _loc4_:*; + a = _loc4_ = 5; + b = _loc4_ = _loc4_; + c = _loc4_; + */ + stack.moveToStack(output); + if (!output.isEmpty()) { + //chained assignments + if ((output.get(output.size() - 1) instanceof SetTypeAVM2Item)) { + GraphTargetItem setItem = output.get(output.size() - 1); + if (setItem.value.getNotCoercedNoDup() instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) setItem.value.getNotCoercedNoDup(); + if (setLocal.regIndex == regId) { + int setLocalIp = localData.code.adr2pos(setLocal.getSrc().getAddress()); + if (localData.getSetLocalUsages(setLocalIp).size() == 1) { + + + //TestIncDec5 with result AIR + if (setItem instanceof SetPropertyAVM2Item + && (setLocal.value instanceof IncrementAVM2Item + || setLocal.value instanceof DecrementAVM2Item + )) { + SetPropertyAVM2Item setProp = (SetPropertyAVM2Item) setItem; + boolean isIncrement = setLocal.value instanceof IncrementAVM2Item; + if (setLocal.value.value instanceof GetPropertyAVM2Item) { + + //TestIncDec6 with result AIR + /* + var _temp_4:* = trace; + var _temp_3:* = global; + var _temp_1:* = a; + var _loc2_:Number; + _temp_1.attrib = (_loc2_ = _temp_1.attrib) + 1; + _temp_4(_loc2_); + */ + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) setLocal.value.value; + if (getProp.object instanceof DuplicateItem) { + DuplicateItem d = (DuplicateItem) getProp.object; + if (setProp.object instanceof DuplicateSourceItem) { + DuplicateSourceItem ds = (DuplicateSourceItem) setProp.object; + if (ds.tempIndex == d.tempIndex) { + if (output.size() >= 2 && output.get(output.size() - 2) instanceof SetTemporaryItem) { + SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 2); + if (st.tempIndex == d.tempIndex) { + getProp.object = st.value; + output.remove(output.size() - 1); + output.remove(output.size() - 1); + stack.moveToStack(output); + if (isIncrement) { + stack.push(new PreIncrementAVM2Item(setLocal.value.getSrc(), setLocal.value.getLineStartItem(), getProp)); + } else { + stack.push(new PreDecrementAVM2Item(setLocal.value.getSrc(), setLocal.value.getLineStartItem(), getProp)); + } + return; + } + } + } + } + } + } + } + + if ((setItem.value instanceof CoerceAVM2Item) || (setItem.value instanceof ConvertAVM2Item)) { + setItem.value.value = setLocal.value; + } else { + setItem.value = setLocal.value; + } + output.remove(output.size() - 1); + stack.moveToStack(output); + + stack.push(setItem); + return; + } + } + } + } + stack.finishBlock(output); + } + stack.moveToStack(output); stack.push(result); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/DupIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/DupIns.java index 454b8f42c..ddcd92e47 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/DupIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/DupIns.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.abc.avm2.graph.AVM2GraphTargetDialect; 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.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.clauses.ExceptionAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; 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 7999b4f5e..8abbca18d 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf differ 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 e2478e0e0..286a7fb28 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index 47d970050..e2dd0e433 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -24,7 +24,10 @@ package TestCallLocal; TestCatchFinally; TestChain2; - TestChainedAssignments; + TestChainedAssignments1; + TestChainedAssignments2; + TestChainedAssignments3; + TestChainedAssignments4; TestCollidingTraitNames; TestCollidingTry; TestComplexExpressions; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments1.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments1.as new file mode 100644 index 000000000..6fc36cda7 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments1.as @@ -0,0 +1,15 @@ +package tests +{ + + public class TestChainedAssignments1 + { + public function run():* + { + trace("c = b = a = 5;"); + var a:int = 0; + var b:int = 0; + var c:int = 0; + c = b = a = 5; + } + } +} diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments2.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments2.as new file mode 100644 index 000000000..c477e675d --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments2.as @@ -0,0 +1,19 @@ +package tests +{ + + public class TestChainedAssignments2 + { + public function run():* + { + trace("e.attrib1 = e.attrib2 = e.attrib3 = 10;"); + var e:TestClass = new TestClass(); + e.attrib1 = e.attrib2 = e.attrib3 = 10; + } + } +} + +class TestClass { + public var attrib1:int; + public var attrib2:int; + public var attrib3:int; +} diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments3.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments3.as new file mode 100644 index 000000000..312264241 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments3.as @@ -0,0 +1,18 @@ +package tests +{ + + public class TestChainedAssignments3 + { + private var prop:int; + + public function run():* + { + var a:int = 0; + var b:int = 0; + prop = a = b = 4; + if (a == 2) { + trace("OK: " + a); + } + } + } +} diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments4.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments4.as new file mode 100644 index 000000000..465a37153 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestChainedAssignments4.as @@ -0,0 +1,18 @@ +package tests +{ + + public class TestChainedAssignments4 + { + private var prop:int; + + public function run():* + { + trace("slotc = slotb = slota = 5;"); + var slota:int = 0; + var slotb:int = 0; + var slotc:int = 0; + var f:Function = function(n1:int, n2:int):int {return n1 + n2;}; //trigger slot generating + slotc = slotb = slota = 5; + } + } +}