blob: a73dcdbfa2388c8afc30347f6a49e3cc997acde3 [file] [log] [blame]
Fred Drake41deb1e2001-02-01 05:27:45 +00001#include "Python.h"
Fred Drake41deb1e2001-02-01 05:27:45 +00002
3
4#define GET_WEAKREFS_LISTPTR(o) \
5 ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
6
Larry Hastings61272b72014-01-07 12:41:53 -08007/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -07008module _weakref
Larry Hastings61272b72014-01-07 12:41:53 -08009[clinic start generated code]*/
10/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -080011
Larry Hastings61272b72014-01-07 12:41:53 -080012/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -070013
14_weakref.getweakrefcount -> Py_ssize_t
15
16 object: object
17 /
18
19Return the number of weak references to 'object'.
Larry Hastings61272b72014-01-07 12:41:53 -080020[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -070021
22PyDoc_STRVAR(_weakref_getweakrefcount__doc__,
Larry Hastings44e2eaa2013-11-23 15:37:55 -080023"getweakrefcount(object)\n"
24"Return the number of weak references to \'object\'.");
Larry Hastings31826802013-10-19 00:09:25 -070025
26#define _WEAKREF_GETWEAKREFCOUNT_METHODDEF \
27 {"getweakrefcount", (PyCFunction)_weakref_getweakrefcount, METH_O, _weakref_getweakrefcount__doc__},
28
29static Py_ssize_t
Larry Hastingsebdcb502013-11-23 14:54:00 -080030_weakref_getweakrefcount_impl(PyModuleDef *module, PyObject *object);
Fred Drake7855aba2001-02-18 05:20:18 +000031
Fred Drake41deb1e2001-02-01 05:27:45 +000032static PyObject *
Larry Hastingsebdcb502013-11-23 14:54:00 -080033_weakref_getweakrefcount(PyModuleDef *module, PyObject *object)
Fred Drake41deb1e2001-02-01 05:27:45 +000034{
Larry Hastings31826802013-10-19 00:09:25 -070035 PyObject *return_value = NULL;
36 Py_ssize_t _return_value;
Larry Hastingsed4a1c52013-11-18 09:32:13 -080037 _return_value = _weakref_getweakrefcount_impl(module, object);
Larry Hastings31826802013-10-19 00:09:25 -070038 if ((_return_value == -1) && PyErr_Occurred())
39 goto exit;
40 return_value = PyLong_FromSsize_t(_return_value);
Fred Drake41deb1e2001-02-01 05:27:45 +000041
Larry Hastings31826802013-10-19 00:09:25 -070042exit:
43 return return_value;
44}
Fred Drake41deb1e2001-02-01 05:27:45 +000045
Larry Hastings31826802013-10-19 00:09:25 -070046static Py_ssize_t
Larry Hastingsebdcb502013-11-23 14:54:00 -080047_weakref_getweakrefcount_impl(PyModuleDef *module, PyObject *object)
Larry Hastings61272b72014-01-07 12:41:53 -080048/*[clinic end generated code: checksum=436e8fbe0297434375f039d8c2d9fc3a9bbe773c]*/
Larry Hastings31826802013-10-19 00:09:25 -070049{
50 PyWeakReference **list;
Fred Drake7fdc0a12001-08-16 14:11:30 +000051
Larry Hastings31826802013-10-19 00:09:25 -070052 if (!PyType_SUPPORTS_WEAKREFS(Py_TYPE(object)))
53 return 0;
Larry Hastings61272b72014-01-07 12:41:53 -080054
Larry Hastings31826802013-10-19 00:09:25 -070055 list = GET_WEAKREFS_LISTPTR(object);
56 return _PyWeakref_GetWeakrefCount(*list);
Fred Drake41deb1e2001-02-01 05:27:45 +000057}
58
59
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000060PyDoc_STRVAR(weakref_getweakrefs__doc__,
Fred Drake7855aba2001-02-18 05:20:18 +000061"getweakrefs(object) -- return a list of all weak reference objects\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000062"that point to 'object'.");
Fred Drake7855aba2001-02-18 05:20:18 +000063
Fred Drake41deb1e2001-02-01 05:27:45 +000064static PyObject *
Fred Drake7fdc0a12001-08-16 14:11:30 +000065weakref_getweakrefs(PyObject *self, PyObject *object)
Fred Drake41deb1e2001-02-01 05:27:45 +000066{
67 PyObject *result = NULL;
Fred Drake41deb1e2001-02-01 05:27:45 +000068
Christian Heimes90aa7642007-12-19 02:45:37 +000069 if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {
Fred Drake7fdc0a12001-08-16 14:11:30 +000070 PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);
Thomas Wouters0e3f5912006-08-11 14:57:12 +000071 Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);
Fred Drake41deb1e2001-02-01 05:27:45 +000072
Fred Drake7fdc0a12001-08-16 14:11:30 +000073 result = PyList_New(count);
74 if (result != NULL) {
75 PyWeakReference *current = *list;
Thomas Wouters0e3f5912006-08-11 14:57:12 +000076 Py_ssize_t i;
Fred Drake7fdc0a12001-08-16 14:11:30 +000077 for (i = 0; i < count; ++i) {
78 PyList_SET_ITEM(result, i, (PyObject *) current);
79 Py_INCREF(current);
80 current = current->wr_next;
Fred Drake41deb1e2001-02-01 05:27:45 +000081 }
82 }
Fred Drake7fdc0a12001-08-16 14:11:30 +000083 }
84 else {
85 result = PyList_New(0);
Fred Drake41deb1e2001-02-01 05:27:45 +000086 }
87 return result;
88}
89
90
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000091PyDoc_STRVAR(weakref_proxy__doc__,
Fred Drake7855aba2001-02-18 05:20:18 +000092"proxy(object[, callback]) -- create a proxy object that weakly\n"
93"references 'object'. 'callback', if given, is called with a\n"
Fred Drake610291c2002-08-02 20:23:40 +000094"reference to the proxy when 'object' is about to be finalized.");
Fred Drake7855aba2001-02-18 05:20:18 +000095
Fred Drake41deb1e2001-02-01 05:27:45 +000096static PyObject *
97weakref_proxy(PyObject *self, PyObject *args)
98{
99 PyObject *object;
100 PyObject *callback = NULL;
Fred Drakef7f8cad2001-10-05 22:00:24 +0000101 PyObject *result = NULL;
Fred Drake41deb1e2001-02-01 05:27:45 +0000102
Fred Drake0d429e82001-10-23 21:12:47 +0000103 if (PyArg_UnpackTuple(args, "proxy", 1, 2, &object, &callback)) {
Fred Drakef7f8cad2001-10-05 22:00:24 +0000104 result = PyWeakref_NewProxy(object, callback);
Fred Drake41deb1e2001-02-01 05:27:45 +0000105 }
Fred Drakef7f8cad2001-10-05 22:00:24 +0000106 return result;
Fred Drake41deb1e2001-02-01 05:27:45 +0000107}
108
109
110static PyMethodDef
111weakref_functions[] = {
Larry Hastings31826802013-10-19 00:09:25 -0700112 _WEAKREF_GETWEAKREFCOUNT_METHODDEF
Fred Drake7fdc0a12001-08-16 14:11:30 +0000113 {"getweakrefs", weakref_getweakrefs, METH_O,
Fred Drake7855aba2001-02-18 05:20:18 +0000114 weakref_getweakrefs__doc__},
115 {"proxy", weakref_proxy, METH_VARARGS,
116 weakref_proxy__doc__},
Fred Drake41deb1e2001-02-01 05:27:45 +0000117 {NULL, NULL, 0, NULL}
118};
119
120
Martin v. Löwis1a214512008-06-11 05:26:20 +0000121static struct PyModuleDef weakrefmodule = {
122 PyModuleDef_HEAD_INIT,
123 "_weakref",
124 "Weak-reference support module.",
125 -1,
126 weakref_functions,
127 NULL,
128 NULL,
129 NULL,
130 NULL
131};
132
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000133PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000134PyInit__weakref(void)
Fred Drake41deb1e2001-02-01 05:27:45 +0000135{
136 PyObject *m;
137
Martin v. Löwis1a214512008-06-11 05:26:20 +0000138 m = PyModule_Create(&weakrefmodule);
Larry Hastings31826802013-10-19 00:09:25 -0700139
Fred Drake41deb1e2001-02-01 05:27:45 +0000140 if (m != NULL) {
Fred Drakef7f8cad2001-10-05 22:00:24 +0000141 Py_INCREF(&_PyWeakref_RefType);
Fred Drake0a4dd392004-07-02 18:57:45 +0000142 PyModule_AddObject(m, "ref",
143 (PyObject *) &_PyWeakref_RefType);
144 Py_INCREF(&_PyWeakref_RefType);
Fred Drake41deb1e2001-02-01 05:27:45 +0000145 PyModule_AddObject(m, "ReferenceType",
Fred Drakef7f8cad2001-10-05 22:00:24 +0000146 (PyObject *) &_PyWeakref_RefType);
147 Py_INCREF(&_PyWeakref_ProxyType);
Fred Drake41deb1e2001-02-01 05:27:45 +0000148 PyModule_AddObject(m, "ProxyType",
Fred Drakef7f8cad2001-10-05 22:00:24 +0000149 (PyObject *) &_PyWeakref_ProxyType);
150 Py_INCREF(&_PyWeakref_CallableProxyType);
Fred Drake41deb1e2001-02-01 05:27:45 +0000151 PyModule_AddObject(m, "CallableProxyType",
Fred Drakef7f8cad2001-10-05 22:00:24 +0000152 (PyObject *) &_PyWeakref_CallableProxyType);
Fred Drake41deb1e2001-02-01 05:27:45 +0000153 }
Martin v. Löwis1a214512008-06-11 05:26:20 +0000154 return m;
Fred Drake41deb1e2001-02-01 05:27:45 +0000155}