1 /* Weak references objects for Python. */ 2 3 #ifndef Py_WEAKREFOBJECT_H 4 #define Py_WEAKREFOBJECT_H 5 #ifdef __cplusplus 6 extern "C" { 7 #endif 8 9 10 typedef struct _PyWeakReference PyWeakReference; 11 12 /* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, 13 * and CallableProxyType. 14 */ 15 struct _PyWeakReference { 16 PyObject_HEAD 17 18 /* The object to which this is a weak reference, or Py_None if none. 19 * Note that this is a stealth reference: wr_object's refcount is 20 * not incremented to reflect this pointer. 21 */ 22 PyObject *wr_object; 23 24 /* A callable to invoke when wr_object dies, or NULL if none. */ 25 PyObject *wr_callback; 26 27 /* A cache for wr_object's hash code. As usual for hashes, this is -1 28 * if the hash code isn't known yet. 29 */ 30 long hash; 31 32 /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL- 33 * terminated list of weak references to it. These are the list pointers. 34 * If wr_object goes away, wr_object is set to Py_None, and these pointers 35 * have no meaning then. 36 */ 37 PyWeakReference *wr_prev; 38 PyWeakReference *wr_next; 39 }; 40 41 PyAPI_DATA(PyTypeObject) _PyWeakref_RefType; 42 PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType; 43 PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; 44 45 #define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) 46 #define PyWeakref_CheckRefExact(op) \ 47 (Py_TYPE(op) == &_PyWeakref_RefType) 48 #define PyWeakref_CheckProxy(op) \ 49 ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ 50 (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) 51 52 /* This macro calls PyWeakref_CheckRef() last since that can involve a 53 function call; this makes it more likely that the function call 54 will be avoided. */ 55 #define PyWeakref_Check(op) \ 56 (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) 57 58 59 PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, 60 PyObject *callback); 61 PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, 62 PyObject *callback); 63 PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); 64 65 PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); 66 67 PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); 68 69 #define PyWeakref_GET_OBJECT(ref) (((PyWeakReference *)(ref))->wr_object) 70 71 72 #ifdef __cplusplus 73 } 74 #endif 75 #endif /* !Py_WEAKREFOBJECT_H */ 76