diff --git a/com.oracle.truffle.r.native/fficall/jni/src/rf_functions.c b/com.oracle.truffle.r.native/fficall/jni/src/rf_functions.c index 72017f431d1336d1253209194f98387b1ee9d104..3dcf32959ddaba295748dd9c5fa62d1d94ce4b85 100644 --- a/com.oracle.truffle.r.native/fficall/jni/src/rf_functions.c +++ b/com.oracle.truffle.r.native/fficall/jni/src/rf_functions.c @@ -29,10 +29,8 @@ static jmethodID Rf_ScalarIntegerMethodID; static jmethodID Rf_ScalarDoubleMethodID; static jmethodID Rf_ScalarStringMethodID; -static jmethodID createIntArrayMethodID; -static jmethodID createDoubleArrayMethodID; -static jmethodID createStringArrayMethodID; -static jmethodID createListMethodID; +static jmethodID Rf_allocateVectorMethodID; +static jmethodID Rf_allocateMatrixMethodID; static jmethodID Rf_duplicateMethodID; static jmethodID Rf_consMethodID; static jmethodID Rf_defineVarMethodID; @@ -60,10 +58,8 @@ void init_rf_functions(JNIEnv *env) { Rf_isNullMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_isNull", "(Ljava/lang/Object;)I", 1); Rf_warningMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_warning", "(Ljava/lang/String;)V", 1); Rf_errorMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_error", "(Ljava/lang/String;)V", 1); - createIntArrayMethodID = checkGetMethodID(env, RDataFactoryClass, "createIntVector", "(I)Lcom/oracle/truffle/r/runtime/data/RIntVector;", 1); - createDoubleArrayMethodID = checkGetMethodID(env, RDataFactoryClass, "createDoubleVector", "(I)Lcom/oracle/truffle/r/runtime/data/RDoubleVector;", 1); - createStringArrayMethodID = checkGetMethodID(env, RDataFactoryClass, "createStringVector", "(I)Lcom/oracle/truffle/r/runtime/data/RStringVector;", 1); - createListMethodID = checkGetMethodID(env, RDataFactoryClass, "createList", "(I)Lcom/oracle/truffle/r/runtime/data/RList;", 1); + Rf_allocateVectorMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_allocateVector", "(II)Ljava/lang/Object;", 1); + Rf_allocateMatrixMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_allocateMatrix", "(III)Ljava/lang/Object;", 1); Rf_duplicateMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_duplicate", "(Ljava/lang/Object;)Ljava/lang/Object;", 1); Rf_NewHashedEnvMethodID = checkGetMethodID(env, RDataFactoryClass, "createNewEnv", "(Lcom/oracle/truffle/r/runtime/env/REnvironment;Ljava/lang/String;ZI)Lcom/oracle/truffle/r/runtime/env/REnvironment;", 1); // Rf_rPsortMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_rPsort", "(Lcom/oracle/truffle/r/runtime/data/RDoubleVector;II)", 1); @@ -93,29 +89,14 @@ SEXP Rf_ScalarString(SEXP value) { SEXP Rf_allocVector(SEXPTYPE t, R_xlen_t len) { TRACE(TARG2d, t, len); JNIEnv *thisenv = getEnv(); - SEXP result; - switch (t) { - case INTSXP: { - result = (*thisenv)->CallStaticObjectMethod(thisenv, RDataFactoryClass, createIntArrayMethodID, len); - break; - } - case REALSXP: { - result = (*thisenv)->CallStaticObjectMethod(thisenv, RDataFactoryClass, createDoubleArrayMethodID, len); - break; - } - case STRSXP: { - result = (*thisenv)->CallStaticObjectMethod(thisenv, RDataFactoryClass, createStringArrayMethodID, len); - break; - } - case VECSXP: { - result = (*thisenv)->CallStaticObjectMethod(thisenv, RDataFactoryClass, createListMethodID, len); - break; - } - default: - printf("t=%d\n", t); - unimplemented("vector type not handled"); - return NULL; - } + SEXP result = (*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_allocateVectorMethodID, t, len); + return checkRef(thisenv, result); +} + +SEXP Rf_allocMatrix(SEXPTYPE mode, int nrow, int ncol) { + TRACE(TARG2d, t, len); + JNIEnv *thisenv = getEnv(); + SEXP result = (*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_allocateMatrixMethodID, mode, nrow, ncol); return checkRef(thisenv, result); } @@ -196,7 +177,7 @@ SEXP Rf_mkString(const char *s) { } SEXP Rf_protect(SEXP x) { - // TODO perhaps we can use this + return x; } void Rf_unprotect(int x) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java index e58c716669bcd6e6ec7c172b82cdd79323c76cb9..1d7362c21e3910804066aca1145958d671354813 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java @@ -57,7 +57,8 @@ public class DynLoadFunctions { DLLInfo dllInfo = DLL.loadPackageDLL(lib, asBoolean(local), asBoolean(now)); return dllInfo.toRList(); } catch (DLLException ex) { - throw RError.error(this, ex); + // This is not a recoverable error + throw RInternalError.shouldNotReachHere(ex); } } diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java index c91106200b723abc56eddc37207a5b2a8a49a72e..727f091adcda34d30e66ffa48ab9810be1054624 100644 --- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java +++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java @@ -28,6 +28,7 @@ import com.oracle.truffle.r.runtime.data.*; import com.oracle.truffle.r.runtime.data.model.*; import com.oracle.truffle.r.runtime.env.*; import com.oracle.truffle.r.runtime.env.REnvironment.PutException; +import com.oracle.truffle.r.runtime.gnur.*; import com.oracle.truffle.r.runtime.ops.na.*; /** @@ -173,6 +174,54 @@ public class CallRFFIHelper { RError.warning(RError.NO_NODE, RError.Message.GENERIC, msg); } + static Object Rf_allocateVector(int mode, int n) { + SEXPTYPE type = SEXPTYPE.mapInt(mode); + if (n < 0) { + throw RError.error(RError.NO_NODE, RError.Message.NEGATIVE_LENGTH_VECTORS_NOT_ALLOWED); + // TODO check long vector + } + switch (type) { + case INTSXP: + return RDataFactory.createIntVector(new int[n], RDataFactory.COMPLETE_VECTOR); + case REALSXP: + return RDataFactory.createDoubleVector(new double[n], RDataFactory.COMPLETE_VECTOR); + case LGLSXP: + return RDataFactory.createLogicalVector(new byte[n], RDataFactory.COMPLETE_VECTOR); + case STRSXP: + return RDataFactory.createStringVector(new String[n], RDataFactory.COMPLETE_VECTOR); + case CPLXSXP: + return RDataFactory.createComplexVector(new double[2 * n], RDataFactory.COMPLETE_VECTOR); + case VECSXP: + return RDataFactory.createList(n); + default: + throw RInternalError.unimplemented(); + } + + } + + static Object Rf_allocateMatrix(int mode, int ncol, int nrow) { + SEXPTYPE type = SEXPTYPE.mapInt(mode); + if (nrow < 0 || ncol < 0) { + throw RError.error(RError.NO_NODE, RError.Message.NEGATIVE_EXTENTS_TO_MATRIX); + } + // TODO check long vector + int[] dims = new int[]{nrow, ncol}; + switch (type) { + case INTSXP: + return RDataFactory.createIntVector(new int[nrow * ncol], RDataFactory.COMPLETE_VECTOR, dims); + case REALSXP: + return RDataFactory.createDoubleVector(new double[nrow * ncol], RDataFactory.COMPLETE_VECTOR, dims); + case LGLSXP: + return RDataFactory.createLogicalVector(new byte[nrow * ncol], RDataFactory.COMPLETE_VECTOR, dims); + case CHARSXP: + return RDataFactory.createStringVector(new String[nrow * ncol], RDataFactory.COMPLETE_VECTOR, dims); + case CPLXSXP: + return RDataFactory.createComplexVector(new double[2 * (nrow * ncol)], RDataFactory.COMPLETE_VECTOR, dims); + default: + throw RInternalError.unimplemented(); + } + } + static int LENGTH(Object x) { if (x instanceof RAbstractContainer) { return ((RAbstractContainer) x).getLength(); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java index cdd1a9f02a81e748ad831e0636cf87e6e36fcb0b..f51b185d5d91e484b5ed9fb165de2d1f83e4e1cc 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java @@ -261,6 +261,7 @@ public final class RError extends RuntimeException { BY_TOO_SMALL("'by' argument is much too small"), INCORRECT_SUBSCRIPTS("incorrect number of subscripts"), INCORRECT_SUBSCRIPTS_MATRIX("incorrect number of subscripts on matrix"), + NEGATIVE_EXTENTS_TO_MATRIX("negative extents to matrix"), INVALID_SEP("invalid 'sep' specification"), INVALID_LENGTH("invalid '%s' length"), EMPTY_WHAT("empty 'what' specified"), diff --git a/com.oracle.truffle.r.test.cran/r/install.cran.packages.R b/com.oracle.truffle.r.test.cran/r/install.cran.packages.R index bdb1406713e288d813ae310effd4a2a2b6e4999c..dac1d67291c59d4f3009d6dd4086ea239d0efa7d 100644 --- a/com.oracle.truffle.r.test.cran/r/install.cran.packages.R +++ b/com.oracle.truffle.r.test.cran/r/install.cran.packages.R @@ -61,7 +61,7 @@ create.blacklist.iter <- function(blacklist) { } # known to be uninstallable -initial.blacklist <- c("Rcpp", "grid", "splines", "parallel") +initial.blacklist <- c("Rcpp") create.blacklist <- function() { create.blacklist.iter(initial.blacklist) diff --git a/mx.fastr/.project b/mx.fastr/.project index c55ff0b0296f696b08b3a7605fbf7aba843676dd..fe3b6176414a7da129d3245e68fb3199bf260926 100644 --- a/mx.fastr/.project +++ b/mx.fastr/.project @@ -3,7 +3,9 @@ <name>mx.fastr</name> <comment></comment> <projects> - <project>mxtool</project> + <project>mx</project> + <project>mx.graal</project> + <project>mx.jvmci</project> </projects> <buildSpec> <buildCommand>