* libguile/weak-table.c (move_disappearing_links): Check the return value of 'GC_move_disappearing_link' and call 'register_disappearing_links' upon GC_NOT_FOUND. (GC_move_disappearing_link) [!HAVE_GC_MOVE_DISAPPEARING_LINK]: Adjust to return the error code. --- libguile/weak-table.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-)
diff --git a/libguile/weak-table.c b/libguile/weak-table.c index 1aa2a0fcc..7d8633165 100644 --- a/libguile/weak-table.c +++ b/libguile/weak-table.c @@ -153,11 +153,16 @@ unregister_disappearing_links (scm_t_weak_entry *entry, } #ifndef HAVE_GC_MOVE_DISAPPEARING_LINK -static void +static int GC_move_disappearing_link (void **from, void **to) { - GC_unregister_disappearing_link (from); - SCM_I_REGISTER_DISAPPEARING_LINK (to, *to); + int err; + + err = GC_unregister_disappearing_link (from); + if (err == GC_SUCCESS) + err = SCM_I_REGISTER_DISAPPEARING_LINK (to, *to); + + return err; } #endif @@ -165,13 +170,33 @@ static void move_disappearing_links (scm_t_weak_entry *from, scm_t_weak_entry *to, SCM key, SCM value, scm_t_weak_table_kind kind) { + int err; + if ((kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH) && SCM_HEAP_OBJECT_P (key)) - GC_move_disappearing_link ((void **) &from->key, (void **) &to->key); + { + err = GC_move_disappearing_link ((void **) &from->key, + (void **) &to->key); + if (err == GC_NOT_FOUND) + /* Link disappeared. */ + register_disappearing_links (to, key, value, + SCM_WEAK_TABLE_KIND_KEY); + else + assert (err == GC_SUCCESS); + } if ((kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH) && SCM_HEAP_OBJECT_P (value)) - GC_move_disappearing_link ((void **) &from->value, (void **) &to->value); + { + err = GC_move_disappearing_link ((void **) &from->value, + (void **) &to->value); + if (err == GC_NOT_FOUND) + /* Link disappeared. */ + register_disappearing_links (to, key, value, + SCM_WEAK_TABLE_KIND_VALUE); + else + assert (err == GC_SUCCESS); + } } static void -- 2.14.2