]> granicus.if.org Git - python/commitdiff
gc_list_move(): Make this truly equivalent to remove+append. While
authorTim Peters <tim.peters@gmail.com>
Mon, 1 Nov 2004 16:39:57 +0000 (16:39 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 1 Nov 2004 16:39:57 +0000 (16:39 +0000)
nothing in gc currently cares, the original coding could screw up if,
e.g., you tried to move a node to the list it's already in, and the node
was already the last in its list.

Modules/gcmodule.c

index 4bfdea643a20d305df6049f8bc69fc6dfa0fbc64..c563ed84d246bc5ed884c27c8cd09191fa6d4a05 100644 (file)
@@ -168,14 +168,16 @@ gc_list_remove(PyGC_Head *node)
 static void
 gc_list_move(PyGC_Head *node, PyGC_Head *list)
 {
+       PyGC_Head *new_prev;
        PyGC_Head *current_prev = node->gc.gc_prev;
        PyGC_Head *current_next = node->gc.gc_next;
-       PyGC_Head *new_prev = list->gc.gc_prev;
+       /* Unlink from current list. */
        current_prev->gc.gc_next = current_next;
        current_next->gc.gc_prev = current_prev;
-       node->gc.gc_next = list;
-       node->gc.gc_prev = new_prev;
+       /* Relink at end of new list. */
+       new_prev = node->gc.gc_prev = list->gc.gc_prev;
        new_prev->gc.gc_next = list->gc.gc_prev = node;
+       node->gc.gc_next = list;
 }
 
 /* append list `from` onto list `to`; `from` becomes an empty list */