Commit 4a05e613 authored by Simon Marlow's avatar Simon Marlow
Browse files

Fix a very rare crash in GHCi

When a BCO with a zero-length bitmap was right at the edge of
allocated memory, we were reading a word of non-existent memory.

This showed up as a segfault in T789(ghci) for me, but the crash was
extremely sensitive and went away with most changes.

Also, optimised scavenge_large_bitmap a bit while I was in there.
parent c4c2f7ec
......@@ -1534,23 +1534,21 @@ scavenge_static(void)
static void
scavenge_large_bitmap( StgPtr p, StgLargeBitmap *large_bitmap, nat size )
{
nat i, b;
nat i, j, b;
StgWord bitmap;
b = 0;
bitmap = large_bitmap->bitmap[b];
for (i = 0; i < size; ) {
if ((bitmap & 1) == 0) {
evacuate((StgClosure **)p);
}
i++;
p++;
if (i % BITS_IN(W_) == 0) {
b++;
bitmap = large_bitmap->bitmap[b];
} else {
for (i = 0; i < size; b++) {
bitmap = large_bitmap->bitmap[b];
j = stg_min(size-i, BITS_IN(W_));
i += j;
for (; j > 0; j--, p++) {
if ((bitmap & 1) == 0) {
evacuate((StgClosure **)p);
}
bitmap = bitmap >> 1;
}
}
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment