summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ghc/rts/GC.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c
index 853d5489c6..9ed6f64629 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;