Kill switch

This commit is contained in:
Jindra Petřík
2021-01-24 07:54:10 +01:00
parent fe6ad7c7f0
commit d5db3dc5f2
2 changed files with 10 additions and 8 deletions

View File

@@ -324,6 +324,8 @@ public class AVM2Code implements Cloneable {
private static final boolean DEBUG_MODE = false;
public static final boolean USE_KILL_INS = false;
public static int toSourceLimit = -1;
public List<AVM2Instruction> code;
@@ -1490,7 +1492,7 @@ public class AVM2Code implements Cloneable {
List<GraphTargetItem> output = new ArrayList<>(input);
for (int i = 0; i < output.size(); i++) {
if (output.get(i) instanceof SetLocalAVM2Item) {
if (isKilled(((SetLocalAVM2Item) output.get(i)).regIndex, 0, code.size() - 1)) {
if (USE_KILL_INS && isKilled(((SetLocalAVM2Item) output.get(i)).regIndex, 0, code.size() - 1)) {
SetLocalAVM2Item lsi = (SetLocalAVM2Item) output.get(i);
if (i + 1 < output.size()) {
if (output.get(i + 1) instanceof ExitItem) {
@@ -1627,11 +1629,11 @@ public class AVM2Code implements Cloneable {
}
}
}*/
if ((ins.definition instanceof GetLocalTypeIns) && (!output.isEmpty()) && (output.get(output.size() - 1) instanceof SetLocalAVM2Item) && (((SetLocalAVM2Item) output.get(output.size() - 1)).regIndex == ((GetLocalTypeIns) ins.definition).getRegisterId(ins)) && isKilled(((SetLocalAVM2Item) output.get(output.size() - 1)).regIndex, start, end)) {
if (USE_KILL_INS && (ins.definition instanceof GetLocalTypeIns) && (!output.isEmpty()) && (output.get(output.size() - 1) instanceof SetLocalAVM2Item) && (((SetLocalAVM2Item) output.get(output.size() - 1)).regIndex == ((GetLocalTypeIns) ins.definition).getRegisterId(ins)) && isKilled(((SetLocalAVM2Item) output.get(output.size() - 1)).regIndex, start, end)) {
SetLocalAVM2Item slt = (SetLocalAVM2Item) output.remove(output.size() - 1);
stack.push(slt.getValue());
ip++;
} else if ((ins.definition instanceof SetLocalTypeIns) && (ip + 1 <= end) && (isKilled(((SetLocalTypeIns) ins.definition).getRegisterId(ins), ip, end))) { // set_local_x,get_local_x..kill x
} else if (USE_KILL_INS && (ins.definition instanceof SetLocalTypeIns) && (ip + 1 <= end) && (isKilled(((SetLocalTypeIns) ins.definition).getRegisterId(ins), ip, end))) { // set_local_x,get_local_x..kill x
AVM2Instruction insAfter = code.get(ip + 1);
if ((insAfter.definition instanceof GetLocalTypeIns) && (((GetLocalTypeIns) insAfter.definition).getRegisterId(insAfter) == ((SetLocalTypeIns) ins.definition).getRegisterId(ins))) {
GraphTargetItem before = stack.peek();
@@ -1670,7 +1672,7 @@ public class AVM2Code implements Cloneable {
} else if (processJumps && (insAfter.definition instanceof IfTrueIns)) {
//stack.add("(" + stack.pop() + ")||");
isAnd = false;
} else if (insAfter.definition instanceof SetLocalTypeIns) {
} else if (USE_KILL_INS && insAfter.definition instanceof SetLocalTypeIns) {
// chained assignments
int reg = (((SetLocalTypeIns) insAfter.definition).getRegisterId(insAfter));
for (int t = ip + 1; t <= end - 1; t++) {
@@ -1697,7 +1699,7 @@ public class AVM2Code implements Cloneable {
}
}
}
if (!isKilled(reg, 0, end)) {
if (USE_KILL_INS && !isKilled(reg, 0, end)) {
GraphTargetItem vx = stack.pop().getThroughDuplicate();
int dupCnt = 1;
for (int i = ip - 1; i >= start; i--) {

View File

@@ -466,7 +466,7 @@ public class AVM2Graph extends Graph {
if (part.nextParts.isEmpty()) {
if (avm2code.code.get(part.end).definition instanceof ReturnValueIns) { //returns in finally clause
if (part.getHeight() >= 3) {
if (avm2code.code.get(part.getPosAt(part.getHeight() - 2)).definition instanceof KillIns) {
if (AVM2Code.USE_KILL_INS && avm2code.code.get(part.getPosAt(part.getHeight() - 2)).definition instanceof KillIns) {
if (avm2code.code.get(part.getPosAt(part.getHeight() - 3)).definition instanceof GetLocalTypeIns) {
if (output.size() >= 2) {
if (output.get(output.size() - 2) instanceof SetLocalAVM2Item) {
@@ -951,7 +951,7 @@ public class AVM2Graph extends Graph {
continue;
}
}
if (avm2code.isKilled(ri.regIndex, 0, Integer.MAX_VALUE)) {
if (AVM2Code.USE_KILL_INS && avm2code.isKilled(ri.regIndex, 0, Integer.MAX_VALUE)) {
if (i + 1 < list.size()) {
if (list.get(i + 1) instanceof SwitchItem) {
SwitchItem si = (SwitchItem) list.get(i + 1);
@@ -1049,7 +1049,7 @@ public class AVM2Graph extends Graph {
}
for (GraphTargetItem i : output) {
if (i instanceof SetLocalAVM2Item) {
if (avm2code.isKilled(((SetLocalAVM2Item) i).regIndex, 0, avm2code.code.size() - 1)) {
if (AVM2Code.USE_KILL_INS && avm2code.isKilled(((SetLocalAVM2Item) i).regIndex, 0, avm2code.code.size() - 1)) {
continue;
}
}