| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 1 | /* Cell object implementation */ | 
 | 2 |  | 
 | 3 | #include "Python.h" | 
 | 4 |  | 
 | 5 | PyObject * | 
 | 6 | PyCell_New(PyObject *obj) | 
 | 7 | { | 
 | 8 | 	PyCellObject *op; | 
 | 9 |  | 
| Neil Schemenauer | e83c00e | 2001-08-29 23:54:21 +0000 | [diff] [blame] | 10 | 	op = (PyCellObject *)PyObject_GC_New(PyCellObject, &PyCell_Type); | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 11 | 	op->ob_ref = obj; | 
 | 12 | 	Py_XINCREF(obj); | 
 | 13 |  | 
| Neil Schemenauer | e83c00e | 2001-08-29 23:54:21 +0000 | [diff] [blame] | 14 | 	_PyObject_GC_TRACK(op); | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 15 | 	return (PyObject *)op; | 
 | 16 | } | 
 | 17 |  | 
 | 18 | PyObject * | 
 | 19 | PyCell_Get(PyObject *op) | 
 | 20 | { | 
 | 21 | 	if (!PyCell_Check(op)) { | 
 | 22 | 		PyErr_BadInternalCall(); | 
 | 23 | 		return NULL; | 
 | 24 | 	} | 
 | 25 | 	Py_XINCREF(((PyCellObject*)op)->ob_ref); | 
 | 26 | 	return PyCell_GET(op); | 
 | 27 | } | 
 | 28 |  | 
 | 29 | int | 
 | 30 | PyCell_Set(PyObject *op, PyObject *obj) | 
 | 31 | { | 
 | 32 | 	if (!PyCell_Check(op)) { | 
 | 33 | 		PyErr_BadInternalCall(); | 
 | 34 | 		return -1; | 
 | 35 | 	} | 
 | 36 | 	Py_XDECREF(((PyCellObject*)op)->ob_ref); | 
 | 37 | 	Py_XINCREF(obj); | 
 | 38 | 	PyCell_SET(op, obj); | 
 | 39 | 	return 0; | 
 | 40 | } | 
 | 41 |  | 
 | 42 | static void | 
 | 43 | cell_dealloc(PyCellObject *op) | 
 | 44 | { | 
| Neil Schemenauer | e83c00e | 2001-08-29 23:54:21 +0000 | [diff] [blame] | 45 | 	_PyObject_GC_UNTRACK(op); | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 46 | 	Py_XDECREF(op->ob_ref); | 
| Neil Schemenauer | e83c00e | 2001-08-29 23:54:21 +0000 | [diff] [blame] | 47 | 	PyObject_GC_Del(op); | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 48 | } | 
 | 49 |  | 
 | 50 | static int | 
 | 51 | cell_compare(PyCellObject *a, PyCellObject *b) | 
 | 52 | { | 
 | 53 | 	if (a->ob_ref == NULL) { | 
 | 54 | 		if (b->ob_ref == NULL) | 
 | 55 | 			return 0; | 
 | 56 | 		return -1; | 
 | 57 | 	} else if (b->ob_ref == NULL) | 
 | 58 | 		return 1; | 
 | 59 | 	return PyObject_Compare(a->ob_ref, b->ob_ref); | 
 | 60 | } | 
 | 61 |  | 
 | 62 | static PyObject * | 
 | 63 | cell_repr(PyCellObject *op) | 
 | 64 | { | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 65 | 	if (op->ob_ref == NULL) | 
| Barry Warsaw | 7ce3694 | 2001-08-24 18:34:26 +0000 | [diff] [blame] | 66 | 		return PyString_FromFormat("<cell at %p: empty>", op); | 
 | 67 |  | 
 | 68 | 	return PyString_FromFormat("<cell at %p: %.80s object at %p>", | 
 | 69 | 				   op, op->ob_ref->ob_type->tp_name, | 
 | 70 | 				   op->ob_ref); | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 71 | } | 
 | 72 |  | 
 | 73 | static int | 
 | 74 | cell_traverse(PyCellObject *op, visitproc visit, void *arg) | 
 | 75 | { | 
 | 76 | 	if (op->ob_ref) | 
 | 77 | 		return visit(op->ob_ref, arg); | 
 | 78 | 	return 0; | 
 | 79 | } | 
 | 80 |  | 
 | 81 | static int | 
 | 82 | cell_clear(PyCellObject *op) | 
 | 83 | { | 
| Jeremy Hylton | 30c9f39 | 2001-03-13 01:58:22 +0000 | [diff] [blame] | 84 | 	Py_XDECREF(op->ob_ref); | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 85 | 	op->ob_ref = NULL; | 
 | 86 | 	return 0; | 
 | 87 | } | 
 | 88 |  | 
 | 89 | PyTypeObject PyCell_Type = { | 
 | 90 | 	PyObject_HEAD_INIT(&PyType_Type) | 
 | 91 | 	0, | 
 | 92 | 	"cell", | 
| Neil Schemenauer | e83c00e | 2001-08-29 23:54:21 +0000 | [diff] [blame] | 93 | 	sizeof(PyCellObject), | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 94 | 	0, | 
 | 95 | 	(destructor)cell_dealloc,               /* tp_dealloc */ | 
 | 96 | 	0,                                      /* tp_print */ | 
 | 97 | 	0,	                                /* tp_getattr */ | 
 | 98 | 	0,					/* tp_setattr */ | 
 | 99 | 	(cmpfunc)cell_compare,			/* tp_compare */ | 
 | 100 | 	(reprfunc)cell_repr,			/* tp_repr */ | 
 | 101 | 	0,					/* tp_as_number */ | 
 | 102 | 	0,			                /* tp_as_sequence */ | 
 | 103 | 	0,					/* tp_as_mapping */ | 
 | 104 | 	0,					/* tp_hash */ | 
 | 105 | 	0,					/* tp_call */ | 
 | 106 | 	0,					/* tp_str */ | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 107 | 	PyObject_GenericGetAttr,		/* tp_getattro */ | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 108 | 	0,					/* tp_setattro */ | 
 | 109 | 	0,					/* tp_as_buffer */ | 
| Neil Schemenauer | e83c00e | 2001-08-29 23:54:21 +0000 | [diff] [blame] | 110 | 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ | 
| Jeremy Hylton | fbd849f | 2001-01-25 20:04:14 +0000 | [diff] [blame] | 111 |  	0,					/* tp_doc */ | 
 | 112 |  	(traverseproc)cell_traverse,		/* tp_traverse */ | 
 | 113 |  	(inquiry)cell_clear,			/* tp_clear */ | 
 | 114 | }; |