zipimport: get_module_code() returns modpath as a Unicode object
... instead of a char*. Encode the module path to the fileystem encoding (for PyImport_ExecCodeModuleEx) instead of utf-8.
This commit is contained in:
parent
26fabe1369
commit
08654e18ee
|
@ -49,7 +49,7 @@ static PyObject *zip_directory_cache = NULL;
|
||||||
static PyObject *read_directory(PyObject *archive);
|
static PyObject *read_directory(PyObject *archive);
|
||||||
static PyObject *get_data(PyObject *archive, PyObject *toc_entry);
|
static PyObject *get_data(PyObject *archive, PyObject *toc_entry);
|
||||||
static PyObject *get_module_code(ZipImporter *self, char *fullname,
|
static PyObject *get_module_code(ZipImporter *self, char *fullname,
|
||||||
int *p_ispackage, char **p_modpath);
|
int *p_ispackage, PyObject **p_modpath);
|
||||||
|
|
||||||
|
|
||||||
#define ZipImporter_Check(op) PyObject_TypeCheck(op, &ZipImporter_Type)
|
#define ZipImporter_Check(op) PyObject_TypeCheck(op, &ZipImporter_Type)
|
||||||
|
@ -310,7 +310,8 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
|
||||||
{
|
{
|
||||||
ZipImporter *self = (ZipImporter *)obj;
|
ZipImporter *self = (ZipImporter *)obj;
|
||||||
PyObject *code = NULL, *mod, *dict;
|
PyObject *code = NULL, *mod, *dict;
|
||||||
char *fullname, *modpath;
|
char *fullname;
|
||||||
|
PyObject *modpath = NULL, *modpath_bytes;
|
||||||
int ispackage;
|
int ispackage;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s:zipimporter.load_module",
|
if (!PyArg_ParseTuple(args, "s:zipimporter.load_module",
|
||||||
|
@ -352,17 +353,24 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
mod = PyImport_ExecCodeModuleEx(fullname, code, modpath);
|
modpath_bytes = PyUnicode_EncodeFSDefault(modpath);
|
||||||
|
if (modpath_bytes == NULL)
|
||||||
|
goto error;
|
||||||
|
mod = PyImport_ExecCodeModuleEx(fullname, code,
|
||||||
|
PyBytes_AS_STRING(modpath_bytes));
|
||||||
|
Py_DECREF(modpath_bytes);
|
||||||
Py_CLEAR(code);
|
Py_CLEAR(code);
|
||||||
if (mod == NULL)
|
if (mod == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (Py_VerboseFlag)
|
if (Py_VerboseFlag)
|
||||||
PySys_WriteStderr("import %s # loaded from Zip %s\n",
|
PySys_FormatStderr("import %s # loaded from Zip %U\n",
|
||||||
fullname, modpath);
|
fullname, modpath);
|
||||||
|
Py_DECREF(modpath);
|
||||||
return mod;
|
return mod;
|
||||||
error:
|
error:
|
||||||
Py_XDECREF(code);
|
Py_XDECREF(code);
|
||||||
|
Py_XDECREF(modpath);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,7 +380,8 @@ zipimporter_get_filename(PyObject *obj, PyObject *args)
|
||||||
{
|
{
|
||||||
ZipImporter *self = (ZipImporter *)obj;
|
ZipImporter *self = (ZipImporter *)obj;
|
||||||
PyObject *code;
|
PyObject *code;
|
||||||
char *fullname, *modpath;
|
char *fullname;
|
||||||
|
PyObject *modpath;
|
||||||
int ispackage;
|
int ispackage;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename",
|
if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename",
|
||||||
|
@ -386,7 +395,7 @@ zipimporter_get_filename(PyObject *obj, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
Py_DECREF(code); /* Only need the path info */
|
Py_DECREF(code); /* Only need the path info */
|
||||||
|
|
||||||
return PyUnicode_FromString(modpath);
|
return modpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a bool signifying whether the module is a package or not. */
|
/* Return a bool signifying whether the module is a package or not. */
|
||||||
|
@ -685,7 +694,8 @@ get_long(unsigned char *buf) {
|
||||||
|
|
||||||
A toc_entry is a tuple:
|
A toc_entry is a tuple:
|
||||||
|
|
||||||
(__file__, # value to use for __file__, available for all files
|
(__file__, # value to use for __file__, available for all files,
|
||||||
|
# encoded to the filesystem encoding
|
||||||
compress, # compression kind; 0 for uncompressed
|
compress, # compression kind; 0 for uncompressed
|
||||||
data_size, # size of compressed data on disk
|
data_size, # size of compressed data on disk
|
||||||
file_size, # size of decompressed data
|
file_size, # size of decompressed data
|
||||||
|
@ -1146,7 +1156,7 @@ get_code_from_data(ZipImporter *self, int ispackage, int isbytecode,
|
||||||
'fullname'. */
|
'fullname'. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
get_module_code(ZipImporter *self, char *fullname,
|
get_module_code(ZipImporter *self, char *fullname,
|
||||||
int *p_ispackage, char **p_modpath)
|
int *p_ispackage, PyObject **p_modpath)
|
||||||
{
|
{
|
||||||
PyObject *toc_entry;
|
PyObject *toc_entry;
|
||||||
char *subname, path[MAXPATHLEN + 1];
|
char *subname, path[MAXPATHLEN + 1];
|
||||||
|
@ -1185,9 +1195,10 @@ get_module_code(ZipImporter *self, char *fullname,
|
||||||
Py_DECREF(code);
|
Py_DECREF(code);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (code != NULL && p_modpath != NULL)
|
if (code != NULL && p_modpath != NULL) {
|
||||||
*p_modpath = _PyUnicode_AsString(
|
*p_modpath = PyTuple_GetItem(toc_entry, 0);
|
||||||
PyTuple_GetItem(toc_entry, 0));
|
Py_INCREF(*p_modpath);
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue