From 7eb1c0d32acc6902b720e8ecd41f9e609a73bd52 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 3 Apr 2016 12:38:31 -0400 Subject: [PATCH] Revert "Remove method context which is unnecessary now theres no more graph analysis" This reverts commit 4e53b80079741083de724f1056380d095b679e9e. --- .../net/runelite/asm/execution/Frame.java | 27 +++++++++--------- .../runelite/asm/execution/MethodContext.java | 28 +++++++++++++++++++ 2 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 src/main/java/net/runelite/asm/execution/MethodContext.java diff --git a/src/main/java/net/runelite/asm/execution/Frame.java b/src/main/java/net/runelite/asm/execution/Frame.java index 292d22bc86..1299f5aa74 100644 --- a/src/main/java/net/runelite/asm/execution/Frame.java +++ b/src/main/java/net/runelite/asm/execution/Frame.java @@ -2,7 +2,6 @@ package net.runelite.asm.execution; import com.google.common.collect.Lists; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import net.runelite.asm.Method; import net.runelite.asm.attributes.Code; @@ -13,7 +12,6 @@ import net.runelite.asm.pool.NameAndType; import net.runelite.asm.attributes.code.instruction.types.InvokeInstruction; import net.runelite.asm.attributes.code.instruction.types.MappableInstruction; import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import org.apache.commons.collections4.map.MultiValueMap; public class Frame { @@ -24,7 +22,7 @@ public class Frame private Stack stack; private Variables variables; private List instructions = new ArrayList<>(); // instructions executed in this frame - private MultiValueMap visited = new MultiValueMap<>(); + private MethodContext ctx; protected Method nonStatic; // next non static method up the stack public Frame other; // in the other execution for mapping public Frame returnTo; // is this the same as caller? @@ -39,6 +37,10 @@ public class Frame stack = new Stack(code.getMaxStack()); variables = new Variables(code.getMaxLocals()); + // don't cache method contexts per execution + // need to allow the same method to execute multiple times + // when called from multiple places to allow graph building //XXX there no longer is a graph + ctx = new MethodContext(execution); nonStatic = method; } @@ -52,6 +54,7 @@ public class Frame stack = new Stack(code.getMaxStack()); variables = new Variables(code.getMaxLocals()); + ctx = new MethodContext(execution); nonStatic = method; cur = i; @@ -135,6 +138,7 @@ public class Frame this.cur = other.cur; this.stack = new Stack(other.stack); this.variables = new Variables(other.variables); + this.ctx = other.ctx; this.nonStatic = other.nonStatic; if (other.returnTo != null) { @@ -185,6 +189,11 @@ public class Frame { return variables; } + + public MethodContext getMethodCtx() + { + return ctx; + } public void addInstructionContext(InstructionContext i) { @@ -311,7 +320,7 @@ public class Frame assert to.getInstructions() == method.getCode().getInstructions(); assert method.getCode().getInstructions().getInstructions().contains(to); - if (hasJumped(from, to)) + if (ctx.hasJumped(from, to)) { executing = false; return; @@ -319,14 +328,4 @@ public class Frame cur = to; } - - private boolean hasJumped(InstructionContext from, Instruction to) - { - Collection i = visited.getCollection(from); - if (i != null && i.contains(to)) - return true; - - visited.put(from, to); - return false; - } } diff --git a/src/main/java/net/runelite/asm/execution/MethodContext.java b/src/main/java/net/runelite/asm/execution/MethodContext.java new file mode 100644 index 0000000000..1559d56fc3 --- /dev/null +++ b/src/main/java/net/runelite/asm/execution/MethodContext.java @@ -0,0 +1,28 @@ +package net.runelite.asm.execution; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import net.runelite.asm.attributes.code.Instruction; +import org.apache.commons.collections4.map.MultiValueMap; + +public class MethodContext +{ + private Execution execution; + private MultiValueMap visited = new MultiValueMap<>(); + + public MethodContext(Execution execution) + { + this.execution = execution; + } + + protected boolean hasJumped(InstructionContext from, Instruction to) + { + Collection i = visited.getCollection(from); + if (i != null && i.contains(to)) + return true; + + visited.put(from, to); + return false; + } +}