diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java b/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java
index c7eb8dc90f..86e0095498 100644
--- a/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java
+++ b/src/main/java/net/runelite/deob/deobfuscators/rename/Rename2.java
@@ -195,46 +195,46 @@ public class Rename2
return fields;
}
- private void mapOneFrame(ClassGroup group, Execution e)
- {
- for (ClassFile cf : group.getClasses())
- {
- for (Method m : cf.getMethods().getMethods())
- {
- if (m.isStatic())
- continue;
-
- List frames = e.processedFrames.stream().filter(f -> f.getMethod() == m).collect(Collectors.toList());
-
- if (frames.size() != 1)
- continue;
-
- int count = 0;
- for (InstructionContext i : frames.get(0).getInstructions())
- {
- if (i.getInstruction() instanceof SetFieldInstruction)
- {
- SetFieldInstruction sfi = (SetFieldInstruction) i.getInstruction();
-
- Field f = sfi.getMyField();
- if (f == null)
- continue;
-
- Vertex methodVertex = e.getGraph().getVertexFor(m),
- fieldVertex = e.getGraph().getVertexFor(f);
-
- Edge edge = new FieldEdge(i.getInstruction(), methodVertex, fieldVertex, EdgeType.SETFIELD, count);
- e.getGraph().addEdge(edge);
-
- edge = new FieldEdge(i.getInstruction(), fieldVertex, methodVertex, EdgeType.SETFIELD_FROM, count);
- e.getGraph().addEdge(edge);
-
- ++count;
- }
- }
- }
- }
- }
+// private void mapOneFrame(ClassGroup group, Execution e)
+// {
+// for (ClassFile cf : group.getClasses())
+// {
+// for (Method m : cf.getMethods().getMethods())
+// {
+// if (m.isStatic())
+// continue;
+//
+// List frames = e.processedFrames.stream().filter(f -> f.getMethod() == m).collect(Collectors.toList());
+//
+// if (frames.size() != 1)
+// continue;
+//
+// int count = 0;
+// for (InstructionContext i : frames.get(0).getInstructions())
+// {
+// if (i.getInstruction() instanceof SetFieldInstruction)
+// {
+// SetFieldInstruction sfi = (SetFieldInstruction) i.getInstruction();
+//
+// Field f = sfi.getMyField();
+// if (f == null)
+// continue;
+//
+// Vertex methodVertex = e.getGraph().getVertexFor(m),
+// fieldVertex = e.getGraph().getVertexFor(f);
+//
+// Edge edge = new FieldEdge(i.getInstruction(), methodVertex, fieldVertex, EdgeType.SETFIELD, count);
+// e.getGraph().addEdge(edge);
+//
+// edge = new FieldEdge(i.getInstruction(), fieldVertex, methodVertex, EdgeType.SETFIELD_FROM, count);
+// e.getGraph().addEdge(edge);
+//
+// ++count;
+// }
+// }
+// }
+// }
+// }
private void solve()
{
diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Edge.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Edge.java
index 9644b96302..000092e517 100644
--- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Edge.java
+++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Edge.java
@@ -1,16 +1,19 @@
package net.runelite.deob.deobfuscators.rename.graph;
+import java.util.Arrays;
import java.util.Objects;
-import net.runelite.deob.attributes.code.Instruction;
+import net.runelite.deob.attributes.code.instruction.types.DupInstruction;
+import net.runelite.deob.execution.InstructionContext;
+import net.runelite.deob.execution.StackContext;
public class Edge
{
- private final Instruction ins; // craetor
+ private final InstructionContext ins;
private final Vertex from, to;
private final EdgeType type;
private int weight;
- public Edge(Instruction ins, Vertex from, Vertex to, EdgeType type)
+ public Edge(InstructionContext ins, Vertex from, Vertex to, EdgeType type)
{
this.ins = ins;
this.from = from;
@@ -20,7 +23,7 @@ public class Edge
assert from.getGraph() == to.getGraph();
}
- public Instruction getIns()
+ public InstructionContext getIns()
{
return ins;
}
@@ -102,9 +105,40 @@ public class Edge
if (this.type != other.type)
return false;
+ if (this.type == EdgeType.SETFIELD)
+ {
+ if (!compareSetField(other.getIns()))
+ return false;
+ }
// if (this.weight != other.weight)
// return false;
return true;
}
+
+ private InstructionContext handleDup(InstructionContext i, StackContext sctx)
+ {
+ DupInstruction d = (DupInstruction) i.getInstruction();
+ return d.getOriginal(sctx).getPushed();
+ }
+
+ private boolean compareSetField(InstructionContext other)
+ {
+ InstructionContext thisp = ins.getPops().get(0).getPushed(),
+ otherp = other.getPops().get(0).getPushed();
+
+ if (thisp.getInstruction() instanceof DupInstruction)
+ {
+ thisp = handleDup(thisp, ins.getPops().get(0));
+ }
+ if (otherp.getInstruction() instanceof DupInstruction)
+ {
+ otherp = handleDup(otherp, other.getPops().get(0));
+ }
+
+ Class[] c1 = thisp.getInstruction().getClass().getInterfaces(),
+ c2 = otherp.getInstruction().getClass().getInterfaces();
+
+ return Arrays.equals(c1, c2);
+ }
}
diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/FieldEdge.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/FieldEdge.java
index 33f0ffeff8..f32c6c7950 100644
--- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/FieldEdge.java
+++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/FieldEdge.java
@@ -1,12 +1,13 @@
package net.runelite.deob.deobfuscators.rename.graph;
import net.runelite.deob.attributes.code.Instruction;
+import net.runelite.deob.execution.InstructionContext;
public class FieldEdge extends Edge
{
private int id;
- public FieldEdge(Instruction ins, Vertex from, Vertex to, EdgeType type, int id)
+ public FieldEdge(InstructionContext ins, Vertex from, Vertex to, EdgeType type, int id)
{
super(ins, from, to, type);
this.id = id;
diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/MethodEdge.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/MethodEdge.java
index 036ec421c8..935e9b863d 100644
--- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/MethodEdge.java
+++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/MethodEdge.java
@@ -2,13 +2,13 @@ package net.runelite.deob.deobfuscators.rename.graph;
import java.util.Objects;
import net.runelite.deob.Method;
-import net.runelite.deob.attributes.code.Instruction;
+import net.runelite.deob.execution.InstructionContext;
public class MethodEdge extends Edge
{
private final Method method;
- public MethodEdge(Instruction i, Vertex from, Vertex to, EdgeType type, Method method)
+ public MethodEdge(InstructionContext i, Vertex from, Vertex to, EdgeType type, Method method)
{
super(i, from, to, type);
this.method = method;
diff --git a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java
index 48eef4dd79..0fdc7d4106 100644
--- a/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java
+++ b/src/main/java/net/runelite/deob/deobfuscators/rename/graph/Vertex.java
@@ -36,7 +36,7 @@ public class Vertex
private Collection mightBe;
private Vertex is;
- private Set edgeFrom = new HashSet<>();
+ //private Set edgeFrom = new HashSet<>();
public Vertex(Graph graph, Object object)
{
@@ -110,11 +110,11 @@ public class Vertex
Edge c = edges.get(edge);
if (c != null)
{
- if (edge.getIns() instanceof SetFieldInstruction && !edgeFrom.contains(edge.getIns()))
- {
- edgeFrom.add(edge.getIns());
- c.increase();
- }
+// if (edge.getIns() instanceof SetFieldInstruction && !edgeFrom.contains(edge.getIns()))
+// {
+// edgeFrom.add(edge.getIns());
+// c.increase();
+// }
return;
}
diff --git a/src/main/java/net/runelite/deob/execution/Execution.java b/src/main/java/net/runelite/deob/execution/Execution.java
index 35d062f153..1fb7a7573a 100644
--- a/src/main/java/net/runelite/deob/execution/Execution.java
+++ b/src/main/java/net/runelite/deob/execution/Execution.java
@@ -217,8 +217,8 @@ public class Execution
for (Method m : methods)
{
- graph.addEdge(new Edge(i, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(m), EdgeType.INVOKE));
- graph.addEdge(new Edge(i, graph.getVertexFor(m), graph.getVertexFor(frame.nonStatic), EdgeType.INVOKED_FROM));
+ graph.addEdge(new Edge(ctx, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(m), EdgeType.INVOKE));
+ graph.addEdge(new Edge(ctx, graph.getVertexFor(m), graph.getVertexFor(frame.nonStatic), EdgeType.INVOKED_FROM));
}
}
else if (i instanceof FieldInstruction)
@@ -228,64 +228,10 @@ public class Execution
if (fi.getMyField() == null)
return;
- //int id = frame.getMethodCtx().fcount++;
EdgeType type = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD : EdgeType.SETFIELD;
- graph.addEdge(new Edge(i, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(fi.getMyField()), type));
+ graph.addEdge(new Edge(ctx, graph.getVertexFor(frame.nonStatic), graph.getVertexFor(fi.getMyField()), type));
EdgeType typeRev = fi instanceof GetFieldInstruction ? EdgeType.GETFIELD_FROM : EdgeType.SETFIELD_FROM;
- graph.addEdge(new Edge(i, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(frame.nonStatic), typeRev));
-
- if (fi instanceof SetFieldInstruction && frame.lastField != null)
- {
- //graph.addEdge(new MethodEdge(i, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(frame.lastField), EdgeType.PREV_FIELD, frame.nonStatic));
- //graph.addEdge(new MethodEdge(i, graph.getVertexFor(frame.lastField), graph.getVertexFor(fi.getMyField()), EdgeType.PREV_FIELD_FROM, frame.nonStatic));
- }
-
-// if (fi instanceof SetFieldInstruction)
-// {
-// StackContext sctx = ctx.getPops().get(0);
-// if (sctx.getPushed().getInstruction() instanceof GetFieldInstruction)
-// {
-// GetFieldInstruction gfi = (GetFieldInstruction) sctx.getPushed().getInstruction();
-//
-// if (gfi.getMyField() != null)
-// {
-// // XXX dup edges
-// graph.addEdge(new MethodEdge(i, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(gfi.getMyField()), EdgeType.FIELD_ASSIGNMENT_FIELD, frame.nonStatic));
-// graph.addEdge(new MethodEdge(i, graph.getVertexFor(gfi.getMyField()), graph.getVertexFor(fi.getMyField()), EdgeType.FIELD_ASSIGNMENT_FIELD_FROM, frame.nonStatic));
-// }
-// }
-// }
-
-// // associated fields
-// for (InstructionContext ic : getInsInExpr(ctx, new HashSet<>()))
-// {
-// Instruction i2 = (Instruction) ic.getInstruction();
-//
-// if (i2 instanceof FieldInstruction)
-// {
-// FieldInstruction fi2 = (FieldInstruction) i2;
-//
-// if (fi2.getMyField() == null)
-// continue;
-//
-// // these are within the context of a method
-// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(fi2.getMyField()), EdgeType.FIELD_ASSOCIATION, frame.nonStatic));
-// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(fi2.getMyField()), graph.getVertexFor(fi.getMyField()), EdgeType.FIELD_ASSOCIATION_FROM, frame.nonStatic));
-// }
-// else if (i2 instanceof InvokeInstruction)
-// {
-// InvokeInstruction ii2 = (InvokeInstruction) i2;
-//
-// if (ii2 instanceof InvokeStatic)
-// continue;
-//
-// for (Method m : ii2.getMethods())
-// {
-// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(m), EdgeType.METHOD_ASSOCIATION, frame.nonStatic));
-// graph.addEdge(new MethodEdge(i2, graph.getVertexFor(m), graph.getVertexFor(fi.getMyField()), EdgeType.METHOD_ASSOCIATION_FROM, frame.nonStatic));
-// }
-// }
-// }
+ graph.addEdge(new Edge(ctx, graph.getVertexFor(fi.getMyField()), graph.getVertexFor(frame.nonStatic), typeRev));
}
}