summaryrefslogtreecommitdiffstats
path: root/Objects/cellobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/cellobject.c')
-rw-r--r--Objects/cellobject.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/Objects/cellobject.c b/Objects/cellobject.c
index 4ab9083..ec2eeb1a 100644
--- a/Objects/cellobject.c
+++ b/Objects/cellobject.c
@@ -83,6 +83,17 @@ cell_dealloc(PyObject *self)
}
static PyObject *
+cell_compare_impl(PyObject *a, PyObject *b, int op)
+{
+ if (a != NULL && b != NULL) {
+ return PyObject_RichCompare(a, b, op);
+ }
+ else {
+ Py_RETURN_RICHCOMPARE(b == NULL, a == NULL, op);
+ }
+}
+
+static PyObject *
cell_richcompare(PyObject *a, PyObject *b, int op)
{
/* neither argument should be NULL, unless something's gone wrong */
@@ -92,27 +103,28 @@ cell_richcompare(PyObject *a, PyObject *b, int op)
if (!PyCell_Check(a) || !PyCell_Check(b)) {
Py_RETURN_NOTIMPLEMENTED;
}
+ PyObject *a_ref = PyCell_GetRef((PyCellObject *)a);
+ PyObject *b_ref = PyCell_GetRef((PyCellObject *)b);
/* compare cells by contents; empty cells come before anything else */
- a = ((PyCellObject *)a)->ob_ref;
- b = ((PyCellObject *)b)->ob_ref;
- if (a != NULL && b != NULL)
- return PyObject_RichCompare(a, b, op);
+ PyObject *res = cell_compare_impl(a_ref, b_ref, op);
- Py_RETURN_RICHCOMPARE(b == NULL, a == NULL, op);
+ Py_XDECREF(a_ref);
+ Py_XDECREF(b_ref);
+ return res;
}
static PyObject *
cell_repr(PyObject *self)
{
- PyCellObject *op = _PyCell_CAST(self);
- if (op->ob_ref == NULL) {
- return PyUnicode_FromFormat("<cell at %p: empty>", op);
+ PyObject *ref = PyCell_GetRef((PyCellObject *)self);
+ if (ref == NULL) {
+ return PyUnicode_FromFormat("<cell at %p: empty>", self);
}
-
- return PyUnicode_FromFormat("<cell at %p: %.80s object at %p>",
- op, Py_TYPE(op->ob_ref)->tp_name,
- op->ob_ref);
+ PyObject *res = PyUnicode_FromFormat("<cell at %p: %.80s object at %p>",
+ self, Py_TYPE(ref)->tp_name, ref);
+ Py_DECREF(ref);
+ return res;
}
static int
@@ -135,11 +147,12 @@ static PyObject *
cell_get_contents(PyObject *self, void *closure)
{
PyCellObject *op = _PyCell_CAST(self);
- if (op->ob_ref == NULL) {
+ PyObject *res = PyCell_GetRef(op);
+ if (res == NULL) {
PyErr_SetString(PyExc_ValueError, "Cell is empty");
return NULL;
}
- return Py_NewRef(op->ob_ref);
+ return res;
}
static int