diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2014-01-22 12:24:46 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2014-01-22 12:24:46 (GMT) |
commit | 09761e7c9cf984b8164c172fcf9f1a5994402495 (patch) | |
tree | 8abf29a20201a6d00e620daf3376599a3e9d2c1b /Lib/test/test_contextlib.py | |
parent | 0e3b0e397e7bd986e2284e2b9ed2be00b404019c (diff) | |
download | cpython-09761e7c9cf984b8164c172fcf9f1a5994402495.zip cpython-09761e7c9cf984b8164c172fcf9f1a5994402495.tar.gz cpython-09761e7c9cf984b8164c172fcf9f1a5994402495.tar.bz2 |
Issue #20317: Don't create a reference loop in ExitStack
Diffstat (limited to 'Lib/test/test_contextlib.py')
-rw-r--r-- | Lib/test/test_contextlib.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 9e45f70..e5365f7 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -600,6 +600,29 @@ class TestExitStack(unittest.TestCase): else: self.fail("Expected KeyError, but no exception was raised") + def test_exit_exception_with_correct_context(self): + # http://bugs.python.org/issue20317 + @contextmanager + def gets_the_context_right(): + try: + yield 6 + finally: + 1 / 0 + + # The contextmanager already fixes the context, so prior to the + # fix, ExitStack would try to fix it *again* and get into an + # infinite self-referential loop + try: + with ExitStack() as stack: + stack.enter_context(gets_the_context_right()) + stack.enter_context(gets_the_context_right()) + stack.enter_context(gets_the_context_right()) + except ZeroDivisionError as exc: + self.assertIsInstance(exc.__context__, ZeroDivisionError) + self.assertIsInstance(exc.__context__.__context__, ZeroDivisionError) + self.assertIsNone(exc.__context__.__context__.__context__) + + def test_body_exception_suppress(self): def suppress_exc(*exc_details): return True |