diff options
author | Brian Curtin <brian@python.org> | 2012-04-17 16:57:09 -0500 |
---|---|---|
committer | Brian Curtin <brian@python.org> | 2012-04-17 16:57:09 -0500 |
commit | 09b86d1196427f2028d7e072b106847d8c693815 (patch) | |
tree | c06e9fe5b6a732d07f2987ff86081165bd69ebf5 /Python | |
parent | fba807ac44ff6804dd1be7c3962fc3455c8e7763 (diff) | |
download | cpython-git-09b86d1196427f2028d7e072b106847d8c693815.tar.gz |
Fix #14600. Correct reference handling and naming of ImportError convenience function
Diffstat (limited to 'Python')
-rw-r--r-- | Python/dynload_win.c | 6 | ||||
-rw-r--r-- | Python/errors.c | 47 | ||||
-rw-r--r-- | Python/import.c | 3 |
3 files changed, 25 insertions, 31 deletions
diff --git a/Python/dynload_win.c b/Python/dynload_win.c index ef3e2c5958..7bf3dfc811 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -254,9 +254,9 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, theLength)); } if (message != NULL) { - PyErr_SetFromImportErrorWithNameAndPath(message, - PyUnicode_FromString(shortname), - pathname); + PyErr_SetImportError(message, PyUnicode_FromString(shortname), + pathname); + Py_DECREF(message); } return NULL; } else { diff --git a/Python/errors.c b/Python/errors.c index 345a345afe..a49cde6247 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -586,50 +586,43 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( #endif /* MS_WINDOWS */ PyObject * -PyErr_SetExcWithArgsKwargs(PyObject *exc, PyObject *args, PyObject *kwargs) +PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) { - PyObject *val; + PyObject *args, *kwargs, *error; - /* args must at least be an empty tuple */ + args = PyTuple_New(1); if (args == NULL) - args = PyTuple_New(0); - - val = PyObject_Call(exc, args, kwargs); - if (val != NULL) { - PyErr_SetObject((PyObject *) Py_TYPE(val), val); - Py_DECREF(val); - } + return NULL; - return NULL; -} + kwargs = PyDict_New(); + if (args == NULL) + return NULL; -PyObject * -PyErr_SetFromImportErrorWithNameAndPath(PyObject *msg, - PyObject *name, PyObject *path) -{ - PyObject *args = PyTuple_New(1); - PyObject *kwargs = PyDict_New(); - PyObject *result; + if (name == NULL) + name = Py_None; if (path == NULL) path = Py_None; + Py_INCREF(msg); PyTuple_SetItem(args, 0, msg); PyDict_SetItemString(kwargs, "name", name); PyDict_SetItemString(kwargs, "path", path); - result = PyErr_SetExcWithArgsKwargs(PyExc_ImportError, args, kwargs); + /* args must at least be an empty tuple */ + if (args == NULL) + args = PyTuple_New(0); + + error = PyObject_Call(PyExc_ImportError, args, kwargs); + if (error!= NULL) { + PyErr_SetObject((PyObject *) Py_TYPE(error), error); + Py_DECREF(error); + } Py_DECREF(args); Py_DECREF(kwargs); - return result; -} - -PyObject * -PyErr_SetFromImportErrorWithName(PyObject *msg, PyObject *name) -{ - return PyErr_SetFromImportErrorWithNameAndPath(msg, name, NULL); + return NULL; } void diff --git a/Python/import.c b/Python/import.c index 584f30eb38..f3de7d8262 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2460,7 +2460,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, PyObject *msg = PyUnicode_FromFormat("import of %R halted; " "None in sys.modules", abs_name); if (msg != NULL) { - PyErr_SetFromImportErrorWithName(msg, abs_name); + PyErr_SetImportError(msg, abs_name, NULL); + Py_DECREF(msg); } mod = NULL; goto error_with_unlock; |