[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