The 32-bit heap may have holes in it. Pointers to (non-heap) objects
in those holes shouldn't cause the GC to throw.
This change is somewhat of a band-aid fix for 1.4.2. We should do
a more thorough fix for tip (keep track of the holes in the heap
with special MSpans, say).
Update #9872
Change-Id: Ife9ba27b77ae6ac5a6792d249c68893b3df62134
Reviewed-on: https://go-review.googlesource.com/4920
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
x -= (uintptr)arena_start>>PageShift;
s = runtime·mheap.spans[x];
if(s == nil || k < s->start || obj >= s->limit || s->state != MSpanInUse) {
+ // Sometimes 32-bit heaps have holes. See issue 9872
+ if(PtrSize == 4 && s == nil)
+ continue;
// Stack pointers lie within the arena bounds but are not part of the GC heap.
// Ignore them.
if(s != nil && s->state == MSpanStack)