From 5ed7bd79dfec6b1ef203f022ef662573a93085c4 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 24 May 2012 22:54:15 -0700 Subject: simplify and rewrite the zipimport part of 702009f3c0b1 a bit --- Modules/zipimport.c | 92 ++++++++++++++++++++++++----------------------------- 1 file 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'. */ -- cgit v0.12