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) { if ((kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH) && SCM_HEAP_OBJECT_P (key)) { #ifdef HAVE_GC_MOVE_DISAPPEARING_LINK GC_move_disappearing_link ((GC_PTR) &from->key, (GC_PTR) &to->key); #else GC_unregister_disappearing_link (&from->key); SCM_I_REGISTER_DISAPPEARING_LINK (&to->key, SCM2PTR (key)); #endif } if ((kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH) && SCM_HEAP_OBJECT_P (value)) { #ifdef HAVE_GC_MOVE_DISAPPEARING_LINK GC_move_disappearing_link ((GC_PTR) &from->value, (GC_PTR) &to->value); #else GC_unregister_disappearing_link (&from->value); SCM_I_REGISTER_DISAPPEARING_LINK (&to->value, SCM2PTR (value)); #endif } }
static void move_weak_entry (scm_t_weak_entry *from, scm_t_weak_entry *to) { if (from->hash) { scm_t_weak_entry copy; copy_weak_entry (from, ©); to->hash = copy.hash; to->key = copy.key; if (copy.key && SCM_HEAP_OBJECT_P (SCM_PACK (copy.key))) { #ifdef HAVE_GC_MOVE_DISAPPEARING_LINK GC_move_disappearing_link ((GC_PTR) &from->key, (GC_PTR) &to->key); #else GC_unregister_disappearing_link ((GC_PTR) &from->key); SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &to->key, (GC_PTR) to->key); #endif } } else { to->hash = 0; to->key = 0; } }
static void move_weak_entry (scm_t_weak_entry *from, scm_t_weak_entry *to) { if (from->hash) { scm_t_weak_entry copy; copy_weak_entry (from, ©); to->hash = copy.hash; to->key = copy.key; if (copy.key && SCM_HEAP_OBJECT_P (SCM_PACK (copy.key))) GC_move_disappearing_link ((void **) &from->key, (void **) &to->key); } else { to->hash = 0; to->key = 0; } }