Fix TestIncDec6 no result AIR

This commit is contained in:
Jindra Petřík
2025-09-01 17:01:27 +02:00
parent 5ab780c78e
commit 2d76938123
3 changed files with 162 additions and 25 deletions
@@ -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<Boolean> isStatic = new Reference<>(false);
Reference<GraphTargetItem> type = new Reference<>(null);
Reference<GraphTargetItem> callType = new Reference<>(null);
@@ -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);
@@ -264,7 +264,7 @@ public class TranslateStack extends Stack<GraphTargetItem> {
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);