https://github.com/python/cpython/commit/2a54c4b25e05e30c50b915302fa846dd0d4e018b
commit: 2a54c4b25e05e30c50b915302fa846dd0d4e018b
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2024-03-14T13:57:02+01:00
summary:

gh-116646, AC: Add CConverter.use_converter() method (#116793)

Only add includes when the converter is effectively used.

files:
M Modules/clinic/_ssl.c.h
M Tools/clinic/clinic.py

diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h
index 2940f16a2cb7f6..e8d1342ed35e66 100644
--- a/Modules/clinic/_ssl.c.h
+++ b/Modules/clinic/_ssl.c.h
@@ -6,7 +6,6 @@ preserve
 #  include "pycore_gc.h"          // PyGC_Head
 #  include "pycore_runtime.h"     // _Py_ID()
 #endif
-#include "pycore_abstract.h"      // _PyNumber_Index()
 #include "pycore_modsupport.h"    // _PyArg_CheckPositional()
 
 PyDoc_STRVAR(_ssl__SSLSocket_do_handshake__doc__,
@@ -1664,4 +1663,4 @@ _ssl_enum_crls(PyObject *module, PyObject *const *args, 
Py_ssize_t nargs, PyObje
 #ifndef _SSL_ENUM_CRLS_METHODDEF
     #define _SSL_ENUM_CRLS_METHODDEF
 #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */
-/*[clinic end generated code: output=fd1c3378fbba5240 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=28a22f2b09d631cb input=a9049054013a1b77]*/
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index c81af5e696e924..21ec6cf7650a37 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -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;
@@ -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:
@@ -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)
@@ -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;
@@ -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()')
 
@@ -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()')
 
@@ -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()')
 
@@ -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()')
 
@@ -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;
@@ -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()')
 
@@ -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("""
@@ -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)
 
 

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to