From dc36801f7c621d02350ef5c652d6dfa8d6f9aef7 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 7 Jul 2022 13:26:21 +0200 Subject: [3.10] gh-94430: Allow params named `module` or `self` with custom C names in AC (GH-94431) (#94650) (cherry picked from commit 8bbd70b4d130f060f87e3f53810dc747a49fa369) Co-authored-by: Erlend Egeberg Aasland --- Lib/test/clinic.test | 41 ++++++++++++++++++++++ .../2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst | 2 ++ Tools/clinic/clinic.py | 9 +++-- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test index 07e1382..0f5c651 100644 --- a/Lib/test/clinic.test +++ b/Lib/test/clinic.test @@ -3308,3 +3308,44 @@ test_preprocessor_guarded_else(PyObject *module, PyObject *Py_UNUSED(ignored)) #define TEST_PREPROCESSOR_GUARDED_ELSE_METHODDEF #endif /* !defined(TEST_PREPROCESSOR_GUARDED_ELSE_METHODDEF) */ /*[clinic end generated code: output=3804bb18d454038c input=3fc80c9989d2f2e1]*/ + +/*[clinic input] +test_paramname_module + + module as mod: object +[clinic start generated code]*/ + +PyDoc_STRVAR(test_paramname_module__doc__, +"test_paramname_module($module, /, module)\n" +"--\n" +"\n"); + +#define TEST_PARAMNAME_MODULE_METHODDEF \ + {"test_paramname_module", (PyCFunction)(void(*)(void))test_paramname_module, METH_FASTCALL|METH_KEYWORDS, test_paramname_module__doc__}, + +static PyObject * +test_paramname_module_impl(PyObject *module, PyObject *mod); + +static PyObject * +test_paramname_module(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"module", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_paramname_module", 0}; + PyObject *argsbuf[1]; + PyObject *mod; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + mod = args[0]; + return_value = test_paramname_module_impl(module, mod); + +exit: + return return_value; +} + +static PyObject * +test_paramname_module_impl(PyObject *module, PyObject *mod) +/*[clinic end generated code: output=2a6769d34d1b2be0 input=afefe259667f13ba]*/ diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst b/Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst new file mode 100644 index 0000000..88aa8d0 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst @@ -0,0 +1,2 @@ +Allow parameters named ``module`` and ``self`` with custom C names in Argument +Clinic. Patch by Erlend E. Aasland diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 8deea13..1ad9807 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -4626,9 +4626,14 @@ class DSLParser: p = Parameter(parameter_name, kind, function=self.function, converter=converter, default=value, group=self.group) - if parameter_name in self.function.parameters: + names = [k.name for k in self.function.parameters.values()] + if parameter_name in names[1:]: fail("You can't have two parameters named " + repr(parameter_name) + "!") - self.function.parameters[parameter_name] = p + elif names and parameter_name == names[0] and c_name is None: + fail(f"Parameter '{parameter_name}' requires a custom C name") + + key = f"{parameter_name}_as_{c_name}" if c_name else parameter_name + self.function.parameters[key] = p def parse_converter(self, annotation): if (hasattr(ast, 'Constant') and -- cgit v0.12