mirror of https://github.com/python/cpython
simplify and rewrite the zipimport part of 702009f3c0b1 a bit
This commit is contained in:
parent
209e04c201
commit
5ed7bd79df
|
@ -319,13 +319,20 @@ get_module_info(ZipImporter *self, PyObject *fullname)
|
|||
return MI_NOT_FOUND;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
fl_error,
|
||||
fl_not_found,
|
||||
fl_module_found,
|
||||
fl_ns_found
|
||||
} find_loader_result;
|
||||
|
||||
/* The guts of "find_loader" and "find_module". Return values:
|
||||
-1: error
|
||||
0: no loader or namespace portions found
|
||||
1: module/package found
|
||||
2: namespace portion found: *namespace_portion will point to the name
|
||||
*/
|
||||
static int
|
||||
static find_loader_result
|
||||
find_loader(ZipImporter *self, PyObject *fullname, PyObject **namespace_portion)
|
||||
{
|
||||
enum zi_module_info mi;
|
||||
|
@ -334,7 +341,7 @@ find_loader(ZipImporter *self, PyObject *fullname, PyObject **namespace_portion)
|
|||
|
||||
mi = get_module_info(self, fullname);
|
||||
if (mi == MI_ERROR)
|
||||
return -1;
|
||||
return fl_error;
|
||||
if (mi == MI_NOT_FOUND) {
|
||||
/* Not a module or regular package. See if this is a directory, and
|
||||
therefore possibly a portion of a namespace package. */
|
||||
|
@ -349,13 +356,13 @@ find_loader(ZipImporter *self, PyObject *fullname, PyObject **namespace_portion)
|
|||
self->archive, SEP,
|
||||
self->prefix, fullname);
|
||||
if (*namespace_portion == NULL)
|
||||
return -1;
|
||||
return 2;
|
||||
return fl_error;
|
||||
return fl_ns_found;
|
||||
}
|
||||
return 0;
|
||||
return fl_not_found;
|
||||
}
|
||||
/* This is a module or package. */
|
||||
return 1;
|
||||
return fl_module_found;
|
||||
}
|
||||
|
||||
|
||||
|
@ -368,31 +375,25 @@ zipimporter_find_module(PyObject *obj, PyObject *args)
|
|||
PyObject *path = NULL;
|
||||
PyObject *fullname;
|
||||
PyObject *namespace_portion = NULL;
|
||||
PyObject *result = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "U|O:zipimporter.find_module",
|
||||
&fullname, &path))
|
||||
goto error;
|
||||
if (!PyArg_ParseTuple(args, "U|O:zipimporter.find_module", &fullname, &path))
|
||||
return NULL;
|
||||
|
||||
switch (find_loader(self, fullname, &namespace_portion)) {
|
||||
case -1: /* Error */
|
||||
goto error;
|
||||
case 0: /* Not found, return None */
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
case 1: /* Return self */
|
||||
Py_INCREF(self);
|
||||
return (PyObject *)self;
|
||||
case 2: /* A namespace portion, but not allowed via
|
||||
find_module, so return None */
|
||||
case fl_ns_found:
|
||||
/* A namespace portion is not allowed via find_module, so return None. */
|
||||
Py_DECREF(namespace_portion);
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
/* FALL THROUGH */
|
||||
case fl_error:
|
||||
case fl_not_found:
|
||||
result = Py_None;
|
||||
break;
|
||||
case fl_module_found:
|
||||
result = (PyObject *)self;
|
||||
break;
|
||||
}
|
||||
/* Can't get here. */
|
||||
assert(0);
|
||||
return NULL;
|
||||
error:
|
||||
Py_XDECREF(namespace_portion);
|
||||
Py_XINCREF(result);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -411,35 +412,24 @@ zipimporter_find_loader(PyObject *obj, PyObject *args)
|
|||
PyObject *result = NULL;
|
||||
PyObject *namespace_portion = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "U|O:zipimporter.find_module",
|
||||
&fullname, &path))
|
||||
goto error;
|
||||
if (!PyArg_ParseTuple(args, "U|O:zipimporter.find_module", &fullname, &path))
|
||||
return NULL;
|
||||
|
||||
switch (find_loader(self, fullname, &namespace_portion)) {
|
||||
case -1: /* Error */
|
||||
goto error;
|
||||
case 0: /* Not found, return (None, []) */
|
||||
if (!(result = Py_BuildValue("O[]", Py_None)))
|
||||
goto error;
|
||||
return result;
|
||||
case 1: /* Return (self, []) */
|
||||
if (!(result = Py_BuildValue("O[]", self)))
|
||||
goto error;
|
||||
return result;
|
||||
case 2: /* Return (None, [namespace_portion]) */
|
||||
if (!(result = Py_BuildValue("O[O]", Py_None, namespace_portion)))
|
||||
goto error;
|
||||
case fl_error:
|
||||
return NULL;
|
||||
case fl_not_found: /* Not found, return (None, []) */
|
||||
result = Py_BuildValue("O[]", Py_None);
|
||||
break;
|
||||
case fl_module_found: /* Return (self, []) */
|
||||
result = Py_BuildValue("O[]", self);
|
||||
break;
|
||||
case fl_ns_found: /* Return (None, [namespace_portion]) */
|
||||
result = Py_BuildValue("O[O]", Py_None, namespace_portion);
|
||||
Py_DECREF(namespace_portion);
|
||||
return result;
|
||||
}
|
||||
/* Can't get here. */
|
||||
assert(0);
|
||||
return NULL;
|
||||
|
||||
error:
|
||||
Py_XDECREF(namespace_portion);
|
||||
Py_XDECREF(result);
|
||||
return NULL;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Load and return the module named by 'fullname'. */
|
||||
|
|
Loading…
Reference in New Issue