.. highlight:: c

.. _cell-objects:

Cell Objects
------------

"Cell" objects are used to implement variables referenced by multiple scopes.
For each such variable, a cell object is created to store the value; the local
variables of each stack frame that references the value contains a reference to
the cells from outer scopes which also use that variable.  When the value is
accessed, the value contained in the cell is used instead of the cell object
itself.  This de-referencing of the cell object requires support from the
generated byte-code; these are not automatically de-referenced when accessed.
Cell objects are not likely to be useful elsewhere.


.. c:type:: PyCellObject

   The C structure used for cell objects.


.. c:var:: PyTypeObject PyCell_Type

   The type object corresponding to cell objects.


.. c:function:: int PyCell_Check(ob)

   Return true if *ob* is a cell object; *ob* must not be ``NULL``.  This
   function always succeeds.


.. c:function:: PyObject* PyCell_New(PyObject *ob)

   Create and return a new cell object containing the value *ob*. The parameter may
   be ``NULL``.


.. c:function:: PyObject* PyCell_Get(PyObject *cell)

   Return the contents of the cell *cell*.


.. c:function:: PyObject* PyCell_GET(PyObject *cell)

   Return the contents of the cell *cell*, but without checking that *cell* is
   non-``NULL`` and a cell object.


.. c:function:: int PyCell_Set(PyObject *cell, PyObject *value)

   Set the contents of the cell object *cell* to *value*.  This releases the
   reference to any current content of the cell. *value* may be ``NULL``.  *cell*
   must be non-``NULL``; if it is not a cell object, ``-1`` will be returned.  On
   success, ``0`` will be returned.


.. c:function:: void PyCell_SET(PyObject *cell, PyObject *value)

   Sets the value of the cell object *cell* to *value*.  No reference counts are
   adjusted, and no checks are made for safety; *cell* must be non-``NULL`` and must
   be a cell object.
