Commit 22c001bd authored by Raymond Hettinger's avatar Raymond Hettinger

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.
parent 861bb024
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment