summaryrefslogtreecommitdiffstats
path: root/Modules/zipimport.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-10-18 12:09:02 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-10-18 12:09:02 (GMT)
commit08654e18eed3c8b0224100fe270da618d60d6eb5 (patch)
treeb844a4e5d05480fa6a282dd635a678ad60d8ef49 /Modules/zipimport.c
parent26fabe13698addebe83e1a57daa8f180c9ad8e1d (diff)
downloadcpython-08654e18eed3c8b0224100fe270da618d60d6eb5.zip
cpython-08654e18eed3c8b0224100fe270da618d60d6eb5.tar.gz
cpython-08654e18eed3c8b0224100fe270da618d60d6eb5.tar.bz2
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.
Diffstat (limited to 'Modules/zipimport.c')
-rw-r--r--Modules/zipimport.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/Modules/zipimport.c b/Modules/zipimport.c
index a35b8c8..5f2e160 100644
--- a/Modules/zipimport.c
+++ b/Modules/zipimport.c
@@ -49,7 +49,7 @@ static PyObject *zip_directory_cache = NULL;
static PyObject *read_directory(PyObject *archive);
static PyObject *get_data(PyObject *archive, PyObject *toc_entry);
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)
@@ -310,7 +310,8 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
PyObject *code = NULL, *mod, *dict;
- char *fullname, *modpath;
+ char *fullname;
+ PyObject *modpath = NULL, *modpath_bytes;
int ispackage;
if (!PyArg_ParseTuple(args, "s:zipimporter.load_module",
@@ -352,17 +353,24 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
if (err != 0)
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);
if (mod == NULL)
goto error;
if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # loaded from Zip %s\n",
- fullname, modpath);
+ PySys_FormatStderr("import %s # loaded from Zip %U\n",
+ fullname, modpath);
+ Py_DECREF(modpath);
return mod;
error:
Py_XDECREF(code);
+ Py_XDECREF(modpath);
return NULL;
}
@@ -372,7 +380,8 @@ zipimporter_get_filename(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
PyObject *code;
- char *fullname, *modpath;
+ char *fullname;
+ PyObject *modpath;
int ispackage;
if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename",
@@ -386,7 +395,7 @@ zipimporter_get_filename(PyObject *obj, PyObject *args)
return NULL;
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. */
@@ -685,7 +694,8 @@ get_long(unsigned char *buf) {
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
data_size, # size of compressed data on disk
file_size, # size of decompressed data
@@ -1146,7 +1156,7 @@ get_code_from_data(ZipImporter *self, int ispackage, int isbytecode,
'fullname'. */
static PyObject *
get_module_code(ZipImporter *self, char *fullname,
- int *p_ispackage, char **p_modpath)
+ int *p_ispackage, PyObject **p_modpath)
{
PyObject *toc_entry;
char *subname, path[MAXPATHLEN + 1];
@@ -1185,9 +1195,10 @@ get_module_code(ZipImporter *self, char *fullname,
Py_DECREF(code);
continue;
}
- if (code != NULL && p_modpath != NULL)
- *p_modpath = _PyUnicode_AsString(
- PyTuple_GetItem(toc_entry, 0));
+ if (code != NULL && p_modpath != NULL) {
+ *p_modpath = PyTuple_GetItem(toc_entry, 0);
+ Py_INCREF(*p_modpath);
+ }
return code;
}
}