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