~ chicken-core (chicken-5) 20b7d9ef62480b43a64e04b7381d9cf62e6823a7
commit 20b7d9ef62480b43a64e04b7381d9cf62e6823a7 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Oct 29 14:48:45 2012 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Oct 29 14:48:45 2012 +0100 comments diff --git a/runtime.c b/runtime.c index 1617c2cf..3538944d 100644 --- a/runtime.c +++ b/runtime.c @@ -278,9 +278,9 @@ typedef struct lf_list_struct typedef struct weak_table_entry_struct { - C_word item, - container; -} WEAK_TABLE_ENTRY; + C_word item, /* item weakly held (symbol) */ + container; /* object holding reference to symbol, lowest 3 bits are */ +} WEAK_TABLE_ENTRY; /* also used as a counter, saturated at 2 or more */ typedef struct finalizer_node_struct { @@ -2982,16 +2982,16 @@ C_regparm void C_fcall C_reclaim(void *trampoline, void *proc) for(i = 0; i < WEAK_TABLE_SIZE; ++i, ++wep) if(wep->item != 0) { - if((wep->container & WEAK_COUNTER_MAX) == 0 && - is_fptr((item = C_block_header(wep->item)))) { - item = fptr_to_ptr(item); + if((wep->container & WEAK_COUNTER_MAX) == 0 && /* counter saturated? (more than 1) */ + is_fptr((item = C_block_header(wep->item)))) { /* and forwarded/collected */ + item = fptr_to_ptr(item); /* recover obj from forwarding ptr */ container = wep->container & ~WEAK_COUNTER_MASK; if(C_header_bits(item) == C_SYMBOL_TYPE && C_block_item(item, 0) == C_SCHEME_UNBOUND && C_block_item(item, 2) == C_SCHEME_END_OF_LIST) { ++weakn; - C_set_block_item(container, 0, C_SCHEME_UNDEFINED); + C_set_block_item(container, 0, C_SCHEME_UNDEFINED); /* clear reference to item */ } } @@ -3146,8 +3146,8 @@ C_regparm void C_fcall really_mark(C_word *x) p->header = ptr_to_fptr((C_uword)p2); C_memcpy(p2->data, p->data, bytes); } - else { - /* Increase counter if weakly held item: */ + else { /* (major GC) */ + /* Increase counter (saturated at 2) if weakly held item (someone pointed to this object): */ if(C_enable_gcweak && (wep = lookup_weak_table_entry(val, 0)) != NULL) { if((wep->container & WEAK_COUNTER_MAX) == 0) ++wep->container; }Trap