diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java index 147732e57ec6ad152d0d19f198b43039df5e3589..dde7cee370c6f056a009896d9a0223edac8bccb7 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; @@ -1446,4 +1447,49 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { return REnvironment.getRegisteredNamespace("methods"); } + private HashMap<String, Integer> name2typeTable; + + @Override + @TruffleBoundary + public int Rf_str2type(Object name) { + if (name == null) { + return -1; + } + initName2typeTable(); + Integer result = name2typeTable.get(name); + return result != null ? result : -1; + } + + private void initName2typeTable() { + if (name2typeTable != null) { + return; + } + name2typeTable = new HashMap<>(26); + name2typeTable.put("NULL", SEXPTYPE.NILSXP.code); /* real types */ + name2typeTable.put("symbol", SEXPTYPE.SYMSXP.code); + name2typeTable.put("pairlist", SEXPTYPE.LISTSXP.code); + name2typeTable.put("closure", SEXPTYPE.CLOSXP.code); + name2typeTable.put("environment", SEXPTYPE.ENVSXP.code); + name2typeTable.put("promise", SEXPTYPE.PROMSXP.code); + name2typeTable.put("language", SEXPTYPE.LANGSXP.code); + name2typeTable.put("special", SEXPTYPE.SPECIALSXP.code); + name2typeTable.put("builtin", SEXPTYPE.BUILTINSXP.code); + name2typeTable.put("char", SEXPTYPE.CHARSXP.code); + name2typeTable.put("logical", SEXPTYPE.LGLSXP.code); + name2typeTable.put("integer", SEXPTYPE.INTSXP.code); + name2typeTable.put("double", SEXPTYPE.REALSXP.code); /*- "real", for R <= 0.61.x */ + name2typeTable.put("complex", SEXPTYPE.CPLXSXP.code); + name2typeTable.put("character", SEXPTYPE.STRSXP.code); + name2typeTable.put("...", SEXPTYPE.DOTSXP.code); + name2typeTable.put("any", SEXPTYPE.ANYSXP.code); + name2typeTable.put("expression", SEXPTYPE.EXPRSXP.code); + name2typeTable.put("list", SEXPTYPE.VECSXP.code); + name2typeTable.put("externalptr", SEXPTYPE.EXTPTRSXP.code); + name2typeTable.put("bytecode", SEXPTYPE.BCODESXP.code); + name2typeTable.put("weakref", SEXPTYPE.WEAKREFSXP.code); + name2typeTable.put("raw", SEXPTYPE.RAWSXP.code); + name2typeTable.put("S4", SEXPTYPE.S4SXP.code); + name2typeTable.put("numeric", SEXPTYPE.REALSXP.code); + name2typeTable.put("name", SEXPTYPE.SYMSXP.code); + } } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java index 54dc54165a246d41eae7b4a70dda50e27c8b14c5..ec15934f16e9525aeb68a973b38add783339169e 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java @@ -825,4 +825,9 @@ final class TracingUpCallsRFFIImpl implements UpCallsRFFI { return delegate.R_MethodsNamespace(); } + @Override + public int Rf_str2type(Object name) { + RFFIUtils.traceUpCall("Rf_str2type"); + return delegate.Rf_str2type(name); + } } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java index d85aab618a7f8383750e9e4940dcdc1e8e66be6d..5606335c7c8f3260f672993a069d6f616243b0bb 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java @@ -288,4 +288,6 @@ public interface StdUpCallsRFFI { Object R_MethodsNamespace(); + int Rf_str2type(@RFFICstring Object name); + } diff --git a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h index 4106eaa952144783bbe6dae31b2b7da276879cb4..3f335946c1e0d7c77472eea4abdfb9a28e5a3c95 100644 --- a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h +++ b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h @@ -110,32 +110,33 @@ #define Rf_ncols_x 105 #define Rf_nrows_x 106 #define Rf_setAttrib_x 107 -#define Rf_warning_x 108 -#define Rf_warningcall_x 109 -#define Rprintf_x 110 -#define SETCADR_x 111 -#define SETCAR_x 112 -#define SETCDR_x 113 -#define SET_RDEBUG_x 114 -#define SET_RSTEP_x 115 -#define SET_S4_OBJECT_x 116 -#define SET_STRING_ELT_x 117 -#define SET_SYMVALUE_x 118 -#define SET_TAG_x 119 -#define SET_TYPEOF_FASTR_x 120 -#define SET_VECTOR_ELT_x 121 -#define STRING_ELT_x 122 -#define SYMVALUE_x 123 -#define TAG_x 124 -#define TYPEOF_x 125 -#define UNSET_S4_OBJECT_x 126 -#define VECTOR_ELT_x 127 -#define getConnectionClassString_x 128 -#define getOpenModeString_x 129 -#define getSummaryDescription_x 130 -#define isSeekable_x 131 -#define unif_rand_x 132 +#define Rf_str2type_x 108 +#define Rf_warning_x 109 +#define Rf_warningcall_x 110 +#define Rprintf_x 111 +#define SETCADR_x 112 +#define SETCAR_x 113 +#define SETCDR_x 114 +#define SET_RDEBUG_x 115 +#define SET_RSTEP_x 116 +#define SET_S4_OBJECT_x 117 +#define SET_STRING_ELT_x 118 +#define SET_SYMVALUE_x 119 +#define SET_TAG_x 120 +#define SET_TYPEOF_FASTR_x 121 +#define SET_VECTOR_ELT_x 122 +#define STRING_ELT_x 123 +#define SYMVALUE_x 124 +#define TAG_x 125 +#define TYPEOF_x 126 +#define UNSET_S4_OBJECT_x 127 +#define VECTOR_ELT_x 128 +#define getConnectionClassString_x 129 +#define getOpenModeString_x 130 +#define getSummaryDescription_x 131 +#define isSeekable_x 132 +#define unif_rand_x 133 -#define UPCALLS_TABLE_SIZE 133 +#define UPCALLS_TABLE_SIZE 134 #endif // RFFI_UPCALLSINDEX_H 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 37a58c953590c57bb3647010cc6e80689405f537..659eff9e47d07a510f25a19dadb27a9fcef2f430 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c @@ -95,6 +95,7 @@ static jmethodID LENGTH_MethodID; static jmethodID R_do_slot_MethodID; static jmethodID R_do_slot_assign_MethodID; static jmethodID R_MethodsNamespaceMethodID; +static jmethodID Rf_str2type_MethodID; static jmethodID Rf_asIntegerMethodID; static jmethodID Rf_asRealMethodID; static jmethodID Rf_asCharMethodID; @@ -212,6 +213,7 @@ void init_internals(JNIEnv *env) { R_do_slot_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "R_do_slot", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 0); R_do_slot_assign_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "R_do_slot_assign", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 0); R_MethodsNamespaceMethodID = checkGetMethodID(env, UpCallsRFFIClass, "R_MethodsNamespace", "()Ljava/lang/Object;", 0); + Rf_str2type_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "Rf_str2type", "(Ljava/lang/Object;)I", 0); Rf_asIntegerMethodID = checkGetMethodID(env, UpCallsRFFIClass, "Rf_asInteger", "(Ljava/lang/Object;)I", 0); Rf_asRealMethodID = checkGetMethodID(env, UpCallsRFFIClass, "Rf_asReal", "(Ljava/lang/Object;)D", 0); Rf_asCharMethodID = checkGetMethodID(env, UpCallsRFFIClass, "Rf_asChar", "(Ljava/lang/Object;)Ljava/lang/Object;", 0); @@ -1537,6 +1539,12 @@ SEXP R_do_new_object(SEXP class_def) { return checkRef(thisenv, result); } +SEXPTYPE Rf_str2type(const char *name) { + JNIEnv *thisenv = getEnv(); + jstring jsName = (*thisenv)->NewStringUTF(thisenv, name); + return (*thisenv)->CallObjectMethod(thisenv, UpCallsRFFIObject, Rf_str2type_MethodID, jsName); +} + static SEXP jniGetMethodsNamespace() { JNIEnv *thisenv = getEnv(); return (*thisenv)->CallObjectMethod(thisenv, UpCallsRFFIObject, R_MethodsNamespaceMethodID); diff --git a/com.oracle.truffle.r.native/version.source b/com.oracle.truffle.r.native/version.source index 6f4247a6255c99f420d1df558d68745592862ff7..f64f5d8d85ac0230d36724bd7e6ba351a95b4942 100644 --- a/com.oracle.truffle.r.native/version.source +++ b/com.oracle.truffle.r.native/version.source @@ -1 +1 @@ -26 +27