[Python-checkins] cpython: Issue #3080: find_init_module() expects Unicode (original) (raw)

victor.stinner python-checkins at python.org
Sun Mar 20 04:13:59 CET 2011


http://hg.python.org/cpython/rev/298a70b27497 changeset: 68733:298a70b27497 user: Victor Stinner <victor.stinner at haypocalc.com> date: Sun Mar 20 03:07:28 2011 +0100 summary: Issue #3080: find_init_module() expects Unicode

files: Python/import.c

diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1668,8 +1668,9 @@ PyObject *p_path); #endif +/ Forward */ static int case_ok(char *, Py_ssize_t, Py_ssize_t, const char *); -static int find_init_module(char ); / Forward / +static int find_init_module(PyObject ); static struct filedescr importhookdescr = {"", "", IMP_HOOK}; / Get the path of a module: get its importer and call importer.find_module() @@ -1766,24 +1767,27 @@ if (stat(buf, &statbuf) == 0 && / it exists / S_ISDIR(statbuf.st_mode)) / it's a directory */ { + PyObject bufobj = PyUnicode_DecodeFSDefault(buf); + if (bufobj == NULL) + return -1; if (case_ok(buf, len, namelen, namestr)) { / case matches / - if (find_init_module(buf)) { / and has init.py / + if (find_init_module(bufobj)) { / and has init.py */ + Py_DECREF(bufobj); *p_fd = &fd_package; return 2; } else { int err; - PyObject unicode = PyUnicode_DecodeFSDefault(buf); - if (unicode == NULL) + err = PyErr_WarnFormat(PyExc_ImportWarning, 1, + "Not importing directory %R: missing init.py", + bufobj); + if (err) { + Py_DECREF(bufobj); return -1; - err = PyErr_WarnFormat(PyExc_ImportWarning, 1, - "Not importing directory '%U': missing init.py", - unicode); - Py_DECREF(unicode); - if (err) - return -1; + } } } + Py_DECREF(bufobj); } #endif return 1; @@ -2154,49 +2158,47 @@ #ifdef HAVE_STAT -/ Helper to look for init.py or init.py[co] in potential package / +/ Helper to look for init.py or init.py[co] in potential package. + Return 1 if init was found, 0 if not, or -1 on error. */ static int -find_init_module(char *buf) +find_init_module(PyObject *directory) { - const size_t save_len = strlen(buf); - size_t i = save_len; - char pname; / pointer to start of init */ + size_t len; struct stat statbuf;

-/* For calling case_ok(buf, len, namelen, name):

-- Repository URL: http://hg.python.org/cpython



More information about the Python-checkins mailing list