diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py index 13d8b10ea48367286e6bc1d435b5b09ed4c0be86..60131d8cfc52444b1f0175e0c062172d31a09eef 100644 --- a/pytools/persistent_dict.py +++ b/pytools/persistent_dict.py @@ -483,6 +483,9 @@ class KeyBuilder: def update_for_function(self, key_hash: Hash, key: Any) -> None: self.rec(key_hash, key.__module__ + key.__qualname__) + if key.__closure__: + self.rec(key_hash, tuple(c.cell_contents for c in key.__closure__)) + # }}} # }}} diff --git a/pytools/test/test_persistent_dict.py b/pytools/test/test_persistent_dict.py index 578b6addf9ba767a521af0e11dd361e5e0ddd0b3..884d926ebe452c068d6c1e4d6830319336874bba 100644 --- a/pytools/test/test_persistent_dict.py +++ b/pytools/test/test_persistent_dict.py @@ -730,10 +730,31 @@ def global_fun2(): def test_hash_function() -> None: keyb = KeyBuilder() + # {{{ global functions + assert keyb(global_fun) == keyb(global_fun) == \ "51b5980dd3a8aa13f6e83869e4a04c22973d7aaf96cb22899abdfdc55e15c9b2" assert keyb(global_fun) != keyb(global_fun2) + # }}} + + # {{{ closures + + def get_fun(x): + def add_x(y): + return x + y + return add_x + + f1 = get_fun(1) + f2 = get_fun(2) + + assert f1 != f2 + assert keyb(f1) != keyb(f2) + + # }}} + + # {{{ local functions + def local_fun(): pass @@ -744,6 +765,10 @@ def test_hash_function() -> None: "fc58f5b0130df821913c848749eb03f5dcd4da7a568c6130f1c0cfb96ed0d12d" assert keyb(local_fun) != keyb(local_fun2) + # }}} + + # {{{ methods + class C1: def method(self): pass @@ -756,6 +781,8 @@ def test_hash_function() -> None: "3013eb424dac133a57bd70cb6084d2a2f349a247714efc508fe3b10b99b6f717" assert keyb(C1.method) != keyb(C2.method) + # }}} + if __name__ == "__main__": if len(sys.argv) > 1: