Skip to content

Commit

Permalink
pythongh-116646, AC: Add CConverter.use_converter() method (python#11…
Browse files Browse the repository at this point in the history
…6793)

Only add includes when the converter is effectively used.
  • Loading branch information
vstinner authored and diegorusso committed Apr 17, 2024
1 parent 7b31a9a commit 888f529
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 8 deletions.
3 changes: 1 addition & 2 deletions Modules/clinic/_ssl.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 35 additions & 6 deletions Tools/clinic/clinic.py
Expand Up @@ -884,6 +884,7 @@ def parser_body(
displayname = parameters[0].get_displayname(0)
parsearg = converters[0].parse_arg(argname, displayname, limited_capi=limited_capi)
if parsearg is None:
converters[0].use_converter()
parsearg = """
if (!PyArg_Parse(%s, "{format_units}:{name}", {parse_arguments})) {{
goto exit;
Expand Down Expand Up @@ -1016,6 +1017,9 @@ def parser_body(
if has_optional:
parser_code.append("skip_optional:")
else:
for parameter in parameters:
parameter.converter.use_converter()

if limited_capi:
fastcall = False
if fastcall:
Expand Down Expand Up @@ -1184,6 +1188,9 @@ def parser_body(
if add_label:
parser_code.append("%s:" % add_label)
else:
for parameter in parameters:
parameter.converter.use_converter()

declarations = declare_parser(f, clinic=clinic,
hasformat=True,
limited_capi=limited_capi)
Expand Down Expand Up @@ -3155,8 +3162,13 @@ def format_code(self, fmt: str, *,
fmt = fmt.replace('{bad_argument2}', bad_argument2)
return fmt.format(argname=argname, paramname=self.parser_name, **kwargs)

def use_converter(self) -> None:
"""Method called when self.converter is used to parse an argument."""
pass

def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'O&':
self.use_converter()
return self.format_code("""
if (!{converter}({argname}, &{paramname})) {{{{
goto exit;
Expand Down Expand Up @@ -3435,6 +3447,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
self.format_unit = 'H'
else:
self.converter = '_PyLong_UnsignedShort_Converter'

def use_converter(self) -> None:
if self.converter == '_PyLong_UnsignedShort_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedShort_Converter()')

Expand Down Expand Up @@ -3519,6 +3534,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
self.format_unit = 'I'
else:
self.converter = '_PyLong_UnsignedInt_Converter'

def use_converter(self) -> None:
if self.converter == '_PyLong_UnsignedInt_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedInt_Converter()')

Expand Down Expand Up @@ -3577,6 +3595,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
self.format_unit = 'k'
else:
self.converter = '_PyLong_UnsignedLong_Converter'

def use_converter(self) -> None:
if self.converter == '_PyLong_UnsignedLong_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedLong_Converter()')

Expand Down Expand Up @@ -3630,6 +3651,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
self.format_unit = 'K'
else:
self.converter = '_PyLong_UnsignedLongLong_Converter'

def use_converter(self) -> None:
if self.converter == '_PyLong_UnsignedLongLong_Converter':
self.add_include('pycore_long.h',
'_PyLong_UnsignedLongLong_Converter()')

Expand Down Expand Up @@ -3664,20 +3688,23 @@ def converter_init(self, *, accept: TypeSet = {int}) -> None:
if accept == {int}:
self.format_unit = 'n'
self.default_type = int
self.add_include('pycore_abstract.h', '_PyNumber_Index()')
elif accept == {int, NoneType}:
self.converter = '_Py_convert_optional_to_ssize_t'
self.add_include('pycore_abstract.h',
'_Py_convert_optional_to_ssize_t()')
else:
fail(f"Py_ssize_t_converter: illegal 'accept' argument {accept!r}")

def use_converter(self) -> None:
if self.converter == '_Py_convert_optional_to_ssize_t':
self.add_include('pycore_abstract.h',
'_Py_convert_optional_to_ssize_t()')

def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'n':
if limited_capi:
PyNumber_Index = 'PyNumber_Index'
else:
PyNumber_Index = '_PyNumber_Index'
self.add_include('pycore_abstract.h', '_PyNumber_Index()')
return self.format_code("""
{{{{
Py_ssize_t ival = -1;
Expand Down Expand Up @@ -3771,7 +3798,7 @@ class size_t_converter(CConverter):
converter = '_PyLong_Size_t_Converter'
c_ignored_default = "0"

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

Expand Down Expand Up @@ -3800,6 +3827,10 @@ class fildes_converter(CConverter):
type = 'int'
converter = '_PyLong_FileDescriptor_Converter'

def use_converter(self) -> None:
self.add_include('pycore_fileutils.h',
'_PyLong_FileDescriptor_Converter()')

def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if limited_capi:
return self.format_code("""
Expand All @@ -3810,8 +3841,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
""",
argname=argname)
else:
self.add_include('pycore_fileutils.h',
'_PyLong_FileDescriptor_Converter()')
return super().parse_arg(argname, displayname, limited_capi=limited_capi)


Expand Down

0 comments on commit 888f529

Please sign in to comment.