mirror of
https://github.com/python/cpython.git
synced 2025-12-04 16:43:27 +00:00
The previous checkin to clear __slots__ variables did a little bit of
the work each time it found another base class. All the work is contiguous, so we might as well do it all at once at the end.
This commit is contained in:
parent
101de912d3
commit
14227b4dd4
1 changed files with 20 additions and 20 deletions
|
|
@ -304,7 +304,7 @@ call_finalizer(PyObject *self)
|
|||
static void
|
||||
subtype_dealloc(PyObject *self)
|
||||
{
|
||||
PyTypeObject *type, *base, *temp;
|
||||
PyTypeObject *type, *base;
|
||||
destructor f;
|
||||
|
||||
/* This exists so we can DECREF self->ob_type */
|
||||
|
|
@ -314,18 +314,19 @@ subtype_dealloc(PyObject *self)
|
|||
|
||||
/* Find the nearest base with a different tp_dealloc */
|
||||
type = self->ob_type;
|
||||
base = type;
|
||||
base = type->tp_base;
|
||||
while ((f = base->tp_dealloc) == subtype_dealloc) {
|
||||
temp = base;
|
||||
base = base->tp_base;
|
||||
assert(base);
|
||||
/* While we're at it, clear __slots__ variables */
|
||||
if (temp->tp_basicsize != base->tp_basicsize &&
|
||||
temp->tp_itemsize == 0)
|
||||
}
|
||||
|
||||
/* Clear __slots__ variables */
|
||||
if (type->tp_basicsize != base->tp_basicsize &&
|
||||
type->tp_itemsize == 0)
|
||||
{
|
||||
char *addr = ((char *)self);
|
||||
char *p = addr + base->tp_basicsize;
|
||||
char *q = addr + temp->tp_basicsize;
|
||||
char *q = addr + type->tp_basicsize;
|
||||
for (; p < q; p += sizeof(PyObject *)) {
|
||||
PyObject **pp;
|
||||
if (p == addr + type->tp_dictoffset ||
|
||||
|
|
@ -338,7 +339,6 @@ subtype_dealloc(PyObject *self)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If we added a dict, DECREF it */
|
||||
if (type->tp_dictoffset && !base->tp_dictoffset) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue