@@ -2779,7 +2779,7 @@ class CConverter(metaclass=CConverterAutoRegister):
27792779 # Only used by the 'O!' format unit (and the "object" converter).
27802780 subclass_of : str | None = None
27812781
2782- # Do we want an adjacent '_length' variable for this variable?
2782+ # See also the 'length_name' property.
27832783 # Only used by format units ending with '#'.
27842784 length = False
27852785
@@ -2873,12 +2873,12 @@ def _render_self(self, parameter: Parameter, data: CRenderData) -> None:
28732873 s = ("&" if self .impl_by_reference else "" ) + name
28742874 data .impl_arguments .append (s )
28752875 if self .length :
2876- data .impl_arguments .append (self .length_name () )
2876+ data .impl_arguments .append (self .length_name )
28772877
28782878 # impl_parameters
28792879 data .impl_parameters .append (self .simple_declaration (by_reference = self .impl_by_reference ))
28802880 if self .length :
2881- data .impl_parameters .append ("Py_ssize_t " + self .length_name () )
2881+ data .impl_parameters .append (f "Py_ssize_t { self .length_name } " )
28822882
28832883 def _render_non_self (
28842884 self ,
@@ -2937,6 +2937,7 @@ def render(self, parameter: Parameter, data: CRenderData) -> None:
29372937 self ._render_self (parameter , data )
29382938 self ._render_non_self (parameter , data )
29392939
2940+ @functools .cached_property
29402941 def length_name (self ) -> str :
29412942 """Computes the name of the associated "length" variable."""
29422943 assert self .length is not None
@@ -2960,7 +2961,7 @@ def parse_argument(self, args: list[str]) -> None:
29602961 args .append (s )
29612962
29622963 if self .length :
2963- args .append ("&" + self .length_name () )
2964+ args .append (f"& { self .length_name } " )
29642965
29652966 #
29662967 # All the functions after here are intended as extension points.
@@ -3005,9 +3006,8 @@ def declaration(self, *, in_parser: bool = False) -> str:
30053006 declaration .append (default )
30063007 declaration .append (";" )
30073008 if self .length :
3008- declaration .append ('\n Py_ssize_t ' )
3009- declaration .append (self .length_name ())
3010- declaration .append (';' )
3009+ declaration .append ('\n ' )
3010+ declaration .append (f"Py_ssize_t { self .length_name } ;" )
30113011 return "" .join (declaration )
30123012
30133013 def initialize (self ) -> str :
@@ -3686,29 +3686,29 @@ def parse_arg(self, argname: str, displayname: str) -> str | None:
36863686 _PyArg_BadArgument("{{name}}", {displayname}, "str", {argname});
36873687 goto exit;
36883688 }}}}
3689- Py_ssize_t {paramname}_length ;
3690- {paramname} = PyUnicode_AsUTF8AndSize({argname}, &{paramname}_length );
3689+ Py_ssize_t {length_name} ;
3690+ {paramname} = PyUnicode_AsUTF8AndSize({argname}, &{length_name} );
36913691 if ({paramname} == NULL) {{{{
36923692 goto exit;
36933693 }}}}
3694- if (strlen({paramname}) != (size_t){paramname}_length ) {{{{
3694+ if (strlen({paramname}) != (size_t){length_name} ) {{{{
36953695 PyErr_SetString(PyExc_ValueError, "embedded null character");
36963696 goto exit;
36973697 }}}}
36983698 """ .format (argname = argname , paramname = self .parser_name ,
3699- displayname = displayname )
3699+ displayname = displayname , length_name = self . length_name )
37003700 if self .format_unit == 'z' :
37013701 return """
37023702 if ({argname} == Py_None) {{{{
37033703 {paramname} = NULL;
37043704 }}}}
37053705 else if (PyUnicode_Check({argname})) {{{{
3706- Py_ssize_t {paramname}_length ;
3707- {paramname} = PyUnicode_AsUTF8AndSize({argname}, &{paramname}_length );
3706+ Py_ssize_t {length_name} ;
3707+ {paramname} = PyUnicode_AsUTF8AndSize({argname}, &{length_name} );
37083708 if ({paramname} == NULL) {{{{
37093709 goto exit;
37103710 }}}}
3711- if (strlen({paramname}) != (size_t){paramname}_length ) {{{{
3711+ if (strlen({paramname}) != (size_t){length_name} ) {{{{
37123712 PyErr_SetString(PyExc_ValueError, "embedded null character");
37133713 goto exit;
37143714 }}}}
@@ -3718,7 +3718,7 @@ def parse_arg(self, argname: str, displayname: str) -> str | None:
37183718 goto exit;
37193719 }}}}
37203720 """ .format (argname = argname , paramname = self .parser_name ,
3721- displayname = displayname )
3721+ displayname = displayname , length_name = self . length_name )
37223722 return super ().parse_arg (argname , displayname )
37233723
37243724#
0 commit comments