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(object
->ob_type
)) {
18 PyWeakReference
**list
= GET_WEAKREFS_LISTPTR(object
);
20 result
= PyInt_FromLong(_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(object
->ob_type
)) {
39 PyWeakReference
**list
= GET_WEAKREFS_LISTPTR(object
);
40 long 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_ref__doc__
,
61 "ref(object[, callback]) -- create a weak reference to 'object';\n"
62 "when 'object' is finalized, 'callback' will be called and passed\n"
63 "a reference to the weak reference object when 'object' is about\n"
67 weakref_ref(PyObject
*self
, PyObject
*args
)
70 PyObject
*callback
= NULL
;
71 PyObject
*result
= NULL
;
73 if (PyArg_UnpackTuple(args
, "ref", 1, 2, &object
, &callback
)) {
74 result
= PyWeakref_NewRef(object
, callback
);
80 PyDoc_STRVAR(weakref_proxy__doc__
,
81 "proxy(object[, callback]) -- create a proxy object that weakly\n"
82 "references 'object'. 'callback', if given, is called with a\n"
83 "reference to the proxy when 'object' is about to be finalized.");
86 weakref_proxy(PyObject
*self
, PyObject
*args
)
89 PyObject
*callback
= NULL
;
90 PyObject
*result
= NULL
;
92 if (PyArg_UnpackTuple(args
, "proxy", 1, 2, &object
, &callback
)) {
93 result
= PyWeakref_NewProxy(object
, callback
);
100 weakref_functions
[] = {
101 {"getweakrefcount", weakref_getweakrefcount
, METH_O
,
102 weakref_getweakrefcount__doc__
},
103 {"getweakrefs", weakref_getweakrefs
, METH_O
,
104 weakref_getweakrefs__doc__
},
105 {"proxy", weakref_proxy
, METH_VARARGS
,
106 weakref_proxy__doc__
},
107 {"ref", weakref_ref
, METH_VARARGS
,
109 {NULL
, NULL
, 0, NULL
}
118 m
= Py_InitModule3("_weakref", weakref_functions
,
119 "Weak-reference support module.");
121 Py_INCREF(&_PyWeakref_RefType
);
122 PyModule_AddObject(m
, "ReferenceType",
123 (PyObject
*) &_PyWeakref_RefType
);
124 Py_INCREF(&_PyWeakref_ProxyType
);
125 PyModule_AddObject(m
, "ProxyType",
126 (PyObject
*) &_PyWeakref_ProxyType
);
127 Py_INCREF(&_PyWeakref_CallableProxyType
);
128 PyModule_AddObject(m
, "CallableProxyType",
129 (PyObject
*) &_PyWeakref_CallableProxyType
);