PyObject * _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp) { PyObject *m, *d, *s; char *lastdot, *shortname, *packagecontext; dl_funcptr p; if ((m = _PyImport_FindExtension(name, pathname)) != NULL) { Py_INCREF(m); return m; } lastdot = strrchr(name, '.'); if (lastdot == NULL) { packagecontext = NULL; shortname = name; } else { packagecontext = name; shortname = lastdot+1; } p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp); if (PyErr_Occurred()) return NULL; if (p == NULL) { PyErr_Format(PyExc_ImportError, "dynamic module does not define init function (init%.200s)", shortname); return NULL; } _Py_PackageContext = packagecontext; (*p)(); _Py_PackageContext = NULL; if (PyErr_Occurred()) return NULL; if (_PyImport_FixupExtension(name, pathname) == NULL) return NULL; m = PyDict_GetItemString(PyImport_GetModuleDict(), name); if (m == NULL) { PyErr_SetString(PyExc_SystemError, "dynamic module not initialized properly"); return NULL; } /* Remember the filename as the __file__ attribute */ d = PyModule_GetDict(m); s = PyString_FromString(pathname); if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0) PyErr_Clear(); /* Not important enough to report */ Py_XDECREF(s); if (Py_VerboseFlag) PySys_WriteStderr( "import %s # dynamically loaded from %s\n", name, pathname); Py_INCREF(m); return m; }
PyObject * _PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp) { PyObject *m; PyObject *pathbytes; char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext; dl_funcptr p0; PyObject* (*p)(void); struct PyModuleDef *def; namestr = _PyUnicode_AsString(name); if (namestr == NULL) return NULL; m = _PyImport_FindExtensionObject(name, path); if (m != NULL) { Py_INCREF(m); return m; } lastdot = strrchr(namestr, '.'); if (lastdot == NULL) { packagecontext = NULL; shortname = namestr; } else { packagecontext = namestr; shortname = lastdot+1; } pathbytes = PyUnicode_EncodeFSDefault(path); if (pathbytes == NULL) return NULL; p0 = _PyImport_GetDynLoadFunc(shortname, PyBytes_AS_STRING(pathbytes), fp); Py_DECREF(pathbytes); p = (PyObject*(*)(void))p0; if (PyErr_Occurred()) return NULL; if (p == NULL) { PyErr_Format(PyExc_ImportError, "dynamic module does not define init function" " (PyInit_%s)", shortname); return NULL; } oldcontext = _Py_PackageContext; _Py_PackageContext = packagecontext; m = (*p)(); _Py_PackageContext = oldcontext; if (m == NULL) return NULL; if (PyErr_Occurred()) { Py_DECREF(m); PyErr_Format(PyExc_SystemError, "initialization of %s raised unreported exception", shortname); return NULL; } /* Remember pointer to module init function. */ def = PyModule_GetDef(m); def->m_base.m_init = p; /* Remember the filename as the __file__ attribute */ if (PyModule_AddObject(m, "__file__", path) < 0) PyErr_Clear(); /* Not important enough to report */ else Py_INCREF(path); if (_PyImport_FixupExtensionObject(m, name, path) < 0) return NULL; if (Py_VerboseFlag) PySys_FormatStderr( "import %U # dynamically loaded from %R\n", name, path); return m; }
jobject _PyImport_LoadDynamicModuleJy(char *name, char *pathname, FILE *fp) { //PyObject *m; jobject m; char *lastdot, *shortname, *packagecontext, *oldcontext; dl_funcptr p; //The following case is covered on java-side now: /*if ((m = _PyImport_FindExtension(name, pathname)) != NULL) { Py_INCREF(m); return m; }*/ lastdot = strrchr(name, '.'); if (lastdot == NULL) { packagecontext = NULL; shortname = name; } else { packagecontext = name; shortname = lastdot+1; } //PyErr_Clear(); //added temporarily by JyNI to focus on further development until the exception thing is solved. p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp); //jputs("got dyn load func"); if (PyErr_Occurred()) { jputs("PyErrOccured00"); return NULL; } //jputs("error check done"); if (p == NULL) { //jputs("no init function"); //JyNI_JyErr_Format((*env)->GetStaticObjectField(env, pyPyClass, pyPyImportError), PyErr_Format(PyExc_ImportError, "dynamic module does not define init function (init%.200s)", shortname); return NULL; } //jputs("dyn load func is not NULL"); oldcontext = _Py_PackageContext; _Py_PackageContext = packagecontext; //jputs("run dyn load func..."); (*p)(); //jputs("run dyn load func done"); _Py_PackageContext = oldcontext; if (PyErr_Occurred()) { //puts("return NULL because PyErr_Occurred"); return NULL; } //m = PyDict_GetItemString(PyImport_GetModuleDict(), name); //jputs("retrieving module..."); //jputs(name); //the following somehow goes wrong, probaby because we didn't call String.intern... /*jobject mName = (*env)->CallStaticObjectMethod(env, pyPyClass, pyPyNewString, (*env)->NewStringUTF(env, name)); m = (*env)->CallObjectMethod(env, (*env)->CallStaticObjectMethod(env, JyNIClass, JyNIPyImport_GetModuleDict), pyDictGet_PyObject, mName );*/ env(NULL); m = (*env)->CallStaticObjectMethod(env, JyNIClass, JyNIJyNI_GetModule, (*env)->NewStringUTF(env, name)); //puts("retrieved module"); if (m == NULL) { //puts("m = NULL"); PyErr_SetString(PyExc_SystemError, "dynamic module not initialized properly"); return NULL; } //puts("name:"); //puts(PyModule_GetName(JyNI_PyObject_FromJythonPyObject(m))); // Remember the filename as the __file__ attribute //if (PyModule_AddStringConstant(m, "__file__", pathname) < 0) //puts("adding filename..."); if (PyModule_AddStringConstantJy(m, "__file__", pathname) < 0) PyErr_Clear(); // Not important enough to report //puts("filename added:"); //puts(PyModule_GetFilename(JyNI_PyObject_FromJythonPyObject(m))); //provide FixupExtension later... //if (_PyImport_FixupExtension(name, pathname) == NULL) // return NULL; //if (Py_VerboseFlag) if ((*env)->CallStaticIntMethod(env, JyNIClass, JyNIGetDLVerbose)) PySys_WriteStderr( "import %s # dynamically loaded from %s\n", name, pathname); //Py_INCREF(m); //jputs("module loaded:"); //jputs(name); //jputsLong(m); return m; }