diff options
author | Benjamin Peterson <benjamin@python.org> | 2012-05-25 05:54:15 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2012-05-25 05:54:15 (GMT) |
commit | 5ed7bd79dfec6b1ef203f022ef662573a93085c4 (patch) | |
tree | 3fa565a5b16ac3f3cfd887022c88ba0ae2fd1378 /Modules | |
parent | 209e04c201613b710cafc250e449f9bd2e4cf607 (diff) | |
download | cpython-5ed7bd79dfec6b1ef203f022ef662573a93085c4.zip cpython-5ed7bd79dfec6b1ef203f022ef662573a93085c4.tar.gz cpython-5ed7bd79dfec6b1ef203f022ef662573a93085c4.tar.bz2 |
simplify and rewrite the zipimport part of 702009f3c0b1 a bit
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/zipimport.c | 92 |
1 files changed, 41 insertions, 51 deletions
diff --git a/Modules/zipimport.c b/Modules/zipimport.c index cc1dffb..4e74edf 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -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; } @@ -367,32 +374,26 @@ zipimporter_find_module(PyObject *obj, PyObject *args) ZipImporter *self = (ZipImporter *)obj; PyObject *path = NULL; PyObject *fullname; - PyObject* namespace_portion = NULL; + 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'. */ |