GNU Info

Info Node: (python2.1-lib.info)Weak References in Extension Types

(python2.1-lib.info)Weak References in Extension Types


Prev: Example Up: weakref
Enter node , (file) or (file)node

Weak References in Extension Types
----------------------------------

One of the goals of the implementation is to allow any type to
participate in the weak reference mechanism without incurring the
overhead on those objects which do not benefit by weak referencing
(such as numbers).

For an object to be weakly referencable, the extension must include a
`PyObject *' field in the instance structure for the use of the weak
reference mechanism; it must be initialized to `NULL' by the object's
constructor.  It must also set the `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:

     typedef struct {
         PyObject_HEAD
         PyClassObject *in_class;       /* The class object */
         PyObject      *in_dict;        /* A dictionary */
         PyObject      *in_weakreflist; /* List of weak references */
     } PyInstanceObject;

The statically-declared type object for instances is defined this way:

     PyTypeObject PyInstance_Type = {
         PyObject_HEAD_INIT(&PyType_Type)
         0,
         "instance",
     
         /* Lots of stuff omitted for brevity... */
     
         offsetof(PyInstanceObject, in_weakreflist) /* tp_weaklistoffset */
     };

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:

     static void
     instance_dealloc(PyInstanceObject *inst)
     {
         /* Allocate tempories if needed, but do not begin
            destruction just yet.
          */
     
         PyObject_ClearWeakRefs((PyObject *) inst);
     
         /* Proceed with object destuction normally. */
     }


automatically generated by info2www version 1.2.2.9