summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_testclinic.c332
-rw-r--r--Modules/clinic/_testclinic.c.h776
-rw-r--r--Modules/clinic/_testclinic_depr.c.h3
-rw-r--r--Modules/clinic/gcmodule.c.h33
-rw-r--r--Modules/clinic/mathmodule.c.h50
-rw-r--r--Modules/gcmodule.c39
-rw-r--r--Modules/mathmodule.c43
7 files changed, 1065 insertions, 211 deletions
diff --git a/Modules/_testclinic.c b/Modules/_testclinic.c
index e3c8ba9..320c8dd 100644
--- a/Modules/_testclinic.c
+++ b/Modules/_testclinic.c
@@ -59,19 +59,20 @@ pack_arguments_newref(int argc, ...)
}
static PyObject *
-pack_varargs_to_tuple(Py_ssize_t varargssize, PyObject *const *args)
+pack_arguments_2pos_varpos(PyObject *a, PyObject *b,
+ PyObject * const *args, Py_ssize_t args_length)
+/*[clinic end generated code: output=267032f41bd039cc input=86ee3064b7853e86]*/
{
- assert(!PyErr_Occurred());
- PyObject *tuple = PyTuple_New(varargssize);
- if (!tuple) {
+ PyObject *tuple = _PyTuple_FromArray(args, args_length);
+ if (tuple == NULL) {
return NULL;
}
- for (Py_ssize_t i = 0; i < varargssize; i++) {
- PyTuple_SET_ITEM(tuple, i, Py_NewRef(args[i]));
- }
- return tuple;
+ PyObject *result = pack_arguments_newref(3, a, b, tuple);
+ Py_DECREF(tuple);
+ return result;
}
+
/* Pack arguments to a tuple.
* `wrapper` is function which converts primitive type to PyObject.
* `arg_type` is type that arguments should be converted to before wrapped. */
@@ -984,16 +985,10 @@ varpos
[clinic start generated code]*/
static PyObject *
-varpos_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
-/*[clinic end generated code: output=b65096f423fb5dcc input=f87cd674145d394c]*/
+varpos_impl(PyObject *module, PyObject *args)
+/*[clinic end generated code: output=7b0b9545872bdca4 input=f87cd674145d394c]*/
{
- PyObject *vararg_tuple = pack_varargs_to_tuple(nargs, args);
- if (!vararg_tuple) {
- return NULL;
- }
- PyObject *result = pack_arguments_newref(1, vararg_tuple);
- Py_DECREF(vararg_tuple);
- return result;
+ return Py_NewRef(args);
}
@@ -1009,16 +1004,29 @@ posonly_varpos
static PyObject *
posonly_varpos_impl(PyObject *module, PyObject *a, PyObject *b,
- Py_ssize_t nargs, PyObject *const *args)
-/*[clinic end generated code: output=d10d43d86d117ab3 input=c9fd7895cfbaabba]*/
+ PyObject *args)
+/*[clinic end generated code: output=5dae5eb2a0d623cd input=c9fd7895cfbaabba]*/
{
- PyObject *vararg_tuple = pack_varargs_to_tuple(nargs, args);
- if (!vararg_tuple) {
- return NULL;
- }
- PyObject *result = pack_arguments_newref(3, a, b, vararg_tuple);
- Py_DECREF(vararg_tuple);
- return result;
+ return pack_arguments_newref(3, a, b, args);
+}
+
+
+/*[clinic input]
+posonly_req_opt_varpos
+
+ a: object
+ b: object = False
+ /
+ *args: object
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_req_opt_varpos_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject *args)
+/*[clinic end generated code: output=67f82f90838e166a input=a49bd64740171e1c]*/
+{
+ return pack_arguments_newref(3, a, b, args);
}
@@ -1130,6 +1138,81 @@ varpos_kwonly_req_opt_impl(PyObject *module, PyObject *args, PyObject *a,
}
+/*[clinic input]
+varpos_array
+
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+varpos_array_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=a25f42f39c9b13ad input=97b8bdcf87e019c7]*/
+{
+ return _PyTuple_FromArray(args, args_length);
+}
+
+
+/*[clinic input]
+posonly_varpos_array
+
+ a: object
+ b: object
+ /
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_varpos_array_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject * const *args, Py_ssize_t args_length)
+/*[clinic end generated code: output=267032f41bd039cc input=86ee3064b7853e86]*/
+{
+ return pack_arguments_2pos_varpos(a, b, args, args_length);
+}
+
+
+/*[clinic input]
+posonly_req_opt_varpos_array
+
+ a: object
+ b: object = False
+ /
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_req_opt_varpos_array_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=f2f93c77ead93699 input=b01d7728164fd93e]*/
+{
+ return pack_arguments_2pos_varpos(a, b, args, args_length);
+}
+
+
+/*[clinic input]
+posonly_poskw_varpos_array
+
+ a: object
+ /
+ b: object
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_poskw_varpos_array_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=155811a8b2d65a12 input=5fb08cdc6afb9d7c]*/
+{
+ return pack_arguments_2pos_varpos(a, b, args, args_length);
+}
+
+
/*[clinic input]
gh_32092_oob
@@ -1183,9 +1266,8 @@ Proof-of-concept of GH-99233 refcount error bug.
[clinic start generated code]*/
static PyObject *
-gh_99233_refcount_impl(PyObject *module, Py_ssize_t nargs,
- PyObject *const *args)
-/*[clinic end generated code: output=b570007e61e5c670 input=eecfdc2092d90dc3]*/
+gh_99233_refcount_impl(PyObject *module, PyObject *args)
+/*[clinic end generated code: output=585855abfbca9a7f input=eecfdc2092d90dc3]*/
{
Py_RETURN_NONE;
}
@@ -1295,9 +1377,9 @@ clone_with_conv_f2_impl(PyObject *module, custom_t path)
/*[clinic input]
-class _testclinic.TestClass "PyObject *" "PyObject"
+class _testclinic.TestClass "PyObject *" "&PyBaseObject_Type"
[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=668a591c65bec947]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=c991635bb3c91f1a]*/
/*[clinic input]
_testclinic.TestClass.get_defining_class
@@ -1360,11 +1442,192 @@ _testclinic_TestClass_defclass_posonly_varpos_impl(PyObject *self,
return pack_arguments_newref(4, cls, a, b, args);
}
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as varpos_no_fastcall
+
+ *args: object
+
+[clinic start generated code]*/
+
+static PyObject *
+varpos_no_fastcall_impl(PyTypeObject *type, PyObject *args)
+/*[clinic end generated code: output=04e94f2898bb2dde input=b0447ebab3e81001]*/
+{
+ return Py_NewRef(args);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as posonly_varpos_no_fastcall
+
+ a: object
+ b: object
+ /
+ *args: object
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_varpos_no_fastcall_impl(PyTypeObject *type, PyObject *a, PyObject *b,
+ PyObject *args)
+/*[clinic end generated code: output=b0a0425719f69f5a input=d2ec37a06b3c2389]*/
+{
+ return pack_arguments_newref(3, a, b, args);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as posonly_req_opt_varpos_no_fastcall
+
+ a: object
+ b: object = False
+ /
+ *args: object
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_req_opt_varpos_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b, PyObject *args)
+/*[clinic end generated code: output=3c44915b1a554e2d input=e9e74686a5e6a06d]*/
+{
+ return pack_arguments_newref(3, a, b, args);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as posonly_poskw_varpos_no_fastcall
+
+ a: object
+ /
+ b: object
+ *args: object
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_poskw_varpos_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b, PyObject *args)
+/*[clinic end generated code: output=6ad74bed4bdc7f96 input=fa931c38184213aa]*/
+{
+ return pack_arguments_newref(3, a, b, args);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as varpos_array_no_fastcall
+
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+varpos_array_no_fastcall_impl(PyTypeObject *type, PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=f99d984346c60d42 input=368d8eea6de48c12]*/
+{
+ return _PyTuple_FromArray(args, args_length);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as posonly_varpos_array_no_fastcall
+
+ a: object
+ b: object
+ /
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_varpos_array_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b, PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=1eec4da1fb5b5978 input=7330c8d819a23548]*/
+{
+ return pack_arguments_2pos_varpos(a, b, args, args_length);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as posonly_req_opt_varpos_array_no_fastcall
+
+ a: object
+ b: object = False
+ /
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_req_opt_varpos_array_no_fastcall_impl(PyTypeObject *type,
+ PyObject *a, PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=88041c2176135218 input=7f5fd34ee5f9e0bf]*/
+{
+ return pack_arguments_2pos_varpos(a, b, args, args_length);
+}
+
+
+/*[clinic input]
+@classmethod
+_testclinic.TestClass.__new__ as posonly_poskw_varpos_array_no_fastcall
+
+ a: object
+ /
+ b: object
+ *args: array
+
+[clinic start generated code]*/
+
+static PyObject *
+posonly_poskw_varpos_array_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=70eda18c3667681e input=2b0fcd7bd9bb865c]*/
+{
+ return pack_arguments_2pos_varpos(a, b, args, args_length);
+}
+
static struct PyMethodDef test_class_methods[] = {
_TESTCLINIC_TESTCLASS_GET_DEFINING_CLASS_METHODDEF
_TESTCLINIC_TESTCLASS_GET_DEFINING_CLASS_ARG_METHODDEF
_TESTCLINIC_TESTCLASS_DEFCLASS_VARPOS_METHODDEF
_TESTCLINIC_TESTCLASS_DEFCLASS_POSONLY_VARPOS_METHODDEF
+
+ {"varpos_no_fastcall", _PyCFunction_CAST(varpos_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+ {"posonly_varpos_no_fastcall", _PyCFunction_CAST(posonly_varpos_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+ {"posonly_req_opt_varpos_no_fastcall", _PyCFunction_CAST(posonly_req_opt_varpos_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+ {"posonly_poskw_varpos_no_fastcall", _PyCFunction_CAST(posonly_poskw_varpos_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+
+ {"varpos_array_no_fastcall",
+ _PyCFunction_CAST(varpos_array_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+ {"posonly_varpos_array_no_fastcall",
+ _PyCFunction_CAST(posonly_varpos_array_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+ {"posonly_req_opt_varpos_array_no_fastcall",
+ _PyCFunction_CAST(posonly_req_opt_varpos_array_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+ {"posonly_poskw_varpos_array_no_fastcall",
+ _PyCFunction_CAST(posonly_poskw_varpos_array_no_fastcall),
+ METH_VARARGS|METH_KEYWORDS|METH_CLASS, ""},
+
{NULL, NULL}
};
@@ -2023,12 +2286,19 @@ static PyMethodDef tester_methods[] = {
VARPOS_METHODDEF
POSONLY_VARPOS_METHODDEF
+ POSONLY_REQ_OPT_VARPOS_METHODDEF
POSONLY_POSKW_VARPOS_METHODDEF
POSKW_VARPOS_METHODDEF
POSKW_VARPOS_KWONLY_OPT_METHODDEF
POSKW_VARPOS_KWONLY_OPT2_METHODDEF
VARPOS_KWONLY_OPT_METHODDEF
VARPOS_KWONLY_REQ_OPT_METHODDEF
+
+ VARPOS_ARRAY_METHODDEF
+ POSONLY_VARPOS_ARRAY_METHODDEF
+ POSONLY_REQ_OPT_VARPOS_ARRAY_METHODDEF
+ POSONLY_POSKW_VARPOS_ARRAY_METHODDEF
+
GH_32092_OOB_METHODDEF
GH_32092_KW_PASS_METHODDEF
GH_99233_REFCOUNT_METHODDEF
diff --git a/Modules/clinic/_testclinic.c.h b/Modules/clinic/_testclinic.c.h
index 7e29998..0f5ae5e 100644
--- a/Modules/clinic/_testclinic.c.h
+++ b/Modules/clinic/_testclinic.c.h
@@ -9,6 +9,7 @@ preserve
#include "pycore_long.h" // _PyLong_UnsignedShort_Converter()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
#include "pycore_runtime.h" // _Py_ID()
+#include "pycore_tuple.h" // _PyTuple_FromArray()
PyDoc_STRVAR(test_empty_function__doc__,
"test_empty_function($module, /)\n"
@@ -2530,22 +2531,24 @@ PyDoc_STRVAR(varpos__doc__,
{"varpos", _PyCFunction_CAST(varpos), METH_FASTCALL, varpos__doc__},
static PyObject *
-varpos_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args);
+varpos_impl(PyObject *module, PyObject *args);
static PyObject *
varpos(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject *__clinic_args = NULL;
- if (!_PyArg_CheckPositional("varpos", nargs, 0, PY_SSIZE_T_MAX)) {
+ __clinic_args = _PyTuple_FromArray(args, nargs);
+ if (__clinic_args == NULL) {
goto exit;
}
- __clinic_args = args + 0;
- return_value = varpos_impl(module, nvararg, __clinic_args);
+ return_value = varpos_impl(module, __clinic_args);
exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2559,26 +2562,75 @@ PyDoc_STRVAR(posonly_varpos__doc__,
static PyObject *
posonly_varpos_impl(PyObject *module, PyObject *a, PyObject *b,
- Py_ssize_t nargs, PyObject *const *args);
+ PyObject *args);
static PyObject *
posonly_varpos(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 2;
PyObject *a;
PyObject *b;
- PyObject *const *__clinic_args = NULL;
+ PyObject *__clinic_args = NULL;
if (!_PyArg_CheckPositional("posonly_varpos", nargs, 2, PY_SSIZE_T_MAX)) {
goto exit;
}
a = args[0];
b = args[1];
- __clinic_args = args + 2;
- return_value = posonly_varpos_impl(module, a, b, nvararg, __clinic_args);
+ __clinic_args = _PyTuple_FromArray(args + 2, nargs - 2);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
+ return_value = posonly_varpos_impl(module, a, b, __clinic_args);
exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+PyDoc_STRVAR(posonly_req_opt_varpos__doc__,
+"posonly_req_opt_varpos($module, a, b=False, /, *args)\n"
+"--\n"
+"\n");
+
+#define POSONLY_REQ_OPT_VARPOS_METHODDEF \
+ {"posonly_req_opt_varpos", _PyCFunction_CAST(posonly_req_opt_varpos), METH_FASTCALL, posonly_req_opt_varpos__doc__},
+
+static PyObject *
+posonly_req_opt_varpos_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject *args);
+
+static PyObject *
+posonly_req_opt_varpos(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ PyObject *a;
+ PyObject *b = Py_False;
+ PyObject *__clinic_args = NULL;
+
+ if (!_PyArg_CheckPositional("posonly_req_opt_varpos", nargs, 1, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = args[0];
+ if (nargs < 2) {
+ goto skip_optional;
+ }
+ b = args[1];
+skip_optional:
+ __clinic_args = nargs > 2
+ ? _PyTuple_FromArray(args + 2, nargs - 2)
+ : PyTuple_New(0);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
+ return_value = posonly_req_opt_varpos_impl(module, a, b, __clinic_args);
+
+exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2623,22 +2675,30 @@ posonly_poskw_varpos(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[3];
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
PyObject *a;
PyObject *b;
PyObject *__clinic_args = NULL;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, 2, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ a = fastargs[0];
+ b = fastargs[1];
+ __clinic_args = nargs > 2
+ ? _PyTuple_FromArray(args + 2, nargs - 2)
+ : PyTuple_New(0);
+ if (__clinic_args == NULL) {
goto exit;
}
- a = args[0];
- b = args[1];
- __clinic_args = args[2];
return_value = posonly_poskw_varpos_impl(module, a, b, __clinic_args);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2682,20 +2742,28 @@ poskw_varpos(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[2];
+ PyObject *argsbuf[1];
+ PyObject * const *fastargs;
PyObject *a;
PyObject *__clinic_args = NULL;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, 1, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ a = fastargs[0];
+ __clinic_args = nargs > 1
+ ? _PyTuple_FromArray(args + 1, nargs - 1)
+ : PyTuple_New(0);
+ if (__clinic_args == NULL) {
goto exit;
}
- a = args[0];
- __clinic_args = args[1];
return_value = poskw_varpos_impl(module, a, __clinic_args);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2740,30 +2808,38 @@ poskw_varpos_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t narg
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[3];
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *a;
PyObject *__clinic_args = NULL;
int b = 0;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, 1, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
- a = args[0];
- __clinic_args = args[1];
+ a = fastargs[0];
if (!noptargs) {
goto skip_optional_kwonly;
}
- b = PyObject_IsTrue(args[2]);
+ b = PyObject_IsTrue(fastargs[1]);
if (b < 0) {
goto exit;
}
skip_optional_kwonly:
+ __clinic_args = nargs > 1
+ ? _PyTuple_FromArray(args + 1, nargs - 1)
+ : PyTuple_New(0);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
return_value = poskw_varpos_kwonly_opt_impl(module, a, __clinic_args, b);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2808,34 +2884,42 @@ poskw_varpos_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ssize_t nar
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[4];
+ PyObject *argsbuf[3];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *a;
PyObject *__clinic_args = NULL;
PyObject *b = Py_False;
PyObject *c = Py_False;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, 1, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
- a = args[0];
- __clinic_args = args[1];
+ a = fastargs[0];
if (!noptargs) {
goto skip_optional_kwonly;
}
- if (args[2]) {
- b = args[2];
+ if (fastargs[1]) {
+ b = fastargs[1];
if (!--noptargs) {
goto skip_optional_kwonly;
}
}
- c = args[3];
+ c = fastargs[2];
skip_optional_kwonly:
+ __clinic_args = nargs > 1
+ ? _PyTuple_FromArray(args + 1, nargs - 1)
+ : PyTuple_New(0);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
return_value = poskw_varpos_kwonly_opt2_impl(module, a, __clinic_args, b, c);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2879,25 +2963,31 @@ varpos_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyO
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[2];
+ PyObject *argsbuf[1];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = 0 + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
PyObject *__clinic_args = NULL;
PyObject *b = Py_False;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, 0, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
- __clinic_args = args[0];
if (!noptargs) {
goto skip_optional_kwonly;
}
- b = args[1];
+ b = fastargs[0];
skip_optional_kwonly:
+ __clinic_args = _PyTuple_FromArray(args, nargs);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
return_value = varpos_kwonly_opt_impl(module, __clinic_args, b);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -2942,34 +3032,202 @@ varpos_kwonly_req_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[4];
+ PyObject *argsbuf[3];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = 0 + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *__clinic_args = NULL;
PyObject *a;
PyObject *b = Py_False;
PyObject *c = Py_False;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 1, 0, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 1, argsbuf);
+ if (!fastargs) {
goto exit;
}
- __clinic_args = args[0];
- a = args[1];
+ a = fastargs[0];
if (!noptargs) {
goto skip_optional_kwonly;
}
- if (args[2]) {
- b = args[2];
+ if (fastargs[1]) {
+ b = fastargs[1];
if (!--noptargs) {
goto skip_optional_kwonly;
}
}
- c = args[3];
+ c = fastargs[2];
skip_optional_kwonly:
+ __clinic_args = _PyTuple_FromArray(args, nargs);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
return_value = varpos_kwonly_req_opt_impl(module, __clinic_args, a, b, c);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+PyDoc_STRVAR(varpos_array__doc__,
+"varpos_array($module, /, *args)\n"
+"--\n"
+"\n");
+
+#define VARPOS_ARRAY_METHODDEF \
+ {"varpos_array", _PyCFunction_CAST(varpos_array), METH_FASTCALL, varpos_array__doc__},
+
+static PyObject *
+varpos_array_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+varpos_array(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ __clinic_args = args;
+ args_length = nargs;
+ return_value = varpos_array_impl(module, __clinic_args, args_length);
+
+ return return_value;
+}
+
+PyDoc_STRVAR(posonly_varpos_array__doc__,
+"posonly_varpos_array($module, a, b, /, *args)\n"
+"--\n"
+"\n");
+
+#define POSONLY_VARPOS_ARRAY_METHODDEF \
+ {"posonly_varpos_array", _PyCFunction_CAST(posonly_varpos_array), METH_FASTCALL, posonly_varpos_array__doc__},
+
+static PyObject *
+posonly_varpos_array_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject * const *args, Py_ssize_t args_length);
+
+static PyObject *
+posonly_varpos_array(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ PyObject *a;
+ PyObject *b;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ if (!_PyArg_CheckPositional("posonly_varpos_array", nargs, 2, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = args[0];
+ b = args[1];
+ __clinic_args = args + 2;
+ args_length = nargs - 2;
+ return_value = posonly_varpos_array_impl(module, a, b, __clinic_args, args_length);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(posonly_req_opt_varpos_array__doc__,
+"posonly_req_opt_varpos_array($module, a, b=False, /, *args)\n"
+"--\n"
+"\n");
+
+#define POSONLY_REQ_OPT_VARPOS_ARRAY_METHODDEF \
+ {"posonly_req_opt_varpos_array", _PyCFunction_CAST(posonly_req_opt_varpos_array), METH_FASTCALL, posonly_req_opt_varpos_array__doc__},
+
+static PyObject *
+posonly_req_opt_varpos_array_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+posonly_req_opt_varpos_array(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ PyObject *a;
+ PyObject *b = Py_False;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ if (!_PyArg_CheckPositional("posonly_req_opt_varpos_array", nargs, 1, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = args[0];
+ if (nargs < 2) {
+ goto skip_optional;
+ }
+ b = args[1];
+skip_optional:
+ __clinic_args = nargs > 2 ? args + 2 : args;
+ args_length = Py_MAX(0, nargs - 2);
+ return_value = posonly_req_opt_varpos_array_impl(module, a, b, __clinic_args, args_length);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(posonly_poskw_varpos_array__doc__,
+"posonly_poskw_varpos_array($module, a, /, b, *args)\n"
+"--\n"
+"\n");
+
+#define POSONLY_POSKW_VARPOS_ARRAY_METHODDEF \
+ {"posonly_poskw_varpos_array", _PyCFunction_CAST(posonly_poskw_varpos_array), METH_FASTCALL|METH_KEYWORDS, posonly_poskw_varpos_array__doc__},
+
+static PyObject *
+posonly_poskw_varpos_array_impl(PyObject *module, PyObject *a, PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+posonly_poskw_varpos_array(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 1
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { _Py_LATIN1_CHR('b'), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"", "b", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "posonly_poskw_varpos_array",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
+ PyObject *a;
+ PyObject *b;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ a = fastargs[0];
+ b = fastargs[1];
+ __clinic_args = nargs > 2 ? args + 2 : args;
+ args_length = Py_MAX(0, nargs - 2);
+ return_value = posonly_poskw_varpos_array_impl(module, a, b, __clinic_args, args_length);
+
+exit:
return return_value;
}
@@ -3015,7 +3273,8 @@ gh_32092_oob(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[5];
+ PyObject *argsbuf[4];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = Py_MIN(nargs, 2) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
PyObject *pos1;
PyObject *pos2;
@@ -3023,28 +3282,35 @@ gh_32092_oob(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
PyObject *kw1 = Py_None;
PyObject *kw2 = Py_None;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, 2, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
- pos1 = args[0];
- pos2 = args[1];
- varargs = args[2];
+ pos1 = fastargs[0];
+ pos2 = fastargs[1];
if (!noptargs) {
goto skip_optional_kwonly;
}
- if (args[3]) {
- kw1 = args[3];
+ if (fastargs[2]) {
+ kw1 = fastargs[2];
if (!--noptargs) {
goto skip_optional_kwonly;
}
}
- kw2 = args[4];
+ kw2 = fastargs[3];
skip_optional_kwonly:
+ varargs = nargs > 2
+ ? _PyTuple_FromArray(args + 2, nargs - 2)
+ : PyTuple_New(0);
+ if (varargs == NULL) {
+ goto exit;
+ }
return_value = gh_32092_oob_impl(module, pos1, pos2, varargs, kw1, kw2);
exit:
+ /* Cleanup for varargs */
Py_XDECREF(varargs);
+
return return_value;
}
@@ -3090,27 +3356,35 @@ gh_32092_kw_pass(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[3];
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *pos;
PyObject *__clinic_args = NULL;
PyObject *kw = Py_None;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, 1, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
- pos = args[0];
- __clinic_args = args[1];
+ pos = fastargs[0];
if (!noptargs) {
goto skip_optional_kwonly;
}
- kw = args[2];
+ kw = fastargs[1];
skip_optional_kwonly:
+ __clinic_args = nargs > 1
+ ? _PyTuple_FromArray(args + 1, nargs - 1)
+ : PyTuple_New(0);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
return_value = gh_32092_kw_pass_impl(module, pos, __clinic_args, kw);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -3124,23 +3398,24 @@ PyDoc_STRVAR(gh_99233_refcount__doc__,
{"gh_99233_refcount", _PyCFunction_CAST(gh_99233_refcount), METH_FASTCALL, gh_99233_refcount__doc__},
static PyObject *
-gh_99233_refcount_impl(PyObject *module, Py_ssize_t nargs,
- PyObject *const *args);
+gh_99233_refcount_impl(PyObject *module, PyObject *args);
static PyObject *
gh_99233_refcount(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject *__clinic_args = NULL;
- if (!_PyArg_CheckPositional("gh_99233_refcount", nargs, 0, PY_SSIZE_T_MAX)) {
+ __clinic_args = _PyTuple_FromArray(args, nargs);
+ if (__clinic_args == NULL) {
goto exit;
}
- __clinic_args = args + 0;
- return_value = gh_99233_refcount_impl(module, nvararg, __clinic_args);
+ return_value = gh_99233_refcount_impl(module, __clinic_args);
exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -3220,30 +3495,38 @@ null_or_tuple_for_varargs(PyObject *module, PyObject *const *args, Py_ssize_t na
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[3];
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *name;
PyObject *constraints = NULL;
int covariant = 0;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, 1, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
- name = args[0];
- constraints = args[1];
+ name = fastargs[0];
if (!noptargs) {
goto skip_optional_kwonly;
}
- covariant = PyObject_IsTrue(args[2]);
+ covariant = PyObject_IsTrue(fastargs[1]);
if (covariant < 0) {
goto exit;
}
skip_optional_kwonly:
+ constraints = nargs > 1
+ ? _PyTuple_FromArray(args + 1, nargs - 1)
+ : PyTuple_New(0);
+ if (constraints == NULL) {
+ goto exit;
+ }
return_value = null_or_tuple_for_varargs_impl(module, name, constraints, covariant);
exit:
+ /* Cleanup for constraints */
Py_XDECREF(constraints);
+
return return_value;
}
@@ -3613,17 +3896,23 @@ _testclinic_TestClass_defclass_varpos(PyObject *self, PyTypeObject *cls, PyObjec
};
#undef KWTUPLE
PyObject *argsbuf[1];
+ PyObject * const *fastargs;
PyObject *__clinic_args = NULL;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, 0, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ __clinic_args = _PyTuple_FromArray(args, nargs);
+ if (__clinic_args == NULL) {
goto exit;
}
- __clinic_args = args[0];
return_value = _testclinic_TestClass_defclass_varpos_impl(self, cls, __clinic_args);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -3658,22 +3947,335 @@ _testclinic_TestClass_defclass_posonly_varpos(PyObject *self, PyTypeObject *cls,
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[3];
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
PyObject *a;
PyObject *b;
PyObject *__clinic_args = NULL;
- args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, 2, argsbuf);
- if (!args) {
+ fastargs = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ a = fastargs[0];
+ b = fastargs[1];
+ __clinic_args = _PyTuple_FromArray(args + 2, nargs - 2);
+ if (__clinic_args == NULL) {
goto exit;
}
- a = args[0];
- b = args[1];
- __clinic_args = args[2];
return_value = _testclinic_TestClass_defclass_posonly_varpos_impl(self, cls, a, b, __clinic_args);
exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+static PyObject *
+varpos_no_fastcall_impl(PyTypeObject *type, PyObject *args);
+
+static PyObject *
+varpos_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ PyTypeObject *base_tp = &PyBaseObject_Type;
+ PyObject *__clinic_args = NULL;
+
+ if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
+ !_PyArg_NoKeywords("TestClass", kwargs)) {
+ goto exit;
+ }
+ __clinic_args = Py_NewRef(args);
+ return_value = varpos_no_fastcall_impl(type, __clinic_args);
+
+exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+static PyObject *
+posonly_varpos_no_fastcall_impl(PyTypeObject *type, PyObject *a, PyObject *b,
+ PyObject *args);
+
+static PyObject *
+posonly_varpos_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ PyTypeObject *base_tp = &PyBaseObject_Type;
+ PyObject *a;
+ PyObject *b;
+ PyObject *__clinic_args = NULL;
+
+ if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
+ !_PyArg_NoKeywords("TestClass", kwargs)) {
+ goto exit;
+ }
+ if (!_PyArg_CheckPositional("TestClass", PyTuple_GET_SIZE(args), 2, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = PyTuple_GET_ITEM(args, 0);
+ b = PyTuple_GET_ITEM(args, 1);
+ __clinic_args = PyTuple_GetSlice(args, 2, PY_SSIZE_T_MAX);
+ if (!__clinic_args) {
+ goto exit;
+ }
+ return_value = posonly_varpos_no_fastcall_impl(type, a, b, __clinic_args);
+
+exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+static PyObject *
+posonly_req_opt_varpos_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b, PyObject *args);
+
+static PyObject *
+posonly_req_opt_varpos_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ PyTypeObject *base_tp = &PyBaseObject_Type;
+ PyObject *a;
+ PyObject *b = Py_False;
+ PyObject *__clinic_args = NULL;
+
+ if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
+ !_PyArg_NoKeywords("TestClass", kwargs)) {
+ goto exit;
+ }
+ if (!_PyArg_CheckPositional("TestClass", PyTuple_GET_SIZE(args), 1, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = PyTuple_GET_ITEM(args, 0);
+ if (PyTuple_GET_SIZE(args) < 2) {
+ goto skip_optional;
+ }
+ b = PyTuple_GET_ITEM(args, 1);
+skip_optional:
+ __clinic_args = PyTuple_GetSlice(args, 2, PY_SSIZE_T_MAX);
+ if (!__clinic_args) {
+ goto exit;
+ }
+ return_value = posonly_req_opt_varpos_no_fastcall_impl(type, a, b, __clinic_args);
+
+exit:
+ /* Cleanup for args */
+ Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+static PyObject *
+posonly_poskw_varpos_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b, PyObject *args);
+
+static PyObject *
+posonly_poskw_varpos_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 1
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { _Py_LATIN1_CHR('b'), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"", "b", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "TestClass",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
+ Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+ PyObject *a;
+ PyObject *b;
+ PyObject *__clinic_args = NULL;
+
+ fastargs = _PyArg_UnpackKeywordsWithVararg(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 2, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ a = fastargs[0];
+ b = fastargs[1];
+ __clinic_args = PyTuple_GetSlice(args, 2, PY_SSIZE_T_MAX);
+ if (!__clinic_args) {
+ goto exit;
+ }
+ return_value = posonly_poskw_varpos_no_fastcall_impl(type, a, b, __clinic_args);
+
+exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
+ return return_value;
+}
+
+static PyObject *
+varpos_array_no_fastcall_impl(PyTypeObject *type, PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+varpos_array_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ PyTypeObject *base_tp = &PyBaseObject_Type;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
+ !_PyArg_NoKeywords("TestClass", kwargs)) {
+ goto exit;
+ }
+ __clinic_args = _PyTuple_ITEMS(args);
+ args_length = PyTuple_GET_SIZE(args);
+ return_value = varpos_array_no_fastcall_impl(type, __clinic_args, args_length);
+
+exit:
+ return return_value;
+}
+
+static PyObject *
+posonly_varpos_array_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b, PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+posonly_varpos_array_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ PyTypeObject *base_tp = &PyBaseObject_Type;
+ PyObject *a;
+ PyObject *b;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
+ !_PyArg_NoKeywords("TestClass", kwargs)) {
+ goto exit;
+ }
+ if (!_PyArg_CheckPositional("TestClass", PyTuple_GET_SIZE(args), 2, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = PyTuple_GET_ITEM(args, 0);
+ b = PyTuple_GET_ITEM(args, 1);
+ __clinic_args = _PyTuple_ITEMS(args) + 2;
+ args_length = PyTuple_GET_SIZE(args) - 2;
+ return_value = posonly_varpos_array_no_fastcall_impl(type, a, b, __clinic_args, args_length);
+
+exit:
+ return return_value;
+}
+
+static PyObject *
+posonly_req_opt_varpos_array_no_fastcall_impl(PyTypeObject *type,
+ PyObject *a, PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+posonly_req_opt_varpos_array_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ PyTypeObject *base_tp = &PyBaseObject_Type;
+ PyObject *a;
+ PyObject *b = Py_False;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
+ !_PyArg_NoKeywords("TestClass", kwargs)) {
+ goto exit;
+ }
+ if (!_PyArg_CheckPositional("TestClass", PyTuple_GET_SIZE(args), 1, PY_SSIZE_T_MAX)) {
+ goto exit;
+ }
+ a = PyTuple_GET_ITEM(args, 0);
+ if (PyTuple_GET_SIZE(args) < 2) {
+ goto skip_optional;
+ }
+ b = PyTuple_GET_ITEM(args, 1);
+skip_optional:
+ __clinic_args = PyTuple_GET_SIZE(args) > 2 ? _PyTuple_ITEMS(args) + 2 : _PyTuple_ITEMS(args);
+ args_length = Py_MAX(0, PyTuple_GET_SIZE(args) - 2);
+ return_value = posonly_req_opt_varpos_array_no_fastcall_impl(type, a, b, __clinic_args, args_length);
+
+exit:
+ return return_value;
+}
+
+static PyObject *
+posonly_poskw_varpos_array_no_fastcall_impl(PyTypeObject *type, PyObject *a,
+ PyObject *b,
+ PyObject * const *args,
+ Py_ssize_t args_length);
+
+static PyObject *
+posonly_poskw_varpos_array_no_fastcall(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 1
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { _Py_LATIN1_CHR('b'), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"", "b", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "TestClass",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
+ Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+ PyObject *a;
+ PyObject *b;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
+
+ fastargs = _PyArg_UnpackKeywordsWithVararg(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 2, 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ a = fastargs[0];
+ b = fastargs[1];
+ __clinic_args = PyTuple_GET_SIZE(args) > 2 ? _PyTuple_ITEMS(args) + 2 : _PyTuple_ITEMS(args);
+ args_length = Py_MAX(0, PyTuple_GET_SIZE(args) - 2);
+ return_value = posonly_poskw_varpos_array_no_fastcall_impl(type, a, b, __clinic_args, args_length);
+
+exit:
return return_value;
}
-/*[clinic end generated code: output=7662d07e7d29cbeb input=a9049054013a1b77]*/
+/*[clinic end generated code: output=ed3408af146a746c input=a9049054013a1b77]*/
diff --git a/Modules/clinic/_testclinic_depr.c.h b/Modules/clinic/_testclinic_depr.c.h
index 95a2cc4..0e374f1 100644
--- a/Modules/clinic/_testclinic_depr.c.h
+++ b/Modules/clinic/_testclinic_depr.c.h
@@ -9,6 +9,7 @@ preserve
#include "pycore_long.h" // _PyLong_UnsignedShort_Converter()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
#include "pycore_runtime.h" // _Py_ID()
+#include "pycore_tuple.h" // _PyTuple_FromArray()
PyDoc_STRVAR(depr_star_new__doc__,
"DeprStarNew(a=None)\n"
@@ -2393,4 +2394,4 @@ depr_multi(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *
exit:
return return_value;
}
-/*[clinic end generated code: output=ca6da2c7137554be input=a9049054013a1b77]*/
+/*[clinic end generated code: output=5dda27c80df7351e input=a9049054013a1b77]*/
diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h
index be3bd35..34b2a79 100644
--- a/Modules/clinic/gcmodule.c.h
+++ b/Modules/clinic/gcmodule.c.h
@@ -8,6 +8,7 @@ preserve
#endif
#include "pycore_abstract.h" // _Py_convert_optional_to_ssize_t()
#include "pycore_modsupport.h" // _PyArg_UnpackKeywords()
+#include "pycore_tuple.h" // _PyTuple_FromArray()
PyDoc_STRVAR(gc_enable__doc__,
"enable($module, /)\n"
@@ -312,23 +313,24 @@ PyDoc_STRVAR(gc_get_referrers__doc__,
{"get_referrers", _PyCFunction_CAST(gc_get_referrers), METH_FASTCALL, gc_get_referrers__doc__},
static PyObject *
-gc_get_referrers_impl(PyObject *module, Py_ssize_t nargs,
- PyObject *const *args);
+gc_get_referrers_impl(PyObject *module, PyObject *objs);
static PyObject *
gc_get_referrers(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject *objs = NULL;
- if (!_PyArg_CheckPositional("get_referrers", nargs, 0, PY_SSIZE_T_MAX)) {
+ objs = _PyTuple_FromArray(args, nargs);
+ if (objs == NULL) {
goto exit;
}
- __clinic_args = args + 0;
- return_value = gc_get_referrers_impl(module, nvararg, __clinic_args);
+ return_value = gc_get_referrers_impl(module, objs);
exit:
+ /* Cleanup for objs */
+ Py_XDECREF(objs);
+
return return_value;
}
@@ -342,23 +344,24 @@ PyDoc_STRVAR(gc_get_referents__doc__,
{"get_referents", _PyCFunction_CAST(gc_get_referents), METH_FASTCALL, gc_get_referents__doc__},
static PyObject *
-gc_get_referents_impl(PyObject *module, Py_ssize_t nargs,
- PyObject *const *args);
+gc_get_referents_impl(PyObject *module, PyObject *objs);
static PyObject *
gc_get_referents(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject *objs = NULL;
- if (!_PyArg_CheckPositional("get_referents", nargs, 0, PY_SSIZE_T_MAX)) {
+ objs = _PyTuple_FromArray(args, nargs);
+ if (objs == NULL) {
goto exit;
}
- __clinic_args = args + 0;
- return_value = gc_get_referents_impl(module, nvararg, __clinic_args);
+ return_value = gc_get_referents_impl(module, objs);
exit:
+ /* Cleanup for objs */
+ Py_XDECREF(objs);
+
return return_value;
}
@@ -575,4 +578,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored))
exit:
return return_value;
}
-/*[clinic end generated code: output=f488a0d4d6bd3687 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=4f35875870da17c9 input=a9049054013a1b77]*/
diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h
index e4bda8a..461f771 100644
--- a/Modules/clinic/mathmodule.c.h
+++ b/Modules/clinic/mathmodule.c.h
@@ -18,22 +18,20 @@ PyDoc_STRVAR(math_gcd__doc__,
{"gcd", _PyCFunction_CAST(math_gcd), METH_FASTCALL, math_gcd__doc__},
static PyObject *
-math_gcd_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args);
+math_gcd_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length);
static PyObject *
math_gcd(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
- if (!_PyArg_CheckPositional("gcd", nargs, 0, PY_SSIZE_T_MAX)) {
- goto exit;
- }
- __clinic_args = args + 0;
- return_value = math_gcd_impl(module, nvararg, __clinic_args);
+ __clinic_args = args;
+ args_length = nargs;
+ return_value = math_gcd_impl(module, __clinic_args, args_length);
-exit:
return return_value;
}
@@ -47,22 +45,20 @@ PyDoc_STRVAR(math_lcm__doc__,
{"lcm", _PyCFunction_CAST(math_lcm), METH_FASTCALL, math_lcm__doc__},
static PyObject *
-math_lcm_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args);
+math_lcm_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length);
static PyObject *
math_lcm(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
- if (!_PyArg_CheckPositional("lcm", nargs, 0, PY_SSIZE_T_MAX)) {
- goto exit;
- }
- __clinic_args = args + 0;
- return_value = math_lcm_impl(module, nvararg, __clinic_args);
+ __clinic_args = args;
+ args_length = nargs;
+ return_value = math_lcm_impl(module, __clinic_args, args_length);
-exit:
return return_value;
}
@@ -430,22 +426,20 @@ PyDoc_STRVAR(math_hypot__doc__,
{"hypot", _PyCFunction_CAST(math_hypot), METH_FASTCALL, math_hypot__doc__},
static PyObject *
-math_hypot_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args);
+math_hypot_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length);
static PyObject *
math_hypot(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- Py_ssize_t nvararg = nargs - 0;
- PyObject *const *__clinic_args = NULL;
+ PyObject * const *__clinic_args;
+ Py_ssize_t args_length;
- if (!_PyArg_CheckPositional("hypot", nargs, 0, PY_SSIZE_T_MAX)) {
- goto exit;
- }
- __clinic_args = args + 0;
- return_value = math_hypot_impl(module, nvararg, __clinic_args);
+ __clinic_args = args;
+ args_length = nargs;
+ return_value = math_hypot_impl(module, __clinic_args, args_length);
-exit:
return return_value;
}
@@ -1109,4 +1103,4 @@ math_ulp(PyObject *module, PyObject *arg)
exit:
return return_value;
}
-/*[clinic end generated code: output=ff99a737c18d9210 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=cb506f61bc5ef862 input=a9049054013a1b77]*/
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index f5fea5a..ad13496 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -216,31 +216,21 @@ gc_get_count_impl(PyObject *module)
/*[clinic input]
gc.get_referrers
- *objs as args: object
+ *objs: tuple
Return the list of objects that directly refer to any of 'objs'.
[clinic start generated code]*/
static PyObject *
-gc_get_referrers_impl(PyObject *module, Py_ssize_t nargs,
- PyObject *const *args)
-/*[clinic end generated code: output=1d44a7695ea25c40 input=bae96961b14a0922]*/
+gc_get_referrers_impl(PyObject *module, PyObject *objs)
+/*[clinic end generated code: output=929d6dff26f609b9 input=9102be7ebee69ee3]*/
{
- PyObject *varargs = _PyTuple_FromArray(args, nargs);
-
- if (!varargs) {
- return NULL;
- }
- if (PySys_Audit("gc.get_referrers", "(O)", varargs) < 0) {
- Py_DECREF(varargs);
+ if (PySys_Audit("gc.get_referrers", "(O)", objs) < 0) {
return NULL;
}
PyInterpreterState *interp = _PyInterpreterState_GET();
- PyObject *result = _PyGC_GetReferrers(interp, varargs);
-
- Py_DECREF(varargs);
- return result;
+ return _PyGC_GetReferrers(interp, objs);
}
/* Append obj to list; return true if error (out of memory), false if OK. */
@@ -274,43 +264,34 @@ append_referrents(PyObject *result, PyObject *args)
/*[clinic input]
gc.get_referents
- *objs as args: object
+ *objs: tuple
Return the list of objects that are directly referred to by 'objs'.
[clinic start generated code]*/
static PyObject *
-gc_get_referents_impl(PyObject *module, Py_ssize_t nargs,
- PyObject *const *args)
-/*[clinic end generated code: output=e459f3e8c0d19311 input=b3ceab0c34038cbf]*/
+gc_get_referents_impl(PyObject *module, PyObject *objs)
+/*[clinic end generated code: output=6dfde40cd1588e1d input=55c078a6d0248fe0]*/
{
- PyObject *varargs = _PyTuple_FromArray(args, nargs);
-
- if (!varargs) {
- return NULL;
- }
- if (PySys_Audit("gc.get_referents", "(O)", varargs) < 0) {
- Py_DECREF(varargs);
+ if (PySys_Audit("gc.get_referents", "(O)", objs) < 0) {
return NULL;
}
PyInterpreterState *interp = _PyInterpreterState_GET();
PyObject *result = PyList_New(0);
if (result == NULL) {
- Py_DECREF(varargs);
return NULL;
}
// NOTE: stop the world is a no-op in default build
_PyEval_StopTheWorld(interp);
- int err = append_referrents(result, varargs);
+ int err = append_referrents(result, objs);
_PyEval_StartTheWorld(interp);
if (err < 0) {
Py_CLEAR(result);
}
- Py_DECREF(varargs);
return result;
}
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 77f50a2..2963811 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -722,22 +722,23 @@ m_log10(double x)
/*[clinic input]
math.gcd
- *integers as args: object
+ *integers as args: array
Greatest Common Divisor.
[clinic start generated code]*/
static PyObject *
-math_gcd_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
-/*[clinic end generated code: output=b57687fcf431c1b8 input=94e675b7ceeaf0c9]*/
+math_gcd_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=a26c95907374ffb4 input=ded7f0ea3850c05c]*/
{
// Fast-path for the common case: gcd(int, int)
- if (nargs == 2 && PyLong_CheckExact(args[0]) && PyLong_CheckExact(args[1]))
+ if (args_length == 2 && PyLong_CheckExact(args[0]) && PyLong_CheckExact(args[1]))
{
return _PyLong_GCD(args[0], args[1]);
}
- if (nargs == 0) {
+ if (args_length == 0) {
return PyLong_FromLong(0);
}
@@ -745,13 +746,13 @@ math_gcd_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
if (res == NULL) {
return NULL;
}
- if (nargs == 1) {
+ if (args_length == 1) {
Py_SETREF(res, PyNumber_Absolute(res));
return res;
}
PyObject *one = _PyLong_GetOne(); // borrowed ref
- for (Py_ssize_t i = 1; i < nargs; i++) {
+ for (Py_ssize_t i = 1; i < args_length; i++) {
PyObject *x = _PyNumber_Index(args[i]);
if (x == NULL) {
Py_DECREF(res);
@@ -804,32 +805,33 @@ long_lcm(PyObject *a, PyObject *b)
/*[clinic input]
math.lcm
- *integers as args: object
+ *integers as args: array
Least Common Multiple.
[clinic start generated code]*/
static PyObject *
-math_lcm_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
-/*[clinic end generated code: output=f3eff0c25e4d7030 input=e64c33e85f4c47c6]*/
+math_lcm_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=c8a59a5c2e55c816 input=3e4f4b7cdf948a98]*/
{
PyObject *res, *x;
Py_ssize_t i;
- if (nargs == 0) {
+ if (args_length == 0) {
return PyLong_FromLong(1);
}
res = PyNumber_Index(args[0]);
if (res == NULL) {
return NULL;
}
- if (nargs == 1) {
+ if (args_length == 1) {
Py_SETREF(res, PyNumber_Absolute(res));
return res;
}
PyObject *zero = _PyLong_GetZero(); // borrowed ref
- for (i = 1; i < nargs; i++) {
+ for (i = 1; i < args_length; i++) {
x = PyNumber_Index(args[i]);
if (x == NULL) {
Py_DECREF(res);
@@ -2629,7 +2631,7 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
/*[clinic input]
math.hypot
- *coordinates as args: object
+ *coordinates as args: array
Multidimensional Euclidean distance from the origin to a point.
@@ -2646,8 +2648,9 @@ For example, the hypotenuse of a 3/4/5 right triangle is:
[clinic start generated code]*/
static PyObject *
-math_hypot_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
-/*[clinic end generated code: output=dcb6d4b7a1102ee1 input=5c0061a2d11235ed]*/
+math_hypot_impl(PyObject *module, PyObject * const *args,
+ Py_ssize_t args_length)
+/*[clinic end generated code: output=c9de404e24370068 input=1bceaf7d4fdcd9c2]*/
{
Py_ssize_t i;
PyObject *item;
@@ -2657,13 +2660,13 @@ math_hypot_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
double coord_on_stack[NUM_STACK_ELEMS];
double *coordinates = coord_on_stack;
- if (nargs > NUM_STACK_ELEMS) {
- coordinates = (double *) PyMem_Malloc(nargs * sizeof(double));
+ if (args_length > NUM_STACK_ELEMS) {
+ coordinates = (double *) PyMem_Malloc(args_length * sizeof(double));
if (coordinates == NULL) {
return PyErr_NoMemory();
}
}
- for (i = 0; i < nargs; i++) {
+ for (i = 0; i < args_length; i++) {
item = args[i];
ASSIGN_DOUBLE(x, item, error_exit);
x = fabs(x);
@@ -2673,7 +2676,7 @@ math_hypot_impl(PyObject *module, Py_ssize_t nargs, PyObject *const *args)
max = x;
}
}
- result = vector_norm(nargs, coordinates, max, found_nan);
+ result = vector_norm(args_length, coordinates, max, found_nan);
if (coordinates != coord_on_stack) {
PyMem_Free(coordinates);
}