}
}
- template<typename SourceGeneration> void trace_card(SourceGeneration *gen, card *ptr)
+ template<typename SourceGeneration> void trace_card(SourceGeneration *gen, card *ptr, card unmask)
{
cell card_start = this->myvm->card_to_addr(ptr);
cell card_scan = card_start + gen->card_offset(card_start);
trace_objects_between(gen,card_scan,&card_end);
+ *ptr &= ~unmask;
+
this->myvm->gc_stats.cards_scanned++;
}
{
card *ptr = (card *)quad_ptr;
- for(int card = 0; card < 4; card++)
- {
- if(ptr[card] & mask)
- {
- trace_card(gen,&ptr[card]);
- ptr[card] &= ~unmask;
- }
- }
+ if(ptr[0] & mask) trace_card(gen,&ptr[0],unmask);
+ if(ptr[1] & mask) trace_card(gen,&ptr[1],unmask);
+ if(ptr[2] & mask) trace_card(gen,&ptr[2],unmask);
+ if(ptr[3] & mask) trace_card(gen,&ptr[3],unmask);
}
}
this->trace_handle(&compiled->owner);
this->trace_handle(&compiled->literals);
this->trace_handle(&compiled->relocation);
+ this->myvm->gc_stats.code_blocks_scanned++;
}
void trace_code_heap_roots(std::set<code_block *> *remembered_set)
void factor_vm::update_dirty_code_blocks(std::set<code_block *> *remembered_set)
{
/* The youngest generation that any code block can now reference */
- std::set<code_block *>::iterator iter = remembered_set->begin();
- std::set<code_block *>::iterator end = remembered_set->end();
+ std::set<code_block *>::const_iterator iter = remembered_set->begin();
+ std::set<code_block *>::const_iterator end = remembered_set->end();
for(; iter != end; iter++) update_literal_references(*iter);
}
result.add(tag<bignum>(ulong_long_to_bignum(gc_stats.cards_scanned)));
result.add(tag<bignum>(ulong_long_to_bignum(gc_stats.decks_scanned)));
result.add(tag<bignum>(ulong_long_to_bignum(gc_stats.card_scan_time)));
- result.add(allot_cell(gc_stats.code_heap_scans));
+ result.add(allot_cell(gc_stats.code_blocks_scanned));
result.trim();
dpush(result.elements.value());