PyObject* pyjobject_new_class(JNIEnv *env, jclass clazz) { PyJObject *pyjob; PyJClassObject *pyjclass; // same object as pyjob, just casted if (!clazz) { PyErr_Format(PyExc_RuntimeError, "Invalid class object."); return NULL; } if (!PyJClass_Type.tp_base) { PyJClass_Type.tp_base = &PyJObject_Type; } if (PyType_Ready(&PyJClass_Type) < 0) { return NULL; } pyjclass = PyObject_NEW(PyJClassObject, &PyJClass_Type); pyjob = (PyJObject*) pyjclass; pyjob->object = NULL; pyjob->clazz = (*env)->NewGlobalRef(env, clazz); pyjob->attr = PyList_New(0); pyjob->methods = PyList_New(0); pyjob->fields = PyList_New(0); pyjob->finishAttr = 0; if (pyjclass_init(env, (PyObject *) pyjob)) { if (pyjobject_init(env, pyjob)) { return (PyObject *) pyjob; } } return NULL; }
PyObject* pyjobject_new_class(JNIEnv *env, jclass clazz) { PyJobject_Object *pyjob; if(!clazz) { PyErr_Format(PyExc_RuntimeError, "Invalid class object."); return NULL; } pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type); pyjob->object = NULL; pyjob->clazz = (*env)->NewGlobalRef(env, clazz); pyjob->attr = PyList_New(0); pyjob->methods = PyList_New(0); pyjob->fields = PyList_New(0); pyjob->finishAttr = 0; pyjob->pyjclass = pyjclass_new(env, (PyObject *) pyjob); if(pyjobject_init(env, pyjob)) return (PyObject *) pyjob; return NULL; }
// called internally to make new PyJobject_Object instances PyObject* pyjobject_new(JNIEnv *env, jobject obj) { PyJobject_Object *pyjob; if(PyType_Ready(&PyJobject_Type) < 0) return NULL; if(!obj) { PyErr_Format(PyExc_RuntimeError, "Invalid object."); return NULL; } pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type); pyjob->object = (*env)->NewGlobalRef(env, obj); pyjob->clazz = (*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, obj)); pyjob->pyjclass = NULL; pyjob->attr = PyList_New(0); pyjob->methods = PyList_New(0); pyjob->fields = PyList_New(0); pyjob->finishAttr = 0; if(pyjobject_init(env, pyjob)) return (PyObject *) pyjob; return NULL; }
// called internally to make new PyJObject instances PyObject* pyjobject_new(JNIEnv *env, jobject obj) { PyJObject *pyjob; jclass objClz; int jtype; if (!subtypes_initialized) { pyjobject_init_subtypes(); } if (!obj) { PyErr_Format(PyExc_RuntimeError, "Invalid object."); return NULL; } objClz = (*env)->GetObjectClass(env, obj); /* * There exist situations where a Java method signature has a return * 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. */ jtype = get_jtype(env, objClz); if (jtype == JARRAY_ID) { return pyjarray_new(env, obj); } else if (jtype == JCLASS_ID) { return pyjobject_new_class(env, obj); } else { #if JEP_NUMPY_ENABLED /* * 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 // check for some of our extensions to pyjobject if ((*env)->IsInstanceOf(env, obj, JITERABLE_TYPE)) { if ((*env)->IsInstanceOf(env, obj, JCOLLECTION_TYPE)) { if ((*env)->IsInstanceOf(env, obj, JLIST_TYPE)) { pyjob = (PyJObject*) pyjlist_new(); } else { // a Collection we have less support for pyjob = (PyJObject*) pyjcollection_new(); } } else { // an Iterable we have less support for pyjob = (PyJObject*) pyjiterable_new(); } } else if ((*env)->IsInstanceOf(env, obj, JMAP_TYPE)) { pyjob = (PyJObject*) pyjmap_new(); } else if ((*env)->IsInstanceOf(env, obj, JITERATOR_TYPE)) { pyjob = (PyJObject*) pyjiterator_new(); } else if ((*env)->IsInstanceOf(env, obj, JNUMBER_TYPE)) { pyjob = (PyJObject*) pyjnumber_new(); } else { pyjob = PyObject_NEW(PyJObject, &PyJObject_Type); } } pyjob->object = (*env)->NewGlobalRef(env, obj); pyjob->clazz = (*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, obj)); pyjob->attr = PyList_New(0); pyjob->methods = PyList_New(0); pyjob->fields = PyList_New(0); pyjob->finishAttr = 0; if (pyjobject_init(env, pyjob)) { return (PyObject *) pyjob; } return NULL; }