summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorChris Jerdonek <chris.jerdonek@gmail.com>2020-05-03 07:07:57 (GMT)
committerGitHub <noreply@github.com>2020-05-03 07:07:57 (GMT)
commit21893fbb74e8fde2931fbed9b511e2a41362b1ab (patch)
treedaa9478ff24df319924478b9de7a435aee101b04 /Objects
parent0400a7f2f8abec8d441990e951cc25f69a2a4036 (diff)
downloadcpython-21893fbb74e8fde2931fbed9b511e2a41362b1ab.zip
cpython-21893fbb74e8fde2931fbed9b511e2a41362b1ab.tar.gz
cpython-21893fbb74e8fde2931fbed9b511e2a41362b1ab.tar.bz2
bpo-29587: allow chaining NULL exceptions in _gen_throw() (GH-19877)
This is a follow-up to GH-19823 that removes the check that the exception value isn't NULL, prior to calling _PyErr_ChainExceptions(). This enables implicit exception chaining for gen.throw() in more circumstances. The commit also adds a test that a particular code snippet involving gen.throw() doesn't crash. The test shows why the new `gi_exc_state.exc_type != Py_None` check that was added is necessary. Without the new check, the code snippet (as well as a number of other tests) crashes on certain platforms (e.g. Fedora but not Mac).
Diffstat (limited to 'Objects')
-rw-r--r--Objects/genobject.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 41a63ae..b27fa92 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -512,11 +512,12 @@ throw_here:
}
PyErr_Restore(typ, val, tb);
- /* XXX Should we also handle the case where exc_type is true and
- exc_value is false? */
- if (gen->gi_exc_state.exc_type && gen->gi_exc_state.exc_value) {
+ /* XXX It seems like we shouldn't have to check not equal to Py_None
+ here because exc_type should only ever be a class. But not including
+ this check was causing crashes on certain tests e.g. on Fedora. */
+ if (gen->gi_exc_state.exc_type && gen->gi_exc_state.exc_type != Py_None) {
Py_INCREF(gen->gi_exc_state.exc_type);
- Py_INCREF(gen->gi_exc_state.exc_value);
+ Py_XINCREF(gen->gi_exc_state.exc_value);
Py_XINCREF(gen->gi_exc_state.exc_traceback);
_PyErr_ChainExceptions(gen->gi_exc_state.exc_type,
gen->gi_exc_state.exc_value, gen->gi_exc_state.exc_traceback);