X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosureMacros.h;h=f40f6aace6d283f3ddfe74d39f255e824b13677a;hb=7f24ae51ed36c5c0308a2d0de23e243f32a0043c;hp=11636b895c6930df0f73c18aa6b9cb8635b8c464;hpb=03dc2dd3dd814ad85cc4c45e9cafc7b73163c8be;p=ghc-hetmet.git diff --git a/ghc/includes/ClosureMacros.h b/ghc/includes/ClosureMacros.h index 11636b8..f40f6aa 100644 --- a/ghc/includes/ClosureMacros.h +++ b/ghc/includes/ClosureMacros.h @@ -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 + \