xdrgen: Pass the containing struct name to member codec emitters

A per-member code generation directive keyed on the (struct, member)
pair needs the name of the containing struct, but
emit_struct_member_encoder() and emit_struct_member_decoder()
receive only the member declaration.

Pass the containing struct's name to emit_struct_member_encoder() and
emit_struct_member_decoder(), and to the matching emitters in
pointer.py, as a required argument. A struct whose last field refers
to its own type is an _XdrPointer rather than an _XdrStruct, so
pointer.py takes the same argument. No emitter renders the new value
yet, so generated output is byte-identical. A subsequent patch keys
the "pragma pages" encoder on it.

Acked-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20260908134234.512312-5-cel@kernel.org
Signed-off-by: Chuck Lever <cel@kernel.org>
This commit is contained in:
Chuck Lever 2026-09-08 09:42:28 -04:00
parent e679ac4bb8
commit d61e221c61
2 changed files with 16 additions and 8 deletions

View File

@ -91,7 +91,9 @@ def emit_pointer_definition(environment: Environment, node: _XdrPointer) -> None
def emit_pointer_member_decoder(
environment: Environment, field: _XdrDeclaration
environment: Environment,
field: _XdrDeclaration,
struct_name: str,
) -> None:
"""Emit a decoder for one field in an XDR pointer"""
if isinstance(field, _XdrBasic):
@ -164,14 +166,16 @@ def emit_pointer_decoder(environment: Environment, node: _XdrPointer) -> None:
print(template.render(name=node.name))
for field in node.fields[0:-1]:
emit_pointer_member_decoder(environment, field)
emit_pointer_member_decoder(environment, field, node.name)
template = get_jinja2_template(environment, "decoder", "close")
print(template.render())
def emit_pointer_member_encoder(
environment: Environment, field: _XdrDeclaration
environment: Environment,
field: _XdrDeclaration,
struct_name: str,
) -> None:
"""Emit an encoder for one field in a XDR pointer"""
if isinstance(field, _XdrBasic):
@ -241,7 +245,7 @@ def emit_pointer_encoder(environment: Environment, node: _XdrPointer) -> None:
print(template.render(name=node.name))
for field in node.fields[0:-1]:
emit_pointer_member_encoder(environment, field)
emit_pointer_member_encoder(environment, field, node.name)
template = get_jinja2_template(environment, "encoder", "close")
print(template.render())

View File

@ -91,7 +91,9 @@ def emit_struct_definition(environment: Environment, node: _XdrStruct) -> None:
def emit_struct_member_decoder(
environment: Environment, field: _XdrDeclaration
environment: Environment,
field: _XdrDeclaration,
struct_name: str,
) -> None:
"""Emit a decoder for one field in an XDR struct"""
if isinstance(field, _XdrBasic):
@ -164,14 +166,16 @@ def emit_struct_decoder(environment: Environment, node: _XdrStruct) -> None:
print(template.render(name=node.name))
for field in node.fields:
emit_struct_member_decoder(environment, field)
emit_struct_member_decoder(environment, field, node.name)
template = get_jinja2_template(environment, "decoder", "close")
print(template.render())
def emit_struct_member_encoder(
environment: Environment, field: _XdrDeclaration
environment: Environment,
field: _XdrDeclaration,
struct_name: str,
) -> None:
"""Emit an encoder for one field in an XDR struct"""
if isinstance(field, _XdrBasic):
@ -241,7 +245,7 @@ def emit_struct_encoder(environment: Environment, node: _XdrStruct) -> None:
print(template.render(name=node.name))
for field in node.fields:
emit_struct_member_encoder(environment, field)
emit_struct_member_encoder(environment, field, node.name)
template = get_jinja2_template(environment, "encoder", "close")
print(template.render())