Commit 0ab537c5 authored by ian@well-typed.com's avatar ian@well-typed.com

More CPP macros -> inline functions

All the wibble seem to have cancelled out, and (non-debug) object sizes
are back to where they started.

I'm not 100% sure that the types are optimal, but at least now the
functions have types and we can fix them if necessary.
parent 773570ed
...@@ -53,21 +53,25 @@ ...@@ -53,21 +53,25 @@
#define GET_TAG(con) (get_itbl(con)->srt_bitmap) #define GET_TAG(con) (get_itbl(con)->srt_bitmap)
#ifdef TABLES_NEXT_TO_CODE #ifdef TABLES_NEXT_TO_CODE
#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)(info) - 1) EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info);
#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)(info) - 1) EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgInfoTable *)info - 1;}
#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)(info) - 1) EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info);
#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)(info) - 1) EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgRetInfoTable *)info - 1;}
#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)(info) - 1) INLINE_HEADER StgFunInfoTable *FUN_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgFunInfoTable *)info - 1;}
INLINE_HEADER StgThunkInfoTable *THUNK_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgThunkInfoTable *)info - 1;}
INLINE_HEADER StgConInfoTable *CON_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgConInfoTable *)info - 1;}
INLINE_HEADER StgFunInfoTable *itbl_to_fun_itbl(const StgInfoTable *i) {return (StgFunInfoTable *)(i + 1) - 1;} INLINE_HEADER StgFunInfoTable *itbl_to_fun_itbl(const StgInfoTable *i) {return (StgFunInfoTable *)(i + 1) - 1;}
INLINE_HEADER StgRetInfoTable *itbl_to_ret_itbl(const StgInfoTable *i) {return (StgRetInfoTable *)(i + 1) - 1;} INLINE_HEADER StgRetInfoTable *itbl_to_ret_itbl(const StgInfoTable *i) {return (StgRetInfoTable *)(i + 1) - 1;}
INLINE_HEADER StgThunkInfoTable *itbl_to_thunk_itbl(const StgInfoTable *i) {return (StgThunkInfoTable *)(i + 1) - 1;} INLINE_HEADER StgThunkInfoTable *itbl_to_thunk_itbl(const StgInfoTable *i) {return (StgThunkInfoTable *)(i + 1) - 1;}
INLINE_HEADER StgConInfoTable *itbl_to_con_itbl(const StgInfoTable *i) {return (StgConInfoTable *)(i + 1) - 1;} INLINE_HEADER StgConInfoTable *itbl_to_con_itbl(const StgInfoTable *i) {return (StgConInfoTable *)(i + 1) - 1;}
#else #else
#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)info) EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info);
#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)info) EXTERN_INLINE StgInfoTable *INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgInfoTable *)info;}
#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)info) EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info);
#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)info) EXTERN_INLINE StgRetInfoTable *RET_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgRetInfoTable *)info;}
#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)info) INLINE_HEADER StgThunkInfoTable *FUN_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgFunInfoTable *)info;}
INLINE_HEADER StgThunkInfoTable *THUNK_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgThunkInfoTable *)info;}
INLINE_HEADER StgConInfoTable *CON_INFO_PTR_TO_STRUCT(const StgInfoTable *info) {return (StgConInfoTable *)info;}
INLINE_HEADER StgFunInfoTable *itbl_to_fun_itbl(const StgInfoTable *i) {return (StgFunInfoTable *)i;} INLINE_HEADER StgFunInfoTable *itbl_to_fun_itbl(const StgInfoTable *i) {return (StgFunInfoTable *)i;}
INLINE_HEADER StgRetInfoTable *itbl_to_ret_itbl(const StgInfoTable *i) {return (StgRetInfoTable *)i;} INLINE_HEADER StgRetInfoTable *itbl_to_ret_itbl(const StgInfoTable *i) {return (StgRetInfoTable *)i;}
INLINE_HEADER StgThunkInfoTable *itbl_to_thunk_itbl(const StgInfoTable *i) {return (StgThunkInfoTable *)i;} INLINE_HEADER StgThunkInfoTable *itbl_to_thunk_itbl(const StgInfoTable *i) {return (StgThunkInfoTable *)i;}
...@@ -227,7 +231,7 @@ TAG_CLOSURE(StgWord tag,StgClosure * p) ...@@ -227,7 +231,7 @@ TAG_CLOSURE(StgWord tag,StgClosure * p)
INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR_NOT_NULL (StgWord p) INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR_NOT_NULL (StgWord p)
{ {
StgInfoTable *info = INFO_PTR_TO_STRUCT(p); StgInfoTable *info = INFO_PTR_TO_STRUCT((StgInfoTable *)p);
return info->type != INVALID_OBJECT && info->type < N_CLOSURE_TYPES; return info->type != INVALID_OBJECT && info->type < N_CLOSURE_TYPES;
} }
......
...@@ -1183,7 +1183,7 @@ run_BCO: ...@@ -1183,7 +1183,7 @@ run_BCO:
int i; int i;
int o_itbl = BCO_GET_LARGE_ARG; int o_itbl = BCO_GET_LARGE_ARG;
int n_words = BCO_NEXT; int n_words = BCO_NEXT;
StgInfoTable* itbl = INFO_PTR_TO_STRUCT(BCO_LIT(o_itbl)); StgInfoTable* itbl = INFO_PTR_TO_STRUCT((StgInfoTable *)BCO_LIT(o_itbl));
int request = CONSTR_sizeW( itbl->layout.payload.ptrs, int request = CONSTR_sizeW( itbl->layout.payload.ptrs,
itbl->layout.payload.nptrs ); itbl->layout.payload.nptrs );
StgClosure* con = (StgClosure*)allocate_NONUPD(cap,request); StgClosure* con = (StgClosure*)allocate_NONUPD(cap,request);
......
...@@ -382,7 +382,7 @@ thread_stack(StgPtr p, StgPtr stack_end) ...@@ -382,7 +382,7 @@ thread_stack(StgPtr p, StgPtr stack_end)
StgRetFun *ret_fun = (StgRetFun *)p; StgRetFun *ret_fun = (StgRetFun *)p;
StgFunInfoTable *fun_info; StgFunInfoTable *fun_info;
fun_info = FUN_INFO_PTR_TO_STRUCT(UNTAG_CLOSURE((StgClosure *) fun_info = FUN_INFO_PTR_TO_STRUCT((StgInfoTable *)UNTAG_CLOSURE((StgClosure *)
get_threaded_info((StgPtr)ret_fun->fun))); get_threaded_info((StgPtr)ret_fun->fun)));
// *before* threading it! // *before* threading it!
thread(&ret_fun->fun); thread(&ret_fun->fun);
...@@ -404,7 +404,7 @@ thread_PAP_payload (StgClosure *fun, StgClosure **payload, StgWord size) ...@@ -404,7 +404,7 @@ thread_PAP_payload (StgClosure *fun, StgClosure **payload, StgWord size)
StgWord bitmap; StgWord bitmap;
StgFunInfoTable *fun_info; StgFunInfoTable *fun_info;
fun_info = FUN_INFO_PTR_TO_STRUCT(UNTAG_CLOSURE((StgClosure *) fun_info = FUN_INFO_PTR_TO_STRUCT((StgInfoTable *)UNTAG_CLOSURE((StgClosure *)
get_threaded_info((StgPtr)fun))); get_threaded_info((StgPtr)fun)));
ASSERT(fun_info->i.type != PAP); ASSERT(fun_info->i.type != PAP);
...@@ -818,7 +818,7 @@ update_fwd_compact( bdescr *blocks ) ...@@ -818,7 +818,7 @@ update_fwd_compact( bdescr *blocks )
// that if (p&BLOCK_MASK) >= (free&BLOCK_MASK), then we // that if (p&BLOCK_MASK) >= (free&BLOCK_MASK), then we
// definitely have enough room. Also see bug #1147. // definitely have enough room. Also see bug #1147.
iptr = get_threaded_info(p); iptr = get_threaded_info(p);
info = INFO_PTR_TO_STRUCT(UNTAG_CLOSURE((StgClosure *)iptr)); info = INFO_PTR_TO_STRUCT((StgInfoTable *)UNTAG_CLOSURE((StgClosure *)iptr));
q = p; q = p;
......
...@@ -875,7 +875,7 @@ selector_chain: ...@@ -875,7 +875,7 @@ selector_chain:
// make sure someone else didn't get here first... // make sure someone else didn't get here first...
if (IS_FORWARDING_PTR(info_ptr) || if (IS_FORWARDING_PTR(info_ptr) ||
INFO_PTR_TO_STRUCT(info_ptr)->type != THUNK_SELECTOR) { INFO_PTR_TO_STRUCT((StgInfoTable *)info_ptr)->type != THUNK_SELECTOR) {
// v. tricky now. The THUNK_SELECTOR has been evacuated // v. tricky now. The THUNK_SELECTOR has been evacuated
// by another thread, and is now either a forwarding ptr or IND. // by another thread, and is now either a forwarding ptr or IND.
// We need to extract ourselves from the current situation // We need to extract ourselves from the current situation
...@@ -898,7 +898,7 @@ selector_chain: ...@@ -898,7 +898,7 @@ selector_chain:
SET_INFO(p,&stg_WHITEHOLE_info); SET_INFO(p,&stg_WHITEHOLE_info);
#endif #endif
field = INFO_PTR_TO_STRUCT(info_ptr)->layout.selector_offset; field = INFO_PTR_TO_STRUCT((StgInfoTable *)info_ptr)->layout.selector_offset;
// The selectee might be a constructor closure, // The selectee might be a constructor closure,
// so we untag the pointer. // so we untag the pointer.
...@@ -959,7 +959,7 @@ selector_loop: ...@@ -959,7 +959,7 @@ selector_loop:
info_ptr = (StgWord)UNTAG_CLOSURE(val)->header.info; info_ptr = (StgWord)UNTAG_CLOSURE(val)->header.info;
if (!IS_FORWARDING_PTR(info_ptr)) if (!IS_FORWARDING_PTR(info_ptr))
{ {
info = INFO_PTR_TO_STRUCT(info_ptr); info = INFO_PTR_TO_STRUCT((StgInfoTable *)info_ptr);
switch (info->type) { switch (info->type) {
case IND: case IND:
case IND_PERM: case IND_PERM:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment