summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorBrian Curtin <brian@python.org>2012-04-17 16:57:09 -0500
committerBrian Curtin <brian@python.org>2012-04-17 16:57:09 -0500
commit09b86d1196427f2028d7e072b106847d8c693815 (patch)
treec06e9fe5b6a732d07f2987ff86081165bd69ebf5 /Python
parentfba807ac44ff6804dd1be7c3962fc3455c8e7763 (diff)
downloadcpython-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.c6
-rw-r--r--Python/errors.c47
-rw-r--r--Python/import.c3
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;