{
case WORD_TYPE:
word = (F_WORD *)scan;
- mark_code_block(word->code);
+ if(word->code)
+ mark_code_block(word->code);
if(word->profiling)
mark_code_block(word->profiling);
break;
void copy_reachable_objects(CELL scan, CELL *end)
{
- if(HAVE_NURSERY_P && collecting_gen == NURSERY)
+ if(collecting_gen == NURSERY)
{
while(scan < *end)
scan = copy_next_from_nursery(scan);
if(collecting_gen != NURSERY)
reset_generations(NURSERY,collecting_gen - 1);
}
- else if(HAVE_NURSERY_P && collecting_gen == NURSERY)
+ else if(collecting_gen == NURSERY)
{
nursery.here = nursery.start;
}
return true;
else if(HAVE_AGING_P && collecting_gen == AGING)
return !in_zone(&data_heap->generations[TENURED],untagged);
- else if(HAVE_NURSERY_P && collecting_gen == NURSERY)
+ else if(collecting_gen == NURSERY)
return in_zone(&nursery,untagged);
else
{
registers) does not run out of memory */
#define ALLOT_BUFFER_ZONE 1024
+/* If this is defined, we GC every 100 allocations. This catches missing local roots */
+#ifdef GC_DEBUG
+static int count;
+#endif
+
/*
* It is up to the caller to fill in the object's fields in a meaningful
* fashion!
*/
INLINE void *allot_object(CELL type, CELL a)
{
+
+#ifdef GC_DEBUG
+
+ if(!gc_off)
+ {
+ if(count++ % 1000 == 0)
+ gc();
+
+ }
+#endif
+
CELL *object;
- if(HAVE_NURSERY_P && nursery.size - ALLOT_BUFFER_ZONE > a)
+ if(nursery.size - ALLOT_BUFFER_ZONE > a)
{
/* If there is insufficient room, collect the nursery */
if(nursery.here + ALLOT_BUFFER_ZONE + a > nursery.end)
/* the 0th generation is where new objects are allocated. */
#define NURSERY 0
-#define HAVE_NURSERY_P (data_heap->gen_count>1)
/* where objects hang around */
#define AGING (data_heap->gen_count-2)
#define HAVE_AGING_P (data_heap->gen_count>2)