[pypy-commit] pypy default: fix issue 1131: coerce the return value of __contains__ to bool
antocuni
noreply at buildbot.pypy.org
Tue Apr 17 11:11:59 CEST 2012
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch:
Changeset: r54451:3efbde36c6ed
Date: 2012-04-17 11:11 +0200
http://bitbucket.org/pypy/pypy/changeset/3efbde36c6ed/
Log: fix issue 1131: coerce the return value of __contains__ to bool
diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py
--- a/pypy/objspace/descroperation.py
+++ b/pypy/objspace/descroperation.py
@@ -414,7 +414,8 @@
def contains(space, w_container, w_item):
w_descr = space.lookup(w_container, '__contains__')
if w_descr is not None:
- return space.get_and_call_function(w_descr, w_container, w_item)
+ w_result = space.get_and_call_function(w_descr, w_container, w_item)
+ return space.wrap(space.bool_w(w_result))
return space._contains(w_container, w_item)
def _contains(space, w_container, w_item):
diff --git a/pypy/objspace/test/test_descroperation.py b/pypy/objspace/test/test_descroperation.py
--- a/pypy/objspace/test/test_descroperation.py
+++ b/pypy/objspace/test/test_descroperation.py
@@ -694,5 +694,24 @@
l = len(X(X(2)))
assert l == 2 and type(l) is int
+ def test_bool___contains__(self):
+ class X(object):
+ def __contains__(self, item):
+ return 42
+ x = X()
+ res = 'foo' in x
+ assert res is True
+ #
+ class CannotConvertToBool(object):
+ def __nonzero__(self):
+ raise TypeError
+ class X(object):
+ def __contains__(self, item):
+ return CannotConvertToBool()
+ x = X()
+ raises(TypeError, "'foo' in x")
+
+
+
class AppTestWithBuiltinShortcut(AppTest_Descroperation):
OPTIONS = {'objspace.std.builtinshortcut': True}
More information about the pypy-commit
mailing list