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