/* * JyNI Warning: The returned pointer is only valid until the value * in the dict is changed! (Should usually not happen.) */ char * PyModule_GetFilename(PyObject *m) { if (!PyModule_Check(m)) { PyErr_BadArgument(); return NULL; } //stringIntern env(NULL); //puts("bis hier..."); jobject pyStr = (*env)->CallObjectMethod(env, JyNI_JythonPyObject_FromPyObject(m), pyObject__getattr__, (*env)->CallObjectMethod(env, (*env)->NewStringUTF(env, "__file__"), stringIntern)); //puts("und noch etwas weiter"); if (pyStr == NULL) { puts("module filename missing"); //printf("PyExc_SystemError isException? %i\n", PyExceptionClass_Check2(PyExc_SystemError)); //printf("PyExc_SystemError isType? %i\n", PyType_Check(PyExc_SystemError)); //puts("hier nicht"); //todo: fix this later //PyErr_SetString(PyExc_SystemError, "module filename missing"); //puts("und hier0?"); return NULL; } //puts("und hier?"); jstring er = (*env)->CallObjectMethod(env, pyStr, pyStringAsString); global_cstr_from_jstring(cstr, er); //puts("fast fertig..."); JyNI_AddOrSetJyAttributeWithFlags(AS_JY_WITH_GC(m), JyAttributeModuleFile, cstr, JY_ATTR_OWNS_VALUE_FLAG_MASK); return cstr; /* PyObject *d; PyObject *fileobj; if (!PyModule_Check(m)) { PyErr_BadArgument(); return NULL; } d = ((PyModuleObject *)m)->md_dict; if (d == NULL || (fileobj = PyDict_GetItemString(d, "__file__")) == NULL || !PyString_Check(fileobj)) { PyErr_SetString(PyExc_SystemError, "module filename missing"); return NULL; } return PyString_AsString(fileobj); */ }
PyObject* JySync_Init_PyCFunction_From_JyBuiltinCallable(jobject src, PyTypeObject* nonNativeSubtype) { // jputs(__FUNCTION__); env(NULL); if ((*env)->IsInstanceOf(env, src, pyCFunctionClass)) { jputs("JyNI-warning: JySync_Init_PyCFunction_From_JyBuiltinCallable shouldn't be called with PyCFunction."); } PyMethodDef* mdef = malloc(sizeof(PyMethodDef)); jobject info = (*env)->GetObjectField(env, src, pyBuiltinCallable_infoField); jint max = (*env)->CallIntMethod(env, info, pyBuiltinCallableInfo_getMaxargs); mdef->ml_flags = (max ? (METH_KEYWORDS | METH_VARARGS) : METH_NOARGS) | METH_JYTHON; jstring jtmp = (*env)->CallObjectMethod(env, info, pyBuiltinCallableInfo_getName); global_cstr_from_jstring(cName, jtmp); mdef->ml_name = cName; // puts(cName); jtmp = (*env)->CallObjectMethod(env, src, pyBuiltinCallable_getDoc); if (jtmp) { global_cstr_from_jstring2(cDoc, jtmp); mdef->ml_doc = cDoc; } else mdef->ml_doc = NULL; mdef->ml_meth = (PyCFunctionWithKeywords) jyBuiltinCallWithKeywords; jobject jmodule = (*env)->CallObjectMethod(env, src, pyBuiltinCallable_getModule); jobject jself = (*env)->CallObjectMethod(env, src, pyBuiltinCallable_getSelf); // Account for incompatible behavior: // In Jython an unbound method has self = None while in CPython self = NULL PyObject* mself = (*env)->IsSameObject(env, jself, JyNone) ? NULL : JyNI_PyObject_FromJythonPyObject(jself); // putsPy(mself); PyCFunctionObject* res = PyCFunction_NewEx(mdef, mself, JyNI_PyObject_FromJythonPyObject(jmodule)); JyNI_AddOrSetJyAttributeWithFlags(AS_JY(res), JyAttributeMethodName, cName, JY_ATTR_OWNS_VALUE_FLAG_MASK); if (mdef->ml_doc) JyNI_AddOrSetJyAttributeWithFlags(AS_JY(res), JyAttributeMethodDoc, mdef->ml_doc, JY_ATTR_OWNS_VALUE_FLAG_MASK); JyNI_AddOrSetJyAttributeWithFlags(AS_JY(res), JyAttributeMethodDef, mdef, JY_ATTR_OWNS_VALUE_FLAG_MASK); return (PyObject*) res; }
/* * JyNI Warning: The returned pointer is only valid until the value * in the dict is changed! (Should usually not happen.) */ char * PyModule_GetName(PyObject *m) { //todo: Maybe attempt to read result from JyAttributeModuleName. if (!PyModule_Check(m)) { PyErr_BadArgument(); return NULL; } //stringIntern env(NULL); jobject pyStr = (*env)->CallObjectMethod(env, JyNI_JythonPyObject_FromPyObject(m), pyObject___getattr__, (*env)->CallObjectMethod(env, (*env)->NewStringUTF(env, "__name__"), string_intern)); if (pyStr == NULL) { PyErr_SetString(PyExc_SystemError, "nameless module"); return NULL; } jstring er = (*env)->CallObjectMethod(env, pyStr, pyObject_asString); global_cstr_from_jstring(cstr, er); JyNI_AddOrSetJyAttributeWithFlags(AS_JY_NO_GC(m), JyAttributeModuleName, cstr, JY_ATTR_OWNS_VALUE_FLAG_MASK); return cstr; /* PyObject *d; PyObject *nameobj; if (!PyModule_Check(m)) { PyErr_BadArgument(); return NULL; } d = ((PyModuleObject *)m)->md_dict; if (d == NULL || (nameobj = PyDict_GetItemString(d, "__name__")) == NULL || !PyString_Check(nameobj)) { PyErr_SetString(PyExc_SystemError, "nameless module"); return NULL; } return PyString_AsString(nameobj);*/ }
PyObject* JySync_Init_PyMethodDescr_From_JyMethodDescr(jobject src, PyTypeObject* nonNativeSubtype) { // jputs(__FUNCTION__); env(NULL); jint max = (*env)->CallIntMethod(env, src, pyBuiltinCallableInfo_getMaxargs); //mdef->ml_flags = (max ? (METH_KEYWORDS | METH_VARARGS) : METH_NOARGS) | METH_JYTHON; jstring jtmp = (*env)->CallObjectMethod(env, src, pyBuiltinCallableInfo_getName); global_cstr_from_jstring(cName, jtmp); //mdef->ml_name = cName; jobject dtype = (*env)->GetObjectField(env, src, pyDescr_dtypeField); PyMethodDef* mdef = malloc(sizeof(PyMethodDef)); mdef->ml_flags = (max ? (METH_KEYWORDS | METH_VARARGS) : METH_NOARGS) | METH_JYTHON | METH_JYTHON_CDEF; mdef->ml_name = cName; jtmp = (*env)->CallObjectMethod(env, src, pyMethodDescr_getDoc); if (jtmp) { global_cstr_from_jstring2(cDoc, jtmp); mdef->ml_doc = cDoc; } else mdef->ml_doc = NULL; mdef->ml_meth = (PyCFunctionWithKeywords) jyBuiltinCallWithKeywords; PyObject* result = PyDescr_NewMethod(JyNI_PyObject_FromJythonPyObject(dtype), mdef); JyNI_AddOrSetJyAttributeWithFlags(AS_JY_WITH_GC(result), JyAttributeMethodName, cName, JY_ATTR_OWNS_VALUE_FLAG_MASK); if (mdef->ml_doc) JyNI_AddOrSetJyAttributeWithFlags(AS_JY_WITH_GC(result), JyAttributeMethodDoc, mdef->ml_doc, JY_ATTR_OWNS_VALUE_FLAG_MASK); JyNI_AddOrSetJyAttributeWithFlags(AS_JY_WITH_GC(result), JyAttributeMethodDef, mdef, JY_ATTR_OWNS_VALUE_FLAG_MASK); return result; }