Map field of invoked object too
This commit is contained in:
@@ -166,8 +166,10 @@ public class InvokeInterface extends Instruction implements InvokeInstruction
|
|||||||
@Override
|
@Override
|
||||||
public void map(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
public void map(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
||||||
{
|
{
|
||||||
|
InvokeInterface otherIv = (InvokeInterface) other.getInstruction();
|
||||||
|
|
||||||
List<net.runelite.deob.Method> myMethods = this.getMethods(),
|
List<net.runelite.deob.Method> myMethods = this.getMethods(),
|
||||||
otherMethods = ((InvokeInterface) other.getInstruction()).getMethods();
|
otherMethods = otherIv.getMethods();
|
||||||
|
|
||||||
assert myMethods.size() == otherMethods.size();
|
assert myMethods.size() == otherMethods.size();
|
||||||
|
|
||||||
@@ -196,6 +198,28 @@ public class InvokeInterface extends Instruction implements InvokeInstruction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* map field that was invoked on */
|
||||||
|
|
||||||
|
StackContext object1 = ctx.getPops().get(method.getNameAndType().getNumberOfArgs()),
|
||||||
|
object2 = other.getPops().get(otherIv.method.getNameAndType().getNumberOfArgs());
|
||||||
|
|
||||||
|
InstructionContext base1 = MappingExecutorUtil.resolve(object1.getPushed(), object1);
|
||||||
|
InstructionContext base2 = MappingExecutorUtil.resolve(object2.getPushed(), object2);
|
||||||
|
|
||||||
|
if (base1.getInstruction() instanceof GetFieldInstruction && base2.getInstruction() instanceof GetFieldInstruction)
|
||||||
|
{
|
||||||
|
GetFieldInstruction gf1 = (GetFieldInstruction) base1.getInstruction(),
|
||||||
|
gf2 = (GetFieldInstruction) base2.getInstruction();
|
||||||
|
|
||||||
|
Field f1 = gf1.getMyField(),
|
||||||
|
f2 = gf2.getMyField();
|
||||||
|
|
||||||
|
if (f1 != null && f2 != null)
|
||||||
|
{
|
||||||
|
mapping.map(f1, f2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -164,8 +164,10 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction
|
|||||||
@Override
|
@Override
|
||||||
public void map(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
public void map(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
||||||
{
|
{
|
||||||
|
InvokeSpecial otherIv = (InvokeSpecial) other.getInstruction();
|
||||||
|
|
||||||
List<net.runelite.deob.Method> myMethods = this.getMethods(),
|
List<net.runelite.deob.Method> myMethods = this.getMethods(),
|
||||||
otherMethods = ((InvokeSpecial) other.getInstruction()).getMethods();
|
otherMethods = otherIv.getMethods();
|
||||||
|
|
||||||
List<net.runelite.deob.Method> m1 = this.myMethods;
|
List<net.runelite.deob.Method> m1 = this.myMethods;
|
||||||
List<net.runelite.deob.Method> m2 = ((InvokeSpecial) other.getInstruction()).myMethods;
|
List<net.runelite.deob.Method> m2 = ((InvokeSpecial) other.getInstruction()).myMethods;
|
||||||
@@ -196,6 +198,28 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* map field that was invoked on */
|
||||||
|
|
||||||
|
StackContext object1 = ctx.getPops().get(method.getNameAndType().getNumberOfArgs()),
|
||||||
|
object2 = other.getPops().get(otherIv.method.getNameAndType().getNumberOfArgs());
|
||||||
|
|
||||||
|
InstructionContext base1 = MappingExecutorUtil.resolve(object1.getPushed(), object1);
|
||||||
|
InstructionContext base2 = MappingExecutorUtil.resolve(object2.getPushed(), object2);
|
||||||
|
|
||||||
|
if (base1.getInstruction() instanceof GetFieldInstruction && base2.getInstruction() instanceof GetFieldInstruction)
|
||||||
|
{
|
||||||
|
GetFieldInstruction gf1 = (GetFieldInstruction) base1.getInstruction(),
|
||||||
|
gf2 = (GetFieldInstruction) base2.getInstruction();
|
||||||
|
|
||||||
|
Field f1 = gf1.getMyField(),
|
||||||
|
f2 = gf2.getMyField();
|
||||||
|
|
||||||
|
if (f1 != null && f2 != null)
|
||||||
|
{
|
||||||
|
mapping.map(f1, f2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -183,9 +183,12 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction
|
|||||||
@Override
|
@Override
|
||||||
public void map(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
public void map(ParallelExecutorMapping mapping, InstructionContext ctx, InstructionContext other)
|
||||||
{
|
{
|
||||||
List<net.runelite.deob.Method> myMethods = this.getMethods(),
|
InvokeVirtual otherIv = (InvokeVirtual) other.getInstruction();
|
||||||
otherMethods = ((InvokeVirtual) other.getInstruction()).getMethods();
|
|
||||||
|
|
||||||
|
List<net.runelite.deob.Method> myMethods = this.getMethods(),
|
||||||
|
otherMethods = otherIv.getMethods();
|
||||||
|
|
||||||
|
assert method.getNameAndType().getDescriptor().equals(otherIv.method.getNameAndType().getDescriptor());
|
||||||
assert myMethods.size() == otherMethods.size();
|
assert myMethods.size() == otherMethods.size();
|
||||||
|
|
||||||
for (int i = 0; i < myMethods.size(); ++i)
|
for (int i = 0; i < myMethods.size(); ++i)
|
||||||
@@ -222,6 +225,28 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* map field that was invoked on */
|
||||||
|
|
||||||
|
StackContext object1 = ctx.getPops().get(method.getNameAndType().getNumberOfArgs()),
|
||||||
|
object2 = other.getPops().get(otherIv.method.getNameAndType().getNumberOfArgs());
|
||||||
|
|
||||||
|
InstructionContext base1 = MappingExecutorUtil.resolve(object1.getPushed(), object1);
|
||||||
|
InstructionContext base2 = MappingExecutorUtil.resolve(object2.getPushed(), object2);
|
||||||
|
|
||||||
|
if (base1.getInstruction() instanceof GetFieldInstruction && base2.getInstruction() instanceof GetFieldInstruction)
|
||||||
|
{
|
||||||
|
GetFieldInstruction gf1 = (GetFieldInstruction) base1.getInstruction(),
|
||||||
|
gf2 = (GetFieldInstruction) base2.getInstruction();
|
||||||
|
|
||||||
|
Field f1 = gf1.getMyField(),
|
||||||
|
f2 = gf2.getMyField();
|
||||||
|
|
||||||
|
if (f1 != null && f2 != null)
|
||||||
|
{
|
||||||
|
mapping.map(f1, f2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ public class MapStaticTest
|
|||||||
ClassGroup group1 = JarUtil.loadJar(new File(JAR1));
|
ClassGroup group1 = JarUtil.loadJar(new File(JAR1));
|
||||||
ClassGroup group2 = JarUtil.loadJar(new File(JAR2));
|
ClassGroup group2 = JarUtil.loadJar(new File(JAR2));
|
||||||
|
|
||||||
Method m1 = group1.findClass("class92").findMethod("method2176");
|
Method m1 = group1.findClass("class222").findMethod("method4107");
|
||||||
Method m2 = group2.findClass("client").findMethod("method540");
|
Method m2 = group2.findClass("class222").findMethod("method3980");
|
||||||
|
|
||||||
ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2);
|
ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2);
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ public class MapStaticTest
|
|||||||
int fields = 0, staticMethod = 0, method = 0, total = 0;
|
int fields = 0, staticMethod = 0, method = 0, total = 0;
|
||||||
for (Entry<Object, Object> e : finalm.getMap().entrySet())
|
for (Entry<Object, Object> e : finalm.getMap().entrySet())
|
||||||
{
|
{
|
||||||
System.out.println(e.getKey() + " <-> " + e.getValue());
|
//System.out.println(e.getKey() + " <-> " + e.getValue());
|
||||||
|
|
||||||
Object o = e.getKey();
|
Object o = e.getKey();
|
||||||
if (o instanceof Field)
|
if (o instanceof Field)
|
||||||
@@ -217,6 +217,34 @@ public class MapStaticTest
|
|||||||
|
|
||||||
finalm.merge(testStaticMapperMap(group1, group2));
|
finalm.merge(testStaticMapperMap(group1, group2));
|
||||||
finalm.merge(testMapperMap(group1, group2));
|
finalm.merge(testMapperMap(group1, group2));
|
||||||
|
|
||||||
|
for (int i = -1; i < 250; ++i)
|
||||||
|
{
|
||||||
|
ClassFile c1;
|
||||||
|
|
||||||
|
if (i == -1)
|
||||||
|
{
|
||||||
|
c1 = group1.findClass("client");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c1 = group1.findClass("class" + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c1 == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (Method m : c1.getMethods().getMethods())
|
||||||
|
{
|
||||||
|
if (!finalm.getMap().containsKey(m))
|
||||||
|
System.out.println("missing " + m);
|
||||||
|
}
|
||||||
|
for (Field m : c1.getFields().getFields())
|
||||||
|
{
|
||||||
|
if (!finalm.getMap().containsKey(m))
|
||||||
|
System.out.println("missing " + m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
summary(finalm, group1);
|
summary(finalm, group1);
|
||||||
|
|
||||||
@@ -225,18 +253,6 @@ public class MapStaticTest
|
|||||||
|
|
||||||
System.out.println("GROUP 1 " + sg1);
|
System.out.println("GROUP 1 " + sg1);
|
||||||
System.out.println("GROUP 2 " + sg2);
|
System.out.println("GROUP 2 " + sg2);
|
||||||
|
|
||||||
|
|
||||||
for (Method m : group1.findClass("client").getMethods().getMethods())
|
|
||||||
{
|
|
||||||
if (!finalm.getMap().containsKey(m))
|
|
||||||
System.out.println("missing " + m);
|
|
||||||
}
|
|
||||||
for (Field m : group1.findClass("client").getFields().getFields())
|
|
||||||
{
|
|
||||||
if (!finalm.getMap().containsKey(m))
|
|
||||||
System.out.println("missing " + m);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//@Test
|
//@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user