diff options
author | Benjamin Peterson <benjamin@python.org> | 2011-07-15 14:10:35 -0500 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2011-07-15 14:10:35 -0500 |
commit | e92cd0ce987d11acf2b93d43171f61c297e935ba (patch) | |
tree | 14c0986adc09d30245c97157fb1eac79b0f68102 | |
parent | af5bacf9bb9b9729fac3da50111441b1f0efdd44 (diff) | |
parent | 5afa03a72ee6d27e742dc0ebc06a0630e1b37fe9 (diff) | |
download | cpython-git-e92cd0ce987d11acf2b93d43171f61c297e935ba.tar.gz |
merge 3.2 (#11627)
-rw-r--r-- | Lib/test/test_raise.py | 9 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Python/ceval.c | 7 |
3 files changed, 19 insertions, 0 deletions
diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py index d120dc1afa..e02c1af131 100644 --- a/Lib/test/test_raise.py +++ b/Lib/test/test_raise.py @@ -121,6 +121,15 @@ class TestRaise(unittest.TestCase): else: self.fail("No exception raised") + def test_new_returns_invalid_instance(self): + # See issue #11627. + class MyException(Exception): + def __new__(cls, *args): + return object() + + with self.assertRaises(TypeError): + raise MyException + class TestCause(unittest.TestCase): def test_invalid_cause(self): @@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1? Core and Builtins ----------------- +- Issue #11627: Fix segfault when __new__ on a exception returns a non-exception + class. + - Issue #12149: Update the method cache after a type's dictionnary gets cleared by the garbage collector. This fixes a segfault when an instance and its type get caught in a reference cycle, and the instance's diff --git a/Python/ceval.c b/Python/ceval.c index 5c936376db..6d493633a9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3494,6 +3494,13 @@ do_raise(PyObject *exc, PyObject *cause) value = PyObject_CallObject(exc, NULL); if (value == NULL) goto raise_error; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto raise_error; + } } else if (PyExceptionInstance_Check(exc)) { value = exc; |