mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-39091: Fix segfault when Exception constructor returns non-exception for gen.throw. (GH-17658) (GH-27572)
Co-authored-by: Benjamin Peterson <benjamin@python.org>
(cherry picked from commit 83ca46b778
)
Co-authored-by: Noah <33094578+coolreader18@users.noreply.github.com>
This commit is contained in:
parent
2b8d4eaec9
commit
8ce7f2f4ef
4 changed files with 44 additions and 4 deletions
|
@ -85,17 +85,29 @@ _PyErr_GetTopmostException(PyThreadState *tstate)
|
|||
}
|
||||
|
||||
static PyObject*
|
||||
_PyErr_CreateException(PyObject *exception, PyObject *value)
|
||||
_PyErr_CreateException(PyObject *exception_type, PyObject *value)
|
||||
{
|
||||
PyObject *exc;
|
||||
|
||||
if (value == NULL || value == Py_None) {
|
||||
return _PyObject_CallNoArg(exception);
|
||||
exc = _PyObject_CallNoArg(exception_type);
|
||||
}
|
||||
else if (PyTuple_Check(value)) {
|
||||
return PyObject_Call(exception, value, NULL);
|
||||
exc = PyObject_Call(exception_type, value, NULL);
|
||||
}
|
||||
else {
|
||||
return PyObject_CallOneArg(exception, value);
|
||||
exc = PyObject_CallOneArg(exception_type, value);
|
||||
}
|
||||
|
||||
if (exc != NULL && !PyExceptionInstance_Check(exc)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"calling %R should have returned an instance of "
|
||||
"BaseException, not %s",
|
||||
exception_type, Py_TYPE(exc)->tp_name);
|
||||
Py_CLEAR(exc);
|
||||
}
|
||||
|
||||
return exc;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue