Skip to content
Snippets Groups Projects
Commit 6e813bd0 authored by Mick Jordan's avatar Mick Jordan
Browse files

rffi: fixes for findVar and friends (argument ordering)

parent 560de3c4
No related branches found
No related tags found
No related merge requests found
......@@ -40,6 +40,7 @@ static jmethodID Rf_findfunMethodID;
static jmethodID Rf_defineVarMethodID;
static jmethodID Rf_findVarMethodID;
static jmethodID Rf_findVarInFrameMethodID;
static jmethodID Rf_findVarInFrame3MethodID;
static jmethodID Rf_getAttribMethodID;
static jmethodID Rf_setAttribMethodID;
static jmethodID Rf_isStringMethodID;
......@@ -128,6 +129,7 @@ void init_internals(JNIEnv *env) {
Rf_defineVarMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_defineVar", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V", 1);
Rf_findVarMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_findVar", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 1);
Rf_findVarInFrameMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_findVarInFrame", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 1);
Rf_findVarInFrame3MethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_findVarInFrame3", "(Ljava/lang/Object;Ljava/lang/Object;I)Ljava/lang/Object;", 1);
Rf_getAttribMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_getAttrib", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 1);
Rf_setAttribMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_setAttrib", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V", 1);
Rf_isStringMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_isString", "(Ljava/lang/Object;)I", 1);
......@@ -322,20 +324,22 @@ SEXP Rf_findFun(SEXP symbol, SEXP rho) {
return checkRef(thisenv, result);
}
SEXP Rf_findVar(SEXP symbol, SEXP rho) {
SEXP Rf_findVar(SEXP sym, SEXP rho) {
JNIEnv *thisenv = getEnv();
SEXP result =(*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_findVarMethodID, symbol, rho);
SEXP result =(*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_findVarMethodID, sym, rho);
return checkRef(thisenv, result);
}
SEXP Rf_findVarInFrame(SEXP symbol, SEXP rho) {
SEXP Rf_findVarInFrame(SEXP rho, SEXP sym) {
JNIEnv *thisenv = getEnv();
SEXP result =(*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_findVarInFrameMethodID, symbol, rho);
SEXP result =(*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_findVarInFrameMethodID, rho, sym);
return checkRef(thisenv, result);
}
SEXP Rf_findVarInFrame3(SEXP symbol, SEXP rho, Rboolean b) {
return unimplemented("Rf_findVarInFrame3");
SEXP Rf_findVarInFrame3(SEXP rho, SEXP sym, Rboolean b) {
JNIEnv *thisenv = getEnv();
SEXP result = (*thisenv)->CallStaticObjectMethod(thisenv, CallRFFIHelperClass, Rf_findVarInFrame3MethodID, rho, sym, b);
return checkRef(thisenv, result);
}
SEXP Rf_getAttrib(SEXP vec, SEXP name) {
......
......@@ -245,16 +245,24 @@ public class CallRFFIHelper {
}
public static Object Rf_findVar(Object symbolArg, Object envArg) {
// WARNING: argument order reversed from Rf_findVarInFrame!
RFFIUtils.traceUpCall("Rf_findVar", symbolArg, envArg);
return findVarInFrameHelper(symbolArg, envArg, true);
return findVarInFrameHelper(envArg, symbolArg, true);
}
public static Object Rf_findVarInFrame(Object symbolArg, Object envArg) {
RFFIUtils.traceUpCall("Rf_findVarInFrame", symbolArg, envArg);
return findVarInFrameHelper(symbolArg, envArg, false);
public static Object Rf_findVarInFrame(Object envArg, Object symbolArg) {
RFFIUtils.traceUpCall("Rf_findVarInFrame", envArg, symbolArg);
return findVarInFrameHelper(envArg, symbolArg, false);
}
private static Object findVarInFrameHelper(Object symbolArg, Object envArg, boolean inherits) {
public static Object Rf_findVarInFrame3(Object envArg, Object symbolArg, @SuppressWarnings("unused") int doGet) {
// GNU R has code for IS_USER_DATBASE that uses doGet
// This is a lookup in the single environment (envArg) only, i.e. inherits=false
RFFIUtils.traceUpCall("Rf_findVarInFrame3", envArg, symbolArg);
return findVarInFrameHelper(envArg, symbolArg, false);
}
private static Object findVarInFrameHelper(Object envArg, Object symbolArg, boolean inherits) {
if (envArg == RNull.instance) {
throw RError.error(RError.SHOW_CALLER2, RError.Message.USE_NULL_ENV_DEFUNCT);
}
......@@ -269,6 +277,7 @@ public class CallRFFIHelper {
return value;
}
if (!inherits) {
// simgle frame lookup
break;
}
env = env.getParent();
......@@ -854,8 +863,10 @@ public class CallRFFIHelper {
public static Object ENCLOS(Object x) {
RFFIUtils.traceUpCall("ENCLOS", x);
REnvironment env = guaranteeInstanceOf(x, REnvironment.class);
REnvironment result = env.getParent();
assert result != null;
Object result = env.getParent();
if (result == null) {
result = RNull.instance;
}
return result;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment