From 2ec2f2336a2170f0b5b256f4e1805d457c96d302 Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Wed, 27 Jul 2016 01:33:01 +0200
Subject: [PATCH] Another addition to the native API.

---
 .../fficall/src/jni/Rembedded.c                        |  6 ++++++
 .../include/ed_Rinterface_gcntx                        |  1 +
 .../truffle/r/runtime/ffi/jnr/CallRFFIHelper.java      | 10 ++++++++++
 3 files changed, 17 insertions(+)

diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c b/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c
index 61431ad1d6..9603887b12 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c
@@ -627,3 +627,9 @@ int R_insideBrowser() {
 	jmethodID methodID = checkGetMethodID(jniEnv, CallRFFIHelperClass, "R_insideBrowser", "()I", 1);
     return (*jniEnv)->CallStaticIntMethod(jniEnv, CallRFFIHelperClass, methodID);
 }
+
+int R_isGlobal(CTXT context) {
+	JNIEnv *jniEnv = getEnv();
+	jmethodID methodID = checkGetMethodID(jniEnv, CallRFFIHelperClass, "R_isGlobal", "(Ljava/lang/Object;)I", 1);
+    return (*jniEnv)->CallStaticIntMethod(jniEnv, CallRFFIHelperClass, methodID, context);
+}
diff --git a/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx b/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx
index f9cf0613c2..59e5f90184 100644
--- a/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx
+++ b/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx
@@ -12,6 +12,7 @@ extern SEXP R_getContextFun(CTXT);
 extern SEXP R_getContextCall(CTXT);
 extern SEXP R_getContextSrcRef(CTXT);
 extern int R_insideBrowser();
+extern int R_isGlobal(CTXT);
 #else
 .
 +1
diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
index 731cbc5ac2..8ba6ddcf25 100644
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
+++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
@@ -1386,4 +1386,14 @@ public class CallRFFIHelper {
     public static int R_insideBrowser() {
         return RContext.getInstance().stateInstrumentation.getBrowserState().inBrowser() ? 1 : 0;
     }
+
+    public static int R_isGlobal(Object c) {
+        if (RFFIUtils.traceEnabled()) {
+            RFFIUtils.traceUpCall("isGlobal", c);
+        }
+        RCaller rCaller = guaranteeInstanceOf(c, RCaller.class);
+
+        return rCaller == topLevel ? 1 : 0;
+    }
+
 }
-- 
GitLab