mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-30 09:06:23 +00:00
Fix swaps
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user