/* Get the code object assoiciated with the module specified by 'fullname'. */ static PyObject * get_module_code(ZipImporter *self, char *fullname, int *p_ispackage, char **p_modpath) { PyObject *toc_entry; char *subname, path[MAXPATHLEN + 1]; int len; struct st_zip_searchorder *zso; subname = get_subname(fullname); len = make_filename(PyString_AsString(self->prefix), subname, path); if (len < 0) return NULL; for (zso = zip_searchorder; *zso->suffix; zso++) { PyObject *code = NULL; strcpy(path + len, zso->suffix); if (Py_VerboseFlag > 1) PySys_WriteStderr("# trying %s%c%s\n", PyString_AsString(self->archive), SEP, path); toc_entry = PyDict_GetItemString(self->files, path); if (toc_entry != NULL) { time_t mtime = 0; int ispackage = zso->type & IS_PACKAGE; int isbytecode = zso->type & IS_BYTECODE; if (isbytecode) mtime = get_mtime_of_source(self, path); if (p_ispackage != NULL) *p_ispackage = ispackage; code = get_code_from_data(self, ispackage, isbytecode, mtime, toc_entry); if (code == Py_None) { /* bad magic number or non-matching mtime in byte code, try next */ Py_DECREF(code); continue; } if (code != NULL && p_modpath != NULL) *p_modpath = PyString_AsString( PyTuple_GetItem(toc_entry, 0)); return code; } } PyErr_Format(ZipImportError, "can't find module '%.200s'", fullname); return NULL; }
/* Get the code object associated with the module specified by 'fullname'. */ static PyObject * get_module_code(ZipImporter *self, PyObject *fullname, int *p_ispackage, PyObject **p_modpath) { PyObject *code = NULL, *toc_entry, *subname; PyObject *path, *fullpath = NULL; struct st_zip_searchorder *zso; subname = get_subname(fullname); if (subname == NULL) return NULL; path = make_filename(self->prefix, subname); Py_DECREF(subname); if (path == NULL) return NULL; for (zso = zip_searchorder; *zso->suffix; zso++) { code = NULL; fullpath = PyUnicode_FromFormat("%U%s", path, zso->suffix); if (fullpath == NULL) goto exit; if (Py_VerboseFlag > 1) PySys_FormatStderr("# trying %U%c%U\n", self->archive, (int)SEP, fullpath); toc_entry = PyDict_GetItem(self->files, fullpath); if (toc_entry != NULL) { time_t mtime = 0; int ispackage = zso->type & IS_PACKAGE; int isbytecode = zso->type & IS_BYTECODE; if (isbytecode) { mtime = get_mtime_of_source(self, fullpath); if (mtime == (time_t)-1 && PyErr_Occurred()) { goto exit; } } Py_CLEAR(fullpath); if (p_ispackage != NULL) *p_ispackage = ispackage; code = get_code_from_data(self, ispackage, isbytecode, mtime, toc_entry); if (code == Py_None) { /* bad magic number or non-matching mtime in byte code, try next */ Py_DECREF(code); continue; } if (code != NULL && p_modpath != NULL) { *p_modpath = PyTuple_GetItem(toc_entry, 0); Py_INCREF(*p_modpath); } goto exit; } else Py_CLEAR(fullpath); } PyErr_Format(ZipImportError, "can't find module %R", fullname); exit: Py_DECREF(path); Py_XDECREF(fullpath); return code; }