*
* A stable pointer has a weighted reference count N attached to it
* (actually in its upper 5 bits), which represents the weight
*
* A stable pointer has a weighted reference count N attached to it
* (actually in its upper 5 bits), which represents the weight
* represents any weight between 1 and 2^32 (represented as zero).
* When the weight is 2^32, the stable name table owns "all" of the
* stable pointers to this object, and the entry can be garbage
* represents any weight between 1 and 2^32 (represented as zero).
* When the weight is 2^32, the stable name table owns "all" of the
* stable pointers to this object, and the entry can be garbage
weight = stable_ptr_table[sn].weight;
if (weight == 0) {
weight = (StgWord)1 << (BITS_IN(StgWord)-1);
stable_ptr_table[sn].weight = weight;
weight = stable_ptr_table[sn].weight;
if (weight == 0) {
weight = (StgWord)1 << (BITS_IN(StgWord)-1);
stable_ptr_table[sn].weight = weight;
- stable_ptr_table[sn].weight -= 2^weight_2;
- return (StgStablePtr)(sn + (weight_2 << STABLEPTR_WEIGHT_SHIFT));
+ stable_ptr_table[sn].weight -= 1 << n;
+ return (StgStablePtr)(sn + ((n+1) << STABLEPTR_WEIGHT_SHIFT));
- IF_DEBUG(stable, fprintf(stderr,"Stable ptr %d still alive at %p, weight %d\n", p - stable_ptr_table, new, p->weight));
+ IF_DEBUG(stable, fprintf(stderr,"Stable ptr %d still alive at %p, weight %u\n", p - stable_ptr_table, new, p->weight));