Fix swaps

This commit is contained in:
Jindra Petřík
2025-08-09 10:41:51 +02:00
parent a804987067
commit 77d96e8e43
23 changed files with 540 additions and 43 deletions

View File

@@ -16,6 +16,7 @@
*/
package com.jpexs.decompiler.graph;
import com.jpexs.decompiler.flash.BaseLocalData;
import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.ExceptionAVM2Item;
@@ -23,11 +24,16 @@ import com.jpexs.decompiler.graph.model.BranchStackResistant;
import com.jpexs.decompiler.graph.model.BreakItem;
import com.jpexs.decompiler.graph.model.CommaExpressionItem;
import com.jpexs.decompiler.graph.model.ContinueItem;
import com.jpexs.decompiler.graph.model.DuplicateItem;
import com.jpexs.decompiler.graph.model.DuplicateSourceItem;
import com.jpexs.decompiler.graph.model.ExitItem;
import com.jpexs.decompiler.graph.model.HasTempIndex;
import com.jpexs.decompiler.graph.model.PopItem;
import com.jpexs.decompiler.graph.model.PushItem;
import com.jpexs.decompiler.graph.model.ScriptEndItem;
import com.jpexs.decompiler.graph.model.SetTemporaryItem;
import com.jpexs.decompiler.graph.model.SwapItem;
import com.jpexs.decompiler.graph.model.TemporaryItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -60,6 +66,8 @@ public class TranslateStack extends Stack<GraphTargetItem> {
private Map<String, GraphTargetItem> marks = new HashMap<>();
public List<GraphTargetItem> outputQueue = new ArrayList<>();
public BaseLocalData localData = null;
@Override
public synchronized Object clone() {
@@ -75,9 +83,10 @@ public class TranslateStack extends Stack<GraphTargetItem> {
}
public void setConnectedOutput(int prevOutputSize, List<GraphTargetItem> connectedOutput) {
public void setConnectedOutput(int prevOutputSize, List<GraphTargetItem> connectedOutput, BaseLocalData localData) {
this.prevOutputSize = prevOutputSize;
this.connectedOutput = connectedOutput;
this.localData = localData;
}
@Override
@@ -86,7 +95,7 @@ public class TranslateStack extends Stack<GraphTargetItem> {
if (item instanceof FindPropertyAVM2Item) {
finishBlock(connectedOutput);
} else {
outputQueue.add(item);
outputQueue.add(item);
item = new CommaExpressionItem(item.dialect, null, item.lineStartItem, outputQueue);
outputQueue = new ArrayList<>();
}
@@ -226,6 +235,39 @@ public class TranslateStack extends Stack<GraphTargetItem> {
connectedOutput.addAll(oldQueue);
}
if (isEmpty() && connectedOutput != null) {
for (int i = connectedOutput.size() - 1; i >= 0; i--) {
GraphTargetItem item = connectedOutput.get(i);
if (item instanceof Block) {
break;
}
if (item instanceof PushItem) {
PushItem pi = (PushItem) item;
if (pi.value instanceof SetTemporaryItem) {
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;
connectedOutput.set(i, new SetTemporaryItem(pi.dialect, ds.getSrc(), ds.getLineStartItem(), ds.value, ds.tempIndex,"push"));
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.remove(i);
return pi.value;
} else {
int temp = localData.maxTempIndex.getVal() + 1;
localData.maxTempIndex.setVal(temp);
connectedOutput.set(i, new SetTemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), pi.value, temp, "push"));
return new TemporaryItem(pi.dialect, pi.value.getSrc(), pi.value.getLineStartItem(), pi.value, temp);
}
}
}
}
if (path != null) {
if (this.isEmpty()) {
@@ -260,10 +302,25 @@ public class TranslateStack extends Stack<GraphTargetItem> {
}
}
private boolean isAllTemp() {
for (int i = 0; i < size(); i++) {
GraphTargetItem item = get(i);
if (item instanceof TemporaryItem) {
continue;
}
if (item instanceof DuplicateItem) {
continue;
}
return false;
}
return true;
}
public void addToOutput(GraphTargetItem item) {
if (isEmpty()
|| peek() instanceof ExceptionAVM2Item
|| peek() instanceof NewActivationAVM2Item
//|| isAllTemp()
) {
connectedOutput.add(item);
return;
@@ -356,7 +413,7 @@ public class TranslateStack extends Stack<GraphTargetItem> {
if (output.size() < 3) {
return;
}
if (!(output.get(output.size() - 1) instanceof SwapItem)) {
if (!(output.get(output.size() - 1) instanceof PushItem)) {
return;
}
@@ -364,13 +421,34 @@ public class TranslateStack extends Stack<GraphTargetItem> {
return;
}
if (!(output.get(output.size() - 3) instanceof PushItem)) {
if (!(output.get(output.size() - 3) instanceof SetTemporaryItem)) {
return;
}
PushItem pi1 = (PushItem) output.get(output.size() - 1);
if (!(pi1.value instanceof TemporaryItem)) {
return;
}
TemporaryItem ti = (TemporaryItem) pi1.value;
SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 3);
if (!"swap".equals(st.getSuffix())) {
return;
}
if (st.getTempIndex() != ti.getTempIndex()) {
return;
}
PushItem pi2 = (PushItem) output.get(output.size() - 2);
output.remove(output.size() - 1);
push(((PushItem)output.remove(output.size() - 1)).value);
push(((PushItem)output.remove(output.size() - 1)).value);
output.remove(output.size() - 1);
output.remove(output.size() - 1);
push(pi2.value);
push(ti.value);
//moveToStack(output);
}
}