diff options
author | Benjamin Peterson <benjamin@python.org> | 2012-09-02 03:04:38 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2012-09-02 03:04:38 (GMT) |
commit | 6a42bd67d7dc251ea96784c77dfc130a8456a486 (patch) | |
tree | 0d5e9b6a3616fdbaa81403a15a385dbcf50b7b33 | |
parent | 9f16e44a479d9efdfd4315df93a9e83901ef96b5 (diff) | |
download | cpython-6a42bd67d7dc251ea96784c77dfc130a8456a486.zip cpython-6a42bd67d7dc251ea96784c77dfc130a8456a486.tar.gz cpython-6a42bd67d7dc251ea96784c77dfc130a8456a486.tar.bz2 |
Make super() internal errors RuntimeError instead of SystemError (closes #15839)
-rw-r--r-- | Lib/test/test_super.py | 15 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/typeobject.c | 14 |
3 files changed, 24 insertions, 7 deletions
diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py index 32eb1c0..f6469cf 100644 --- a/Lib/test/test_super.py +++ b/Lib/test/test_super.py @@ -115,6 +115,21 @@ class TestSuper(unittest.TestCase): return __class__ self.assertIs(X.f(), X) + def test_obscure_super_errors(self): + def f(): + super() + self.assertRaises(RuntimeError, f) + def f(x): + del x + super() + self.assertRaises(RuntimeError, f, None) + class X: + def f(x): + nonlocal __class__ + del __class__ + super() + self.assertRaises(RuntimeError, X().f) + def test_main(): support.run_unittest(TestSuper) @@ -10,6 +10,8 @@ What's New in Python 3.3.1 Core and Builtins ----------------- +- Issue #15839: Convert SystemErrors in super() to RuntimeErrors. + - Issue #15801: Make sure mappings passed to '%' formatting are actually subscriptable. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index a357ced..bc01b0d 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6497,18 +6497,18 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) PyCodeObject *co = f->f_code; Py_ssize_t i, n; if (co == NULL) { - PyErr_SetString(PyExc_SystemError, + PyErr_SetString(PyExc_RuntimeError, "super(): no code object"); return -1; } if (co->co_argcount == 0) { - PyErr_SetString(PyExc_SystemError, + PyErr_SetString(PyExc_RuntimeError, "super(): no arguments"); return -1; } obj = f->f_localsplus[0]; if (obj == NULL) { - PyErr_SetString(PyExc_SystemError, + PyErr_SetString(PyExc_RuntimeError, "super(): arg[0] deleted"); return -1; } @@ -6527,18 +6527,18 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) PyTuple_GET_SIZE(co->co_cellvars) + i; PyObject *cell = f->f_localsplus[index]; if (cell == NULL || !PyCell_Check(cell)) { - PyErr_SetString(PyExc_SystemError, + PyErr_SetString(PyExc_RuntimeError, "super(): bad __class__ cell"); return -1; } type = (PyTypeObject *) PyCell_GET(cell); if (type == NULL) { - PyErr_SetString(PyExc_SystemError, + PyErr_SetString(PyExc_RuntimeError, "super(): empty __class__ cell"); return -1; } if (!PyType_Check(type)) { - PyErr_Format(PyExc_SystemError, + PyErr_Format(PyExc_RuntimeError, "super(): __class__ is not a type (%s)", Py_TYPE(type)->tp_name); return -1; @@ -6547,7 +6547,7 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) } } if (type == NULL) { - PyErr_SetString(PyExc_SystemError, + PyErr_SetString(PyExc_RuntimeError, "super(): __class__ cell not found"); return -1; } |