A small change to the C API for weakly-referencable types: Such types

must now initialize the extra field used by the weak-ref machinery to
NULL themselves, to avoid having to require PyObject_INIT() to check
if the type supports weak references and do it there.  This causes less
work to be done for all objects (the type object does not need to be
consulted to check for the Py_TPFLAGS_HAVE_WEAKREFS bit).
This commit is contained in:
Fred Drake 2001-03-22 18:26:47 +00:00
parent 82f1480d63
commit 4e262a9631
3 changed files with 8 additions and 5 deletions

View File

@ -167,11 +167,7 @@ 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)), \
(PyType_SUPPORTS_WEAKREFS((typeobj)) \
? *(PyObject_GET_WEAKREFS_LISTPTR(op)) = NULL \
: NULL), \
(op))
( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) )
#define PyObject_INIT_VAR(op, typeobj, size) \
( (op)->ob_size = (size), PyObject_INIT((op), (typeobj)) )

View File

@ -61,6 +61,12 @@ Python/C API
- Py_BuildValue() now has a "D" conversion to create a Python complex
number from a Py_complex C value.
- Extensions types which support weak references must now set the
field allocated for the weak reference machinery to NULL themselves;
this is done to avoid the cost of checking each object for having a
weakly referencable type in PyObject_INIT(), since most types are
not weakly referencable.
Distutils
- the sdist command now writes a PKG-INFO file, as described in PEP 241,

View File

@ -453,6 +453,7 @@ PyInstance_NewRaw(PyObject *klass, PyObject *dict)
Py_DECREF(dict);
return NULL;
}
inst->in_weakreflist = NULL;
Py_INCREF(klass);
inst->in_class = (PyClassObject *)klass;
inst->in_dict = dict;