From: simonmar Date: Fri, 25 Oct 2002 09:40:47 +0000 (+0000) Subject: [project @ 2002-10-25 09:40:47 by simonmar] X-Git-Tag: Approx_11550_changesets_converted~1515 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=67944e157c667338e206f0cca6c48319ebc256d0;p=ghc-hetmet.git [project @ 2002-10-25 09:40:47 by simonmar] In eval_thunk_selector(), don't follow IND_STATICs because they might lead us into to-space. Fixes a case of "EVACUATED object entered!". Also, add an assertion to catch this bug earlier. MERGE TO STABLE --- diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index 853d548..9ed6f64 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: GC.c,v 1.144 2002/09/25 14:46:34 simonmar Exp $ + * $Id: GC.c,v 1.145 2002/10/25 09:40:47 simonmar Exp $ * * (c) The GHC Team 1998-1999 * @@ -1382,8 +1382,12 @@ addBlock(step *stp) static __inline__ void upd_evacuee(StgClosure *p, StgClosure *dest) { - p->header.info = &stg_EVACUATED_info; - ((StgEvacuated *)p)->evacuee = dest; + // Source object must be in from-space: + ASSERT((Bdescr((P_)p)->flags & BF_EVACUATED) == 0); + // not true: (ToDo: perhaps it should be) + // ASSERT(Bdescr((P_)dest)->flags & BF_EVACUATED); + p->header.info = &stg_EVACUATED_info; + ((StgEvacuated *)p)->evacuee = dest; } @@ -1985,7 +1989,6 @@ selector_loop: return selectee->payload[field]; case IND: - case IND_STATIC: case IND_PERM: case IND_OLDGEN: case IND_OLDGEN_PERM: @@ -1998,6 +2001,11 @@ selector_loop: // leaks by evaluating this selector thunk anyhow. break; + case IND_STATIC: + // We can't easily tell whether the indirectee is into + // from or to-space, so just bail out here. + break; + case THUNK_SELECTOR: { StgClosure *val;