PyObject *od_weakreflist; /* holds weakrefs to the odict */
};
+#define _PyODictObject_CAST(op) _Py_CAST(PyODictObject*, (op))
+
/* ----------------------------------------------
* odict keys (a simple doubly-linked list)
#define _odictnode_PREV(node) (node->prev)
#define _odictnode_NEXT(node) (node->next)
-#define _odict_FIRST(od) (((PyODictObject *)od)->od_first)
-#define _odict_LAST(od) (((PyODictObject *)od)->od_last)
+#define _odict_FIRST(od) (_PyODictObject_CAST(od)->od_first)
+#define _odict_LAST(od) (_PyODictObject_CAST(od)->od_last)
#define _odict_EMPTY(od) (_odict_FIRST(od) == NULL)
#define _odict_FOREACH(od, node) \
for (node = _odict_FIRST(od); node != NULL; node = _odictnode_NEXT(node))
/* mp_ass_subscript: __setitem__() and __delitem__() */
static int
-odict_mp_ass_sub(PyODictObject *od, PyObject *v, PyObject *w)
+odict_mp_ass_sub(PyObject *od, PyObject *v, PyObject *w)
{
if (w == NULL)
- return PyODict_DelItem((PyObject *)od, v);
+ return PyODict_DelItem(od, v);
else
- return PyODict_SetItem((PyObject *)od, v, w);
+ return PyODict_SetItem(od, v, w);
}
/* tp_as_mapping */
static PyMappingMethods odict_as_mapping = {
0, /*mp_length*/
0, /*mp_subscript*/
- (objobjargproc)odict_mp_ass_sub, /*mp_ass_subscript*/
+ odict_mp_ass_sub, /*mp_ass_subscript*/
};
PyDoc_STRVAR(odict_sizeof__doc__, "");
static PyObject *
-odict_sizeof(PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_sizeof(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ PyODictObject *od = _PyODictObject_CAST(op);
Py_ssize_t res = _PyDict_SizeOf((PyDictObject *)od);
res += sizeof(_ODictNode *) * od->od_fast_nodes_size; /* od_fast_nodes */
if (!_odict_EMPTY(od)) {
PyDoc_STRVAR(odict_reduce__doc__, "Return state information for pickling");
static PyObject *
-odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ register PyODictObject *od = _PyODictObject_CAST(op);
PyObject *state, *result = NULL;
PyObject *items_iter, *items, *args = NULL;
Py_BEGIN_CRITICAL_SECTION(od);
- _ODictNode *node = _odict_find_node_hash((PyODictObject *)od, key, hash);
+ _ODictNode *node = _odict_find_node_hash(_PyODictObject_CAST(od), key, hash);
if (node != NULL) {
/* Pop the node first to avoid a possible dict resize (due to
eval loop reentrancy) and complications due to hash collision
resolution. */
- int res = _odict_clear_node((PyODictObject *)od, node, key, hash);
+ int res = _odict_clear_node(_PyODictObject_CAST(od), node, key, hash);
if (res < 0) {
goto done;
}
"od.clear() -> None. Remove all items from od.");
static PyObject *
-odict_clear(register PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_clear(PyObject *op, PyObject *Py_UNUSED(ignored))
{
- PyDict_Clear((PyObject *)od);
+ register PyODictObject *od = _PyODictObject_CAST(op);
+ PyDict_Clear(op);
_odict_clear_nodes(od);
Py_RETURN_NONE;
}
PyDoc_STRVAR(odict_copy__doc__, "od.copy() -> a shallow copy of od");
static PyObject *
-odict_copy(register PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_copy(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ register PyODictObject *od = _PyODictObject_CAST(op);
_ODictNode *node;
PyObject *od_copy;
static PyObject * odictiter_new(PyODictObject *, int);
static PyObject *
-odict_reversed(PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ PyODictObject *od = _PyODictObject_CAST(op);
return odictiter_new(od, _odict_ITER_KEYS|_odict_ITER_REVERSED);
}
/* overridden dict methods */
ORDEREDDICT_FROMKEYS_METHODDEF
- {"__sizeof__", (PyCFunction)odict_sizeof, METH_NOARGS,
+ {"__sizeof__", odict_sizeof, METH_NOARGS,
odict_sizeof__doc__},
- {"__reduce__", (PyCFunction)odict_reduce, METH_NOARGS,
+ {"__reduce__", odict_reduce, METH_NOARGS,
odict_reduce__doc__},
ORDEREDDICT_SETDEFAULT_METHODDEF
ORDEREDDICT_POP_METHODDEF
odict_items__doc__},
{"update", _PyCFunction_CAST(odict_update), METH_VARARGS | METH_KEYWORDS,
odict_update__doc__},
- {"clear", (PyCFunction)odict_clear, METH_NOARGS,
+ {"clear", odict_clear, METH_NOARGS,
odict_clear__doc__},
- {"copy", (PyCFunction)odict_copy, METH_NOARGS,
+ {"copy", odict_copy, METH_NOARGS,
odict_copy__doc__},
/* new methods */
- {"__reversed__", (PyCFunction)odict_reversed, METH_NOARGS,
+ {"__reversed__", odict_reversed, METH_NOARGS,
odict_reversed__doc__},
ORDEREDDICT_MOVE_TO_END_METHODDEF
/* tp_dealloc */
static void
-odict_dealloc(PyODictObject *self)
+odict_dealloc(PyObject *op)
{
+ PyODictObject *self = _PyODictObject_CAST(op);
PyObject_GC_UnTrack(self);
Py_TRASHCAN_BEGIN(self, odict_dealloc)
/* tp_repr */
static PyObject *
-odict_repr(PyODictObject *self)
+odict_repr(PyObject *op)
{
+ PyODictObject *self = _PyODictObject_CAST(op);
int i;
PyObject *result = NULL, *dcopy = NULL;
/* tp_traverse */
static int
-odict_traverse(PyODictObject *od, visitproc visit, void *arg)
+odict_traverse(PyObject *op, visitproc visit, void *arg)
{
+ PyODictObject *od = _PyODictObject_CAST(op);
_ODictNode *node;
Py_VISIT(od->od_inst_dict);
/* tp_clear */
static int
-odict_tp_clear(PyODictObject *od)
+odict_tp_clear(PyObject *op)
{
+ PyODictObject *od = _PyODictObject_CAST(op);
Py_CLEAR(od->od_inst_dict);
PyDict_Clear((PyObject *)od);
_odict_clear_nodes(od);
Py_DECREF(cmp);
/* Try comparing odict keys. */
- eq = _odict_keys_equal((PyODictObject *)v, (PyODictObject *)w);
+ eq = _odict_keys_equal(_PyODictObject_CAST(v), _PyODictObject_CAST(w));
if (eq < 0)
return NULL;
/* tp_iter */
static PyObject *
-odict_iter(PyODictObject *od)
+odict_iter(PyObject *op)
{
- return odictiter_new(od, _odict_ITER_KEYS);
+ return odictiter_new(_PyODictObject_CAST(op), _odict_ITER_KEYS);
}
/* tp_init */
"collections.OrderedDict", /* tp_name */
sizeof(PyODictObject), /* tp_basicsize */
0, /* tp_itemsize */
- (destructor)odict_dealloc, /* tp_dealloc */
+ odict_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_as_async */
- (reprfunc)odict_repr, /* tp_repr */
+ odict_repr, /* tp_repr */
&odict_as_number, /* tp_as_number */
0, /* tp_as_sequence */
&odict_as_mapping, /* tp_as_mapping */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,/* tp_flags */
odict_doc, /* tp_doc */
- (traverseproc)odict_traverse, /* tp_traverse */
- (inquiry)odict_tp_clear, /* tp_clear */
- (richcmpfunc)odict_richcompare, /* tp_richcompare */
+ odict_traverse, /* tp_traverse */
+ odict_tp_clear, /* tp_clear */
+ odict_richcompare, /* tp_richcompare */
offsetof(PyODictObject, od_weakreflist), /* tp_weaklistoffset */
- (getiterfunc)odict_iter, /* tp_iter */
+ odict_iter, /* tp_iter */
0, /* tp_iternext */
odict_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_descr_get */
0, /* tp_descr_set */
offsetof(PyODictObject, od_inst_dict), /* tp_dictoffset */
- (initproc)odict_init, /* tp_init */
+ odict_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
0, /* tp_new */
0, /* tp_free */
{
int res = _PyDict_SetItem_KnownHash(od, key, value, hash);
if (res == 0) {
- res = _odict_add_new_node((PyODictObject *)od, key, hash);
+ res = _odict_add_new_node(_PyODictObject_CAST(od), key, hash);
if (res < 0) {
/* Revert setting the value on the dict */
PyObject *exc = PyErr_GetRaisedException();
Py_hash_t hash = PyObject_Hash(key);
if (hash == -1)
return -1;
- res = _odict_clear_node((PyODictObject *)od, NULL, key, hash);
+ res = _odict_clear_node(_PyODictObject_CAST(od), NULL, key, hash);
if (res < 0)
return -1;
return _PyDict_DelItem_KnownHash(od, key, hash);
} odictiterobject;
static void
-odictiter_dealloc(odictiterobject *di)
+odictiter_dealloc(PyObject *op)
{
+ odictiterobject *di = (odictiterobject*)op;
_PyObject_GC_UNTRACK(di);
Py_XDECREF(di->di_odict);
Py_XDECREF(di->di_current);
}
static int
-odictiter_traverse(odictiterobject *di, visitproc visit, void *arg)
+odictiter_traverse(PyObject *op, visitproc visit, void *arg)
{
+ odictiterobject *di = (odictiterobject*)op;
Py_VISIT(di->di_odict);
Py_VISIT(di->di_current); /* A key could be any type, not just str. */
Py_VISIT(di->di_result);
}
static PyObject *
-odictiter_iternext(odictiterobject *di)
+odictiter_iternext(PyObject *op)
{
+ odictiterobject *di = (odictiterobject*)op;
PyObject *result, *value;
PyObject *key = odictiter_nextkey(di); /* new reference */
PyDoc_STRVAR(reduce_doc, "Return state information for pickling");
static PyObject *
-odictiter_reduce(odictiterobject *di, PyObject *Py_UNUSED(ignored))
+odictiter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ odictiterobject *di = (odictiterobject*)op;
+
/* copy the iterator state */
odictiterobject tmp = *di;
Py_XINCREF(tmp.di_odict);
}
static PyMethodDef odictiter_methods[] = {
- {"__reduce__", (PyCFunction)odictiter_reduce, METH_NOARGS, reduce_doc},
+ {"__reduce__", odictiter_reduce, METH_NOARGS, reduce_doc},
{NULL, NULL} /* sentinel */
};
sizeof(odictiterobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- (destructor)odictiter_dealloc, /* tp_dealloc */
+ odictiter_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
- (traverseproc)odictiter_traverse, /* tp_traverse */
+ odictiter_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
- (iternextfunc)odictiter_iternext, /* tp_iternext */
+ odictiter_iternext, /* tp_iternext */
odictiter_methods, /* tp_methods */
0,
};
if (dv->dv_dict == NULL) {
Py_RETURN_NONE;
}
- return odictiter_new((PyODictObject *)dv->dv_dict,
+ return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
_odict_ITER_KEYS);
}
static PyObject *
-odictkeys_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored))
+odictkeys_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ _PyDictViewObject *dv = (_PyDictViewObject*)op;
if (dv->dv_dict == NULL) {
Py_RETURN_NONE;
}
- return odictiter_new((PyODictObject *)dv->dv_dict,
+ return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
_odict_ITER_KEYS|_odict_ITER_REVERSED);
}
static PyMethodDef odictkeys_methods[] = {
- {"__reversed__", (PyCFunction)odictkeys_reversed, METH_NOARGS, NULL},
+ {"__reversed__", odictkeys_reversed, METH_NOARGS, NULL},
{NULL, NULL} /* sentinel */
};
if (dv->dv_dict == NULL) {
Py_RETURN_NONE;
}
- return odictiter_new((PyODictObject *)dv->dv_dict,
+ return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
_odict_ITER_KEYS|_odict_ITER_VALUES);
}
static PyObject *
-odictitems_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored))
+odictitems_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ _PyDictViewObject *dv = (_PyDictViewObject*)op;
if (dv->dv_dict == NULL) {
Py_RETURN_NONE;
}
- return odictiter_new((PyODictObject *)dv->dv_dict,
+ return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
_odict_ITER_KEYS|_odict_ITER_VALUES|_odict_ITER_REVERSED);
}
static PyMethodDef odictitems_methods[] = {
- {"__reversed__", (PyCFunction)odictitems_reversed, METH_NOARGS, NULL},
+ {"__reversed__", odictitems_reversed, METH_NOARGS, NULL},
{NULL, NULL} /* sentinel */
};
/* values() */
static PyObject *
-odictvalues_iter(_PyDictViewObject *dv)
+odictvalues_iter(PyObject *op)
{
+ _PyDictViewObject *dv = (_PyDictViewObject*)op;
if (dv->dv_dict == NULL) {
Py_RETURN_NONE;
}
- return odictiter_new((PyODictObject *)dv->dv_dict,
+ return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
_odict_ITER_VALUES);
}
static PyObject *
-odictvalues_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored))
+odictvalues_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
{
+ _PyDictViewObject *dv = (_PyDictViewObject*)op;
if (dv->dv_dict == NULL) {
Py_RETURN_NONE;
}
- return odictiter_new((PyODictObject *)dv->dv_dict,
+ return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
_odict_ITER_VALUES|_odict_ITER_REVERSED);
}
static PyMethodDef odictvalues_methods[] = {
- {"__reversed__", (PyCFunction)odictvalues_reversed, METH_NOARGS, NULL},
+ {"__reversed__", odictvalues_reversed, METH_NOARGS, NULL},
{NULL, NULL} /* sentinel */
};
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
- (getiterfunc)odictvalues_iter, /* tp_iter */
+ odictvalues_iter, /* tp_iter */
0, /* tp_iternext */
odictvalues_methods, /* tp_methods */
0, /* tp_members */