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:
parent
fccb68ef2a
commit
e32bf6ead2
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue