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 54c5c79209d12d65cbee830a6d24a19af28e9fc4..48d34db470d1bc751044c3411b51a433f78c5d02 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 771587f95b8d1c384aa93b646a37563a6f0d1d04..b8f04f014f1932f69092eaeda8e7e26737c065e7 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 f6159aecd7e41521b283e9fdec07e9924b6252e5..6ed10247f02af0042cba428563448e5dd1bd96fb 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 40270c5de51f4b35661184065b85a52780d0e742..400a9c7b8f90f0a833c0fa568b46212095152d8c 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)"); + } }