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.)
This commit is contained in:
Guido van Rossum 1998-02-11 05:53:02 +00:00
parent fccb68ef2a
commit e32bf6ead2
1 changed files with 25 additions and 5 deletions

View File

@ -424,6 +424,15 @@ PyObject *
PyImport_ExecCodeModule(name, co) PyImport_ExecCodeModule(name, co)
char *name; char *name;
PyObject *co; 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 *modules = PyImport_GetModuleDict();
PyObject *m, *d, *v; PyObject *m, *d, *v;
@ -438,9 +447,20 @@ PyImport_ExecCodeModule(name, co)
return NULL; return NULL;
} }
/* Remember the filename as the __file__ attribute */ /* Remember the filename as the __file__ attribute */
if (PyDict_SetItemString(d, "__file__", v = NULL;
((PyCodeObject *)co)->co_filename) != 0) 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 */ PyErr_Clear(); /* Not important enough to report */
Py_DECREF(v);
v = PyEval_EvalCode((PyCodeObject *)co, d, d); v = PyEval_EvalCode((PyCodeObject *)co, d, d);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
@ -570,7 +590,7 @@ load_compiled_module(name, cpathname, fp)
if (Py_VerboseFlag) if (Py_VerboseFlag)
fprintf(stderr, "import %s # precompiled from %s\n", fprintf(stderr, "import %s # precompiled from %s\n",
name, cpathname); name, cpathname);
m = PyImport_ExecCodeModule(name, (PyObject *)co); m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Py_DECREF(co); Py_DECREF(co);
return m; return m;
@ -679,7 +699,7 @@ load_source_module(name, pathname, fp)
name, pathname); name, pathname);
write_compiled_module(co, cpathname, mtime); write_compiled_module(co, cpathname, mtime);
} }
m = PyImport_ExecCodeModule(name, (PyObject *)co); m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Py_DECREF(co); Py_DECREF(co);
return m; return m;
@ -1132,7 +1152,7 @@ PyImport_ImportFrozenModule(name)
name); name);
return -1; return -1;
} }
m = PyImport_ExecCodeModule(name, co); m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Py_DECREF(co); Py_DECREF(co);
if (m == NULL) if (m == NULL)
return -1; return -1;