_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
* Rename _PyImport_FindExtension() to _PyImport_FindExtensionUnicode(): the filename becomes a Unicode object instead of byte string * Rename _PyImport_FixupExtension() to _PyImport_FixupExtensionUnicode(): the filename becomes a Unicode object instead of byte string
This commit is contained in:
parent
3e85dfd15e
commit
49d3f2514b
|
@ -40,8 +40,10 @@ PyAPI_FUNC(int) _PyImport_ReleaseLock(void);
|
||||||
|
|
||||||
PyAPI_FUNC(void) _PyImport_ReInitLock(void);
|
PyAPI_FUNC(void) _PyImport_ReInitLock(void);
|
||||||
|
|
||||||
PyAPI_FUNC(PyObject *)_PyImport_FindExtension(char *, char *);
|
PyAPI_FUNC(PyObject *)_PyImport_FindBuiltin(char *);
|
||||||
PyAPI_FUNC(int)_PyImport_FixupExtension(PyObject*, char *, char *);
|
PyAPI_FUNC(PyObject *)_PyImport_FindExtensionUnicode(char *, PyObject *);
|
||||||
|
PyAPI_FUNC(int)_PyImport_FixupBuiltin(PyObject*, char *);
|
||||||
|
PyAPI_FUNC(int)_PyImport_FixupExtensionUnicode(PyObject*, char *, PyObject *);
|
||||||
|
|
||||||
struct _inittab {
|
struct _inittab {
|
||||||
char *name;
|
char *name;
|
||||||
|
|
|
@ -951,7 +951,7 @@ PyOS_InitInterrupts(void)
|
||||||
{
|
{
|
||||||
PyObject *m = PyInit_signal();
|
PyObject *m = PyInit_signal();
|
||||||
if (m) {
|
if (m) {
|
||||||
_PyImport_FixupExtension(m, "signal", "signal");
|
_PyImport_FixupBuiltin(m, "signal");
|
||||||
Py_DECREF(m);
|
Py_DECREF(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ typedef unsigned short mode_t;
|
||||||
static long pyc_magic = MAGIC;
|
static long pyc_magic = MAGIC;
|
||||||
static const char *pyc_tag = TAG;
|
static const char *pyc_tag = TAG;
|
||||||
|
|
||||||
/* See _PyImport_FixupExtension() below */
|
/* See _PyImport_FixupExtensionUnicode() below */
|
||||||
static PyObject *extensions = NULL;
|
static PyObject *extensions = NULL;
|
||||||
|
|
||||||
/* This table is defined in config.c: */
|
/* This table is defined in config.c: */
|
||||||
|
@ -561,10 +561,10 @@ PyImport_GetMagicTag(void)
|
||||||
once, we keep a static dictionary 'extensions' keyed by module name
|
once, we keep a static dictionary 'extensions' keyed by module name
|
||||||
(for built-in modules) or by filename (for dynamically loaded
|
(for built-in modules) or by filename (for dynamically loaded
|
||||||
modules), containing these modules. A copy of the module's
|
modules), containing these modules. A copy of the module's
|
||||||
dictionary is stored by calling _PyImport_FixupExtension()
|
dictionary is stored by calling _PyImport_FixupExtensionUnicode()
|
||||||
immediately after the module initialization function succeeds. A
|
immediately after the module initialization function succeeds. A
|
||||||
copy can be retrieved from there by calling
|
copy can be retrieved from there by calling
|
||||||
_PyImport_FindExtension().
|
_PyImport_FindExtensionUnicode().
|
||||||
|
|
||||||
Modules which do support multiple initialization set their m_size
|
Modules which do support multiple initialization set their m_size
|
||||||
field to a non-negative number (indicating the size of the
|
field to a non-negative number (indicating the size of the
|
||||||
|
@ -573,7 +573,7 @@ PyImport_GetMagicTag(void)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
_PyImport_FixupExtension(PyObject *mod, char *name, char *filename)
|
_PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename)
|
||||||
{
|
{
|
||||||
PyObject *modules, *dict;
|
PyObject *modules, *dict;
|
||||||
struct PyModuleDef *def;
|
struct PyModuleDef *def;
|
||||||
|
@ -613,18 +613,31 @@ _PyImport_FixupExtension(PyObject *mod, char *name, char *filename)
|
||||||
if (def->m_base.m_copy == NULL)
|
if (def->m_base.m_copy == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
PyDict_SetItemString(extensions, filename, (PyObject*)def);
|
PyDict_SetItem(extensions, filename, (PyObject*)def);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_PyImport_FixupBuiltin(PyObject *mod, char *name)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
PyObject *filename;
|
||||||
|
filename = PyUnicode_FromString(name);
|
||||||
|
if (filename == NULL)
|
||||||
|
return -1;
|
||||||
|
res = _PyImport_FixupExtensionUnicode(mod, name, filename);
|
||||||
|
Py_DECREF(filename);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
_PyImport_FindExtension(char *name, char *filename)
|
_PyImport_FindExtensionUnicode(char *name, PyObject *filename)
|
||||||
{
|
{
|
||||||
PyObject *mod, *mdict;
|
PyObject *mod, *mdict;
|
||||||
PyModuleDef* def;
|
PyModuleDef* def;
|
||||||
if (extensions == NULL)
|
if (extensions == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
def = (PyModuleDef*)PyDict_GetItemString(extensions, filename);
|
def = (PyModuleDef*)PyDict_GetItem(extensions, filename);
|
||||||
if (def == NULL)
|
if (def == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (def->m_size == -1) {
|
if (def->m_size == -1) {
|
||||||
|
@ -655,12 +668,23 @@ _PyImport_FindExtension(char *name, char *filename)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (Py_VerboseFlag)
|
if (Py_VerboseFlag)
|
||||||
PySys_WriteStderr("import %s # previously loaded (%s)\n",
|
PySys_FormatStderr("import %s # previously loaded (%U)\n",
|
||||||
name, filename);
|
name, filename);
|
||||||
return mod;
|
return mod;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
_PyImport_FindBuiltin(char *name)
|
||||||
|
{
|
||||||
|
PyObject *res, *filename;
|
||||||
|
filename = PyUnicode_FromString(name);
|
||||||
|
if (filename == NULL)
|
||||||
|
return NULL;
|
||||||
|
res = _PyImport_FindExtensionUnicode(name, filename);
|
||||||
|
Py_DECREF(filename);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the module object corresponding to a module name.
|
/* Get the module object corresponding to a module name.
|
||||||
First check the modules dictionary if there's one there,
|
First check the modules dictionary if there's one there,
|
||||||
|
@ -2121,7 +2145,7 @@ init_builtin(char *name)
|
||||||
{
|
{
|
||||||
struct _inittab *p;
|
struct _inittab *p;
|
||||||
|
|
||||||
if (_PyImport_FindExtension(name, name) != NULL)
|
if (_PyImport_FindBuiltin(name) != NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for (p = PyImport_Inittab; p->name != NULL; p++) {
|
for (p = PyImport_Inittab; p->name != NULL; p++) {
|
||||||
|
@ -2138,7 +2162,7 @@ init_builtin(char *name)
|
||||||
mod = (*p->initfunc)();
|
mod = (*p->initfunc)();
|
||||||
if (mod == 0)
|
if (mod == 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (_PyImport_FixupExtension(mod, name, name) < 0)
|
if (_PyImport_FixupBuiltin(mod, name) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
/* FixupExtension has put the module into sys.modules,
|
/* FixupExtension has put the module into sys.modules,
|
||||||
so we can release our own reference. */
|
so we can release our own reference. */
|
||||||
|
|
|
@ -27,10 +27,16 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
|
||||||
dl_funcptr p0;
|
dl_funcptr p0;
|
||||||
PyObject* (*p)(void);
|
PyObject* (*p)(void);
|
||||||
struct PyModuleDef *def;
|
struct PyModuleDef *def;
|
||||||
|
PyObject *result;
|
||||||
|
|
||||||
if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
|
path = PyUnicode_DecodeFSDefault(pathname);
|
||||||
|
if (path == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if ((m = _PyImport_FindExtensionUnicode(name, path)) != NULL) {
|
||||||
Py_INCREF(m);
|
Py_INCREF(m);
|
||||||
return m;
|
result = m;
|
||||||
|
goto finally;
|
||||||
}
|
}
|
||||||
lastdot = strrchr(name, '.');
|
lastdot = strrchr(name, '.');
|
||||||
if (lastdot == NULL) {
|
if (lastdot == NULL) {
|
||||||
|
@ -45,26 +51,26 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
|
||||||
p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
|
p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
|
||||||
p = (PyObject*(*)(void))p0;
|
p = (PyObject*(*)(void))p0;
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
goto error;
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
PyErr_Format(PyExc_ImportError,
|
PyErr_Format(PyExc_ImportError,
|
||||||
"dynamic module does not define init function (PyInit_%.200s)",
|
"dynamic module does not define init function (PyInit_%.200s)",
|
||||||
shortname);
|
shortname);
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
oldcontext = _Py_PackageContext;
|
oldcontext = _Py_PackageContext;
|
||||||
_Py_PackageContext = packagecontext;
|
_Py_PackageContext = packagecontext;
|
||||||
m = (*p)();
|
m = (*p)();
|
||||||
_Py_PackageContext = oldcontext;
|
_Py_PackageContext = oldcontext;
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
return NULL;
|
goto error;
|
||||||
|
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
Py_DECREF(m);
|
Py_DECREF(m);
|
||||||
PyErr_Format(PyExc_SystemError,
|
PyErr_Format(PyExc_SystemError,
|
||||||
"initialization of %s raised unreported exception",
|
"initialization of %s raised unreported exception",
|
||||||
shortname);
|
shortname);
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remember pointer to module init function. */
|
/* Remember pointer to module init function. */
|
||||||
|
@ -72,17 +78,25 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
|
||||||
def->m_base.m_init = p;
|
def->m_base.m_init = p;
|
||||||
|
|
||||||
/* Remember the filename as the __file__ attribute */
|
/* Remember the filename as the __file__ attribute */
|
||||||
path = PyUnicode_DecodeFSDefault(pathname);
|
|
||||||
if (PyModule_AddObject(m, "__file__", path) < 0)
|
if (PyModule_AddObject(m, "__file__", path) < 0)
|
||||||
PyErr_Clear(); /* Not important enough to report */
|
PyErr_Clear(); /* Not important enough to report */
|
||||||
|
else
|
||||||
|
Py_INCREF(path);
|
||||||
|
|
||||||
if (_PyImport_FixupExtension(m, name, pathname) < 0)
|
if (_PyImport_FixupExtensionUnicode(m, name, path) < 0)
|
||||||
return NULL;
|
goto error;
|
||||||
if (Py_VerboseFlag)
|
if (Py_VerboseFlag)
|
||||||
PySys_WriteStderr(
|
PySys_WriteStderr(
|
||||||
"import %s # dynamically loaded from %s\n",
|
"import %s # dynamically loaded from %s\n",
|
||||||
name, pathname);
|
name, pathname);
|
||||||
return m;
|
result = m;
|
||||||
|
goto finally;
|
||||||
|
|
||||||
|
error:
|
||||||
|
result = NULL;
|
||||||
|
finally:
|
||||||
|
Py_DECREF(path);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_DYNAMIC_LOADING */
|
#endif /* HAVE_DYNAMIC_LOADING */
|
||||||
|
|
|
@ -255,7 +255,7 @@ Py_InitializeEx(int install_sigs)
|
||||||
bimod = _PyBuiltin_Init();
|
bimod = _PyBuiltin_Init();
|
||||||
if (bimod == NULL)
|
if (bimod == NULL)
|
||||||
Py_FatalError("Py_Initialize: can't initialize builtins modules");
|
Py_FatalError("Py_Initialize: can't initialize builtins modules");
|
||||||
_PyImport_FixupExtension(bimod, "builtins", "builtins");
|
_PyImport_FixupBuiltin(bimod, "builtins");
|
||||||
interp->builtins = PyModule_GetDict(bimod);
|
interp->builtins = PyModule_GetDict(bimod);
|
||||||
if (interp->builtins == NULL)
|
if (interp->builtins == NULL)
|
||||||
Py_FatalError("Py_Initialize: can't initialize builtins dict");
|
Py_FatalError("Py_Initialize: can't initialize builtins dict");
|
||||||
|
@ -271,7 +271,7 @@ Py_InitializeEx(int install_sigs)
|
||||||
if (interp->sysdict == NULL)
|
if (interp->sysdict == NULL)
|
||||||
Py_FatalError("Py_Initialize: can't initialize sys dict");
|
Py_FatalError("Py_Initialize: can't initialize sys dict");
|
||||||
Py_INCREF(interp->sysdict);
|
Py_INCREF(interp->sysdict);
|
||||||
_PyImport_FixupExtension(sysmod, "sys", "sys");
|
_PyImport_FixupBuiltin(sysmod, "sys");
|
||||||
PySys_SetPath(Py_GetPath());
|
PySys_SetPath(Py_GetPath());
|
||||||
PyDict_SetItemString(interp->sysdict, "modules",
|
PyDict_SetItemString(interp->sysdict, "modules",
|
||||||
interp->modules);
|
interp->modules);
|
||||||
|
@ -577,7 +577,7 @@ Py_NewInterpreter(void)
|
||||||
interp->modules = PyDict_New();
|
interp->modules = PyDict_New();
|
||||||
interp->modules_reloading = PyDict_New();
|
interp->modules_reloading = PyDict_New();
|
||||||
|
|
||||||
bimod = _PyImport_FindExtension("builtins", "builtins");
|
bimod = _PyImport_FindBuiltin("builtins");
|
||||||
if (bimod != NULL) {
|
if (bimod != NULL) {
|
||||||
interp->builtins = PyModule_GetDict(bimod);
|
interp->builtins = PyModule_GetDict(bimod);
|
||||||
if (interp->builtins == NULL)
|
if (interp->builtins == NULL)
|
||||||
|
@ -588,7 +588,7 @@ Py_NewInterpreter(void)
|
||||||
/* initialize builtin exceptions */
|
/* initialize builtin exceptions */
|
||||||
_PyExc_Init();
|
_PyExc_Init();
|
||||||
|
|
||||||
sysmod = _PyImport_FindExtension("sys", "sys");
|
sysmod = _PyImport_FindBuiltin("sys");
|
||||||
if (bimod != NULL && sysmod != NULL) {
|
if (bimod != NULL && sysmod != NULL) {
|
||||||
PyObject *pstderr;
|
PyObject *pstderr;
|
||||||
interp->sysdict = PyModule_GetDict(sysmod);
|
interp->sysdict = PyModule_GetDict(sysmod);
|
||||||
|
|
Loading…
Reference in New Issue