diff options
author | Victor Stinner <vstinner@python.org> | 2024-05-10 19:08:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-10 19:08:24 (GMT) |
commit | aa36f83c1670f1e41fa9432a20e5c4a88ee9012c (patch) | |
tree | 2dfa668791a82aa1e7725c75e74ed1baa09ae8fa /Lib/test | |
parent | ec9d12be9648ee60a2eb02d67069d74f8b314df9 (diff) | |
download | cpython-aa36f83c1670f1e41fa9432a20e5c4a88ee9012c.zip cpython-aa36f83c1670f1e41fa9432a20e5c4a88ee9012c.tar.gz cpython-aa36f83c1670f1e41fa9432a20e5c4a88ee9012c.tar.bz2 |
gh-118702: Implement vectorcall for BaseException (#118703)
* BaseException_vectorcall() now creates a tuple from 'args' array.
* Creation an exception using BaseException_vectorcall() is now a
single function call, rather than having to call
BaseException_new() and then BaseException_init().
Calling BaseException_init() is inefficient since it overrides
the 'args' attribute.
* _PyErr_SetKeyError() now uses PyObject_CallOneArg() to create the
KeyError instance to use BaseException_vectorcall().
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_exceptions.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 3138f50..9460d1f 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1817,6 +1817,29 @@ class ExceptionTests(unittest.TestCase): rc, _, err = script_helper.assert_python_ok("-c", code) self.assertIn(b'MemoryError', err) + def test_keyerror_context(self): + # Make sure that _PyErr_SetKeyError() chains exceptions + try: + err1 = None + err2 = None + try: + d = {} + try: + raise ValueError("bug") + except Exception as exc: + err1 = exc + d[1] + except Exception as exc: + err2 = exc + + self.assertIsInstance(err1, ValueError) + self.assertIsInstance(err2, KeyError) + self.assertEqual(err2.__context__, err1) + finally: + # Break any potential reference cycle + exc1 = None + exc2 = None + class NameErrorTests(unittest.TestCase): def test_name_error_has_name(self): |