From aa36f83c1670f1e41fa9432a20e5c4a88ee9012c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 10 May 2024 21:08:24 +0200 Subject: 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(). --- Python/errors.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'Python') diff --git a/Python/errors.c b/Python/errors.c index 433253b8f9a..ad6b7dbef07 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -257,13 +257,14 @@ void _PyErr_SetKeyError(PyObject *arg) { PyThreadState *tstate = _PyThreadState_GET(); - PyObject *tup = PyTuple_Pack(1, arg); - if (!tup) { + PyObject *exc = PyObject_CallOneArg(PyExc_KeyError, arg); + if (!exc) { /* caller will expect error to be set anyway */ return; } - _PyErr_SetObject(tstate, PyExc_KeyError, tup); - Py_DECREF(tup); + + _PyErr_SetObject(tstate, (PyObject*)Py_TYPE(exc), exc); + Py_DECREF(exc); } void -- cgit v1.2.3