From 30f61cbb1331615af829aea69d2586e990488525 Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Sat, 24 Nov 2007 13:53:29 +0000 Subject: Issue #1445: Fix a SystemError when accessing the ``cell_contents`` attribute of an empty cell object. Now a ValueError is raised. Backport of r59170. --- Lib/test/test_funcattrs.py | 12 ++++++++++++ Misc/NEWS | 5 ++++- Objects/cellobject.c | 7 ++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 7a083b7..a32be38 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -242,6 +242,17 @@ def test_func_closure(): verify(c[0].__class__.__name__ == "cell") # don't have a type object handy cantset(f, "func_closure", c) +def test_empty_cell(): + def f(): print a + try: + f.func_closure[0].cell_contents + except ValueError: + pass + else: + raise TestFailed, "shouldn't be able to read an empty cell" + + a = 12 + def test_func_doc(): def f(): pass verify(f.__doc__ is None) @@ -385,6 +396,7 @@ def test_im_name(): def testmore(): test_func_closure() + test_empty_cell() test_func_doc() test_func_globals() test_func_name() diff --git a/Misc/NEWS b/Misc/NEWS index c633032..f856c1f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1,4 +1,4 @@ -+++++++++++ ++++++++++++ Python News +++++++++++ @@ -12,6 +12,9 @@ What's New in Python 2.5.2c1? Core and builtins ----------------- +- Issue #1445: Fix a SystemError when accessing the ``cell_contents`` + attribute of an empty cell object. + - Issue #1265: Fix a problem with sys.settrace, if the tracing function uses a generator expression when at the same time the executed code is closing a paused generator. diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 65a29aa..e659555 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -89,7 +89,12 @@ cell_clear(PyCellObject *op) static PyObject * cell_get_contents(PyCellObject *op, void *closure) { - Py_XINCREF(op->ob_ref); + if (op->ob_ref == NULL) + { + PyErr_SetString(PyExc_ValueError, "Cell is empty"); + return NULL; + } + Py_INCREF(op->ob_ref); return op->ob_ref; } -- cgit v0.12