diff options
Diffstat (limited to 'Tools/clinic/clinic.py')
-rwxr-xr-x | Tools/clinic/clinic.py | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 3d3ab4b..a6974bd 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -78,6 +78,7 @@ CLINIC_PREFIXED_ARGS = { "noptargs", "return_value", } +LIMITED_CAPI_REGEX = re.compile(r'#define +Py_LIMITED_API') class Sentinels(enum.Enum): @@ -1249,6 +1250,22 @@ class CLanguage(Language): parser_prototype = self.PARSER_PROTOTYPE_VARARGS parser_definition = parser_body(parser_prototype, ' {option_group_parsing}') + elif not requires_defining_class and pos_only == len(parameters) - pseudo_args and clinic.limited_capi: + # positional-only for the limited C API + flags = "METH_VARARGS" + + parser_prototype = self.PARSER_PROTOTYPE_VARARGS + parser_code = [normalize_snippet(""" + if (!PyArg_ParseTuple(args, "{format_units}:{name}", + {parse_arguments})) + goto exit; + """, indent=4)] + argname_fmt = 'args[%d]' + declarations = "" + + parser_definition = parser_body(parser_prototype, *parser_code, + declarations=declarations) + elif not requires_defining_class and pos_only == len(parameters) - pseudo_args: if not new_or_init: # positional-only, but no option groups @@ -2581,10 +2598,6 @@ def parse_file( ) -> None: verify = not ns.force limited_capi = ns.limited_capi - # XXX Temporary solution - if os.path.basename(filename) == '_testclinic_limited.c': - print(f"{filename} uses limited C API") - limited_capi = True if not output: output = filename @@ -2605,6 +2618,9 @@ def parse_file( if not find_start_re.search(raw): return + if LIMITED_CAPI_REGEX.search(raw): + limited_capi = True + assert isinstance(language, CLanguage) clinic = Clinic(language, verify=verify, |