diff --git a/mypyc/codegen/literals.py b/mypyc/codegen/literals.py index 4cd41e0f4d32..9d69e1f2aeb3 100644 --- a/mypyc/codegen/literals.py +++ b/mypyc/codegen/literals.py @@ -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]