Issue #3080: Refactor find_module_path(), use return instead of break

Prepare also the API change of case_ok()
This commit is contained in:
Victor Stinner 2011-03-14 14:04:10 -04:00
parent df75a023a0
commit d029621c70

View file

@ -144,6 +144,8 @@ static const struct filedescr _PyImport_StandardFiletab[] = {
{0, 0} {0, 0}
}; };
static PyObject *initstr = NULL;
/* Initialize things */ /* Initialize things */
@ -155,6 +157,10 @@ _PyImport_Init(void)
int countD = 0; int countD = 0;
int countS = 0; int countS = 0;
initstr = PyUnicode_InternFromString("__init__");
if (initstr == NULL)
Py_FatalError("Can't initialize import variables");
/* prepare _PyImport_Filetab: copy entries from /* prepare _PyImport_Filetab: copy entries from
_PyImport_DynLoadFiletab and _PyImport_StandardFiletab. _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
*/ */
@ -1507,13 +1513,6 @@ load_package(PyObject *name, PyObject *pathname)
char buf[MAXPATHLEN+1]; char buf[MAXPATHLEN+1];
FILE *fp = NULL; FILE *fp = NULL;
struct filedescr *fdp; struct filedescr *fdp;
static PyObject *initstr = NULL;
if (initstr == NULL) {
initstr = PyUnicode_InternFromString("__init__");
if (initstr == NULL)
return NULL;
}
m = PyImport_AddModuleObject(name); m = PyImport_AddModuleObject(name);
if (m == NULL) if (m == NULL)
@ -1765,23 +1764,25 @@ find_module_path(PyObject *fullname, PyObject *name, PyObject *path,
and there's an __init__ module in that directory */ and there's an __init__ module in that directory */
#ifdef HAVE_STAT #ifdef HAVE_STAT
if (stat(buf, &statbuf) == 0 && /* it exists */ if (stat(buf, &statbuf) == 0 && /* it exists */
S_ISDIR(statbuf.st_mode) && /* it's a directory */ S_ISDIR(statbuf.st_mode)) /* it's a directory */
case_ok(buf, len, namelen, namestr)) { /* case matches */ {
if (find_init_module(buf)) { /* and has __init__.py */ if (case_ok(buf, len, namelen, namestr)) { /* case matches */
*p_fd = &fd_package; if (find_init_module(buf)) { /* and has __init__.py */
return 2; *p_fd = &fd_package;
} return 2;
else { }
int err; else {
PyObject *unicode = PyUnicode_DecodeFSDefault(buf); int err;
if (unicode == NULL) PyObject *unicode = PyUnicode_DecodeFSDefault(buf);
return -1; if (unicode == NULL)
err = PyErr_WarnFormat(PyExc_ImportWarning, 1, return -1;
"Not importing directory '%U': missing __init__.py", err = PyErr_WarnFormat(PyExc_ImportWarning, 1,
unicode); "Not importing directory '%U': missing __init__.py",
Py_DECREF(unicode); unicode);
if (err) Py_DECREF(unicode);
return -1; if (err)
return -1;
}
} }
} }
#endif #endif
@ -1842,25 +1843,21 @@ find_module_path_list(PyObject *fullname, PyObject *name,
if (filemode[0] == 'U') if (filemode[0] == 'U')
filemode = "r" PY_STDIOTEXTMODE; filemode = "r" PY_STDIOTEXTMODE;
fp = fopen(buf, filemode); fp = fopen(buf, filemode);
if (fp != NULL) { if (fp == NULL)
if (case_ok(buf, len, namelen, namestr)) continue;
break;
else { /* continue search */ if (case_ok(buf, len, namelen, namestr)) {
fclose(fp); *p_fp = fp;
fp = NULL; return fdp;
}
} }
fclose(fp);
fp = NULL;
} }
if (fp != NULL)
break;
} }
if (fp == NULL) { PyErr_Format(PyExc_ImportError,
PyErr_Format(PyExc_ImportError, "No module named %U", name);
"No module named %U", name); return NULL;
return NULL;
}
*p_fp = fp;
return fdp;
} }
/* Find a module: /* Find a module: