[issue19503] does gc_list_merge merge properly?

2013-11-05 Thread martenjan

New submission from martenjan:

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);
}

--
components: Interpreter Core
messages: 202206
nosy: martenjan
priority: normal
severity: normal
status: open
title: does gc_list_merge merge properly?
type: behavior
versions: Python 2.7

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue19503
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue19503] does gc_list_merge merge properly?

2013-11-05 Thread Mark Dickinson

Mark Dickinson added the comment:

The current code is correct.  Note that `from` is the list header, and is not 
attached to a gc-tracked object.  We want to splice the last non-header element 
of `to` (`to-gc.gc_prev`) to the first non-header element of `from` 
(`from-gc.gc_next`).

Did you try running the test suite with your change?  It would be quite a feat 
for a bug this fundamental to have made it this far in 2.7 without anyone 
noticing. :-)

Closing as invalid.

--
nosy: +mark.dickinson
resolution:  - invalid
status: open - closed

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue19503
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue19503] does gc_list_merge merge properly?

2013-11-05 Thread martenjan

martenjan added the comment:

Thanks for your explanation

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue19503
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com