1 /* Cell object implementation */
6 PyCell_New(PyObject
*obj
)
10 op
= (PyCellObject
*)PyObject_New(PyCellObject
, &PyCell_Type
);
15 return (PyObject
*)op
;
19 PyCell_Get(PyObject
*op
)
21 if (!PyCell_Check(op
)) {
22 PyErr_BadInternalCall();
25 Py_XINCREF(((PyCellObject
*)op
)->ob_ref
);
26 return PyCell_GET(op
);
30 PyCell_Set(PyObject
*op
, PyObject
*obj
)
32 if (!PyCell_Check(op
)) {
33 PyErr_BadInternalCall();
36 Py_XDECREF(((PyCellObject
*)op
)->ob_ref
);
43 cell_dealloc(PyCellObject
*op
)
46 Py_XDECREF(op
->ob_ref
);
51 cell_compare(PyCellObject
*a
, PyCellObject
*b
)
53 if (a
->ob_ref
== NULL
) {
54 if (b
->ob_ref
== NULL
)
57 } else if (b
->ob_ref
== NULL
)
59 return PyObject_Compare(a
->ob_ref
, b
->ob_ref
);
63 cell_repr(PyCellObject
*op
)
67 if (op
->ob_ref
== NULL
)
68 sprintf(buf
, "<cell at %p: empty>", op
);
70 sprintf(buf
, "<cell at %p: %.80s object at %p>",
71 op
, op
->ob_ref
->ob_type
->tp_name
, op
->ob_ref
);
72 return PyString_FromString(buf
);
76 cell_traverse(PyCellObject
*op
, visitproc visit
, void *arg
)
79 return visit(op
->ob_ref
, arg
);
84 cell_clear(PyCellObject
*op
)
86 Py_XDECREF(op
->ob_ref
);
91 PyTypeObject PyCell_Type
= {
92 PyObject_HEAD_INIT(&PyType_Type
)
95 sizeof(PyCellObject
) + PyGC_HEAD_SIZE
,
97 (destructor
)cell_dealloc
, /* tp_dealloc */
101 (cmpfunc
)cell_compare
, /* tp_compare */
102 (reprfunc
)cell_repr
, /* tp_repr */
103 0, /* tp_as_number */
104 0, /* tp_as_sequence */
105 0, /* tp_as_mapping */
111 0, /* tp_as_buffer */
112 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_GC
, /* tp_flags */
114 (traverseproc
)cell_traverse
, /* tp_traverse */
115 (inquiry
)cell_clear
, /* tp_clear */