]> granicus.if.org Git - python/commitdiff
Issue #1445: Fix a SystemError when accessing the ``cell_contents``
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Sat, 24 Nov 2007 13:44:17 +0000 (13:44 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Sat, 24 Nov 2007 13:44:17 +0000 (13:44 +0000)
attribute of an empty cell object.  Now a ValueError is raised.

Lib/test/test_funcattrs.py
Misc/NEWS
Objects/cellobject.c

index 7a083b70dfbf18a7b22c24b7434903f8e0b43a66..a32be38333dc56a33fef8ad2d8e4fff37b23d8a8 100644 (file)
@@ -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()
index c2ea9566b92492d3727c76063ecf9f8f6750dd39..15fa9be11efb4f895875abf5127f108107734ac4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1?
 Core and builtins
 -----------------
 
+- Issue #1445: Fix a SystemError when accessing the ``cell_contents`` 
+  attribute of an empty cell object.
+
 - Issue #1460: The utf-7 incremental decoder did not accept truncated input.
   It now correctly saves its state between chunks of data.
 
index 63322c13718109a664d68e7f843790824a755312..dc684d5b67189a5bf0815e3d01031c5696bf7312 100644 (file)
@@ -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;
 }