Fix TestIncDec3

This commit is contained in:
Jindra Petřík
2025-08-16 16:55:35 +02:00
parent 2048402750
commit ed62d9eb02
3 changed files with 232 additions and 12 deletions

View File

@@ -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<GraphTargetItem> 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)

View File

@@ -65,7 +65,11 @@ public interface SetTypeIns {
* @param type Type
*/
public static void handleResult(GraphTargetItem value, TranslateStack stack, List<GraphTargetItem> 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;

View File

@@ -260,16 +260,18 @@ public class TranslateStack extends Stack<GraphTargetItem> {
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 {