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 4a7fdffdd3cd064131e9ed347aecae97bd9c66df..af705d11e94160a54ca31a0d02fece4069410853 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c @@ -54,6 +54,7 @@ static jmethodID Rf_warningcallMethodID; static jmethodID Rf_warningMethodID; static jmethodID Rf_errorMethodID; static jmethodID Rf_NewHashedEnvMethodID; +static jmethodID Rf_classgetsMethodID; static jmethodID Rf_rPsortMethodID; static jmethodID Rf_iPsortMethodID; static jmethodID RprintfMethodID; @@ -154,6 +155,7 @@ void init_internals(JNIEnv *env) { Rf_duplicateMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_duplicate", "(Ljava/lang/Object;I)Ljava/lang/Object;", 1); Rf_anyDuplicatedMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_anyDuplicated", "(Ljava/lang/Object;I)I", 1); Rf_NewHashedEnvMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_createNewEnv", "(Lcom/oracle/truffle/r/runtime/env/REnvironment;Ljava/lang/String;ZI)Lcom/oracle/truffle/r/runtime/env/REnvironment;", 1); + Rf_classgetsMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_classgets", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 1); RprintfMethodID = checkGetMethodID(env, CallRFFIHelperClass, "printf", "(Ljava/lang/String;)V", 1); R_do_MAKE_CLASS_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "R_do_MAKE_CLASS", "(Ljava/lang/String;)Ljava/lang/Object;", 1); R_FindNamespaceMethodID = checkGetMethodID(env, CallRFFIHelperClass, "R_FindNamespace", "(Ljava/lang/Object;)Ljava/lang/Object;", 1); @@ -675,9 +677,10 @@ SEXP R_NewHashedEnv(SEXP parent, SEXP size) { return checkRef(thisenv, result); } -SEXP Rf_classgets(SEXP x, SEXP y) { - unimplemented("Rf_classgets"); - return NULL; +SEXP Rf_classgets(SEXP vec, SEXP klass) { + JNIEnv *thisenv = getEnv(); + SEXP result = (*thisenv)->CallStaticObjectMethod(thisenv, RDataFactoryClass, Rf_classgetsMethodID, vec, klass); + return checkRef(thisenv, result); } const char *Rf_translateChar(SEXP x) { 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 62dceba674c6d9765c1c085b05acb6b7e01bda16..17b709e42409978a85f50726d3b066533256a8bf 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 @@ -1377,4 +1377,10 @@ public class CallRFFIHelper { return x == y ? 1 : 0; } + public static Object Rf_classgets(Object x, Object y) { + RAbstractVector vector = guaranteeInstanceOf(x, RAbstractVector.class); + vector.setClassAttr(guaranteeInstanceOf(y, RStringVector.class)); + return RNull.instance; + } + }