diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c index 08b2380ae7f1beb403493b0dea2606c6fb6cd6e2..ff81c0002ad83c7a456d22843abb2b4c022290bd 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c @@ -136,6 +136,8 @@ static jmethodID Rf_ncolsMethodID; static jclass CharSXPWrapperClass; static jfieldID CharSXPWrapperContentsFieldID; +jmethodID setCompleteMethodID; + void init_internals(JNIEnv *env) { Rf_ScalarIntegerMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_ScalarInteger", "(I)Lcom/oracle/truffle/r/runtime/data/RIntVector;", 1); Rf_ScalarDoubleMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_ScalarDouble", "(D)Lcom/oracle/truffle/r/runtime/data/RDoubleVector;", 1); @@ -240,6 +242,8 @@ void init_internals(JNIEnv *env) { Rf_copyMatrixMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_copyMatrix", "(Ljava/lang/Object;Ljava/lang/Object;I)V", 1); Rf_nrowsMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_nrows", "(Ljava/lang/Object;)I", 1); Rf_ncolsMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_ncols", "(Ljava/lang/Object;)I", 1); + + setCompleteMethodID = checkGetMethodID(env, CallRFFIHelperClass, "setComplete", "(Ljava/lang/Object;Z)V", 1); } static jstring stringFromCharSXP(JNIEnv *thisenv, SEXP charsxp) { diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c index 381fd1bbd330935ecbb9c4beace5183490c43502..aa7a7506b4e8ff58c4fde9ed424c98c9ff848c64 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c @@ -294,6 +294,7 @@ static void releaseNativeArray(JNIEnv *env, int i, int freedata) { fprintf(traceFile, "releaseNativeArray(x=%p, ix=%d, freedata=%d)\n", cv.obj, i, freedata); #endif if (cv.obj != NULL) { + jboolean complete = JNI_FALSE; // pessimal switch (cv.type) { case INTSXP: { jintArray intArray = (jintArray) cv.jArray; @@ -307,13 +308,21 @@ static void releaseNativeArray(JNIEnv *env, int i, int freedata) { int len = (*env)->GetArrayLength(env, byteArray); jbyte* internalData = (*env)->GetByteArrayElements(env, byteArray, NULL); int* data = (int*) cv.data; + complete = JNI_TRUE; // since we going to look at each element anyway for (int i = 0; i < len; i++) { - internalData[i] = data[i] == NA_INTEGER ? 255 : (jbyte) data[i]; + int isNA = data[i] == NA_INTEGER ? JNI_TRUE : JNI_FALSE; + if (isNA) { + internalData[i] = 255; + complete = JNI_FALSE; + } else { + internalData[i] = (jbyte) data[i]; + } + } (*env)->ReleaseByteArrayElements(env, byteArray, internalData, 0); - if (freedata){ - free(data); // was malloc'ed in addNativeArray - } + if (freedata){ + free(data); // was malloc'ed in addNativeArray + } break; } @@ -333,10 +342,13 @@ static void releaseNativeArray(JNIEnv *env, int i, int freedata) { default: fatalError("releaseNativeArray type"); } - if (freedata) { - // free up the slot + // update complete status + (*env)->CallVoidMethod(env, cv.obj, setCompleteMethodID, cv.obj, complete); + + if (freedata) { + // free up the slot cv.obj = NULL; - } + } } } diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h index 1a217b586c83a8ea42af363fa6adc2cb791dfc3d..9ace813ba473f3d71d4f44b9972c9aea3fc26eda 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h +++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h @@ -126,6 +126,7 @@ extern jmethodID INTEGER_MethodID; extern jmethodID LOGICAL_MethodID; extern jmethodID REAL_MethodID; extern jmethodID RAW_MethodID; +extern jmethodID setCompleteMethodID; extern int callDepth; diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java index 1354db03807188427ea23aa85dfa3328b9cd7305..5849eeabcc7cd2fcd6e7d881864ba24a800d6020 100644 --- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java +++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java @@ -71,6 +71,7 @@ import com.oracle.truffle.r.runtime.data.RShareable; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.RUnboundValue; +import com.oracle.truffle.r.runtime.data.RVector; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; @@ -659,6 +660,17 @@ public class CallRFFIHelper { } } + /** + * Called to possibly update the "complete" status on {@code x}. N.B. {@code x} may not be an + * object with a concrete {@code setComplete} method, e.g. see {@link #INTEGER(Object)}. + */ + public static void setComplete(Object x, boolean complete) { + // only care about concrete vectors + if (x instanceof RVector) { + ((RVector<?>) x).setComplete(complete); + } + } + public static void logObject(Object x) { System.out.println("object " + x); System.out.println("class " + x.getClass()); 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 2fcf4c4215a3084ed2aaf10b7c5874fef5cb0f7c..3043028d705efe1ff3e2eb9914fb6aae55dbbea2 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 @@ -114708,48 +114708,16 @@ Error: unexpected '*' in: #'\ ' == ' ' [1] TRUE -##com.oracle.truffle.r.test.rffi.TestUserRNG.testUserRNG# -#{ dyn.load("com.oracle.truffle.r.test.native/urand/lib/liburand.so"); RNGkind("user"); print(RNGkind()); set.seed(4567); runif(10) } -[1] "user-supplied" "Inversion" - [1] 0.45336386 0.38848030 0.94576608 0.11726267 0.21542351 0.08672997 - [7] 0.35201276 0.16919220 0.93579263 0.26084486 - -##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed# -#invisible(runif(1)); length(.Random.seed) -[1] 626 - -##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed# -#set.seed(42); runif(5); .Random.seed[1:10] -[1] 0.9148060 0.9370754 0.2861395 0.8304476 0.6417455 - [1] 403 5 -1577024373 1699409082 1745430460 -928819969 - [7] -1754023851 671107948 815604674 1800709149 - -##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext# -#.Random.seed <- c(401, 1, 2); invisible(runif(3)) -Warning message: -In runif(3) : - '.Random.seed' is not an integer vector but of type 'double', so ignored - -##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment# -#.Random.seed <- c(401L, 1L, 2L); runif(3) -[1] 0.5641106 0.2932388 0.6696743 - -##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext# -#.Random.seed <- c(999, 1, 2); invisible(runif(3)) -Warning message: -In runif(3) : - '.Random.seed' is not an integer vector but of type 'double', so ignored - -##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange# -#RNGkind('Marsaglia-Multicarry'); RNGkind('Mersenne-Twister'); set.seed(2); runif(5); -[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393 +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI1# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addInt(2L, 3L); detach("package:testrffi"); x } +[1] 5 -##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange# -#invisible(runif(5)); RNGkind('Marsaglia-Multicarry'); set.seed(2); runif(5); -[1] 0.8431527 0.5749091 0.1531976 0.3460321 0.2313936 +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI10# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); a <- c(1L,2L,3L); x <- rffi.iterate_iptr(a); detach("package:testrffi"); x } +[1] 1 2 3 -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIDotC# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.dotCModifiedArguments(c(0,1,2,3)); r1 } +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI11# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotCModifiedArguments(c(0,1,2,3)); detach("package:testrffi"); x } [[1]] [1] 4 @@ -114763,8 +114731,8 @@ In runif(3) : [1] TRUE FALSE FALSE FALSE -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIExternal# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); r1 } +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI12# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); x } [[1]] [[1]][[1]] NULL @@ -114822,8 +114790,8 @@ NULL -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIExternalWithNames# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); r1 } +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI13# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); x } [[1]] [[1]][[1]] x @@ -114881,48 +114849,203 @@ NULL -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIManyArgs# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.invoke12(); detach("package:testrffi"); r1 } +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI14# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.invoke12(); detach("package:testrffi"); x } [1] 12 -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFISimple# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); c3 <- c(1L,2L,3L); r1 <- rffi.iterate_iarray(c3); r2 <- rffi.iterate_iptr(c3); detach("package:testrffi"); list(r1, r2) } -[[1]] -[1] 1 2 3 +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI15# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.TYPEOF(3L); detach("package:testrffi"); x } +[1] 13 -[[2]] -[1] 1 2 3 +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI16# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString("hello"); detach("package:testrffi"); x } +[1] TRUE +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI17# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString(NULL); detach("package:testrffi"); x } +[1] FALSE -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFISimple# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.addInt(2L, 3L); r2 <- rffi.addDouble(2, 3); r3 <- rffi.populateIntVector(5); r4 <- rffi.populateLogicalVector(5); detach("package:testrffi"); list(r1, r2, r3, r4) } -[[1]] -[1] 5 +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI18# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.interactive(); detach("package:testrffi"); x } +[1] FALSE -[[2]] +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI19# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- 1; x <- rffi.findVar(x, globalenv()); detach("package:testrffi"); x } +Error: could not find function "rffi.findVar" + +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI2# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addDouble(2, 3); detach("package:testrffi"); x } [1] 5 -[[3]] +##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"); x } [1] 0 1 2 3 4 -[[4]] +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI4# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.populateLogicalVector(5); detach("package:testrffi"); x } [1] TRUE NA FALSE FALSE FALSE - -##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFISimple# -#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.mkStringFromChar(); r2 <- rffi.mkStringFromBytes(); r3 <- rffi.null(); r4 <-rffi.isRString(character(0)); detach("package:testrffi"); list(r1, r2, r3, r4) } -[[1]] +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI5# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.mkStringFromChar(); detach("package:testrffi"); x } [1] "hello" -[[2]] +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI6# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.mkStringFromBytes(); detach("package:testrffi"); x } [1] "hello" -[[3]] +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI7# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null(); detach("package:testrffi"); x } NULL -[[4]] +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI8# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString(character(0)); detach("package:testrffi"); x } [1] TRUE +##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI9# +#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); a <- c(1L,2L,3L); x <- rffi.iterate_iarray(a); detach("package:testrffi"); x } +[1] 1 2 3 + +##com.oracle.truffle.r.test.rffi.TestUserRNG.testUserRNG# +#{ dyn.load("com.oracle.truffle.r.test.native/urand/lib/liburand.so"); RNGkind("user"); print(RNGkind()); set.seed(4567); runif(10) } +[1] "user-supplied" "Inversion" + [1] 0.45336386 0.38848030 0.94576608 0.11726267 0.21542351 0.08672997 + [7] 0.35201276 0.16919220 0.93579263 0.26084486 + +##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed# +#invisible(runif(1)); length(.Random.seed) +[1] 626 + +##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed# +#set.seed(42); .Random.seed + [1] 403 624 507561766 1260545903 1362917092 -1772566379 + [7] -1344458670 1072028587 -1293707536 1708789297 -1333339586 256895399 + [13] 998413756 -555191411 -1047547670 -50950813 -1543487672 -1766763351 + [19] 32923734 1971684063 1718493076 -1117926011 890393730 -1032174053 + [25] 932479648 -1892763103 -1040205458 262148887 -1220643732 1566094973 + [31] -137659622 1045161427 -1555709704 178265753 -1033943674 -1034388913 + [37] -1721830332 -1749741963 -1137867598 -2065544053 866474576 458187281 + [43] 1218274462 -2000447353 199687964 1107998061 590795082 -858760637 + [49] -240079192 839017609 -1886488906 -1479389761 1595536628 1848478565 + [55] 368165090 -1706758405 -128901632 360384001 2027084750 1372682743 + [61] -1578682932 -1716686755 1324659578 1519053491 2044463192 -906549639 + [67] 1851192294 -1175847633 -1083563612 -849984427 333580562 1871261035 + [73] 1972555184 1756407281 1943215870 -1751074969 1282021500 -1397758131 + [79] 518529450 -1421699293 488820232 -413309847 1749794070 441878687 + [85] 81427028 1971206469 -1203675838 995493851 -366646944 -810597919 + [91] 2006003246 1288196311 -111499476 -280946115 -4973606 75390867 + [97] 1671430072 -422306215 -1145056698 -393285617 1823866628 1253337653 +[103] 1712504178 1846705739 -1820069616 -990520879 247466334 -1717615033 +[109] 1633935836 -246413011 1455137290 -1652210685 741252456 1555715145 +[115] 197538678 -1312148609 -687362124 1153947429 286861730 568692923 +[121] 1575576768 1925410241 1087549582 1279039415 -1208956788 1317778461 +[127] -1306414022 257836147 1550427928 86967865 -1875779418 -520138001 +[133] 1989839972 1598521365 1842848210 -1967767765 -1806646160 -1558774351 +[139] -1040440386 1215776039 1529633596 -1637672179 -121023894 -992976669 +[145] -1867768632 -1273940951 1167448534 786779743 -2131127020 -1987943163 +[151] 563160578 1714129307 -1871376352 -1347450463 590308078 -135901545 +[157] -2080269844 1678065149 -1705673574 1784846675 -871301512 1157619225 +[163] 491069190 301147599 -563099196 -1769503243 -230115790 1806462987 +[169] 1792100304 1913393553 35614238 -1176456185 -165968740 -27190035 +[175] -1087819062 1583082947 678644776 -1957034999 760393782 778033471 +[181] -636999052 757457637 -155102622 -1134562693 -1432327296 862688641 +[187] 960447822 1400730999 -1343939764 -1742358563 2020046074 549674547 +[193] -2039609896 1111401977 -527331994 -970823505 -779241692 -1209238571 +[199] -964822382 1395462379 -170034384 -1664281231 264366206 1603506919 +[205] -1702273540 398593741 -269270230 -1017124189 1029450632 -57883671 +[211] 647280278 686937119 -443846700 1428836549 -1446924606 1958398811 +[217] -1052543264 -1494249119 1771722670 -1095103401 972246188 258286013 +[223] -1737515686 1505268499 -883376840 350445017 -1548801082 608508815 +[229] -1454615420 -957455947 -913346830 527442379 5070480 -1974335151 +[235] -142896418 122151367 1556997980 -1392643923 1564443530 1762940803 +[241] -2059486488 -1650363447 -520885002 1934835455 -757373644 1661447845 +[247] 1604991778 2071204923 -717868480 -1355580095 1725471246 -179039433 +[253] -863752692 -1438942307 -762972742 1484404723 1185490072 1357252025 +[259] 2083912230 789790319 -352083484 50673557 -426437806 1252893355 +[265] 1090056688 -1651315407 -1847300802 -625631065 -46063428 1015857805 +[271] 1696986090 -525257629 569571912 -2138041431 1476940630 1044126175 +[277] -45086060 -197788539 1234368386 1489227035 -749691488 -315664095 +[283] -1349383058 251890199 -1108361364 86033789 -1966965222 2084588755 +[289] 272055288 104766873 -876742522 -985345713 1208721220 -408355467 +[295] 346482610 -350383221 1522021712 898089233 -2087422050 1603587975 +[301] -398783972 15107181 -239168438 -680623805 -1588532824 860922761 +[307] -748033610 -1771805505 -331259916 -500352411 -1533811742 820114939 +[313] -1804945152 -35969791 -1906397490 2139123959 277741772 2022506333 +[319] -1321388422 1078120883 -1411710120 -1058724487 1071589094 -1584278481 +[325] -1648603996 743551829 1457318930 -1292372885 -597481296 -1389853455 +[331] 1025749502 2006806119 907256700 -259836339 2032231594 377765411 +[337] -47150840 -1076157591 -424628202 1686380447 1392993620 1113942085 +[343] -1178271678 -1006203173 -581139360 2049892577 433488174 377669591 +[349] 1924592172 418916669 -1039261990 1002030739 158104248 -1999528615 +[355] -768506554 1521633039 -177362428 -998811339 -1135665038 -260782773 +[361] 1087491088 1533884625 -81126306 1619492167 -1423774500 -1109731283 +[367] -43621110 -2094372093 -1687562136 -1406692535 1903470198 1834175103 +[373] 284826292 1716946469 -566342494 1852413883 1593704384 -148730687 +[379] 881951630 -4026697 1052939148 -1227209955 -984795334 568142707 +[385] -2067553768 -503577287 -934472794 1667115503 -2072529052 -544084203 +[391] 1612022994 -1916008917 -287563920 -1823613775 -968902978 -1274348505 +[397] -1212094916 -681219571 212178282 513345507 1305794504 -97651927 +[403] -1622291242 1367991647 829521940 -612854779 1930938626 675483803 +[409] -1238947040 95299745 -1926777362 -1023949417 2064180460 -559198979 +[415] 1326612378 -1041956781 -440895112 -866362087 -1278619130 172850383 +[421] -1405979452 -384207627 1766332722 288732939 962208464 -1547538287 +[427] 1929150750 1742727943 2017824668 1738206189 -1057557046 101192899 +[433] 1380550440 669401865 -405527754 -1914703809 -339372684 1799590373 +[439] -446073502 -2050295429 1806698112 852079745 -1640949682 1138388087 +[445] -639506868 -656193827 2138437626 118048051 1612906712 -1008032519 +[451] 1916780646 2050506671 -101326300 -2004489515 184475026 -1662396437 +[457] 1596184112 -675089295 -1577550978 -843167257 -1257707268 1425235405 +[463] -1066236374 1924108707 1386210952 793281257 245344662 2064476959 +[469] -1555146028 456097733 -1370795582 -1220980133 -193949216 124596321 +[475] -1371166034 -1037925545 -1180330068 -1443221315 42967130 -125699565 +[481] -1814349768 -1063330599 759619270 -1177128305 656015236 -1588637515 +[487] -2075012622 -283088693 -1961805424 1984391249 -1077172770 -1822549817 +[493] -496831908 1105641389 1026573962 -1178108285 1689253352 -2041793847 +[499] 591945718 1305105919 -412889036 750017957 1389714978 -2000282821 +[505] -1321153216 143694913 -805475058 -645395913 615250188 308808349 +[511] 276265146 -1182327053 -1934024808 913376441 1517759782 -1411377809 +[517] 418827492 1391306389 542701138 1645308331 -738571024 -1035482063 +[523] 84803646 -1032366169 548121532 -1930620531 -179816726 1283971939 +[529] 173126984 518705833 -2124003754 382644447 1935537556 491400069 +[535] 1679792770 1655264283 -285689696 -1221855199 -504340626 -2117926633 +[541] -783480212 -1901800323 1833271578 -1991199789 -1030441224 358161561 +[547] -1150768250 252520527 -521909692 -120001419 908872370 -336274805 +[553] 1018630224 -88334319 1985448606 -1061026169 1010504988 1350456173 +[559] 852645706 -1205295037 828187816 1729815177 -795779914 -1026393153 +[565] 781503220 -1503073947 2135033570 1226505467 -428846080 -1875426303 +[571] -1900641842 244017143 568380364 1462275677 1762769274 -1021921101 +[577] 424017496 -917560199 1572035046 2115349295 -1137018972 713630293 +[583] 686018322 520272747 -1273003088 1520198641 -465550082 1341531495 +[589] -1385615748 1662158157 -874076246 -1511922397 866796552 1221911145 +[595] 73507606 445494943 744509524 -1115121851 1297392450 -598534693 +[601] -1132486816 212500449 1290261550 798572247 616512812 1617639485 +[607] -537648678 -569299565 -526060104 978000985 -1695598522 1873911311 +[613] 340874500 -1149876171 1737982834 695405643 353085200 417372113 +[619] -346017954 -1916029881 -1735526436 1461823277 580724746 -622095869 +[625] -686746776 705745481 + +##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext# +#.Random.seed <- c(401, 1, 2); invisible(runif(3)) +Warning message: +In runif(3) : + '.Random.seed' is not an integer vector but of type 'double', so ignored + +##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment# +#.Random.seed <- c(401L, 1L, 2L); runif(3) +[1] 0.5641106 0.2932388 0.6696743 + +##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext# +#.Random.seed <- c(999, 1, 2); invisible(runif(3)) +Warning message: +In runif(3) : + '.Random.seed' is not an integer vector but of type 'double', so ignored + +##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange# +#RNGkind('Marsaglia-Multicarry'); RNGkind('Mersenne-Twister'); set.seed(2); runif(5); +[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393 + +##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange# +#invisible(runif(5)); RNGkind('Marsaglia-Multicarry'); set.seed(2); runif(5); +[1] 0.8431527 0.5749091 0.1531976 0.3460321 0.2313936 ##com.oracle.truffle.r.test.rpackages.TestRecommendedPackages.testLoad#Ignored.OutputFormatting#Context.NonShared#Context.LongTimeout# #{ library(KernSmooth, lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); detach("package:KernSmooth"); } 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 new file mode 100644 index 0000000000000000000000000000000000000000..1b8cd192ef964076af0a275b3de0b31ace62002a --- /dev/null +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.truffle.r.test.rffi; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.oracle.truffle.r.test.TestBase; +import com.oracle.truffle.r.test.rpackages.TestRPackages; + +public class TestRFFIPackage extends TestRPackages { + + private static final String[] TEST_PACKAGES = new String[]{"testrffi"}; + + @BeforeClass + public static void setupInstallMyTestPackages() { + setupInstallTestPackages(TEST_PACKAGES); + } + + @AfterClass + public static void tearDownUninstallMyTestPackages() { + tearDownUninstallTestPackages(TEST_PACKAGES); + } + + private void assertEvalWithLibWithSetup(String setup, String test) { + assertEval(TestBase.template("{ library(\"testrffi\", lib.loc = \"%0\"); " + setup + "x <- " + test + "; detach(\"package:testrffi\"); x }", new String[]{TestRPackages.libLoc()})); + } + + private void assertEvalWithLib(String test) { + assertEvalWithLibWithSetup("", test); + } + + @Test + public void testRFFI1() { + assertEvalWithLib("rffi.addInt(2L, 3L)"); + } + + @Test + public void testRFFI2() { + assertEvalWithLib("rffi.addDouble(2, 3)"); + } + + @Test + public void testRFFI3() { + assertEvalWithLib("rffi.populateIntVector(5)"); + } + + @Test + public void testRFFI4() { + assertEvalWithLib("rffi.populateLogicalVector(5)"); + } + + @Test + public void testRFFI5() { + assertEvalWithLib("rffi.mkStringFromChar()"); + } + + @Test + public void testRFFI6() { + assertEvalWithLib("rffi.mkStringFromBytes()"); + } + + @Test + public void testRFFI7() { + assertEvalWithLib("rffi.null()"); + } + + @Test + public void testRFFI8() { + assertEvalWithLib("rffi.isRString(character(0))"); + } + + @Test + public void testRFFI9() { + assertEvalWithLibWithSetup("a <- c(1L,2L,3L); ", "rffi.iterate_iarray(a)"); + } + + @Test + public void testRFFI10() { + assertEvalWithLibWithSetup("a <- c(1L,2L,3L); ", "rffi.iterate_iptr(a)"); + } + + @Test + public void testRFFI11() { + assertEvalWithLib("rffi.dotCModifiedArguments(c(0,1,2,3))"); + } + + @Test + public void testRFFI12() { + assertEvalWithLib("rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12))"); + } + + @Test + public void testRFFI13() { + assertEvalWithLib("rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12))"); + } + + @Test + public void testRFFI14() { + assertEvalWithLib("rffi.invoke12()"); + } + + @Test + public void testRFFI15() { + assertEvalWithLib("rffi.TYPEOF(3L)"); + } + + @Test + public void testRFFI16() { + assertEvalWithLib("rffi.isRString(\"hello\")"); + } + + @Test + public void testRFFI17() { + assertEvalWithLib("rffi.isRString(NULL)"); + } + + @Test + public void testRFFI18() { + assertEvalWithLib("rffi.interactive()"); + } + + @Test + public void testRFFI19() { + assertEvalWithLibWithSetup("x <- 1; ", "rffi.findVar(x, globalenv())"); + } +} diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestRFFIPackage.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestRFFIPackage.java deleted file mode 100644 index c6c3f540298bd422ff25ebe384c0eaa8bcdd7ff9..0000000000000000000000000000000000000000 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestRFFIPackage.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.truffle.r.test.rpackages; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.oracle.truffle.r.test.TestBase; - -/** - * Tests related to the loading, etc. of R packages. - */ -public class TestRFFIPackage extends TestRPackages { - - private static final String[] TEST_PACKAGES = new String[]{"testrffi"}; - - @BeforeClass - public static void setupInstallMyTestPackages() { - setupInstallTestPackages(TEST_PACKAGES); - } - - @AfterClass - public static void tearDownUninstallMyTestPackages() { - tearDownUninstallTestPackages(TEST_PACKAGES); - } - - @Test - public void testLoadTestRFFISimple() { - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.addInt(2L, 3L); r2 <- rffi.addDouble(2, 3); r3 <- rffi.populateIntVector(5); " + - "r4 <- rffi.populateLogicalVector(5); detach(\"package:testrffi\"); list(r1, r2, r3, r4) }", - new String[]{TestRPackages.libLoc()})); - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.mkStringFromChar(); r2 <- rffi.mkStringFromBytes(); r3 <- rffi.null(); " + - "r4 <-rffi.isRString(character(0)); detach(\"package:testrffi\"); list(r1, r2, r3, r4) }", - new String[]{TestRPackages.libLoc()})); - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); c3 <- c(1L,2L,3L); r1 <- rffi.iterate_iarray(c3); r2 <- rffi.iterate_iptr(c3); " + - "detach(\"package:testrffi\"); list(r1, r2) }", - new String[]{TestRPackages.libLoc()})); - } - - @Test - public void testLoadTestRFFIDotC() { - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.dotCModifiedArguments(c(0,1,2,3)); r1 }", - new String[]{TestRPackages.libLoc()})); - } - - @Test - public void testLoadTestRFFIExternal() { - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach(\"package:testrffi\"); r1 }", - new String[]{TestRPackages.libLoc()})); - } - - @Test - public void testLoadTestRFFIExternalWithNames() { - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach(\"package:testrffi\"); r1 }", - new String[]{TestRPackages.libLoc()})); - } - - @Test - public void testLoadTestRFFIManyArgs() { - assertEval(TestBase.template( - "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.invoke12(); detach(\"package:testrffi\"); r1 }", - new String[]{TestRPackages.libLoc()})); - } - -}