From 894fbdc63e3af1e582d3ab0527a858b9047dcdd4 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 2 Aug 2006 02:14:24 +0000 Subject: [PATCH] fix 3m bug related to compacting the old generation svn: r3921 --- src/mzscheme/gc2/newgc.c | 22 ++++++++++------------ src/mzscheme/src/eval.c | 3 +++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index d5aaf409c2..acdf380cdf 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -640,7 +640,7 @@ inline static void reset_nursery(void) /* else */ /* new_gen0_size = gen0_max_size + MAX_GEN0_GROW_SHRINK; */ /* } */ - + resize_gen0(new_gen0_size); } @@ -1542,7 +1542,7 @@ inline static void mark_normal_obj(struct mpage *page, void *ptr) case PAGE_TARRAY: { struct objhead *info = (struct objhead *)((char*)ptr - WORD_SIZE); unsigned short tag = *(unsigned short*)ptr; - void **temp = ptr, **end = temp + (info->size - 1); + void **temp = ptr, **end = PPTR(info) + (info->size - 1); while(temp < end) temp += mark_table[tag](temp); break; @@ -2442,10 +2442,8 @@ inline static void do_heap_compact(void) work = work->prev; } } else { - /* Much as I'd like to free pages here, so that we can just have the - relevant pages cached, that causes problems. Specifically, if a - weak whatever has a pointer into this page, we *cannot* reuse it - yet, as we need that information to fix those bits later. */ + if (npage == work) + npage = npage->prev; work = work->prev; } } @@ -2521,12 +2519,12 @@ static void repair_heap(void) struct objhead *info = (struct objhead *)start; size_t size = info->size; if(info->mark) { - void **tempend = start++ + size; + void **tempend = (start++) + size; while(start < tempend) gcFIXUP(*start++); info->mark = 0; } else { info->dead = 1; - start += info->size; + start += size; } } break; @@ -2535,15 +2533,15 @@ static void repair_heap(void) struct objhead *info = (struct objhead *)start; size_t size = info->size; if(info->mark) { - void **tempend = start++ + (size - 1); + void **tempend = (++start) + (size - 1); unsigned short tag = *(unsigned short*)start; while(start < tempend) start += fixup_table[tag](start); info->mark = 0; - start = PPTR(info) + info->size; + start = PPTR(info) + size; } else { info->dead = 1; - start += info->size; + start += size; } } break; @@ -2587,7 +2585,7 @@ static void clean_up_heap(void) struct mpage *next = work->next; if(prev) prev->next = next; else pages[i] = next; - if(work->next) work->next->prev = prev; + if(next) work->next->prev = prev; pagemap_remove(work); free_backtrace(work); free_pages(work, work->big_page ? round_to_apage_size(work->size) : APAGE_SIZE); diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index c6cc2681c1..56a72020a0 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -3224,6 +3224,9 @@ void scheme_merge_compile_recs(Scheme_Compile_Info *src, int drec, void scheme_init_lambda_rec(Scheme_Compile_Info *src, int drec, Scheme_Compile_Info *lam, int dlrec) { +#ifdef MZTAG_REQUIRED + lam[dlrec].type = scheme_rt_compile_info; +#endif lam[dlrec].comp = 1; lam[dlrec].dont_mark_local_use = src[drec].dont_mark_local_use; lam[dlrec].resolve_module_ids = src[drec].resolve_module_ids;