67 lines
1.5 KiB
C
67 lines
1.5 KiB
C
#include "factor.h"
|
|
|
|
/* scan all the objects in the card */
|
|
INLINE void collect_card(CARD *ptr, CELL here)
|
|
{
|
|
CARD c = *ptr;
|
|
CELL offset = (c & CARD_BASE_MASK);
|
|
CELL card_scan = (CELL)CARD_TO_ADDR(ptr) + offset;
|
|
CELL card_end = (CELL)CARD_TO_ADDR(ptr + 1);
|
|
|
|
if(offset == 0x7f)
|
|
{
|
|
if(c == 0xff)
|
|
critical_error("bad card",(CELL)ptr);
|
|
else
|
|
return;
|
|
}
|
|
|
|
while(card_scan < card_end && card_scan < here)
|
|
card_scan = collect_next(card_scan);
|
|
|
|
cards_scanned++;
|
|
}
|
|
|
|
INLINE void collect_gen_cards(CELL gen)
|
|
{
|
|
CARD *ptr = ADDR_TO_CARD(generations[gen].base);
|
|
CELL here = generations[gen].here;
|
|
CARD *last_card = ADDR_TO_CARD(here);
|
|
|
|
if(generations[gen].here == generations[gen].limit)
|
|
last_card--;
|
|
|
|
for(; ptr <= last_card; ptr++)
|
|
{
|
|
if(card_marked(*ptr))
|
|
collect_card(ptr,here);
|
|
}
|
|
}
|
|
|
|
void unmark_cards(CELL from, CELL to)
|
|
{
|
|
CARD *ptr = ADDR_TO_CARD(generations[from].base);
|
|
CARD *last_card = ADDR_TO_CARD(generations[to].here);
|
|
if(generations[to].here == generations[to].limit)
|
|
last_card--;
|
|
for(; ptr <= last_card; ptr++)
|
|
unmark_card(ptr);
|
|
}
|
|
|
|
void clear_cards(CELL from, CELL to)
|
|
{
|
|
/* NOTE: reverse order due to heap layout. */
|
|
CARD *last_card = ADDR_TO_CARD(generations[from].limit);
|
|
CARD *ptr = ADDR_TO_CARD(generations[to].base);
|
|
for(; ptr < last_card; ptr++)
|
|
clear_card(ptr);
|
|
}
|
|
|
|
/* scan cards in all generations older than the one being collected */
|
|
void collect_cards(CELL gen)
|
|
{
|
|
int i;
|
|
for(i = gen + 1; i < gen_count; i++)
|
|
collect_gen_cards(i);
|
|
}
|