Commits

Anonymous committed 633cade

gc_list_move(): Make this truly equivalent to remove+append. While
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.

Comments (0)

Files changed (1)

Modules/gcmodule.c

 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;
+	/* 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;
-	node->gc.gc_prev = new_prev;
-	new_prev->gc.gc_next = list->gc.gc_prev = node;
 }
 
 /* append list `from` onto list `to`; `from` becomes an empty list */