~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Include/weakrefobject.h

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 */