[3.6] bpo-28603: Fix formatting tracebacks for unhashable exceptions (GH-4014) (#4024)

(cherry picked from commit de86073a76)
This commit is contained in:
Miss Islington (bot) 2017-10-17 15:14:19 -07:00 committed by Serhiy Storchaka
parent 858ea4354f
commit 2712247ec9
9 changed files with 114 additions and 9 deletions

View file

@ -811,13 +811,21 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
if (seen != NULL) {
/* Exception chaining */
if (PySet_Add(seen, value) == -1)
PyObject *value_id = PyLong_FromVoidPtr(value);
if (value_id == NULL || PySet_Add(seen, value_id) == -1)
PyErr_Clear();
else if (PyExceptionInstance_Check(value)) {
PyObject *check_id = NULL;
cause = PyException_GetCause(value);
context = PyException_GetContext(value);
if (cause) {
res = PySet_Contains(seen, cause);
check_id = PyLong_FromVoidPtr(cause);
if (check_id == NULL) {
res = -1;
} else {
res = PySet_Contains(seen, check_id);
Py_DECREF(check_id);
}
if (res == -1)
PyErr_Clear();
if (res == 0) {
@ -829,7 +837,13 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
}
else if (context &&
!((PyBaseExceptionObject *)value)->suppress_context) {
res = PySet_Contains(seen, context);
check_id = PyLong_FromVoidPtr(context);
if (check_id == NULL) {
res = -1;
} else {
res = PySet_Contains(seen, check_id);
Py_DECREF(check_id);
}
if (res == -1)
PyErr_Clear();
if (res == 0) {
@ -842,6 +856,7 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
Py_XDECREF(context);
Py_XDECREF(cause);
}
Py_XDECREF(value_id);
}
print_exception(f, value);
if (err != 0)