8000 gh-116646, AC: Add CConverter.use_converter() method (#116793) · python/cpython@2a54c4b · GitHub
[go: up one dir, main page]

Skip to content

Commit 2a54c4b

Browse files
authored
gh-116646, AC: Add CConverter.use_converter() method (#116793)
Only add includes when the converter is effectively used.
1 parent 97b80af commit 2a54c4b

File tree

2 files changed

+36
-8
lines changed
< 8000 div role="slider" aria-label="Draggable pane splitter" aria-valuemin="0" aria-valuemax="0" aria-valuenow="0" aria-valuetext="Pane width 0 pixels" tabindex="0" class="Box-sc-g0xbh4-0 bHLmSv">

2 files changed

+36
-8
lines changed

Modules/clinic/_ssl.c.h

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/clinic/clinic.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,7 @@ def parser_body(
884884
displayname = parameters[0].get_displayname(0)
885885
parsearg = converters[0].parse_arg(argname, displayname, limited_capi=limited_capi)
886886
if parsearg is None:
887+
converters[0].use_converter()
887888
parsearg = """
888889
if (!PyArg_Parse(%s, "{format_units}:{name}", {parse_arguments})) {{
889890
goto exit;
@@ -1016,6 +1017,9 @@ def parser_body(
10161017
if has_optional:
10171018
parser_code.append("skip_optional:")
10181019
else:
1020+
for parameter in parameters:
1021+
parameter.converter.use_converter()
1022+
10191023
if limited_capi:
10201024
fastcall = False
10211025
if fastcall:
@@ -1184,6 +1188,9 @@ def parser_body(
11841188
if add_label:
11851189
parser_code.append("%s:" % add_label)
11861190
else:
1191+
for parameter in parameters:
1192+
parameter.converter.use_converter()
1193+
11871194
declarations = declare_parser(f, clinic=clinic,
11881195
hasformat=True,
11891196
limited_capi=limited_capi)
@@ -3155,8 +3162,13 @@ def format_code(self, fmt: str, *,
31553162
fmt = fmt.replace('{bad_argument2}', bad_argument2)
315631 8000 63
return fmt.format(argname=argname, paramname=self.parser_name, **kwargs)
31573164

3165+
def use_converter(self) -> None:
3166+
"""Method called when self.converter is used to parse an argument."""
3167+
pass
3168+
31583169
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
31593170
if self.format_unit == 'O&':
3171+
self.use_converter()
31603172
return self.format_code("""
31613173
if (!{converter}({argname}, &{paramname})) {{{{
31623174
goto exit;
@@ -3435,6 +3447,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
34353447
self.format_unit = 'H'
34363448
else:
34373449
self.converter = '_PyLong_UnsignedShort_Converter'
3450+
3451+
def use_converter(self) -> None:
3452+
if self.converter == '_PyLong_UnsignedShort_Converter':
34383453
self.add_include('pycore_long.h',
34393454
'_PyLong_UnsignedShort_Converter()')
34403455

@@ -3519,6 +3534,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
35193534
self.format_unit = 'I'
35203535
else:
35213536
self.converter = '_PyLong_UnsignedInt_Converter'
3537+
3538+
def use_converter(self) -> None:
3539+
if self.converter == '_PyLong_UnsignedInt_Converter':
35223540
self.add_include('pycore_long.h',
35233541
'_PyLong_UnsignedInt_Converter()')
35243542

@@ -3577,6 +3595,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
35773595
self.format_unit = 'k'
35783596
else:
35793597
self.converter = '_PyLong_UnsignedLong_Converter'
3598+
3599+
def use_converter(self) -> None:
3600+
if self.converter == '_PyLong_UnsignedLong_Converter':
35803601
self.add_include('pycore_long.h',
35813602
'_PyLong_UnsignedLong_Converter()')
35823603

@@ -3630,6 +3651,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
36303651
self.format_unit = 'K'
36313652
else:
36323653
self.converter = '_PyLong_UnsignedLongLong_Converter'
3654+
3655+
def use_converter(self) -> None:
3656+
if self.converter == '_PyLong_UnsignedLongLong_Converter':
36333657
self.add_include('pycore_long.h',
36343658
'_PyLong_UnsignedLongLong_Converter()')
36353659

@@ -3664,20 +3688,23 @@ def converter_init(self, *, accept: TypeSet = {int}) -> None:
36643688
if accept == {int}:
36653689
self.format_unit = 'n'
36663690
self.default_type = int
3667-
self.add_include('pycore_abstract.h', '_PyNumber_Index()')
36683691
elif accept == {int, NoneType}:
36693692
self.converter = '_Py_convert_optional_to_ssize_t'
3670-
self.add_include('pycore_abstract.h',
3671-
'_Py_convert_optional_to_ssize_t()')
36723693
else:
36733694
fail(f"Py_ssize_t_converter: illegal 'accept' argument {accept!r}")
36743695

3696+
def use_converter(self) -> None:
3697+
if self.converter == '_Py_convert_optional_to_ssize_t':
3698+
self.add_include('pycore_abstract.h',
3699+
'_Py_convert_optional_to_ssize_t()')
3700+
36753701
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
36763702
if self.format_unit == 'n':
36773703
if limited_capi:
36783704
PyNumber_Index = 'PyNumber_Index'
36793705
else:
36803706
PyNumber_Index = '_PyNumber_Index'
3707+
self.add_include('pycore_abstract.h', '_PyNumber_Index()')
36813708
return self.format_code("""
36823709
{{{{
36833710
Py_ssize_t ival = -1;
@@ -3771,7 +3798,7 @@ class size_t_converter(CConverter):
37713798
converter = '_PyLong_Size_t_Converter'
37723799
c_ignored_default = "0"
37733800

3774-
def converter_init(self, *, accept: TypeSet = {int, NoneType}) -> None:
3801+
def use_converter(self) -> None:
37753802
self.add_include('pycore_long.h',
37763803
'_PyLong_Size_t_Converter()')
37773804

@@ -3800,6 +3827,10 @@ class fildes_converter(CConverter):
38003827
type = 'int'
38013828
converter = '_PyLong_FileDescriptor_Converter'
38023829

3830+
def use_converter(self) -> None:
3831+
self.add_include('pycore_fileutils.h',
3832+
'_PyLong_FileDescriptor_Converter()')
3833+
38033834
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
38043835
if limited_capi:
38053836
return self.format_code("""
@@ -3810,8 +3841,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
38103841
""",
38113842
argname=argname)
38123843
else:
3813-
self.add_include('pycore_fileutils.h',
3814-
'_PyLong_FileDescriptor_Converter()')
38153844
return super().parse_arg(argname, displayname, limited_capi=limited_capi)
38163845

38173846

0 commit comments

Comments
 (0)
0