diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-08-20 23:23:34 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-08-20 23:23:34 (GMT) |
commit | 6e7740c790bf41f520e304ec17abf79a5373b5cc (patch) | |
tree | d56ae0f5e5952ce1acae9e97372cd148c10e297b | |
parent | 41e36676cd820ece16b9f8db07be8d541f264116 (diff) | |
download | cpython-6e7740c790bf41f520e304ec17abf79a5373b5cc.zip cpython-6e7740c790bf41f520e304ec17abf79a5373b5cc.tar.gz cpython-6e7740c790bf41f520e304ec17abf79a5373b5cc.tar.bz2 |
apply a fix for #3611 where the current exception context was deleted with a generator causing a segfault
-rw-r--r-- | Lib/test/test_exceptions.py | 22 | ||||
-rw-r--r-- | Python/ceval.c | 2 |
2 files changed, 23 insertions, 1 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 5ce76f1..6075b8d 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -564,6 +564,28 @@ class ExceptionTests(unittest.TestCase): pass self.assertEquals(e, (None, None, None)) + def test_3118(self): + def gen(): + try: + yield 1 + finally: + pass + + def f(): + g = gen() + next(g) + try: + try: + raise ValueError + except: + del g + raise KeyError + except Exception as e: + self.assert_(isinstance(e.__context__, ValueError)) + + f() + + def test_badisinstance(self): # Bug #2542: if issubclass(e, MyException) raises an exception, # it should be ignored diff --git a/Python/ceval.c b/Python/ceval.c index 40ce038..3af0cef 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2453,7 +2453,7 @@ fast_block_end: if (b->b_type == EXCEPT_HANDLER) { UNWIND_EXCEPT_HANDLER(b); - if (why == WHY_EXCEPTION) { + if (why == WHY_EXCEPTION && !throwflag) { Py_CLEAR(tstate->exc_type); Py_CLEAR(tstate->exc_value); Py_CLEAR(tstate->exc_traceback); |