4 #define GET_WEAKREFS_LISTPTR(o) \
5 ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
8 PyDoc_STRVAR(weakref_getweakrefcount__doc__
,
9 "getweakrefcount(object) -- return the number of weak references\n"
13 weakref_getweakrefcount(PyObject
*self
, PyObject
*object
)
15 PyObject
*result
= NULL
;
17 if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object
))) {
18 PyWeakReference
**list
= GET_WEAKREFS_LISTPTR(object
);
20 result
= PyInt_FromSsize_t(_PyWeakref_GetWeakrefCount(*list
));
23 result
= PyInt_FromLong(0);
29 PyDoc_STRVAR(weakref_getweakrefs__doc__
,
30 "getweakrefs(object) -- return a list of all weak reference objects\n"
31 "that point to 'object'.");
34 weakref_getweakrefs(PyObject
*self
, PyObject
*object
)
36 PyObject
*result
= NULL
;
38 if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object
))) {
39 PyWeakReference
**list
= GET_WEAKREFS_LISTPTR(object
);
40 Py_ssize_t count
= _PyWeakref_GetWeakrefCount(*list
);
42 result
= PyList_New(count
);
44 PyWeakReference
*current
= *list
;
46 for (i
= 0; i
< count
; ++i
) {
47 PyList_SET_ITEM(result
, i
, (PyObject
*) current
);
49 current
= current
->wr_next
;
54 result
= PyList_New(0);
60 PyDoc_STRVAR(weakref_proxy__doc__
,
61 "proxy(object[, callback]) -- create a proxy object that weakly\n"
62 "references 'object'. 'callback', if given, is called with a\n"
63 "reference to the proxy when 'object' is about to be finalized.");
66 weakref_proxy(PyObject
*self
, PyObject
*args
)
69 PyObject
*callback
= NULL
;
70 PyObject
*result
= NULL
;
72 if (PyArg_UnpackTuple(args
, "proxy", 1, 2, &object
, &callback
)) {
73 result
= PyWeakref_NewProxy(object
, callback
);
80 weakref_functions
[] = {
81 {"getweakrefcount", weakref_getweakrefcount
, METH_O
,
82 weakref_getweakrefcount__doc__
},
83 {"getweakrefs", weakref_getweakrefs
, METH_O
,
84 weakref_getweakrefs__doc__
},
85 {"proxy", weakref_proxy
, METH_VARARGS
,
86 weakref_proxy__doc__
},
96 m
= Py_InitModule3("_weakref", weakref_functions
,
97 "Weak-reference support module.");
99 Py_INCREF(&_PyWeakref_RefType
);
100 PyModule_AddObject(m
, "ref",
101 (PyObject
*) &_PyWeakref_RefType
);
102 Py_INCREF(&_PyWeakref_RefType
);
103 PyModule_AddObject(m
, "ReferenceType",
104 (PyObject
*) &_PyWeakref_RefType
);
105 Py_INCREF(&_PyWeakref_ProxyType
);
106 PyModule_AddObject(m
, "ProxyType",
107 (PyObject
*) &_PyWeakref_ProxyType
);
108 Py_INCREF(&_PyWeakref_CallableProxyType
);
109 PyModule_AddObject(m
, "CallableProxyType",
110 (PyObject
*) &_PyWeakref_CallableProxyType
);