Message202206
The code for gc_list_merge is given in gcmodule.c. I retrieved it from
http://hg.python.org/cpython/file/tip/Modules/gcmodule.c#l287
The code seems to merge list `from` incompletely: the first entry of `from` is omitted in the merged list.
The issue is in line 295: tail->gc.gc_next = from->gc.gc_next;
I fixed it as : tail->gc.gc_next = from;
Please check if my analysis is correct.
See below for the context.
Original: lines 287 to 301
/* append list `from` onto list `to`; `from` becomes an empty list */
static void
gc_list_merge(PyGC_Head *from, PyGC_Head *to)
{
PyGC_Head *tail;
assert(from != to);
if (!gc_list_is_empty(from)) {
tail = to->gc.gc_prev;
tail->gc.gc_next = from->gc.gc_next;
tail->gc.gc_next->gc.gc_prev = tail;
to->gc.gc_prev = from->gc.gc_prev;
to->gc.gc_prev->gc.gc_next = to;
}
gc_list_init(from);
}
Fix:
/* append list `from` onto list `to`; `from` becomes an empty list */
static void
gc_list_merge(PyGC_Head *from, PyGC_Head *to)
{
PyGC_Head *tail;
assert(from != to);
if (!gc_list_is_empty(from)) {
tail = to->gc.gc_prev;
tail->gc.gc_next = from;
tail->gc.gc_next->gc.gc_prev = tail;
to->gc.gc_prev = from->gc.gc_prev;
to->gc.gc_prev->gc.gc_next = to;
}
gc_list_init(from);
} |
|
Date |
User |
Action |
Args |
2013-11-05 11:14:05 | martenjan | set | recipients:
+ martenjan |
2013-11-05 11:14:05 | martenjan | set | messageid: <1383650045.9.0.887861923874.issue19503@psf.upfronthosting.co.za> |
2013-11-05 11:14:05 | martenjan | link | issue19503 messages |
2013-11-05 11:14:05 | martenjan | create | |
|