diff --git a/includes/rts/storage/ClosureMacros.h b/includes/rts/storage/ClosureMacros.h index 5722769651d7de24fbc49b000d8300b1182256b4..e10b86a006fe2bdbebb6bc9bb318428bb7a477ae 100644 --- a/includes/rts/storage/ClosureMacros.h +++ b/includes/rts/storage/ClosureMacros.h @@ -159,27 +159,35 @@ INLINE_HEADER StgHalfWord GET_TAG(const StgClosure *con) /* These are hard-coded. */ #define THUNK_STATIC_LINK(p) (&(p)->payload[1]) -#define IND_STATIC_LINK(p) (&(p)->payload[1]) +#define IND_STATIC_LINK(p) (&(p)->payload[1]) +#define SMALL_MUT_ARR_STATIC_LINK(p) (&((StgSmallMutArrPtrs*)p)->payload[((StgSmallMutArrPtrs*)p)->ptrs]) +#define CONSTR_AND_FUN_STATIC_LINK(info,p) (&(p)->payload[info->layout.payload.ptrs + info->layout.payload.nptrs]) INLINE_HEADER StgClosure ** STATIC_LINK(const StgInfoTable *info, StgClosure *p) { switch (info->type) { + case FUN_STATIC: + case CONSTR: + case CONSTR_1_0: + case CONSTR_2_0: + case CONSTR_1_1: + return CONSTR_AND_FUN_STATIC_LINK(info,p); + case THUNK_STATIC: return THUNK_STATIC_LINK(p); case IND_STATIC: return IND_STATIC_LINK(p); - case SMALL_MUT_ARR_PTRS_CLEAN: - case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: + // case SMALL_MUT_ARR_PTRS_CLEAN: // TODO: do we really need this case? + // case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: // TODO: do we really need this case? case SMALL_MUT_ARR_PTRS_DIRTY: case SMALL_MUT_ARR_PTRS_FROZEN_DIRTY: - return (StgSmallMutArrPtrs*)p->payload[(StgSmallMutArrPtrs*)p->size]; + return SMALL_MUT_ARR_STATIC_LINK(p); default: - return &p->payload[info->layout.payload.ptrs + - info->layout.payload.nptrs]; + barf("STATIC_LINK: strange closure type %d", (int)(info->type)); } } diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c index 93941393ff9fdfed898180491ecc748f40846b11..26a6d3eac936893832c258e2f12ab34521f7c52b 100644 --- a/rts/sm/Evac.c +++ b/rts/sm/Evac.c @@ -604,7 +604,7 @@ loop: case FUN_STATIC: if (info->srt != 0 || info->layout.payload.ptrs != 0) { - evacuate_static_object(STATIC_LINK(info,(StgClosure *)q), q); + evacuate_static_object(CONSTR_AND_FUN_STATIC_LINK(info,(StgClosure *)q), q); } return; @@ -620,7 +620,7 @@ loop: case CONSTR_1_0: case CONSTR_2_0: case CONSTR_1_1: - evacuate_static_object(STATIC_LINK(info,(StgClosure *)q), q); + evacuate_static_object(CONSTR_AND_FUN_STATIC_LINK(info,(StgClosure *)q), q); return; case CONSTR_0_1: @@ -635,7 +635,7 @@ loop: case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: // todo: do we even need to evac this case? case SMALL_MUT_ARR_PTRS_DIRTY: case SMALL_MUT_ARR_PTRS_FROZEN_DIRTY: - evacuate_static_object(STATIC_LINK(info,(StgSmallMutArrPtrs*)q), q); + evacuate_static_object(SMALL_MUT_ARR_STATIC_LINK((StgSmallMutArrPtrs*)q), q); return; default: