Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
Argument Clinic return converters no longer need to hardcode the name of the
variable returned by the parsing function.
It is now available as ``data.parser_retval``.
7 changes: 4 additions & 3 deletions PC/msvcrtmodule.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -65,17 +65,18 @@ class byte_char_return_converter(CReturnConverter):
data.declarations.append('char s[1];')
data.return_value = 's[0]'
data.return_conversion.append(
'return_value = PyBytes_FromStringAndSize(s, 1);\n')
f'{data.parser_retval} = PyBytes_FromStringAndSize(s, 1);\n')

class wchar_t_return_converter(CReturnConverter):
type = 'wchar_t'

def render(self, function, data):
self.declare(data)
data.return_conversion.append(
'return_value = PyUnicode_FromOrdinal(_return_value);\n')
f'{data.parser_retval} = '
f'PyUnicode_FromOrdinal({data.converter_retval});\n')
[python start generated code]*/
/*[python end generated code: output=da39a3ee5e6b4b0d input=ff031be44ab3250d]*/
/*[python end generated code: output=da39a3ee5e6b4b0d input=ed7a4a045a6d0496]*/

/*[clinic input]
module msvcrt
Expand Down
1 change: 1 addition & 0 deletions Tools/clinic/libclinic/clanguage.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -525,6 +525,7 @@ def render_function(
template_dict['cleanup'] = libclinic.format_escape("".join(data.cleanup))

template_dict['return_value'] = data.return_value
template_dict['parser_retval'] = data.parser_retval
template_dict['lock'] = "\n".join(data.lock)
template_dict['unlock'] = "\n".join(data.unlock)

Expand Down
7 changes: 5 additions & 2 deletions Tools/clinic/libclinic/codegen.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -47,14 +47,17 @@ def __init__(self) -> None:
# The arguments to the impl function at the time it's called.
self.impl_arguments: list[str] = []

# The name of the variable which is returned by the parser.
self.parser_retval = "return_value"

# For return converters: the name of the variable that
# should receive the value returned by the impl.
self.return_value = "return_value"

# For return converters: the code to convert the return
# value from the parse function. This is also where
# you should check the _return_value for errors, and
# "goto exit" if there are any.
# you should check the value returned by the impl for errors,
# and "goto exit" if there are any.
self.return_conversion: list[str] = []
self.converter_retval = "_return_value"

Expand Down
8 changes: 4 additions & 4 deletions Tools/clinic/libclinic/parse_args.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -319,7 +319,7 @@ def select_prototypes(self) -> None:
self.docstring_prototype=''
self.docstring_definition=''
self.methoddef_define=METHODDEF_PROTOTYPE_DEFINE
self.return_value_declaration="PyObject *return_value = NULL;"
self.return_value_declaration="PyObject *{parser_retval} = NULL;"

ifself.is_new_or_init() andnotself.func.docstring:
pass
Expand All@@ -330,7 +330,7 @@ def select_prototypes(self) -> None:
elifself.func.kindisSETTER:
ifself.func.docstring:
fail("docstrings are only supported for @getter, not @setter")
self.return_value_declaration="int {return_value};"
self.return_value_declaration="int {parser_retval};"
self.methoddef_define=SETTERDEF_PROTOTYPE_DEFINE
else:
self.docstring_prototype=DOCSTRING_PROTOTYPE_VAR
Expand DownExpand Up@@ -371,7 +371,7 @@ def parser_body(
{exit_label}
{cleanup}
return return_value;
return {parser_retval};
}}
""")
forfieldinpreamble, *fields, finale:
Expand DownExpand Up@@ -860,7 +860,7 @@ def handle_new_or_init(self) -> None:
ifself.func.kindisMETHOD_NEW:
self.parser_prototype=PARSER_PROTOTYPE_KEYWORD
else:
self.return_value_declaration="int return_value = -1;"
self.return_value_declaration="int {parser_retval} = -1;"
self.parser_prototype=PARSER_PROTOTYPE_KEYWORD___INIT__

fields: list[str] =list(self.parser_body_fields)
Expand Down
9 changes: 6 additions & 3 deletions Tools/clinic/libclinic/return_converters.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -110,7 +110,8 @@ def render(self, function: Function, data: CRenderData) -> None:
self.declare(data)
self.err_occurred_if(f"{data.converter_retval} == -1", data)
data.return_conversion.append(
f'return_value = PyBool_FromLong((long){data.converter_retval});\n'
f'{data.parser_retval} = '
f'PyBool_FromLong((long){data.converter_retval});\n'
)


Expand All@@ -124,7 +125,8 @@ def render(self, function: Function, data: CRenderData) -> None:
self.declare(data)
self.err_occurred_if(f"{data.converter_retval} == {self.unsigned_cast}-1", data)
data.return_conversion.append(
f'return_value = {self.conversion_fn}({self.cast}{data.converter_retval});\n'
f'{data.parser_retval} = '
f'{self.conversion_fn}({self.cast}{data.converter_retval});\n'
)


Expand DownExpand Up@@ -164,7 +166,8 @@ def render(self, function: Function, data: CRenderData) -> None:
self.declare(data)
self.err_occurred_if(f"{data.converter_retval} == -1.0", data)
data.return_conversion.append(
f'return_value = PyFloat_FromDouble({self.cast}{data.converter_retval});\n'
f'{data.parser_retval} = '
f'PyFloat_FromDouble({self.cast}{data.converter_retval});\n'
)


Expand Down
Loading