Fix #14600. Correct reference handling and naming of ImportError convenience function
diff --git a/Python/errors.c b/Python/errors.c
index 345a345..a49cde6 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -586,50 +586,43 @@
#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 = PyTuple_New(1);
+ if (args == NULL)
+ return NULL;
+
+ kwargs = PyDict_New();
+ if (args == NULL)
+ return NULL;
+
+ 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);
/* args must at least be an empty tuple */
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);
+ error = PyObject_Call(PyExc_ImportError, args, kwargs);
+ if (error!= NULL) {
+ PyErr_SetObject((PyObject *) Py_TYPE(error), error);
+ Py_DECREF(error);
}
- return NULL;
-}
-
-PyObject *
-PyErr_SetFromImportErrorWithNameAndPath(PyObject *msg,
- PyObject *name, PyObject *path)
-{
- PyObject *args = PyTuple_New(1);
- PyObject *kwargs = PyDict_New();
- PyObject *result;
-
- if (path == NULL)
- path = Py_None;
-
- PyTuple_SetItem(args, 0, msg);
- PyDict_SetItemString(kwargs, "name", name);
- PyDict_SetItemString(kwargs, "path", path);
-
- result = PyErr_SetExcWithArgsKwargs(PyExc_ImportError, args, kwargs);
-
Py_DECREF(args);
Py_DECREF(kwargs);
- return result;
-}
-
-PyObject *
-PyErr_SetFromImportErrorWithName(PyObject *msg, PyObject *name)
-{
- return PyErr_SetFromImportErrorWithNameAndPath(msg, name, NULL);
+ return NULL;
}
void