Skip to content
Merged
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
16 changes: 8 additions & 8 deletions loopy/translation_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,14 +373,14 @@ def __setstate__(self, state_obj):
self._program_executor_cache = {}

def __hash__(self):
if self._hash_value is not None:
return self._hash_value

from loopy.tools import LoopyKeyBuilder
from pytools.persistent_dict import new_hash
key_hash = new_hash()
self.update_persistent_hash(key_hash, LoopyKeyBuilder())
self._hash_value = hash(key_hash.digest())
# NOTE: _hash_value may vanish during pickling
if getattr(self, "_hash_value", None) is None:
from loopy.tools import LoopyKeyBuilder
from pytools.persistent_dict import new_hash
key_hash = new_hash()
self.update_persistent_hash(key_hash, LoopyKeyBuilder())
self._hash_value = hash(key_hash.digest())

return self._hash_value

# }}}
Expand Down
13 changes: 13 additions & 0 deletions test/test_loopy.py
Original file line number Diff line number Diff line change
Expand Up @@ -3350,6 +3350,19 @@ def test_different_index_dtypes():
lp.generate_code_v2(knl)


def test_translation_unit_pickle():
tunit = lp.make_kernel(
"{[i]: 0<=i<16}",
"""
y[i] = i
""")
assert isinstance(hash(tunit), int)

from pickle import dumps, loads
tunit = loads(dumps(tunit))
assert isinstance(hash(tunit), int)


if __name__ == "__main__":
if len(sys.argv) > 1:
exec(sys.argv[1])
Expand Down