コード例 #1
0
ファイル: pyjobject.c プロジェクト: codeApeFromChina/jep
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;
}
コード例 #2
0
ファイル: pyjobject.c プロジェクト: Kroisse/jep
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;
}
コード例 #3
0
ファイル: pyjobject.c プロジェクト: Kroisse/jep
// 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;
}
コード例 #4
0
ファイル: pyjobject.c プロジェクト: codeApeFromChina/jep
// 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;
}