summaryrefslogtreecommitdiffstats
path: root/Python/clinic
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2024-11-07 21:40:03 (GMT)
committerGitHub <noreply@github.com>2024-11-07 21:40:03 (GMT)
commit1f777396f52a4cf7417f56097f10add8042295f4 (patch)
treed2b16073b0665beba75e900fff1dd2daf24b0717 /Python/clinic
parent09d6f5dc7824c74672add512619e978844ff8051 (diff)
downloadcpython-1f777396f52a4cf7417f56097f10add8042295f4.zip
cpython-1f777396f52a4cf7417f56097f10add8042295f4.tar.gz
cpython-1f777396f52a4cf7417f56097f10add8042295f4.tar.bz2
gh-122943: Rework support of var-positional parameter in Argument Clinic (GH-122945)
Move creation of a tuple for var-positional parameter out of _PyArg_UnpackKeywordsWithVararg(). Merge _PyArg_UnpackKeywordsWithVararg() with _PyArg_UnpackKeywords(). Add a new parameter in _PyArg_UnpackKeywords(). The "parameters" and "converters" attributes of ParseArgsCodeGen no longer contain the var-positional parameter. It is now available as the "varpos" attribute. Optimize code generation for var-positional parameter and reuse the same generating code for functions with and without keyword parameters. Add special converters for var-positional parameter. "tuple" represents it as a Python tuple and "array" represents it as a continuous array of PyObject*. "object" is a temporary alias of "tuple".
Diffstat (limited to 'Python/clinic')
-rw-r--r--Python/clinic/bltinmodule.c.h31
1 files changed, 19 insertions, 12 deletions
diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h
index f75a8d4..b472796 100644
--- a/Python/clinic/bltinmodule.c.h
+++ b/Python/clinic/bltinmodule.c.h
@@ -7,6 +7,7 @@ preserve
# include "pycore_runtime.h" // _Py_ID()
#endif
#include "pycore_modsupport.h" // _PyArg_UnpackKeywords()
+#include "pycore_tuple.h" // _PyTuple_FromArray()
PyDoc_STRVAR(builtin___import____doc__,
"__import__($module, /, name, globals=None, locals=None, fromlist=(),\n"
@@ -933,7 +934,8 @@ builtin_print(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
- PyObject *argsbuf[5];
+ PyObject *argsbuf[4];
+ PyObject * const *fastargs;
Py_ssize_t noptargs = 0 + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
PyObject *__clinic_args = NULL;
PyObject *sep = Py_None;
@@ -941,41 +943,46 @@ builtin_print(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec
PyObject *file = Py_None;
int flush = 0;
- 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;
}
- if (args[1]) {
- sep = args[1];
+ if (fastargs[0]) {
+ sep = fastargs[0];
if (!--noptargs) {
goto skip_optional_kwonly;
}
}
- if (args[2]) {
- end = args[2];
+ if (fastargs[1]) {
+ end = fastargs[1];
if (!--noptargs) {
goto skip_optional_kwonly;
}
}
- if (args[3]) {
- file = args[3];
+ if (fastargs[2]) {
+ file = fastargs[2];
if (!--noptargs) {
goto skip_optional_kwonly;
}
}
- flush = PyObject_IsTrue(args[4]);
+ flush = PyObject_IsTrue(fastargs[3]);
if (flush < 0) {
goto exit;
}
skip_optional_kwonly:
+ __clinic_args = _PyTuple_FromArray(args, nargs);
+ if (__clinic_args == NULL) {
+ goto exit;
+ }
return_value = builtin_print_impl(module, __clinic_args, sep, end, file, flush);
exit:
+ /* Cleanup for args */
Py_XDECREF(__clinic_args);
+
return return_value;
}
@@ -1228,4 +1235,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
exit:
return return_value;
}
-/*[clinic end generated code: output=435d3f286a863c49 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=76b27cf4164f257e input=a9049054013a1b77]*/