summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-08-25 21:22:08 (GMT)
committerGitHub <noreply@github.com>2023-08-25 21:22:08 (GMT)
commit1dd951097728d735d46a602fc43285d35b7b32cb (patch)
tree5becd43c129047a61de332ffb60994a4a2b20fbe /Modules
parent4eae1e53425d3a816a26760f28d128a4f05c1da4 (diff)
downloadcpython-1dd951097728d735d46a602fc43285d35b7b32cb.zip
cpython-1dd951097728d735d46a602fc43285d35b7b32cb.tar.gz
cpython-1dd951097728d735d46a602fc43285d35b7b32cb.tar.bz2
gh-108494: Argument Clinic partial supports of Limited C API (#108495)
Argument Clinic now has a partial support of the Limited API: * Add --limited option to clinic.c. * Add '_testclinic_limited' extension which is built with the limited C API version 3.13. * For now, hardcode in clinic.py that "_testclinic_limited.c" targets the limited C API.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/Setup.stdlib.in1
-rw-r--r--Modules/_testclinic_limited.c69
-rw-r--r--Modules/clinic/_testclinic_limited.c.h53
3 files changed, 123 insertions, 0 deletions
diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in
index 689f1d4..6ed8495 100644
--- a/Modules/Setup.stdlib.in
+++ b/Modules/Setup.stdlib.in
@@ -161,6 +161,7 @@
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/abstract.c _testcapi/unicode.c _testcapi/dict.c _testcapi/getargs.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/buffer.c _testcapi/pyos.c _testcapi/immortal.c _testcapi/heaptype_relative.c _testcapi/gc.c
@MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c
+@MODULE__TESTCLINIC_TRUE@_testclinic_limited _testclinic_limited.c
# Some testing modules MUST be built as shared libraries.
*shared*
diff --git a/Modules/_testclinic_limited.c b/Modules/_testclinic_limited.c
new file mode 100644
index 0000000..6dd2745
--- /dev/null
+++ b/Modules/_testclinic_limited.c
@@ -0,0 +1,69 @@
+// For now, only limited C API 3.13 is supported
+#define Py_LIMITED_API 0x030d0000
+
+/* Always enable assertions */
+#undef NDEBUG
+
+#include "Python.h"
+
+
+#include "clinic/_testclinic_limited.c.h"
+
+
+/*[clinic input]
+module _testclinic_limited
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=dd408149a4fc0dbb]*/
+
+
+/*[clinic input]
+test_empty_function
+
+[clinic start generated code]*/
+
+static PyObject *
+test_empty_function_impl(PyObject *module)
+/*[clinic end generated code: output=0f8aeb3ddced55cb input=0dd7048651ad4ae4]*/
+{
+ Py_RETURN_NONE;
+}
+
+
+/*[clinic input]
+my_int_func -> int
+
+ arg: int
+ /
+
+[clinic start generated code]*/
+
+static int
+my_int_func_impl(PyObject *module, int arg)
+/*[clinic end generated code: output=761cd54582f10e4f input=16eb8bba71d82740]*/
+{
+ return arg;
+}
+
+
+static PyMethodDef tester_methods[] = {
+ TEST_EMPTY_FUNCTION_METHODDEF
+ MY_INT_FUNC_METHODDEF
+ {NULL, NULL}
+};
+
+static struct PyModuleDef _testclinic_module = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "_testclinic_limited",
+ .m_size = 0,
+ .m_methods = tester_methods,
+};
+
+PyMODINIT_FUNC
+PyInit__testclinic_limited(void)
+{
+ PyObject *m = PyModule_Create(&_testclinic_module);
+ if (m == NULL) {
+ return NULL;
+ }
+ return m;
+}
diff --git a/Modules/clinic/_testclinic_limited.c.h b/Modules/clinic/_testclinic_limited.c.h
new file mode 100644
index 0000000..730e967
--- /dev/null
+++ b/Modules/clinic/_testclinic_limited.c.h
@@ -0,0 +1,53 @@
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+PyDoc_STRVAR(test_empty_function__doc__,
+"test_empty_function($module, /)\n"
+"--\n"
+"\n");
+
+#define TEST_EMPTY_FUNCTION_METHODDEF \
+ {"test_empty_function", (PyCFunction)test_empty_function, METH_NOARGS, test_empty_function__doc__},
+
+static PyObject *
+test_empty_function_impl(PyObject *module);
+
+static PyObject *
+test_empty_function(PyObject *module, PyObject *Py_UNUSED(ignored))
+{
+ return test_empty_function_impl(module);
+}
+
+PyDoc_STRVAR(my_int_func__doc__,
+"my_int_func($module, arg, /)\n"
+"--\n"
+"\n");
+
+#define MY_INT_FUNC_METHODDEF \
+ {"my_int_func", (PyCFunction)my_int_func, METH_O, my_int_func__doc__},
+
+static int
+my_int_func_impl(PyObject *module, int arg);
+
+static PyObject *
+my_int_func(PyObject *module, PyObject *arg_)
+{
+ PyObject *return_value = NULL;
+ int arg;
+ int _return_value;
+
+ arg = PyLong_AsInt(arg_);
+ if (arg == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ _return_value = my_int_func_impl(module, arg);
+ if ((_return_value == -1) && PyErr_Occurred()) {
+ goto exit;
+ }
+ return_value = PyLong_FromLong((long)_return_value);
+
+exit:
+ return return_value;
+}
+/*[clinic end generated code: output=07e2e8ed6923cd16 input=a9049054013a1b77]*/