From e3f3b0da977ffb9a1865cfba7fb63c32e073564b Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Mon, 29 Aug 2016 22:34:27 +0200
Subject: [PATCH] Added support for comparing SEXP-s and contexts from native
 side.

---
 com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c    | 6 ++++++
 com.oracle.truffle.r.native/include/ed_Rinterface_gcntx    | 1 +
 .../oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java   | 7 +++++++
 3 files changed, 14 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 6b062aee26..af38cfcc84 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c
@@ -653,3 +653,9 @@ int R_isGlobal(CTXT context) {
 	jmethodID methodID = checkGetMethodID(jniEnv, CallRFFIHelperClass, "R_isGlobal", "(Ljava/lang/Object;)I", 1);
     return (*jniEnv)->CallStaticIntMethod(jniEnv, CallRFFIHelperClass, methodID, context);
 }
+
+int R_isEqual(void* x, void* y) {
+	JNIEnv *jniEnv = getEnv();
+	jmethodID methodID = checkGetMethodID(jniEnv, CallRFFIHelperClass, "R_isEqual", "(Ljava/lang/Object;Ljava/lang/Object;)I", 1);
+    return (*jniEnv)->CallStaticIntMethod(jniEnv, CallRFFIHelperClass, methodID, x, y);
+}
diff --git a/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx b/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx
index 59e5f90184..88fe94a62a 100644
--- a/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx
+++ b/com.oracle.truffle.r.native/include/ed_Rinterface_gcntx
@@ -13,6 +13,7 @@ extern SEXP R_getContextCall(CTXT);
 extern SEXP R_getContextSrcRef(CTXT);
 extern int R_insideBrowser();
 extern int R_isGlobal(CTXT);
+extern int R_isEqual(void*, void*);
 #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 81c57b689e..d1301b102f 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
@@ -1383,4 +1383,11 @@ public class CallRFFIHelper {
         return rCaller == RCaller.topLevel ? 1 : 0;
     }
 
+    public static int R_isEqual(Object x, Object y) {
+        if (RFFIUtils.traceEnabled()) {
+            RFFIUtils.traceUpCall("isEqual", x, y);
+        }
+        return x == y ? 1 : 0;
+    }
+
 }
-- 
GitLab