From fa2131ca5d570daf582884fe88d8fdc1470a1ae9 Mon Sep 17 00:00:00 2001 From: Adam Welc <adam.welc@oracle.com> Date: Mon, 29 Aug 2016 22:35:44 +0200 Subject: [PATCH] Browser context is now simulated. --- .../r/nodes/builtin/base/BrowserFunctions.java | 2 +- .../builtin/helpers/BrowserInteractNode.java | 15 ++++++++++++--- .../r/nodes/builtin/helpers/DebugHandling.java | 8 +------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BrowserFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BrowserFunctions.java index 9053fbfead..334ba50b17 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BrowserFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BrowserFunctions.java @@ -94,7 +94,7 @@ public class BrowserFunctions { StackTraceElement[] s = Thread.currentThread().getStackTrace(); RContext.getInstance().getConsoleHandler().printf("Called from: %s%n", callerString); RCaller browserCaller = RCaller.create(null, caller, this.asRSyntaxNode()); - browserInteractNode.executeInteger(frame, browserCaller); + browserInteractNode.execute(frame); } finally { helperState.remove(helperState.size() - 1); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java index a8bdec6a46..3333c0f27a 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java @@ -27,6 +27,8 @@ import com.oracle.truffle.api.dsl.NodeChild; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.r.nodes.RASTBuilder; +import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; import com.oracle.truffle.r.runtime.JumpToTopLevelException; import com.oracle.truffle.r.runtime.RArguments; import com.oracle.truffle.r.runtime.RCaller; @@ -46,6 +48,7 @@ import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.env.REnvironment; import com.oracle.truffle.r.runtime.instrument.InstrumentationState.BrowserState; import com.oracle.truffle.r.runtime.nodes.RNode; +import com.oracle.truffle.r.runtime.nodes.RSyntaxNode; /** * The interactive component of the {@code browser} function. @@ -61,7 +64,8 @@ import com.oracle.truffle.r.runtime.nodes.RNode; @NodeChild("browserCall") public abstract class BrowserInteractNode extends RNode { - public abstract int executeInteger(VirtualFrame frame, Object caller); + // it's never meant to be executed + private static final RSyntaxNode browserCall = new RASTBuilder().call(RSyntaxNode.INTERNAL, ReadVariableNode.create("browser")); public static final int STEP = 0; public static final int NEXT = 1; @@ -69,7 +73,7 @@ public abstract class BrowserInteractNode extends RNode { public static final int FINISH = 3; @Specialization - protected int interact(VirtualFrame frame, Object browserCaller) { + protected int interact(VirtualFrame frame) { CompilerDirectives.transferToInterpreter(); MaterializedFrame mFrame = frame.materialize(); ConsoleHandler ch = RContext.getInstance().getConsoleHandler(); @@ -79,8 +83,13 @@ public abstract class BrowserInteractNode extends RNode { RFunction caller = RArguments.getFunction(frame); boolean callerIsDebugged = DebugHandling.isDebugged(caller); int exitMode = NEXT; + RCaller currentCaller = RArguments.getCall(mFrame); + if (currentCaller == null) { + currentCaller = RCaller.topLevel; + } + RCaller browserCaller = RCaller.create(null, currentCaller, browserCall); try { - browserState.setInBrowser((RCaller) browserCaller); + browserState.setInBrowser(browserCaller); LW: while (true) { String input = ch.readLine(); if (input != null) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java index 2959ee0f10..e93a1d237c 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java @@ -232,13 +232,7 @@ public class DebugHandling { } protected void browserInteract(Node node, VirtualFrame frame) { - RCaller caller = RArguments.getCall(frame); - if (caller == null) { - caller = RCaller.topLevel; - } - - // TODO: make sure that the caller correctly reflects the context - int exitMode = browserInteractNode.executeInteger(frame, caller); + int exitMode = (int) browserInteractNode.execute(frame); switch (exitMode) { case BrowserInteractNode.NEXT: break; -- GitLab