summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_class.py8
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/classobject.c10
3 files changed, 16 insertions, 4 deletions
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py
index 6c91deb..26b8e7a 100644
--- a/Lib/test/test_class.py
+++ b/Lib/test/test_class.py
@@ -172,6 +172,14 @@ testme ^ 1
# List/dict operations
+class Empty: pass
+
+try:
+ 1 in Empty()
+ print 'failed, should have raised TypeError'
+except TypeError:
+ pass
+
1 in testme
testme[1]
diff --git a/Misc/NEWS b/Misc/NEWS
index 9631d4f..5c575c9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.5.1c1?
Core and builtins
-----------------
+- Bug #1591996: Correctly forward exception in instance_contains().
+
- Bug #1588287: fix invalid assertion for `1,2` in debug builds.
- Bug #1576657: when setting a KeyError for a tuple key, make sure that
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 7680a3d..8560b68 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -1318,15 +1318,17 @@ instance_contains(PyInstanceObject *inst, PyObject *member)
/* Couldn't find __contains__. */
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ Py_ssize_t rc;
/* Assume the failure was simply due to that there is no
* __contains__ attribute, and try iterating instead.
*/
PyErr_Clear();
- return _PySequence_IterSearch((PyObject *)inst, member,
- PY_ITERSEARCH_CONTAINS) > 0;
+ rc = _PySequence_IterSearch((PyObject *)inst, member,
+ PY_ITERSEARCH_CONTAINS);
+ if (rc >= 0)
+ return rc > 0;
}
- else
- return -1;
+ return -1;
}
static PySequenceMethods