[Python-checkins] r45531 - python/trunk/Lib/test/crashers/nasty_eq_vs_dict.py

michael.hudson python-checkins at python.org
Tue Apr 18 15:52:33 CEST 2006


Author: michael.hudson
Date: Tue Apr 18 15:52:32 2006
New Revision: 45531

Added:
   python/trunk/Lib/test/crashers/nasty_eq_vs_dict.py   (contents, props changed)
Log:
add a very old crasher from the 2.1 -> 2.2 round of dictionary fixes.


Added: python/trunk/Lib/test/crashers/nasty_eq_vs_dict.py
==============================================================================
--- (empty file)
+++ python/trunk/Lib/test/crashers/nasty_eq_vs_dict.py	Tue Apr 18 15:52:32 2006
@@ -0,0 +1,47 @@
+# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html
+
+# if you keep changing a dictionary while looking up a key, you can
+# provoke an infinite recursion in C
+
+# At the time neither Tim nor Michael could be bothered to think of a
+# way to fix it.
+
+class Yuck:
+    def __init__(self):
+        self.i = 0
+
+    def make_dangerous(self):
+        self.i = 1
+
+    def __hash__(self):
+        # direct to slot 4 in table of size 8; slot 12 when size 16
+        return 4 + 8
+
+    def __eq__(self, other):
+        if self.i == 0:
+            # leave dict alone
+            pass
+        elif self.i == 1:
+            # fiddle to 16 slots
+            self.__fill_dict(6)
+            self.i = 2
+        else:
+            # fiddle to 8 slots
+            self.__fill_dict(4)
+            self.i = 1
+
+        return 1
+
+    def __fill_dict(self, n):
+        self.i = 0
+        dict.clear()
+        for i in range(n):
+            dict[i] = i
+        dict[self] = "OK!"
+
+y = Yuck()
+dict = {y: "OK!"}
+
+z = Yuck()
+y.make_dangerous()
+print dict[z]


More information about the Python-checkins mailing list