Commit 6bb9989a authored by R. David Murray's avatar R. David Murray

#1574217: only swallow AttributeErrors in isinstance, not everything.

Patch and tests by Brian Harring, with improvements by Ralf Schmitt.
parent f149e45a
...@@ -81,6 +81,20 @@ class TestIsInstanceExceptions(unittest.TestCase): ...@@ -81,6 +81,20 @@ class TestIsInstanceExceptions(unittest.TestCase):
self.assertRaises(TypeError, isinstance, I(), C()) self.assertRaises(TypeError, isinstance, I(), C())
# check that we don't mask non AttributeErrors
# see: http://bugs.python.org/issue1574217
def test_isinstance_dont_mask_non_attribute_error(self):
class C(object):
def getclass(self):
raise RuntimeError()
__class__=property(getclass)
c=C()
self.assertRaises(RuntimeError, isinstance, c, bool)
# test another code path
class D: pass
self.assertRaises(RuntimeError, isinstance, c, D)
# These tests are similar to above, but tickle certain code paths in # These tests are similar to above, but tickle certain code paths in
......
...@@ -337,6 +337,7 @@ Barry Hantman ...@@ -337,6 +337,7 @@ Barry Hantman
Lynda Hardman Lynda Hardman
Derek Harland Derek Harland
Jason Harper Jason Harper
Brian Harring
Larry Hastings Larry Hastings
Shane Hathaway Shane Hathaway
Rycharde Hawkes Rycharde Hawkes
......
...@@ -10,6 +10,9 @@ What's New in Python 3.2 Beta 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.2 Beta 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #1574217: isinstance now catches only AttributeError, rather than
masking all errors.
- Issue #10391: Don't dereference invalid memory in error messages in the ast - Issue #10391: Don't dereference invalid memory in error messages in the ast
module. module.
......
...@@ -2500,7 +2500,12 @@ recursive_isinstance(PyObject *inst, PyObject *cls) ...@@ -2500,7 +2500,12 @@ recursive_isinstance(PyObject *inst, PyObject *cls)
if (retval == 0) { if (retval == 0) {
PyObject *c = PyObject_GetAttr(inst, __class__); PyObject *c = PyObject_GetAttr(inst, __class__);
if (c == NULL) { if (c == NULL) {
PyErr_Clear(); if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
}
else {
retval = -1;
}
} }
else { else {
if (c != (PyObject *)(inst->ob_type) && if (c != (PyObject *)(inst->ob_type) &&
...@@ -2518,8 +2523,12 @@ recursive_isinstance(PyObject *inst, PyObject *cls) ...@@ -2518,8 +2523,12 @@ recursive_isinstance(PyObject *inst, PyObject *cls)
return -1; return -1;
icls = PyObject_GetAttr(inst, __class__); icls = PyObject_GetAttr(inst, __class__);
if (icls == NULL) { if (icls == NULL) {
PyErr_Clear(); if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
retval = 0; PyErr_Clear();
}
else {
retval = -1;
}
} }
else { else {
retval = abstract_issubclass(icls, cls); retval = abstract_issubclass(icls, cls);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment