mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
Issue #25914: Fixed and simplified OrderedDict.__sizeof__.
This commit is contained in:
parent
5af856404a
commit
0ce7a3a34c
5 changed files with 45 additions and 25 deletions
|
@ -2554,7 +2554,7 @@ dict_tp_clear(PyObject *op)
|
|||
|
||||
static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
|
||||
|
||||
PyObject *
|
||||
Py_ssize_t
|
||||
_PyDict_SizeOf(PyDictObject *mp)
|
||||
{
|
||||
Py_ssize_t size, res;
|
||||
|
@ -2567,7 +2567,7 @@ _PyDict_SizeOf(PyDictObject *mp)
|
|||
in the type object. */
|
||||
if (mp->ma_keys->dk_refcnt == 1)
|
||||
res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
|
||||
return PyLong_FromSsize_t(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
Py_ssize_t
|
||||
|
@ -2576,6 +2576,12 @@ _PyDict_KeysSize(PyDictKeysObject *keys)
|
|||
return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
|
||||
}
|
||||
|
||||
PyObject *
|
||||
dict_sizeof(PyDictObject *mp)
|
||||
{
|
||||
return PyLong_FromSsize_t(_PyDict_SizeOf(mp));
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]");
|
||||
|
||||
PyDoc_STRVAR(sizeof__doc__,
|
||||
|
@ -2623,7 +2629,7 @@ static PyMethodDef mapp_methods[] = {
|
|||
DICT___CONTAINS___METHODDEF
|
||||
{"__getitem__", (PyCFunction)dict_subscript, METH_O | METH_COEXIST,
|
||||
getitem__doc__},
|
||||
{"__sizeof__", (PyCFunction)_PyDict_SizeOf, METH_NOARGS,
|
||||
{"__sizeof__", (PyCFunction)dict_sizeof, METH_NOARGS,
|
||||
sizeof__doc__},
|
||||
{"get", (PyCFunction)dict_get, METH_VARARGS,
|
||||
get__doc__},
|
||||
|
|
|
@ -940,27 +940,7 @@ PyDoc_STRVAR(odict_sizeof__doc__, "");
|
|||
static PyObject *
|
||||
odict_sizeof(PyODictObject *od)
|
||||
{
|
||||
PyObject *pylong;
|
||||
Py_ssize_t res, temp;
|
||||
|
||||
pylong = _PyDict_SizeOf((PyDictObject *)od);
|
||||
if (pylong == NULL)
|
||||
return NULL;
|
||||
res = PyLong_AsSsize_t(pylong);
|
||||
Py_DECREF(pylong);
|
||||
if (res == -1 && PyErr_Occurred())
|
||||
return NULL;
|
||||
|
||||
/* instance dict */
|
||||
pylong = _PyDict_SizeOf((PyDictObject *)od->od_inst_dict);
|
||||
if (pylong == NULL)
|
||||
return NULL;
|
||||
temp = PyLong_AsSsize_t(pylong);
|
||||
Py_DECREF(pylong);
|
||||
if (temp == -1 && PyErr_Occurred())
|
||||
return NULL;
|
||||
res += temp;
|
||||
|
||||
Py_ssize_t res = _PyDict_SizeOf((PyDictObject *)od);
|
||||
res += sizeof(_ODictNode *) * _odict_FAST_SIZE(od); /* od_fast_nodes */
|
||||
if (!_odict_EMPTY(od)) {
|
||||
res += sizeof(_ODictNode) * PyODict_SIZE(od); /* linked-list */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue