Omaha #4259 speed up get_jtype, ensure correct jep types are chosen
Change-Id: I11a7c072f8b460d2728cf2a4a018932159c0e1b0 Former-commit-id: c13284d74b6c561cd305cf714722e4904b4ab0bf
This commit is contained in:
parent
b546751b9d
commit
15b501ce07
3 changed files with 82 additions and 73 deletions
|
@ -551,18 +551,7 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self,
|
||||||
|
|
||||||
Py_BLOCK_THREADS;
|
Py_BLOCK_THREADS;
|
||||||
if(!process_java_exception(env) && obj != NULL) {
|
if(!process_java_exception(env) && obj != NULL) {
|
||||||
jclass retClazz;
|
result = pyjobject_new(env, obj);
|
||||||
int type_id = -1;
|
|
||||||
|
|
||||||
retClazz = (*env)->GetObjectClass(env, obj);
|
|
||||||
type_id = get_jtype(env, retClazz);
|
|
||||||
if(type_id == -1) {
|
|
||||||
process_java_exception(env);
|
|
||||||
} else if(type_id == JARRAY_ID){
|
|
||||||
result = pyjarray_new(env, obj);
|
|
||||||
} else {
|
|
||||||
result = pyjobject_new(env, obj);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -60,6 +60,7 @@
|
||||||
#include "pyjfield.h"
|
#include "pyjfield.h"
|
||||||
#include "pyjclass.h"
|
#include "pyjclass.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "pyjarray.h"
|
||||||
#include "pyjmethodwrapper.h"
|
#include "pyjmethodwrapper.h"
|
||||||
#include "pyjlist.h"
|
#include "pyjlist.h"
|
||||||
|
|
||||||
|
@ -78,6 +79,8 @@ static PyObject *classnamePyJMethodsDict = NULL;
|
||||||
// called internally to make new PyJobject_Object instances
|
// called internally to make new PyJobject_Object instances
|
||||||
PyObject* pyjobject_new(JNIEnv *env, jobject obj) {
|
PyObject* pyjobject_new(JNIEnv *env, jobject obj) {
|
||||||
PyJobject_Object *pyjob;
|
PyJobject_Object *pyjob;
|
||||||
|
jclass objClz;
|
||||||
|
int jtype;
|
||||||
|
|
||||||
if(PyType_Ready(&PyJobject_Type) < 0)
|
if(PyType_Ready(&PyJobject_Type) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -86,25 +89,42 @@ PyObject* pyjobject_new(JNIEnv *env, jobject obj) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_NUMPY
|
objClz = (*env)->GetObjectClass(env, obj);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check for jep/NDArray and autoconvert to numpy.ndarray instead of
|
* There exist situations where a Java method signature has a return
|
||||||
* pyjobject
|
* type of Object but actually returns a Class or array. Also if you
|
||||||
|
* call Jep.set(String, Object[]) it should be treated as an array, not
|
||||||
|
* an object. Hence this check here to build the optimal jep type in
|
||||||
|
* the interpreter regardless of signature.
|
||||||
*/
|
*/
|
||||||
if(jndarray_check(env, obj)) {
|
jtype = get_jtype(env, objClz);
|
||||||
return convert_jndarray_pyndarray(env, obj);
|
if(jtype == JARRAY_ID) {
|
||||||
}
|
return pyjarray_new(env, obj);
|
||||||
if(PyErr_Occurred()) {
|
} else if(jtype == JCLASS_ID) {
|
||||||
return NULL;
|
return pyjobject_new_class(env, obj);
|
||||||
}
|
} else {
|
||||||
|
#if USE_NUMPY
|
||||||
|
/*
|
||||||
|
* check for jep/NDArray and autoconvert to numpy.ndarray instead of
|
||||||
|
* pyjobject
|
||||||
|
*/
|
||||||
|
if(jndarray_check(env, obj)) {
|
||||||
|
return convert_jndarray_pyndarray(env, obj);
|
||||||
|
}
|
||||||
|
if(PyErr_Occurred()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if((*env)->IsInstanceOf(env, obj, JLIST_TYPE)) {
|
if((*env)->IsInstanceOf(env, obj, JLIST_TYPE)) {
|
||||||
pyjob = (PyJobject_Object*) pyjlist_new();
|
pyjob = (PyJobject_Object*) pyjlist_new();
|
||||||
} else {
|
} else {
|
||||||
pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type);
|
pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pyjob->object = (*env)->NewGlobalRef(env, obj);
|
pyjob->object = (*env)->NewGlobalRef(env, obj);
|
||||||
pyjob->clazz = (*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, obj));
|
pyjob->clazz = (*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, obj));
|
||||||
pyjob->pyjclass = NULL;
|
pyjob->pyjclass = NULL;
|
||||||
|
|
|
@ -108,7 +108,6 @@ jclass JEP_NDARRAY_TYPE = NULL;
|
||||||
|
|
||||||
// cached methodids
|
// cached methodids
|
||||||
jmethodID objectToString = 0;
|
jmethodID objectToString = 0;
|
||||||
jmethodID objectEquals = 0;
|
|
||||||
jmethodID objectIsArray = 0;
|
jmethodID objectIsArray = 0;
|
||||||
|
|
||||||
// for convert_jobject
|
// for convert_jobject
|
||||||
|
@ -1255,16 +1254,6 @@ int get_jtype(JNIEnv *env, jclass clazz) {
|
||||||
jboolean equals = JNI_FALSE;
|
jboolean equals = JNI_FALSE;
|
||||||
jboolean array = JNI_FALSE;
|
jboolean array = JNI_FALSE;
|
||||||
|
|
||||||
// have to find the equals() method.
|
|
||||||
if(objectEquals == 0) {
|
|
||||||
objectEquals = (*env)->GetMethodID(env,
|
|
||||||
JCLASS_TYPE,
|
|
||||||
"equals",
|
|
||||||
"(Ljava/lang/Object;)Z");
|
|
||||||
if((*env)->ExceptionCheck(env) || !objectEquals)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// have to find Class.isArray() method
|
// have to find Class.isArray() method
|
||||||
if(objectIsArray == 0) {
|
if(objectIsArray == 0) {
|
||||||
objectIsArray = (*env)->GetMethodID(env,
|
objectIsArray = (*env)->GetMethodID(env,
|
||||||
|
@ -1275,91 +1264,102 @@ int get_jtype(JNIEnv *env, jclass clazz) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// object checks
|
||||||
|
if((*env)->IsAssignableFrom(env, clazz, JOBJECT_TYPE)) {
|
||||||
|
// check for string
|
||||||
|
equals = (*env)->IsSameObject(env, clazz, JSTRING_TYPE);
|
||||||
|
if((*env)->ExceptionCheck(env))
|
||||||
|
return -1;
|
||||||
|
if(equals)
|
||||||
|
return JSTRING_ID;
|
||||||
|
|
||||||
|
|
||||||
|
// check if it's an array first
|
||||||
|
array = (*env)->CallBooleanMethod(env, clazz, objectIsArray);
|
||||||
|
if((*env)->ExceptionCheck(env))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if(array)
|
||||||
|
return JARRAY_ID;
|
||||||
|
|
||||||
|
// check for class
|
||||||
|
if((*env)->IsAssignableFrom(env, clazz, JCLASS_TYPE))
|
||||||
|
return JCLASS_ID;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: contemplate adding List and jep.NDArray check in here
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ok it's not a string, array, or class, so let's call it object
|
||||||
|
return JOBJECT_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check primitive types
|
||||||
|
*/
|
||||||
|
|
||||||
// int
|
// int
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JINT_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JINT_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JINT_ID;
|
return JINT_ID;
|
||||||
|
|
||||||
// short
|
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JSHORT_TYPE);
|
|
||||||
if((*env)->ExceptionCheck(env))
|
|
||||||
return -1;
|
|
||||||
if(equals)
|
|
||||||
return JSHORT_ID;
|
|
||||||
|
|
||||||
// double
|
// double
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JDOUBLE_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JDOUBLE_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JDOUBLE_ID;
|
return JDOUBLE_ID;
|
||||||
|
|
||||||
// float
|
// float
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JFLOAT_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JFLOAT_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JFLOAT_ID;
|
return JFLOAT_ID;
|
||||||
|
|
||||||
// boolean
|
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JBOOLEAN_TYPE);
|
|
||||||
if((*env)->ExceptionCheck(env))
|
|
||||||
return -1;
|
|
||||||
if(equals)
|
|
||||||
return JBOOLEAN_ID;
|
|
||||||
|
|
||||||
// long
|
// long
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JLONG_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JLONG_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JLONG_ID;
|
return JLONG_ID;
|
||||||
|
|
||||||
// string
|
// boolean
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JSTRING_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JBOOLEAN_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JSTRING_ID;
|
return JBOOLEAN_ID;
|
||||||
|
|
||||||
// void
|
// void
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JVOID_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JVOID_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JVOID_ID;
|
return JVOID_ID;
|
||||||
|
|
||||||
// char
|
// char
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JCHAR_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JCHAR_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JCHAR_ID;
|
return JCHAR_ID;
|
||||||
|
|
||||||
// byte
|
// byte
|
||||||
equals = (*env)->CallBooleanMethod(env, clazz, objectEquals, JBYTE_TYPE);
|
equals = (*env)->IsSameObject(env, clazz, JBYTE_TYPE);
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
if(equals)
|
if(equals)
|
||||||
return JBYTE_ID;
|
return JBYTE_ID;
|
||||||
|
|
||||||
// object checks
|
// short
|
||||||
|
equals = (*env)->IsSameObject(env, clazz, JSHORT_TYPE);
|
||||||
// check if it's an array first
|
|
||||||
array = (*env)->CallBooleanMethod(env, clazz, objectIsArray);
|
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
return -1;
|
return -1;
|
||||||
|
if(equals)
|
||||||
if(array)
|
return JSHORT_ID;
|
||||||
return JARRAY_ID;
|
|
||||||
|
|
||||||
if((*env)->IsAssignableFrom(env, clazz, JCLASS_TYPE))
|
|
||||||
return JCLASS_ID;
|
|
||||||
|
|
||||||
if((*env)->IsAssignableFrom(env, clazz, JOBJECT_TYPE))
|
|
||||||
return JOBJECT_ID;
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue