diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index 6fa1665d2f3a72e56259ea53556d23f2e5b1e5a7..23b83a5b5f4aafc77b890f7a8a3a35180c77d906 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: GC.c,v 1.4 1999/01/06 12:15:35 simonm Exp $ + * $Id: GC.c,v 1.5 1999/01/06 12:27:47 simonm Exp $ * * Two-space garbage collector * @@ -1185,6 +1185,7 @@ scavenge_stack(StgPtr p, StgPtr stack_end) case RET_BIG: case RET_VEC_BIG: { + StgPtr q; StgLargeBitmap *large_bitmap; nat i; @@ -1193,6 +1194,7 @@ scavenge_stack(StgPtr p, StgPtr stack_end) for (i=0; i<large_bitmap->size; i++) { bitmap = large_bitmap->bitmap[i]; + q = p + sizeof(W_) * 8; while (bitmap != 0) { if ((bitmap & 1) == 0) { (StgClosure *)*p = evacuate((StgClosure *)*p); @@ -1200,6 +1202,12 @@ scavenge_stack(StgPtr p, StgPtr stack_end) p++; bitmap = bitmap >> 1; } + if (i+1 < large_bitmap->size) { + while (p < q) { + (StgClosure *)*p = evacuate((StgClosure *)*p); + p++; + } + } } /* and don't forget to follow the SRT */ @@ -1210,7 +1218,7 @@ scavenge_stack(StgPtr p, StgPtr stack_end) barf("scavenge_stack: weird activation record found on stack.\n"); } } -} +} /*----------------------------------------------------------------------------- scavenge the large object list.