From 647280dce87a1f16b84a78d713a3d00d872402ee Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Thu, 18 May 2017 16:00:01 +0200
Subject: [PATCH] Fix: Returned wrong foreign access.

---
 .../oracle/truffle/r/runtime/env/RScope.java  | 41 ++++++++++++-------
 .../truffle/r/test/tck/FastRDebugTest.java    |  3 ++
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
index 977affc8f0..d44fd73c87 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
@@ -65,7 +65,20 @@ public final class RScope extends AbstractScope {
 
     @Override
     protected String getName() {
-        return isPromiseScope() ? "promise" : "function";
+        // just to be sure
+        if (env == REnvironment.emptyEnv()) {
+            return "empty environment";
+        }
+
+        assert env.getFrame() != null;
+        RFunction function = RArguments.getFunction(env.getFrame());
+        if (function != null) {
+            String name = function.getName();
+            return "function environment" + (name != null ? " for function " + name : "");
+        } else {
+            String name = env.getName();
+            return "explicit environment" + (name != null ? ": " + name : "");
+        }
     }
 
     @Override
@@ -103,24 +116,22 @@ public final class RScope extends AbstractScope {
     }
 
     private static String[] collectArgs(REnvironment env) {
-        assert RArguments.isRFrame(env.getFrame());
-        RFunction f = RArguments.getFunction(env.getFrame());
-        if (f != null) {
-            return RContext.getRRuntimeASTAccess().getArgumentsSignature(f).getNames();
-        } else {
-            ArgumentsSignature suppliedSignature = RArguments.getSuppliedSignature(env.getFrame());
-            if (suppliedSignature != null) {
-                return suppliedSignature.getNames();
+
+        if (env != REnvironment.emptyEnv()) {
+            assert RArguments.isRFrame(env.getFrame());
+            RFunction f = RArguments.getFunction(env.getFrame());
+            if (f != null) {
+                return RContext.getRRuntimeASTAccess().getArgumentsSignature(f).getNames();
+            } else {
+                ArgumentsSignature suppliedSignature = RArguments.getSuppliedSignature(env.getFrame());
+                if (suppliedSignature != null) {
+                    return suppliedSignature.getNames();
+                }
             }
         }
         return new String[0];
     }
 
-    private boolean isPromiseScope() {
-        Frame frame = env.getFrame();
-        return RArguments.getFunction(frame) == null && RArguments.getSuppliedSignature(frame) != null;
-    }
-
     public static RScope createScope(Node node, Frame frame) {
         return new RScope(node.getRootNode(), getEnv(frame));
     }
@@ -288,7 +299,7 @@ public final class RScope extends AbstractScope {
 
         @Override
         public ForeignAccess getForeignAccess() {
-            return VariableNamesMessageResolutionForeign.ACCESS;
+            return ArgumentNamesMessageResolutionForeign.ACCESS;
         }
 
         public static boolean isInstance(TruffleObject obj) {
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tck/FastRDebugTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tck/FastRDebugTest.java
index 9adb1d9053..134b0b01d3 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tck/FastRDebugTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tck/FastRDebugTest.java
@@ -341,6 +341,9 @@ public class FastRDebugTest {
             debuggerSession.suspendNextExecution();
         });
 
+        assertArguments(1, "main(1, 2, 3, 4)");
+
+        stepInto(1);
         assertArguments(2, "x <- 10L", "a", "b", "c", "d");
         continueExecution();
         performWork();
-- 
GitLab