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 c4cd4d8ae..025bc703c 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 @@ -66,6 +66,8 @@ import com.jpexs.decompiler.graph.model.DuplicateItem; import com.jpexs.decompiler.graph.model.DuplicateSourceItem; import com.jpexs.decompiler.graph.model.PopItem; import com.jpexs.decompiler.graph.model.PushItem; +import com.jpexs.decompiler.graph.model.SetTemporaryItem; +import com.jpexs.decompiler.graph.model.TemporaryItem; import com.jpexs.helpers.LinkedIdentityHashSet; import com.jpexs.helpers.Reference; import java.io.Serializable; @@ -555,12 +557,16 @@ public abstract class InstructionDefinition implements Serializable { * @param output Output * @param path Path */ + @SuppressWarnings("unchecked") public void handleSetProperty(boolean init, AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { stack.allowSwap(output); int multinameIndex = ins.operands[0]; GraphTargetItem value = stack.pop(); FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins, output); GraphTargetItem obj = stack.pop(); + + + /* //assembled/TestIncrement if ((value instanceof IncrementAVM2Item) || (value instanceof DecrementAVM2Item)) { boolean isIncrement = (value instanceof IncrementAVM2Item); @@ -757,12 +763,220 @@ public abstract class InstructionDefinition implements Serializable { } } } - } - + }*/ + + + if (value instanceof LocalRegAVM2Item) { + LocalRegAVM2Item valueLocalReg = (LocalRegAVM2Item) value; + LocalRegAVM2Item nameLocalReg = null; + if (multiname.name instanceof LocalRegAVM2Item) { + nameLocalReg = (LocalRegAVM2Item) multiname.name; + } + 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; + _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; + } + } - stack.moveToStack(output); + 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 TemporaryItem)) { + break; + } + if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { + break; + } + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (!(fm.name instanceof TemporaryItem)) { + break; + } + TemporaryItem tempObj = (TemporaryItem) getProp.object; + if (tempObj.tempIndex != setTempObj.tempIndex) { + break; + } + TemporaryItem tempName = (TemporaryItem) 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; + _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; + } + } + + 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 TemporaryItem)) { + break; + } + if (!(getProp.propertyName instanceof FullMultinameAVM2Item)) { + break; + } + FullMultinameAVM2Item fm = (FullMultinameAVM2Item) getProp.propertyName; + if (!(fm.name instanceof TemporaryItem)) { + break; + } + TemporaryItem tempObj = (TemporaryItem) getProp.object; + if (tempObj.tempIndex != setTempObj.tempIndex) { + break; + } + TemporaryItem tempName = (TemporaryItem) 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.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + } else { + stack.addToOutput(new PreDecrementAVM2Item(setLocalValue.value.value.getSrc(), setLocalValue.value.value.lineStartItem, getProp)); + } + return; + } while(false); + } + + + /*stack.moveToStack(output); if (!stack.isEmpty()) { GraphTargetItem checked = checkIncDec(false, multinameIndex, ins, localData, stack.peek(), valueLocalReg, nameLocalReg, objLocalReg); if (checked != null) { @@ -778,7 +992,7 @@ public abstract class InstructionDefinition implements Serializable { output.add(checked); return; } - } + }*/ } } @@ -875,8 +1089,8 @@ public abstract class InstructionDefinition implements Serializable { if (propertyName.name instanceof SetLocalAVM2Item) { nameSetLocalReg = (SetLocalAVM2Item) propertyName.name; } - if (getProperty.object instanceof SetLocalAVM2Item) { - SetLocalAVM2Item objSetLocalReg = (SetLocalAVM2Item) getProperty.object; + if (getProperty.object.getThroughDuplicate() instanceof SetLocalAVM2Item) { + SetLocalAVM2Item objSetLocalReg = (SetLocalAVM2Item) getProperty.object.getThroughDuplicate(); if ((valueLocalReg.regIndex == valueSetLocalReg.regIndex) && (propertyName.multinameIndex == multinameIndex) 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 787e25fb9..bc861d098 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 @@ -65,7 +65,11 @@ public interface SetTypeIns { * @param type Type */ public static void handleResult(GraphTargetItem value, TranslateStack stack, List output, AVM2LocalData localData, GraphTargetItem result, int regId, GraphTargetItem type) { - //stack.addToOutput(result); + stack.addToOutput(result); + if (true) { //FIXME?? + return; + } + // GraphTargetItem notCoercedValue = value; if ((value instanceof CoerceAVM2Item) || (value instanceof ConvertAVM2Item)) { notCoercedValue = value.value; 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 d0f2150fe..d9372cce8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java @@ -260,16 +260,18 @@ public class TranslateStack extends Stack { SetTemporaryItem st = (SetTemporaryItem) pi.value; connectedOutput.set(i, st); return new TemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), pi.value, st.tempIndex); - } /*else if (pi.value instanceof DuplicateSourceItem) { - //DuplicateSourceItem ds = (DuplicateSourceItem) pi.value; + } else if (pi.value instanceof DuplicateSourceItem) { + 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); } else if (pi.value instanceof DuplicateItem) { DuplicateItem d = (DuplicateItem) pi.value; //connectedOutput.remove(i); - connectedOutput.set(i, new SetTemporaryItem(pi.dialect, d.getSrc(), d.getLineStartItem(), d.value, d.tempIndex)); - return new TemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), pi.value, d.tempIndex); - } */else if (pi.value instanceof TemporaryItem) { + //connectedOutput.set(i, new SetTemporaryItem(pi.dialect, d.getSrc(), d.getLineStartItem(), d.value, d.tempIndex)); + connectedOutput.remove(i); + return new TemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), pi.value, d.tempIndex); + } else if (pi.value instanceof TemporaryItem) { connectedOutput.remove(i); return pi.value; } else {