Skip to content

Commit f589c05

Browse files
committed
If the GC is enabled then don't use the ob_type pointer to create a list
of trash objects. Use the gc_prev pointer instead.
1 parent b883310 commit f589c05

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

Objects/object.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2037,6 +2037,7 @@ PyObject * _PyTrash_delete_later = NULL;
20372037
void
20382038
_PyTrash_deposit_object(PyObject *op)
20392039
{
2040+
#ifndef WITH_CYCLE_GC
20402041
int typecode;
20412042

20422043
if (PyTuple_Check(op))
@@ -2054,8 +2055,11 @@ _PyTrash_deposit_object(PyObject *op)
20542055
return; /* pacify compiler -- execution never here */
20552056
}
20562057
op->ob_refcnt = typecode;
2057-
20582058
op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
2059+
#else
2060+
assert (_Py_AS_GC(op)->gc.gc_next == NULL);
2061+
_Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *)_PyTrash_delete_later;
2062+
#endif
20592063
_PyTrash_delete_later = op;
20602064
}
20612065

@@ -2064,6 +2068,8 @@ _PyTrash_destroy_chain(void)
20642068
{
20652069
while (_PyTrash_delete_later) {
20662070
PyObject *shredder = _PyTrash_delete_later;
2071+
2072+
#ifndef WITH_CYCLE_GC
20672073
_PyTrash_delete_later = (PyObject*) shredder->ob_type;
20682074

20692075
switch (shredder->ob_refcnt) {
@@ -2083,6 +2089,11 @@ _PyTrash_destroy_chain(void)
20832089
shredder->ob_type = &PyTraceBack_Type;
20842090
break;
20852091
}
2092+
#else
2093+
_PyTrash_delete_later =
2094+
(PyObject*) _Py_AS_GC(shredder)->gc.gc_prev;
2095+
#endif
2096+
20862097
_Py_NewReference(shredder);
20872098

20882099
++_PyTrash_delete_nesting;

0 commit comments

Comments
 (0)