From: Guido van Rossum Date: Wed, 11 Feb 1998 05:53:02 +0000 (+0000) Subject: Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to X-Git-Tag: v1.5.1~822 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e32bf6ead2ae610f5b318c4fbd1c926241fbc3b1;p=python Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to pass it the true file. This is used to set __file__ properly, instead of believing what the code object carries with it. (If the pointer is NULL, the code object's co_filename is still used.) --- diff --git a/Python/import.c b/Python/import.c index 9dbbd255b6..a8076894d9 100644 --- a/Python/import.c +++ b/Python/import.c @@ -424,6 +424,15 @@ PyObject * PyImport_ExecCodeModule(name, co) char *name; PyObject *co; +{ + return PyImport_ExecCodeModuleEx(name, co, (char *)NULL); +} + +PyObject * +PyImport_ExecCodeModuleEx(name, co, pathname) + char *name; + PyObject *co; + char *pathname; { PyObject *modules = PyImport_GetModuleDict(); PyObject *m, *d, *v; @@ -438,9 +447,20 @@ PyImport_ExecCodeModule(name, co) return NULL; } /* Remember the filename as the __file__ attribute */ - if (PyDict_SetItemString(d, "__file__", - ((PyCodeObject *)co)->co_filename) != 0) + v = NULL; + if (pathname != NULL) { + v = PyString_FromString(pathname); + if (v == NULL) + PyErr_Clear(); + } + if (v == NULL) { + v = ((PyCodeObject *)co)->co_filename; + Py_INCREF(v); + } + if (PyDict_SetItemString(d, "__file__", v) != 0) PyErr_Clear(); /* Not important enough to report */ + Py_DECREF(v); + v = PyEval_EvalCode((PyCodeObject *)co, d, d); if (v == NULL) return NULL; @@ -570,7 +590,7 @@ load_compiled_module(name, cpathname, fp) if (Py_VerboseFlag) fprintf(stderr, "import %s # precompiled from %s\n", name, cpathname); - m = PyImport_ExecCodeModule(name, (PyObject *)co); + m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname); Py_DECREF(co); return m; @@ -679,7 +699,7 @@ load_source_module(name, pathname, fp) name, pathname); write_compiled_module(co, cpathname, mtime); } - m = PyImport_ExecCodeModule(name, (PyObject *)co); + m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname); Py_DECREF(co); return m; @@ -1132,7 +1152,7 @@ PyImport_ImportFrozenModule(name) name); return -1; } - m = PyImport_ExecCodeModule(name, co); + m = PyImport_ExecCodeModuleEx(name, co, ""); Py_DECREF(co); if (m == NULL) return -1;