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 61431ad1d6d0b6c2717a6d7d17d8babc84c26456..9603887b123187a08901878dff54ff49fbbe2701 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 f9cf0613c24ce9f66f6d1c864deb23a289a24224..59e5f90184ec1c719a8b8d270f7e504a0947892b 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 731cbc5ac2557d606af6fd9b8002b45447355926..8ba6ddcf2560239fe56939ca258f52051a885bc4 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; + } + }