From 0d69d09d74ba9a4a8980a5e1658b7abe40731862 Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Wed, 4 Oct 2017 12:08:36 +0200
Subject: [PATCH] Removed 'test_isNull' because it caused a crash on GnuR.

---
 .../packages/testrffi/testrffi/R/testrffi.R         |  8 ++------
 .../packages/testrffi/testrffi/src/init.c           |  2 +-
 .../packages/testrffi/testrffi/src/testrffi.c       | 13 ++++++++-----
 .../packages/testrffi/testrffi/src/testrffi.h       |  4 +---
 .../packages/testrffi/testrffi/tests/simpleTests.R  | 10 ++++------
 5 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
index 2f5a00e578..b4e7c16b80 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
@@ -98,8 +98,8 @@ rffi.iterate_iptr <- function(x) {
 	.Call("iterate_iptr", x, PACKAGE = "testrffi")
 }
 
-rffi.preserve_object <- function() {
-	.Call("preserve_object", PACKAGE = "testrffi")
+rffi.preserve_object <- function(v) {
+	.Call("preserve_object", v, PACKAGE = "testrffi")
 }
 
 rffi.release_object <- function(x) {
@@ -192,7 +192,3 @@ rffi.createNativeConnection <- function() {
 rffi.parseVector <- function(x) {
     .Call('test_ParseVector', x);
 }
-
-rffi.isNull <- function(x) {
-    .Call('test_isNull', x);
-}
\ No newline at end of file
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c
index 9daac422f9..51107ad6a2 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c
@@ -61,7 +61,7 @@ static const R_CallMethodDef CallEntries[] = {
         CALLDEF(null, 0),
         CALLDEF(iterate_iarray, 1),
         CALLDEF(iterate_iptr, 1),
-        CALLDEF(preserve_object, 0),
+        CALLDEF(preserve_object, 1),
         CALLDEF(release_object, 1),
         CALLDEF(findvar, 2),
         CALLDEF(test_asReal, 1),
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c
index a8adfd05dc..3a2abf0fd5 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c
@@ -278,9 +278,16 @@ SEXP iterate_iptr(SEXP x) {
     return v;
 }
 
-SEXP preserve_object(void) {
+SEXP preserve_object(SEXP val) {
 	SEXP v;
 	v = allocVector(INTSXP, 1);
+    int *iv = INTEGER(v);
+    if(LENGTH(val) > 0) {
+    	int *ival = INTEGER(val);
+    	iv[0] = ival[1];
+    } else {
+    	iv[0] = 1234;
+    }
 	R_PreserveObject(v);
 	return v;
 }
@@ -533,7 +540,3 @@ SEXP test_ParseVector(SEXP src) {
     UNPROTECT(2);
     return result;
 }
-
-Rboolean test_isNull(SEXP x) {
-	return Rf_isNull(x);
-}
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.h b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.h
index c21517de65..48b2e53621 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.h
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.h
@@ -66,7 +66,7 @@ extern SEXP iterate_iarray(SEXP x);
 
 extern SEXP iterate_iptr(SEXP x);
 
-extern SEXP preserve_object(void);
+extern SEXP preserve_object(SEXP val);
 
 extern SEXP release_object(SEXP x);
 
@@ -105,5 +105,3 @@ extern SEXP test_readConnection(SEXP conn);
 extern SEXP test_createNativeConnection(void);
 
 extern SEXP test_ParseVector(SEXP src);
-
-extern Rboolean test_isNUll(SEXP x);
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R
index e889ccad45..c01e673ea3 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/tests/simpleTests.R
@@ -83,14 +83,12 @@ rffi.parseVector('1+')
 
 # preserve and release object
 # using loop to trigger compilation
+preserved_objects <- list()
 for(i in seq(5000)) {
-    rffi.preserve_object()
+    preserved_objects[[i]] <- rffi.preserve_object(i)
 }
 
 for(i in seq(5000)) {
-    rffi.release_object()
+    obj <- preserved_objects[[i]]
+    rffi.release_object(obj)
 }
-
-# test isNull
-rffi.isNull(NULL)
-
-- 
GitLab