Author: Antonio Cuni <anto.c...@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} _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit