X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosureMacros.h;h=f40f6aace6d283f3ddfe74d39f255e824b13677a;hb=c137ecd7e6e83d0f9c39b15ccdb9f2355f243c91;hp=12023a59184df54e0f0c59ff9b0572aac9900f88;hpb=e7c3f957fd36fd9f6369183b7a31e2a4a4c21b43;p=ghc-hetmet.git diff --git a/ghc/includes/ClosureMacros.h b/ghc/includes/ClosureMacros.h index 12023a5..f40f6aa 100644 --- a/ghc/includes/ClosureMacros.h +++ b/ghc/includes/ClosureMacros.h @@ -114,7 +114,7 @@ #define SET_PROF_HDR(c,ccs_) \ ((c)->header.prof.ccs = ccs_, \ LDV_RECORD_CREATE((c))) -#endif // DEBUG_RETAINER +#endif /* DEBUG_RETAINER */ #define SET_STATIC_PROF_HDR(ccs_) \ prof : { ccs : (CostCentreStack *)ccs_, hp : { rs : NULL } }, #else @@ -161,23 +161,28 @@ /* ----------------------------------------------------------------------------- How to get hold of the static link field for a static closure. - - Note that we have to use (*cast(T*,&e)) instead of cast(T,e) - because C won't let us take the address of a casted - expression. Huh? -------------------------------------------------------------------------- */ -#define STATIC_LINK(info,p) \ - (*(StgClosure**)(&((p)->payload[info->layout.payload.ptrs + \ - info->layout.payload.nptrs]))) - -/* These macros are optimised versions of the above for certain - * closure types. They *must* be equivalent to the generic - * STATIC_LINK. - */ -#define FUN_STATIC_LINK(p) ((p)->payload[0]) -#define THUNK_STATIC_LINK(p) ((p)->payload[1]) -#define IND_STATIC_LINK(p) ((p)->payload[1]) +/* These are hard-coded. */ +#define FUN_STATIC_LINK(p) (&(p)->payload[0]) +#define THUNK_STATIC_LINK(p) (&(p)->payload[1]) +#define IND_STATIC_LINK(p) (&(p)->payload[1]) + +INLINE_HEADER StgClosure ** +STATIC_LINK(const StgInfoTable *info, StgClosure *p) +{ + switch (info->type) { + case THUNK_STATIC: + return THUNK_STATIC_LINK(p); + case FUN_STATIC: + return FUN_STATIC_LINK(p); + case IND_STATIC: + return IND_STATIC_LINK(p); + default: + return &(p)->payload[info->layout.payload.ptrs + + info->layout.payload.nptrs]; + } +} #define STATIC_LINK2(info,p) \ (*(StgClosure**)(&((p)->payload[info->layout.payload.ptrs + \