Skip to content

Commit 321f0f7

Browse files
gh-104683: Argument Clinic: Use CConverter.length_name where possible (#107638)
Also make it a cached property. Co-authored-by: Alex Waygood <[email protected]>
1 parent 400835e commit 321f0f7

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

Tools/clinic/clinic.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -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('\nPy_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

Comments
 (0)