https://github.com/python/cpython/commit/93b27e7f6d185efd5163d04fcdae8436ebf69144
commit: 93b27e7f6d185efd5163d04fcdae8436ebf69144
branch: main
author: Sam Gross <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-02-03T16:02:06+05:30
summary:
gh-139103: use `METH_FASTCALL` for tp_new_wrapper (#144406)
files:
M Objects/typeobject.c
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 2905b9ba56241e..ac52fe4002dc69 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -10159,7 +10159,7 @@ wrap_init(PyObject *self, PyObject *args, void
*wrapped, PyObject *kwds)
}
static PyObject *
-tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
+tp_new_wrapper(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
PyObject *kwnames)
{
PyTypeObject *staticbase;
PyObject *arg0, *res;
@@ -10171,13 +10171,13 @@ tp_new_wrapper(PyObject *self, PyObject *args,
PyObject *kwds)
}
PyTypeObject *type = (PyTypeObject *)self;
- if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
+ if (nargs < 1) {
PyErr_Format(PyExc_TypeError,
"%s.__new__(): not enough arguments",
type->tp_name);
return NULL;
}
- arg0 = PyTuple_GET_ITEM(args, 0);
+ arg0 = args[0];
if (!PyType_Check(arg0)) {
PyErr_Format(PyExc_TypeError,
"%s.__new__(X): X is not a type object (%s)",
@@ -10219,16 +10219,26 @@ tp_new_wrapper(PyObject *self, PyObject *args,
PyObject *kwds)
return NULL;
}
- args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
- if (args == NULL)
+ PyObject *args_tuple = PyTuple_FromArray(args + 1, nargs - 1);
+ if (args_tuple == NULL) {
return NULL;
- res = type->tp_new(subtype, args, kwds);
- Py_DECREF(args);
+ }
+ PyObject *kwds = NULL;
+ if (kwnames != NULL) {
+ kwds = _PyStack_AsDict(args + nargs, kwnames);
+ if (kwds == NULL) {
+ Py_DECREF(args_tuple);
+ return NULL;
+ }
+ }
+ res = type->tp_new(subtype, args_tuple, kwds);
+ Py_DECREF(args_tuple);
+ Py_XDECREF(kwds);
return res;
}
static struct PyMethodDef tp_new_methoddef[] = {
- {"__new__", _PyCFunction_CAST(tp_new_wrapper), METH_VARARGS|METH_KEYWORDS,
+ {"__new__", _PyCFunction_CAST(tp_new_wrapper), METH_FASTCALL|METH_KEYWORDS,
PyDoc_STR("__new__($type, *args, **kwargs)\n--\n\n"
"Create and return a new object. "
"See help(type) for accurate signature.")},
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]