Swap fixes

This commit is contained in:
Jindra Petřík
2025-08-09 19:45:24 +02:00
parent 82d3cc2d2a
commit 68fdf1097d
6 changed files with 78 additions and 3 deletions

View File

@@ -835,7 +835,7 @@ public abstract class InstructionDefinition implements Serializable {
Reference<GraphTargetItem> callType = new Reference<>(null);
GetPropertyIns.resolvePropertyType(localData, obj, multiname, isStatic, type, callType);
obj = obj.getThroughDuplicate();
//obj = obj.getThroughDuplicate();
SetTypeAVM2Item result;
if (init) {

View File

@@ -28,10 +28,13 @@ import com.jpexs.decompiler.flash.abc.avm2.model.GetLexAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TranslateStack;
import com.jpexs.decompiler.graph.model.CompoundableBinaryOp;
import com.jpexs.decompiler.graph.model.DuplicateItem;
import com.jpexs.decompiler.graph.model.DuplicateSourceItem;
import java.util.List;
import java.util.Objects;
@@ -101,7 +104,14 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns
if (Objects.equals(obj.getThroughDuplicate(), propItem.object.getThroughDuplicate()) && Objects.equals(multiname, propItem.propertyName)) {
result.setCompoundValue(binaryOp.getRightSide());
result.setCompoundOperator(binaryOp.getOperator());
}
if (result instanceof SetPropertyAVM2Item) {
SetPropertyAVM2Item sp = (SetPropertyAVM2Item) result;
if (sp.object instanceof DuplicateSourceItem) {
sp.object = sp.object.value;
}
}
}
}
}
}

View File

@@ -130,6 +130,26 @@ public class SwapIns extends InstructionDefinition {
return;
}
*/
/*int temp = localData.maxTempIndex.getVal() + 1;
localData.maxTempIndex.setVal(temp);
stack.finishBlock(output);
stack.addToOutput(new SetTemporaryItem(AVM2GraphTargetDialect.INSTANCE, ins, localData.lineStartInstruction, o2, temp, "swap"));
stack.finishBlock(output);
stack.push(o1);
stack.push(new TemporaryItem(AVM2GraphTargetDialect.INSTANCE, ins, localData.lineStartInstruction, o2, temp)); */
if (o2 instanceof TemporaryItem) {
stack.push(o1);
stack.push(o2);
return;
}
if (o2 instanceof DuplicateItem) {
stack.push(o1);
stack.push(o2);
return;
}
int temp = localData.maxTempIndex.getVal() + 1;
localData.maxTempIndex.setVal(temp);
stack.finishBlock(output);

View File

@@ -407,6 +407,42 @@ public class TranslateStack extends Stack<GraphTargetItem> {
}
public void allowSwap(List<GraphTargetItem> output) {
/*
if (!isEmpty()) {
return;
}
if (output.isEmpty()) {
return;
}
if (size() != 2) {
return;
}
if (!(output.get(output.size() - 1) instanceof SetTemporaryItem)) {
return;
}
if (!(peek() instanceof TemporaryItem)) {
return;
}
TemporaryItem ti = (TemporaryItem) peek();
SetTemporaryItem st = (SetTemporaryItem) output.get(output.size() - 1);
if (!"swap".equals(st.getSuffix())) {
return;
}
if (st.getTempIndex() != ti.getTempIndex()) {
return;
}
output.remove(output.size() - 1);
pop();
push(ti.value);
*/
if (!isEmpty()) {
return;
}
@@ -420,7 +456,7 @@ public class TranslateStack extends Stack<GraphTargetItem> {
if (!(output.get(output.size() - 2) instanceof PushItem)) {
return;
}
if (!(output.get(output.size() - 3) instanceof SetTemporaryItem)) {
return;
}

View File

@@ -22,6 +22,7 @@ import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetDialect;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.GraphTargetVisitorInterface;
import com.jpexs.decompiler.graph.SimpleValue;
import com.jpexs.decompiler.graph.SourceGenerator;
import java.util.List;
@@ -145,4 +146,8 @@ public class DuplicateItem extends GraphTargetItem implements SimpleValue, HasTe
public int getTempIndex() {
return tempIndex;
}
@Override
public void visit(GraphTargetVisitorInterface visitor) {
}
}

View File

@@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetDialect;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.GraphTargetVisitorInterface;
import com.jpexs.decompiler.graph.SimpleValue;
import com.jpexs.decompiler.graph.SourceGenerator;
import java.util.ArrayList;
@@ -136,4 +137,7 @@ public class TemporaryItem extends GraphTargetItem implements SimpleValue, HasTe
return tempIndex;
}
@Override
public void visit(GraphTargetVisitorInterface visitor) {
}
}