diff options
author | Fred Drake <fdrake@acm.org> | 2001-02-01 05:27:45 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-02-01 05:27:45 (GMT) |
commit | 41deb1efc2f969b58e49af669cc20d15ccdb04c6 (patch) | |
tree | 6478ef737151fb4e091594b78f611318a15d3a31 /Include | |
parent | 2de7471d69b950a64e52a950675d59d9f4071da1 (diff) | |
download | cpython-41deb1efc2f969b58e49af669cc20d15ccdb04c6.zip cpython-41deb1efc2f969b58e49af669cc20d15ccdb04c6.tar.gz cpython-41deb1efc2f969b58e49af669cc20d15ccdb04c6.tar.bz2 |
PEP 205, Weak References -- initial checkin.
Diffstat (limited to 'Include')
-rw-r--r-- | Include/classobject.h | 1 | ||||
-rw-r--r-- | Include/object.h | 8 | ||||
-rw-r--r-- | Include/objimpl.h | 12 |
3 files changed, 17 insertions, 4 deletions
diff --git a/Include/classobject.h b/Include/classobject.h index 8fde040..06c178f 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -24,6 +24,7 @@ typedef struct { PyObject_HEAD PyClassObject *in_class; /* The class object */ PyObject *in_dict; /* A dictionary */ + PyObject *in_weakreflist; /* List of weak references */ } PyInstanceObject; typedef struct { diff --git a/Include/object.h b/Include/object.h index de67505..1eaa900 100644 --- a/Include/object.h +++ b/Include/object.h @@ -246,8 +246,8 @@ typedef struct _typeobject { /* rich comparisons */ richcmpfunc tp_richcompare; - /* More spares */ - long tp_xxx8; + /* weak reference enabler */ + long tp_weaklistoffset; #ifdef COUNT_ALLOCS /* these must be last */ @@ -284,6 +284,8 @@ extern DL_IMPORT(int) PyCallable_Check(PyObject *); extern DL_IMPORT(int) PyNumber_Coerce(PyObject **, PyObject **); extern DL_IMPORT(int) PyNumber_CoerceEx(PyObject **, PyObject **); +extern DL_IMPORT(int) (*PyObject_ClearWeakRefs)(PyObject *); + /* Helpers for printing recursive container types */ extern DL_IMPORT(int) Py_ReprEnter(PyObject *); extern DL_IMPORT(void) Py_ReprLeave(PyObject *); @@ -418,7 +420,7 @@ extern DL_IMPORT(long) _Py_RefTotal; #define Py_INCREF(op) (_Py_RefTotal++, (op)->ob_refcnt++) #define Py_DECREF(op) \ - if (--_Py_RefTotal, --(op)->ob_refcnt != 0) \ + if (--_Py_RefTotal, (--((op)->ob_refcnt) != 0)) \ ; \ else \ _Py_Dealloc((PyObject *)(op)) diff --git a/Include/objimpl.h b/Include/objimpl.h index 4909517..93c5b23 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -160,7 +160,11 @@ extern DL_IMPORT(void) _PyObject_Del(PyObject *); /* Macros trading binary compatibility for speed. See also pymem.h. Note that these macros expect non-NULL object pointers.*/ #define PyObject_INIT(op, typeobj) \ - ( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) + ((op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), \ + (PyType_SUPPORTS_WEAKREFS((typeobj)) \ + ? *(PyObject_GET_WEAKREFS_LISTPTR(op)) = NULL \ + : NULL), \ + (op)) #define PyObject_INIT_VAR(op, typeobj, size) \ ( (op)->ob_size = (size), PyObject_INIT((op), (typeobj)) ) @@ -266,6 +270,12 @@ extern DL_IMPORT(void) _PyGC_Dump(PyGC_Head *); #endif /* WITH_CYCLE_GC */ +/* Test if a type supports weak references */ +#define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) + +#define PyObject_GET_WEAKREFS_LISTPTR(o) \ + ((PyObject **) (((char *) (o)) + (o)->ob_type->tp_weaklistoffset)) + #ifdef __cplusplus } #endif |