From 22c001bd295a3481687bd9224c71a0f6b275f8aa Mon Sep 17 00:00:00 2001
From: Raymond Hettinger <python@rcn.com>
Date: Wed, 7 Aug 2002 16:18:54 +0000
Subject: Described responsibilty of weakly referenced extension types to
 initialize the weakreflist to NULL in the constructor and to fill the
 tp_flags slot with Py_TPFLAGS_HAVE_WEAKREFS.  Closes SF bug 586583.

---
 Doc/lib/libweakref.tex | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/Doc/lib/libweakref.tex b/Doc/lib/libweakref.tex
index fda27d2..9e07b00 100644
--- a/Doc/lib/libweakref.tex
+++ b/Doc/lib/libweakref.tex
@@ -217,7 +217,9 @@ For an object to be weakly referencable, the extension must include a
 weak reference mechanism; it must be initialized to \NULL{} by the
 object's constructor.  It must also set the \member{tp_weaklistoffset}
 field of the corresponding type object to the offset of the field.
-For example, the instance type is defined with the following structure:
+Also, it needs to add \constant{Py_TPFLAGS_HAVE_WEAKREFS} to the
+tp_flags slot.  For example, the instance type is defined with the
+following structure:
 
 \begin{verbatim}
 typedef struct {
@@ -238,10 +240,29 @@ PyTypeObject PyInstance_Type = {
 
     /* Lots of stuff omitted for brevity... */
 
-    offsetof(PyInstanceObject, in_weakreflist) /* tp_weaklistoffset */
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS   /* tp_flags */
+    0,                                          /* tp_doc */
+    0,                                          /* tp_traverse */
+    0,                                          /* tp_clear */
+    0,                                          /* tp_richcompare */
+    offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
 };
 \end{verbatim}
 
+The type constructor is responsible for initializing the weak reference
+list to \NULL:
+
+\begin{verbatim}
+static PyObject * 
+instance_new() { 
+    /* Other initialization stuff omitted for brevity */ 
+
+    self->in_weakreflist = NULL; 
+
+    return (PyObject *) self; 
+} 
+\end{verbatim}
+
 The only further addition is that the destructor needs to call the
 weak reference manager to clear any weak references.  This should be
 done before any other parts of the destruction have occurred, but is
-- 
cgit v0.12