Skip to content

Commit

Permalink
gh-104683: Argument Clinic: Use CConverter.length_name where possible (
Browse files Browse the repository at this point in the history
…#107638)

Also make it a cached property.

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
  • Loading branch information
erlend-aasland and AlexWaygood authored Aug 4, 2023
1 parent 400835e commit 321f0f7
Showing 1 changed file with 15 additions and 15 deletions.
30 changes: 15 additions & 15 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -2779,7 +2779,7 @@ class CConverter(metaclass=CConverterAutoRegister):
# Only used by the 'O!' format unit (and the "object" converter).
subclass_of: str | None = None

# Do we want an adjacent '_length' variable for this variable?
# See also the 'length_name' property.
# Only used by format units ending with '#'.
length = False

Expand Down Expand Up @@ -2873,12 +2873,12 @@ def _render_self(self, parameter: Parameter, data: CRenderData) -> None:
s = ("&" if self.impl_by_reference else "") + name
data.impl_arguments.append(s)
if self.length:
data.impl_arguments.append(self.length_name())
data.impl_arguments.append(self.length_name)

# impl_parameters
data.impl_parameters.append(self.simple_declaration(by_reference=self.impl_by_reference))
if self.length:
data.impl_parameters.append("Py_ssize_t " + self.length_name())
data.impl_parameters.append(f"Py_ssize_t {self.length_name}")

def _render_non_self(
self,
Expand Down Expand Up @@ -2937,6 +2937,7 @@ def render(self, parameter: Parameter, data: CRenderData) -> None:
self._render_self(parameter, data)
self._render_non_self(parameter, data)

@functools.cached_property
def length_name(self) -> str:
"""Computes the name of the associated "length" variable."""
assert self.length is not None
Expand All @@ -2960,7 +2961,7 @@ def parse_argument(self, args: list[str]) -> None:
args.append(s)

if self.length:
args.append("&" + self.length_name())
args.append(f"&{self.length_name}")

#
# All the functions after here are intended as extension points.
Expand Down Expand Up @@ -3005,9 +3006,8 @@ def declaration(self, *, in_parser: bool = False) -> str:
declaration.append(default)
declaration.append(";")
if self.length:
declaration.append('\nPy_ssize_t ')
declaration.append(self.length_name())
declaration.append(';')
declaration.append('\n')
declaration.append(f"Py_ssize_t {self.length_name};")
return "".join(declaration)

def initialize(self) -> str:
Expand Down Expand Up @@ -3686,29 +3686,29 @@ def parse_arg(self, argname: str, displayname: str) -> str | None:
_PyArg_BadArgument("{{name}}", {displayname}, "str", {argname});
goto exit;
}}}}
Py_ssize_t {paramname}_length;
{paramname} = PyUnicode_AsUTF8AndSize({argname}, &{paramname}_length);
Py_ssize_t {length_name};
{paramname} = PyUnicode_AsUTF8AndSize({argname}, &{length_name});
if ({paramname} == NULL) {{{{
goto exit;
}}}}
if (strlen({paramname}) != (size_t){paramname}_length) {{{{
if (strlen({paramname}) != (size_t){length_name}) {{{{
PyErr_SetString(PyExc_ValueError, "embedded null character");
goto exit;
}}}}
""".format(argname=argname, paramname=self.parser_name,
displayname=displayname)
displayname=displayname, length_name=self.length_name)
if self.format_unit == 'z':
return """
if ({argname} == Py_None) {{{{
{paramname} = NULL;
}}}}
else if (PyUnicode_Check({argname})) {{{{
Py_ssize_t {paramname}_length;
{paramname} = PyUnicode_AsUTF8AndSize({argname}, &{paramname}_length);
Py_ssize_t {length_name};
{paramname} = PyUnicode_AsUTF8AndSize({argname}, &{length_name});
if ({paramname} == NULL) {{{{
goto exit;
}}}}
if (strlen({paramname}) != (size_t){paramname}_length) {{{{
if (strlen({paramname}) != (size_t){length_name}) {{{{
PyErr_SetString(PyExc_ValueError, "embedded null character");
goto exit;
}}}}
Expand All @@ -3718,7 +3718,7 @@ def parse_arg(self, argname: str, displayname: str) -> str | None:
goto exit;
}}}}
""".format(argname=argname, paramname=self.parser_name,
displayname=displayname)
displayname=displayname, length_name=self.length_name)
return super().parse_arg(argname, displayname)

#
Expand Down

0 comments on commit 321f0f7

Please sign in to comment.