| #include "Python.h" | 
 |  | 
 |  | 
 | #define GET_WEAKREFS_LISTPTR(o) \ | 
 |         ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) | 
 |  | 
 |  | 
 | PyDoc_STRVAR(weakref_getweakrefcount__doc__, | 
 | "getweakrefcount(object) -- return the number of weak references\n" | 
 | "to 'object'."); | 
 |  | 
 | static PyObject * | 
 | weakref_getweakrefcount(PyObject *self, PyObject *object) | 
 | { | 
 |     PyObject *result = NULL; | 
 |  | 
 |     if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) { | 
 |         PyWeakReference **list = GET_WEAKREFS_LISTPTR(object); | 
 |  | 
 |         result = PyLong_FromSsize_t(_PyWeakref_GetWeakrefCount(*list)); | 
 |     } | 
 |     else | 
 |         result = PyLong_FromLong(0); | 
 |  | 
 |     return result; | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR(weakref_getweakrefs__doc__, | 
 | "getweakrefs(object) -- return a list of all weak reference objects\n" | 
 | "that point to 'object'."); | 
 |  | 
 | static PyObject * | 
 | weakref_getweakrefs(PyObject *self, PyObject *object) | 
 | { | 
 |     PyObject *result = NULL; | 
 |  | 
 |     if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) { | 
 |         PyWeakReference **list = GET_WEAKREFS_LISTPTR(object); | 
 |         Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list); | 
 |  | 
 |         result = PyList_New(count); | 
 |         if (result != NULL) { | 
 |             PyWeakReference *current = *list; | 
 |             Py_ssize_t i; | 
 |             for (i = 0; i < count; ++i) { | 
 |                 PyList_SET_ITEM(result, i, (PyObject *) current); | 
 |                 Py_INCREF(current); | 
 |                 current = current->wr_next; | 
 |             } | 
 |         } | 
 |     } | 
 |     else { | 
 |         result = PyList_New(0); | 
 |     } | 
 |     return result; | 
 | } | 
 |  | 
 |  | 
 | PyDoc_STRVAR(weakref_proxy__doc__, | 
 | "proxy(object[, callback]) -- create a proxy object that weakly\n" | 
 | "references 'object'.  'callback', if given, is called with a\n" | 
 | "reference to the proxy when 'object' is about to be finalized."); | 
 |  | 
 | static PyObject * | 
 | weakref_proxy(PyObject *self, PyObject *args) | 
 | { | 
 |     PyObject *object; | 
 |     PyObject *callback = NULL; | 
 |     PyObject *result = NULL; | 
 |  | 
 |     if (PyArg_UnpackTuple(args, "proxy", 1, 2, &object, &callback)) { | 
 |         result = PyWeakref_NewProxy(object, callback); | 
 |     } | 
 |     return result; | 
 | } | 
 |  | 
 |  | 
 | static PyMethodDef | 
 | weakref_functions[] =  { | 
 |     {"getweakrefcount", weakref_getweakrefcount,        METH_O, | 
 |      weakref_getweakrefcount__doc__}, | 
 |     {"getweakrefs",     weakref_getweakrefs,            METH_O, | 
 |      weakref_getweakrefs__doc__}, | 
 |     {"proxy",           weakref_proxy,                  METH_VARARGS, | 
 |      weakref_proxy__doc__}, | 
 |     {NULL, NULL, 0, NULL} | 
 | }; | 
 |  | 
 |  | 
 | static struct PyModuleDef weakrefmodule = { | 
 | 	PyModuleDef_HEAD_INIT, | 
 | 	"_weakref", | 
 | 	"Weak-reference support module.", | 
 | 	-1, | 
 | 	weakref_functions, | 
 | 	NULL, | 
 | 	NULL, | 
 | 	NULL, | 
 | 	NULL | 
 | }; | 
 |  | 
 | PyMODINIT_FUNC | 
 | PyInit__weakref(void) | 
 | { | 
 |     PyObject *m; | 
 |  | 
 |     m = PyModule_Create(&weakrefmodule); | 
 |                         | 
 |     if (m != NULL) { | 
 |         Py_INCREF(&_PyWeakref_RefType); | 
 |         PyModule_AddObject(m, "ref", | 
 |                            (PyObject *) &_PyWeakref_RefType); | 
 |         Py_INCREF(&_PyWeakref_RefType); | 
 |         PyModule_AddObject(m, "ReferenceType", | 
 |                            (PyObject *) &_PyWeakref_RefType); | 
 |         Py_INCREF(&_PyWeakref_ProxyType); | 
 |         PyModule_AddObject(m, "ProxyType", | 
 |                            (PyObject *) &_PyWeakref_ProxyType); | 
 |         Py_INCREF(&_PyWeakref_CallableProxyType); | 
 |         PyModule_AddObject(m, "CallableProxyType", | 
 |                            (PyObject *) &_PyWeakref_CallableProxyType); | 
 |     } | 
 |     return m; | 
 | } |