/* -----------------------------------------------------------------------------
- * $Id: Stable.c,v 1.7 1999/08/04 15:25:33 simonmar Exp $
+ * $Id: Stable.c,v 1.9 1999/10/26 17:15:39 sewardj Exp $
*
* (c) The GHC Team, 1998-1999
*
{
StgWord sn = lookupStableName(p);
StgWord weight, weight_2;
-
weight = stable_ptr_table[sn].weight;
if (weight == 0) {
weight = (StgWord)1 << (BITS_IN(StgWord)-1);
end_stable_ptr_table = &stable_ptr_table[SPT_size];
- /* Mark all the stable *pointers* (not stable names)
+ /* Mark all the stable *pointers* (not stable names).
+ * _starting_ at index 1; index 0 is unused.
*/
- for (p = stable_ptr_table; p < end_stable_ptr_table; p++) {
+ for (p = stable_ptr_table+1; p < end_stable_ptr_table; p++) {
q = p->addr;
/* internal pointers or NULL are free slots
*/
(StgClosure *)p->addr = new;
} else if ((P_)new != q) {
removeHashTable(addrToStableHash, (W_)q, NULL);
- insertHashTable(addrToStableHash, (W_)new,
- (void *)(p - stable_ptr_table));
+ if (!lookupHashTable(addrToStableHash, (W_)new)) {
+ insertHashTable(addrToStableHash, (W_)new,
+ (void *)(p - stable_ptr_table));
+ }
(StgClosure *)p->addr = new;
}
IF_DEBUG(stable, fprintf(stderr,"Stable ptr %d still alive at %p, weight %d\n", p - stable_ptr_table, new, p->weight));
end_stable_ptr_table = &stable_ptr_table[SPT_size];
- for (p = stable_ptr_table; p < end_stable_ptr_table; p++) {
+ /* NOTE: _starting_ at index 1; index 0 is unused. */
+ for (p = stable_ptr_table + 1; p < end_stable_ptr_table; p++) {
/* Update the pointer to the StableName object, if there is one */
if (p->sn_obj != NULL) {