Map multiple field comparison ifs, this maps all of my test rl fields
This commit is contained in:
@@ -13,6 +13,7 @@ import net.runelite.deob.execution.StackContext;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import net.runelite.deob.Field;
|
import net.runelite.deob.Field;
|
||||||
@@ -88,26 +89,12 @@ public abstract class If extends Instruction implements JumpingInstruction, Comp
|
|||||||
|
|
||||||
ins.pop(one, two);
|
ins.pop(one, two);
|
||||||
|
|
||||||
Field f1 = getComparedField(ins);
|
Frame other = frame.dup();
|
||||||
if (f1 != null && f1.getName().equals("field289"))
|
other.created = this;
|
||||||
{
|
other.forking = ins;
|
||||||
int i =5;
|
other.jump(ins, to);
|
||||||
}
|
|
||||||
// if (f1 != null && f1.packetHandler)
|
|
||||||
// {
|
|
||||||
// assert this instanceof IfICmpNe;
|
|
||||||
//
|
|
||||||
// frame.jump(ins, to);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
{
|
|
||||||
Frame other = frame.dup();
|
|
||||||
other.created = this;
|
|
||||||
other.forking = ins;
|
|
||||||
other.jump(ins, to);
|
|
||||||
|
|
||||||
ins.branch(other);
|
ins.branch(other);
|
||||||
}
|
|
||||||
|
|
||||||
frame.addInstructionContext(ins);
|
frame.addInstructionContext(ins);
|
||||||
}
|
}
|
||||||
@@ -143,7 +130,7 @@ public abstract class If extends Instruction implements JumpingInstruction, Comp
|
|||||||
branch2.other = branch1;
|
branch2.other = branch1;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mapArguments(mapping, ctx, other);
|
this.mapArguments(mapping, ctx, other, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void mapOtherBranch(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
protected void mapOtherBranch(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
||||||
@@ -182,38 +169,53 @@ public abstract class If extends Instruction implements JumpingInstruction, Comp
|
|||||||
// e2.frames.remove(i2);
|
// e2.frames.remove(i2);
|
||||||
// e2.frames.add(i2, f2);
|
// e2.frames.add(i2, f2);
|
||||||
|
|
||||||
this.mapArguments(mapping, ctx, other);
|
this.mapArguments(mapping, ctx, other, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mapArguments(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
private void mapArguments(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other, boolean inverse)
|
||||||
{
|
{
|
||||||
Field f1 = getComparedField(ctx), f2 = getComparedField(other);
|
List<Field> f1s = getComparedFields(ctx), f2s = getComparedFields(other);
|
||||||
|
|
||||||
if (f1 == null || f2 == null)
|
if (f1s == null || f2s == null || f1s.size() != f2s.size())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
assert f1.getType().equals(f2.getType());
|
if (f1s.size() == 1)
|
||||||
|
|
||||||
mapping.map(f1, f2);
|
|
||||||
|
|
||||||
if (f1.packetHandler && f2.packetHandler)
|
|
||||||
{
|
{
|
||||||
int pc1 = this.getConstantInstruction(ctx),
|
Field f1 = f1s.get(0), f2 = f2s.get(0);
|
||||||
pc2 = this.getConstantInstruction(other);
|
|
||||||
|
|
||||||
assert (pc1 != -1) == (pc2 != -1);
|
assert f1.getType().equals(f2.getType());
|
||||||
|
|
||||||
if (pc1 == -1 && pc2 == -1)
|
mapping.map(f1, f2);
|
||||||
return;
|
|
||||||
|
|
||||||
mapping.packetHandler1.add(new PacketHandler(this, pc1));
|
if (f1.packetHandler && f2.packetHandler)
|
||||||
mapping.packetHandler2.add(new PacketHandler((If) other.getInstruction(), pc2));
|
{
|
||||||
|
int pc1 = this.getConstantInstruction(ctx),
|
||||||
|
pc2 = this.getConstantInstruction(other);
|
||||||
|
|
||||||
|
assert (pc1 != -1) == (pc2 != -1);
|
||||||
|
|
||||||
|
if (pc1 == -1 && pc2 == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mapping.packetHandler1.add(new PacketHandler(this, pc1));
|
||||||
|
mapping.packetHandler2.add(new PacketHandler((If) other.getInstruction(), pc2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if (f1s.size() == 2)
|
||||||
|
{
|
||||||
|
Field f1 = f1s.get(0), f2 = f2s.get(0);
|
||||||
|
Field j1 = f1s.get(1), j2 = f2s.get(1);
|
||||||
|
|
||||||
|
mapping.map(f1, j2);
|
||||||
|
mapping.map(j1, f2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
assert false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Field getComparedField(InstructionContext ctx)
|
private List<Field> getComparedFields(InstructionContext ctx)
|
||||||
{
|
{
|
||||||
GetFieldInstruction gfi = null;
|
List<Field> fields = new ArrayList<>();
|
||||||
|
|
||||||
for (StackContext sctx : ctx.getPops())
|
for (StackContext sctx : ctx.getPops())
|
||||||
{
|
{
|
||||||
@@ -221,17 +223,14 @@ public abstract class If extends Instruction implements JumpingInstruction, Comp
|
|||||||
|
|
||||||
if (base.getInstruction() instanceof GetFieldInstruction)
|
if (base.getInstruction() instanceof GetFieldInstruction)
|
||||||
{
|
{
|
||||||
if (gfi != null)
|
GetFieldInstruction gfi = (GetFieldInstruction) base.getInstruction();
|
||||||
return null;
|
|
||||||
|
|
||||||
gfi = (GetFieldInstruction) base.getInstruction();
|
if (gfi.getMyField() != null)
|
||||||
|
fields.add(gfi.getMyField());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gfi == null)
|
return fields.isEmpty() ? null : fields;
|
||||||
return null;
|
|
||||||
|
|
||||||
return gfi.getMyField();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Integer getConstantInstruction(InstructionContext ctx)
|
private Integer getConstantInstruction(InstructionContext ctx)
|
||||||
@@ -256,14 +255,33 @@ public abstract class If extends Instruction implements JumpingInstruction, Comp
|
|||||||
|
|
||||||
protected boolean isSameField(InstructionContext thisIc, InstructionContext otherIc)
|
protected boolean isSameField(InstructionContext thisIc, InstructionContext otherIc)
|
||||||
{
|
{
|
||||||
Field f1 = getComparedField(thisIc), f2 = getComparedField(otherIc);
|
List<Field> f1s = getComparedFields(thisIc), f2s = getComparedFields(otherIc);
|
||||||
if ((f1 != null) != (f2 != null))
|
|
||||||
|
if ((f1s != null) != (f2s != null))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (f1 == null || f2 == null)
|
if (f1s == null || f2s == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return f1.getType().equals(f2.getType());
|
if (f1s.size() != f2s.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
assert f1s.size() == 1 || f1s.size() == 2;
|
||||||
|
|
||||||
|
if (f1s.size() == 2)
|
||||||
|
{
|
||||||
|
Field f1 = f1s.get(0), f2 = f2s.get(0);
|
||||||
|
Field j1 = f1s.get(1), j2 = f2s.get(1);
|
||||||
|
|
||||||
|
return (f1.getType().equals(f2.getType()) && j1.getType().equals(j2.getType())) ||
|
||||||
|
(f1.getType().equals(j2.getType()) && j1.getType().equals(f2.getType()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Field f1 = f1s.get(0), f2 = f2s.get(0);
|
||||||
|
|
||||||
|
return f1.getType().equals(f2.getType());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user