From bc1d1b80d1abfd7f95cb02e7f09be18b94504559 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Mon, 1 Nov 2004 16:39:57 +0000 Subject: [PATCH] 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. --- Modules/gcmodule.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 4bfdea643a2..c563ed84d24 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -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 */