npath = PyList_Size(path);
namelen = strlen(name);
for (i = 0; i < npath; i++) {
- PyObject *copy = NULL;
PyObject *v = PyList_GetItem(path, i);
PyObject *origv = v;
- char *base;
+ const char *base;
Py_ssize_t size;
if (!v)
return NULL;
- if (PyUnicode_Check(v)) {
- copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
- PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
- if (copy == NULL)
- return NULL;
- v = copy;
- }
- if (PyString_Check(v)) {
- base = PyString_AS_STRING(v);
- size = PyString_GET_SIZE(v);
- }
- else if (PyBytes_Check(v)) {
- base = PyBytes_AS_STRING(v);
- size = PyBytes_GET_SIZE(v);
- }
- else {
- Py_XDECREF(copy);
- continue;
- }
+ if (PyObject_AsCharBuffer(v, &base, &size) < 0)
+ return NULL;
len = size;
if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
- Py_XDECREF(copy);
continue; /* Too long */
}
strcpy(buf, base);
if (strlen(buf) != len) {
- Py_XDECREF(copy);
continue; /* v contains '\0' */
}
importer = get_path_importer(path_importer_cache,
path_hooks, origv);
if (importer == NULL) {
- Py_XDECREF(copy);
return NULL;
}
/* Note: importer is a borrowed reference */
loader = PyObject_CallMethod(importer,
"find_module",
"s", fullname);
- Py_XDECREF(copy);
if (loader == NULL)
return NULL; /* error */
if (loader != Py_None) {
S_ISDIR(statbuf.st_mode) && /* it's a directory */
case_ok(buf, len, namelen, name)) { /* case matches */
if (find_init_module(buf)) { /* and has __init__.py */
- Py_XDECREF(copy);
return &fd_package;
}
else {
MAXPATHLEN, buf);
if (PyErr_Warn(PyExc_ImportWarning,
warnstr)) {
- Py_XDECREF(copy);
return NULL;
}
}
if (isdir(buf) &&
case_ok(buf, len, namelen, name)) {
if (find_init_module(buf)) {
- Py_XDECREF(copy);
return &fd_package;
}
else {
MAXPATHLEN, buf);
if (PyErr_Warn(PyExc_ImportWarning,
warnstr)) {
- Py_XDECREF(copy);
return NULL;
}
}
saved_buf = NULL;
}
#endif
- Py_XDECREF(copy);
if (fp != NULL)
break;
}