From c9b4f1713c92a991385d800b885caa6a66fb2ab9 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Wed, 28 Dec 2016 16:13:53 -0800
Subject: [PATCH] testrffi: add test for C string null termination

---
 .../packages/testrffi/testrffi/R/testrffi.R              | 4 ++++
 .../packages/testrffi/testrffi/src/testrffi.c            | 9 +++++++++
 .../com/oracle/truffle/r/test/ExpectedTestOutput.test    | 4 ++++
 .../com/oracle/truffle/r/test/rffi/TestRFFIPackage.java  | 5 +++++
 4 files changed, 22 insertions(+)

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 54c5c79209..48d34db470 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
@@ -78,6 +78,10 @@ rffi.r_home <- function() {
 	.Call("r_home", PACKAGE = "testrffi")
 }
 
+rffi.char_length <- function(x) {
+	.Call("char_length", PACKAGE = "testrffi", x)
+}
+
 rffi.mkStringFromChar <- function() {
 	.Call("mkStringFromChar", PACKAGE = "testrffi")
 }
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 771587f95b..b8f04f014f 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
@@ -219,6 +219,15 @@ SEXP r_home(void) {
 	return mkString(R_Home);
 }
 
+SEXP char_length(SEXP x) {
+	const char *cx = R_CHAR(STRING_ELT(x, 0));
+	int count  = 0;
+	while (*cx++ != 0) {
+		count++;
+	}
+	return ScalarInteger(count);
+}
+
 SEXP mkStringFromChar(void) {
 	return mkString("hello");
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index f6159aecd7..6ed10247f0 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -119998,6 +119998,10 @@ NULL
 #{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addDouble(2, 3); detach("package:testrffi", unload=T); x }
 [1] 5
 
+##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI20#
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- "12345"; x <- rffi.char_length(x); detach("package:testrffi", unload=T); x }
+[1] 5
+
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI3#
 #{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.populateIntVector(5); detach("package:testrffi", unload=T); x }
 [1] 0 1 2 3 4
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
index 40270c5de5..400a9c7b8f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
@@ -160,4 +160,9 @@ public class TestRFFIPackage extends TestRPackages {
     public void testRFFI19() {
         assertEvalWithLibWithSetup("x <- 1; ", "rffi.findvar(\"x\", globalenv())");
     }
+
+    @Test
+    public void testRFFI20() {
+        assertEvalWithLibWithSetup("x <- \"12345\"; ", "rffi.char_length(x)");
+    }
 }
-- 
GitLab