return 0;
}
+static int super_init_impl(PyObject *self, PyTypeObject *type, PyObject *obj);
+
static int
super_init(PyObject *self, PyObject *args, PyObject *kwds)
{
- superobject *su = (superobject *)self;
PyTypeObject *type = NULL;
PyObject *obj = NULL;
- PyTypeObject *obj_type = NULL;
if (!_PyArg_NoKeywords("super", kwds))
return -1;
if (!PyArg_ParseTuple(args, "|O!O:super", &PyType_Type, &type, &obj))
return -1;
+ if (super_init_impl(self, type, obj) < 0) {
+ return -1;
+ }
+ return 0;
+}
+static inline int
+super_init_impl(PyObject *self, PyTypeObject *type, PyObject *obj) {
+ superobject *su = (superobject *)self;
+ PyTypeObject *obj_type = NULL;
if (type == NULL) {
/* Call super(), without args -- fill in from __class__
and first local variable on the stack. */
return 0;
}
+static PyObject *
+super_vectorcall(PyObject *self, PyObject *const *args,
+ size_t nargsf, PyObject *kwnames)
+{
+ assert(PyType_Check(self));
+ if (!_PyArg_NoKwnames("super", kwnames)) {
+ return NULL;
+ }
+ Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+ if (!_PyArg_CheckPositional("super()", nargs, 0, 2)) {
+ return NULL;
+ }
+ PyTypeObject *type = NULL;
+ PyObject *obj = NULL;
+ PyTypeObject *self_type = (PyTypeObject *)self;
+ PyObject *su = self_type->tp_alloc(self_type, 0);
+ if (su == NULL) {
+ return NULL;
+ }
+ // 1 or 2 argument form super().
+ if (nargs != 0) {
+ PyObject *arg0 = args[0];
+ if (!PyType_Check(arg0)) {
+ PyErr_Format(PyExc_TypeError,
+ "super() argument 1 must be a type, not %.200s", Py_TYPE(arg0)->tp_name);
+ goto fail;
+ }
+ type = (PyTypeObject *)arg0;
+ }
+ if (nargs == 2) {
+ obj = args[1];
+ }
+ if (super_init_impl(su, type, obj) < 0) {
+ goto fail;
+ }
+ return su;
+fail:
+ Py_DECREF(su);
+ return NULL;
+}
+
PyTypeObject PySuper_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"super", /* tp_name */
PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */
PyObject_GC_Del, /* tp_free */
+ .tp_vectorcall = (vectorcallfunc)super_vectorcall,
};