mirror of
https://github.com/python/cpython.git
synced 2026-04-14 07:41:00 +00:00
Add PyArg_ParseArray() and PyArg_ParseArrayAndKeywords() functions to parse arguments of functions using the METH_FASTCALL calling convention. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
#include "parts.h"
|
|
|
|
|
|
|
|
static PyObject *
|
|
pyabiinfo_check(PyObject *Py_UNUSED(module), PyObject *args)
|
|
{
|
|
const char *modname;
|
|
unsigned long maj, min, flags, buildver, abiver;
|
|
|
|
if (!PyArg_ParseTuple(args, "zkkkkk",
|
|
&modname, &maj, &min, &flags, &buildver, &abiver))
|
|
{
|
|
return NULL;
|
|
}
|
|
PyABIInfo info = {
|
|
.abiinfo_major_version = (uint8_t)maj,
|
|
.abiinfo_minor_version = (uint8_t)min,
|
|
.flags = (uint16_t)flags,
|
|
.build_version = (uint32_t)buildver,
|
|
.abi_version = (uint32_t)abiver};
|
|
if (PyABIInfo_Check(&info, modname) < 0) {
|
|
return NULL;
|
|
}
|
|
Py_RETURN_NONE;
|
|
}
|
|
|
|
static PyObject *
|
|
pyarg_parsearray(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
|
|
{
|
|
int a, b, c = 0;
|
|
if (!PyArg_ParseArray(args, nargs, "ii|i", &a, &b, &c)) {
|
|
return NULL;
|
|
}
|
|
return Py_BuildValue("iii", a, b, c);
|
|
}
|
|
|
|
static PyObject *
|
|
pyarg_parsearrayandkeywords(PyObject* self, PyObject* const* args,
|
|
Py_ssize_t nargs, PyObject* kwnames)
|
|
{
|
|
int a, b, c = 0;
|
|
const char *kwlist[] = {"a", "b", "c", NULL};
|
|
if (!PyArg_ParseArrayAndKeywords(args, nargs, kwnames,
|
|
"ii|i", kwlist,
|
|
&a, &b, &c)) {
|
|
return NULL;
|
|
}
|
|
return Py_BuildValue("iii", a, b, c);
|
|
}
|
|
|
|
static PyMethodDef TestMethods[] = {
|
|
{"pyabiinfo_check", pyabiinfo_check, METH_VARARGS},
|
|
{"pyarg_parsearray", _PyCFunction_CAST(pyarg_parsearray), METH_FASTCALL},
|
|
{"pyarg_parsearrayandkeywords",
|
|
_PyCFunction_CAST(pyarg_parsearrayandkeywords),
|
|
METH_FASTCALL | METH_KEYWORDS},
|
|
{NULL},
|
|
};
|
|
|
|
int
|
|
_PyTestCapi_Init_Modsupport(PyObject *m)
|
|
{
|
|
if (PyModule_AddIntMacro(m, PyABIInfo_STABLE) < 0) {
|
|
return -1;
|
|
}
|
|
if (PyModule_AddIntMacro(m, PyABIInfo_INTERNAL) < 0) {
|
|
return -1;
|
|
}
|
|
if (PyModule_AddIntMacro(m, PyABIInfo_GIL) < 0) {
|
|
return -1;
|
|
}
|
|
if (PyModule_AddIntMacro(m, PyABIInfo_FREETHREADED) < 0) {
|
|
return -1;
|
|
}
|
|
if (PyModule_AddIntMacro(m, PyABIInfo_FREETHREADING_AGNOSTIC) < 0) {
|
|
return -1;
|
|
}
|
|
if (PyModule_AddFunctions(m, TestMethods) < 0) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|