Skip to content

Commit 509abfc

Browse files
committed
xdrgen: Prevent reordering of encoder and decoder functions
I noticed that "xdrgen source" reorders the procedure encoder and decoder functions every time it is run. I would prefer that the generated code be more deterministic: it enables a reader to better see exactly what has changed between runs of the tool. The problem is that Python sets are not ordered. I use a Python set to ensure that, when multiple procedures use a particular argument or result type, the encoder/decoder for that type is emitted only once. Sets aren't ordered, but I can use Python dictionaries for this purpose to ensure the procedure functions are always emitted in the same order if the .x file does not change. Signed-off-by: Chuck Lever <[email protected]>
1 parent fed8a17 commit 509abfc

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

tools/net/sunrpc/xdrgen/generators/program.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,20 @@ def emit_version_declarations(
3434
environment: Environment, program: str, version: _RpcVersion
3535
) -> None:
3636
"""Emit declarations for each RPC version's procedures"""
37-
arguments = set()
37+
arguments = dict.fromkeys([])
3838
for procedure in version.procedures:
3939
if procedure.name not in excluded_apis:
40-
arguments.add(procedure.argument.type_name)
40+
arguments[procedure.argument.type_name] = None
4141
if len(arguments) > 0:
4242
print("")
4343
template = environment.get_template("declaration/argument.j2")
4444
for argument in arguments:
4545
print(template.render(program=program, argument=argument))
4646

47-
results = set()
47+
results = dict.fromkeys([])
4848
for procedure in version.procedures:
4949
if procedure.name not in excluded_apis:
50-
results.add(procedure.result.type_name)
50+
results[procedure.result.type_name] = None
5151
if len(results) > 0:
5252
print("")
5353
template = environment.get_template("declaration/result.j2")
@@ -59,10 +59,10 @@ def emit_version_argument_decoders(
5959
environment: Environment, program: str, version: _RpcVersion
6060
) -> None:
6161
"""Emit server argument decoders for each RPC version's procedures"""
62-
arguments = set()
62+
arguments = dict.fromkeys([])
6363
for procedure in version.procedures:
6464
if procedure.name not in excluded_apis:
65-
arguments.add(procedure.argument.type_name)
65+
arguments[procedure.argument.type_name] = None
6666

6767
template = environment.get_template("decoder/argument.j2")
6868
for argument in arguments:
@@ -73,10 +73,10 @@ def emit_version_result_decoders(
7373
environment: Environment, program: str, version: _RpcVersion
7474
) -> None:
7575
"""Emit client result decoders for each RPC version's procedures"""
76-
results = set()
76+
results = dict.fromkeys([])
7777
for procedure in version.procedures:
7878
if procedure.name not in excluded_apis:
79-
results.add(procedure.result.type_name)
79+
results[procedure.result.type_name] = None
8080

8181
template = environment.get_template("decoder/result.j2")
8282
for result in results:
@@ -87,10 +87,10 @@ def emit_version_argument_encoders(
8787
environment: Environment, program: str, version: _RpcVersion
8888
) -> None:
8989
"""Emit client argument encoders for each RPC version's procedures"""
90-
arguments = set()
90+
arguments = dict.fromkeys([])
9191
for procedure in version.procedures:
9292
if procedure.name not in excluded_apis:
93-
arguments.add(procedure.argument.type_name)
93+
arguments[procedure.argument.type_name] = None
9494

9595
template = environment.get_template("encoder/argument.j2")
9696
for argument in arguments:
@@ -101,10 +101,10 @@ def emit_version_result_encoders(
101101
environment: Environment, program: str, version: _RpcVersion
102102
) -> None:
103103
"""Emit server result encoders for each RPC version's procedures"""
104-
results = set()
104+
results = dict.fromkeys([])
105105
for procedure in version.procedures:
106106
if procedure.name not in excluded_apis:
107-
results.add(procedure.result.type_name)
107+
results[procedure.result.type_name] = None
108108

109109
template = environment.get_template("encoder/result.j2")
110110
for result in results:

0 commit comments

Comments
 (0)