1 /* Cell object implementation */
6 PyCell_New(PyObject
*obj
)
10 op
= (PyCellObject
*)PyObject_GC_New(PyCellObject
, &PyCell_Type
);
16 _PyObject_GC_TRACK(op
);
17 return (PyObject
*)op
;
21 PyCell_Get(PyObject
*op
)
23 if (!PyCell_Check(op
)) {
24 PyErr_BadInternalCall();
27 Py_XINCREF(((PyCellObject
*)op
)->ob_ref
);
28 return PyCell_GET(op
);
32 PyCell_Set(PyObject
*op
, PyObject
*obj
)
34 if (!PyCell_Check(op
)) {
35 PyErr_BadInternalCall();
38 Py_XDECREF(((PyCellObject
*)op
)->ob_ref
);
45 cell_dealloc(PyCellObject
*op
)
47 _PyObject_GC_UNTRACK(op
);
48 Py_XDECREF(op
->ob_ref
);
53 cell_compare(PyCellObject
*a
, PyCellObject
*b
)
55 if (a
->ob_ref
== NULL
) {
56 if (b
->ob_ref
== NULL
)
59 } else if (b
->ob_ref
== NULL
)
61 return PyObject_Compare(a
->ob_ref
, b
->ob_ref
);
65 cell_repr(PyCellObject
*op
)
67 if (op
->ob_ref
== NULL
)
68 return PyString_FromFormat("<cell at %p: empty>", op
);
70 return PyString_FromFormat("<cell at %p: %.80s object at %p>",
71 op
, op
->ob_ref
->ob_type
->tp_name
,
76 cell_traverse(PyCellObject
*op
, visitproc visit
, void *arg
)
83 cell_clear(PyCellObject
*op
)
90 cell_get_contents(PyCellObject
*op
, void *closure
)
92 if (op
->ob_ref
== NULL
)
94 PyErr_SetString(PyExc_ValueError
, "Cell is empty");
97 Py_INCREF(op
->ob_ref
);
101 static PyGetSetDef cell_getsetlist
[] = {
102 {"cell_contents", (getter
)cell_get_contents
, NULL
},
103 {NULL
} /* sentinel */
106 PyTypeObject PyCell_Type
= {
107 PyObject_HEAD_INIT(&PyType_Type
)
110 sizeof(PyCellObject
),
112 (destructor
)cell_dealloc
, /* tp_dealloc */
116 (cmpfunc
)cell_compare
, /* tp_compare */
117 (reprfunc
)cell_repr
, /* tp_repr */
118 0, /* tp_as_number */
119 0, /* tp_as_sequence */
120 0, /* tp_as_mapping */
124 PyObject_GenericGetAttr
, /* tp_getattro */
126 0, /* tp_as_buffer */
127 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
129 (traverseproc
)cell_traverse
, /* tp_traverse */
130 (inquiry
)cell_clear
, /* tp_clear */
131 0, /* tp_richcompare */
132 0, /* tp_weaklistoffset */
137 cell_getsetlist
, /* tp_getset */