summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2024-05-10 19:08:24 (GMT)
committerGitHub <noreply@github.com>2024-05-10 19:08:24 (GMT)
commitaa36f83c1670f1e41fa9432a20e5c4a88ee9012c (patch)
tree2dfa668791a82aa1e7725c75e74ed1baa09ae8fa /Lib/test
parentec9d12be9648ee60a2eb02d67069d74f8b314df9 (diff)
downloadcpython-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.py23
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):