[pypy-commit] pypy set-strategies: fix and test for fakeobject in has_key
l.diekmann
noreply at buildbot.pypy.org
Thu Nov 10 13:50:07 CET 2011
Author: Lukas Diekmann <lukas.diekmann at uni-duesseldorf.de>
Branch: set-strategies
Changeset: r49178:7bc2b4077184
Date: 2011-05-24 15:56 +0200
http://bitbucket.org/pypy/pypy/changeset/7bc2b4077184/
Log: fix and test for fakeobject in has_key
diff --git a/pypy/objspace/std/setobject.py b/pypy/objspace/std/setobject.py
--- a/pypy/objspace/std/setobject.py
+++ b/pypy/objspace/std/setobject.py
@@ -387,8 +387,11 @@
return keys_w
def has_key(self, w_set, w_key):
+ from pypy.objspace.std.dictmultiobject import _is_sane_hash
if not self.is_correct_type(w_key):
- #XXX switch object strategy, test
+ if not _is_sane_hash(self.space, w_key):
+ w_set.switch_to_object_strategy(self.space)
+ return w_set.has_key(w_key)
return False
d = self.cast_from_void_star(w_set.sstorage)
return self.unwrap(w_key) in d
diff --git a/pypy/objspace/std/test/test_setobject.py b/pypy/objspace/std/test/test_setobject.py
--- a/pypy/objspace/std/test/test_setobject.py
+++ b/pypy/objspace/std/test/test_setobject.py
@@ -578,3 +578,20 @@
s.remove(FakeInt(3))
assert s == set([1,2])
raises(KeyError, s.remove, FakeInt(16))
+
+
+ def test_fakeobject_and_has_key(test):
+ class FakeInt(object):
+ def __init__(self, value):
+ self.value = value
+ def __hash__(self):
+ return hash(self.value)
+
+ def __eq__(self, other):
+ if other == self.value:
+ return True
+ return False
+
+ s = set([1,2,3,4,5])
+ assert 5 in s
+ assert FakeInt(5) in s
More information about the pypy-commit
mailing list