diff options
author | Chris Jerdonek <chris.jerdonek@gmail.com> | 2020-05-02 01:14:19 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-02 01:14:19 (GMT) |
commit | 02047265eb83a43ba18cc7fee81756f1a1a1f968 (patch) | |
tree | 41f74764a8cfa3f824fcfea57a1b3ef17f7b4fd3 /Objects | |
parent | f40bd466bf14029e2687e36e965875adf9d4be1a (diff) | |
download | cpython-02047265eb83a43ba18cc7fee81756f1a1a1f968.zip cpython-02047265eb83a43ba18cc7fee81756f1a1a1f968.tar.gz cpython-02047265eb83a43ba18cc7fee81756f1a1a1f968.tar.bz2 |
bpo-29587: Update gen.throw() to chain exceptions (#19823)
Before this commit, if an exception was active inside a generator
when calling gen.throw(), that exception was lost (i.e. there was
no implicit exception chaining). This commit fixes that by
setting exc.__context__ when calling gen.throw(exc).
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/genobject.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c index 6e36690..41a63ae 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -512,6 +512,15 @@ 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) { + Py_INCREF(gen->gi_exc_state.exc_type); + Py_INCREF(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); + } return gen_send_ex(gen, Py_None, 1, 0); failed_throw: |