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