Skip to content
17 changes: 16 additions & 1 deletion mypyc/codegen/literals.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,22 @@ def encoded_tuple_values(self) -> list[str]:
return self._encode_collection_values(self.tuple_literals)

def encoded_frozenset_values(self) -> list[str]:
return self._encode_collection_values(self.frozenset_literals)
def sort_frozenset_recursive(value: frozenset[object]) -> list[object]:
# even though frozensets are not sorted in python, we need to sort the items here
# to improve the determinism of the generated C file, making it easier to compare
# differences in the C files generated by different versions of your code.
sort_helper = {repr(v) + type(v).__name__: v for v in value}
items = []
for key in sorted(sort_helper):
v = sort_helper[key]
if isinstance(v, frozenset):
v = sort_frozenset_recursive(v)
items.append(v)
return items

return self._encode_collection_values(
{sort_frozenset_recursive(fr): i for fr, i in self.frozenset_literals.items()}
)

def _encode_collection_values(
self, values: dict[tuple[object, ...], int] | dict[frozenset[object], int]
Expand Down
Loading