From f6f3b19780976f385cfa9e03e65a0c7b52305880 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 28 Aug 2023 18:44:21 +0200 Subject: [PATCH 1/2] gh-108494: Argument Clinic: fix option group for Limited C API Use PyTuple_Size() instead of PyTuple_GET_SIZE(). --- Tools/clinic/clinic.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 723592fa266c4c..2f7a0301d4ff87 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1664,8 +1664,9 @@ def group_to_variable_name(group: int) -> str: def render_option_group_parsing( self, + clinic: Clinic, f: Function, - template_dict: TemplateDict + template_dict: TemplateDict, ) -> None: # positional only, grouped, optional arguments! # can be optional on the left or right. @@ -1713,7 +1714,11 @@ def render_option_group_parsing( count_min = sys.maxsize count_max = -1 - add("switch (PyTuple_GET_SIZE(args)) {\n") + if clinic.limited_capi: + nargs = 'PyTuple_Size(args)' + else: + nargs = 'PyTuple_GET_SIZE(args)' + add(f"switch ({nargs}) {{\n") for subset in permute_optional_groups(left, required, right): count = len(subset) count_min = min(count_min, count) @@ -1870,7 +1875,7 @@ def render_function( template_dict['unpack_max'] = str(unpack_max) if has_option_groups: - self.render_option_group_parsing(f, template_dict) + self.render_option_group_parsing(clinic, f, template_dict) # buffers, not destination for name, destination in clinic.destination_buffers.items(): From 37e2667209ca42a3f0a66fadf61e83c94de48188 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 28 Aug 2023 22:45:22 +0200 Subject: [PATCH 2/2] pass limited_capi, not clinic --- Tools/clinic/clinic.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 2f7a0301d4ff87..0a942e4a584f70 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1664,9 +1664,9 @@ def group_to_variable_name(group: int) -> str: def render_option_group_parsing( self, - clinic: Clinic, f: Function, template_dict: TemplateDict, + limited_capi: bool, ) -> None: # positional only, grouped, optional arguments! # can be optional on the left or right. @@ -1714,7 +1714,7 @@ def render_option_group_parsing( count_min = sys.maxsize count_max = -1 - if clinic.limited_capi: + if limited_capi: nargs = 'PyTuple_Size(args)' else: nargs = 'PyTuple_GET_SIZE(args)' @@ -1875,7 +1875,8 @@ def render_function( template_dict['unpack_max'] = str(unpack_max) if has_option_groups: - self.render_option_group_parsing(clinic, f, template_dict) + self.render_option_group_parsing(f, template_dict, + limited_capi=clinic.limited_capi) # buffers, not destination for name, destination in clinic.destination_buffers.items():