diff -r 770ffc91a82e Include/dictobject.h --- a/Include/dictobject.h Thu Aug 16 07:22:15 2012 +0300 +++ b/Include/dictobject.h Thu Aug 16 22:11:53 2012 +0300 @@ -129,6 +129,7 @@ PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); +PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *mp); #endif /* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ diff -r 770ffc91a82e Modules/_ctypes/stgdict.c --- a/Modules/_ctypes/stgdict.c Thu Aug 16 07:22:15 2012 +0300 +++ b/Modules/_ctypes/stgdict.c Thu Aug 16 22:11:53 2012 +0300 @@ -48,6 +48,21 @@ PyDict_Type.tp_dealloc((PyObject *)self); } +static PyObject * +PyCStgDict_sizeof(StgDictObject *self, void *unused) +{ + Py_ssize_t res; + + res = _PyDict_SizeOf((PyDictObject *)self); + res += sizeof(StgDictObject) - sizeof(PyDictObject); + if (self->format) + res += strlen(self->format) + 1; + res += self->ndim * sizeof(Py_ssize_t); + if (self->ffi_type_pointer.elements) + res += (self->length + 1) * sizeof(ffi_type *); + return PyLong_FromSsize_t(res); +} + int PyCStgDict_clone(StgDictObject *dst, StgDictObject *src) { @@ -102,6 +117,11 @@ return 0; } +static struct PyMethodDef PyCStgDict_methods[] = { + {"__sizeof__", (PyCFunction)PyCStgDict_sizeof, METH_NOARGS}, + {NULL, NULL} /* sentinel */ +}; + PyTypeObject PyCStgDict_Type = { PyVarObject_HEAD_INIT(NULL, 0) "StgDict", @@ -130,7 +150,7 @@ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + PyCStgDict_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -482,7 +502,7 @@ char *fieldfmt = dict->format ? dict->format : "B"; char *fieldname = _PyUnicode_AsString(name); char *ptr; - Py_ssize_t len; + Py_ssize_t len; char *buf; if (fieldname == NULL) diff -r 770ffc91a82e Objects/dictobject.c --- a/Objects/dictobject.c Thu Aug 16 07:22:15 2012 +0300 +++ b/Objects/dictobject.c Thu Aug 16 22:11:53 2012 +0300 @@ -1967,15 +1967,21 @@ static PyObject *dictiter_new(PyDictObject *, PyTypeObject *); -static PyObject * -dict_sizeof(PyDictObject *mp) +Py_ssize_t +_PyDict_SizeOf(PyDictObject *mp) { Py_ssize_t res; res = sizeof(PyDictObject); if (mp->ma_table != mp->ma_smalltable) res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry); - return PyLong_FromSsize_t(res); + return res; +} + +static PyObject * +dict_sizeof(PyDictObject *mp) +{ + return PyLong_FromSsize_t(_PyDict_SizeOf(mp)); } PyDoc_STRVAR(contains__doc__,