/Lib/test/crashers/nasty_eq_vs_dict.py
http://unladen-swallow.googlecode.com/ · Python · 47 lines · 28 code · 10 blank · 9 comment · 4 complexity · 385c54c572af6d32b1058e577cb8c7c0 MD5 · raw file
- # 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]