diff options
Diffstat (limited to 'rts/ClosureSize.c')
-rw-r--r-- | rts/ClosureSize.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/rts/ClosureSize.c b/rts/ClosureSize.c new file mode 100644 index 0000000000..8fa99c6e6e --- /dev/null +++ b/rts/ClosureSize.c @@ -0,0 +1,69 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team 2021 + * + * Implementation of closure_sizeW_ + * + * ---------------------------------------------------------------------------*/ + +#include "Rts.h" + +uint32_t +closure_sizeW_ (const StgClosure *p, const StgInfoTable *info) +{ + switch (info->type) { + case THUNK_0_1: + case THUNK_1_0: + return sizeofW(StgThunk) + 1; + case FUN_0_1: + case CONSTR_0_1: + case FUN_1_0: + case CONSTR_1_0: + return sizeofW(StgHeader) + 1; + case THUNK_0_2: + case THUNK_1_1: + case THUNK_2_0: + return sizeofW(StgThunk) + 2; + case FUN_0_2: + case CONSTR_0_2: + case FUN_1_1: + case CONSTR_1_1: + case FUN_2_0: + case CONSTR_2_0: + return sizeofW(StgHeader) + 2; + case THUNK: + return thunk_sizeW_fromITBL(info); + case THUNK_SELECTOR: + return THUNK_SELECTOR_sizeW(); + case AP_STACK: + return ap_stack_sizeW((StgAP_STACK *)p); + case AP: + return ap_sizeW((StgAP *)p); + case PAP: + return pap_sizeW((StgPAP *)p); + case IND: + return sizeofW(StgInd); + case ARR_WORDS: + return arr_words_sizeW((StgArrBytes *)p); + case MUT_ARR_PTRS_CLEAN: + case MUT_ARR_PTRS_DIRTY: + case MUT_ARR_PTRS_FROZEN_CLEAN: + case MUT_ARR_PTRS_FROZEN_DIRTY: + return mut_arr_ptrs_sizeW((StgMutArrPtrs*)p); + case SMALL_MUT_ARR_PTRS_CLEAN: + case SMALL_MUT_ARR_PTRS_DIRTY: + case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: + case SMALL_MUT_ARR_PTRS_FROZEN_DIRTY: + return small_mut_arr_ptrs_sizeW((StgSmallMutArrPtrs*)p); + case TSO: + return sizeofW(StgTSO); + case STACK: + return stack_sizeW((StgStack*)p); + case BCO: + return bco_sizeW((StgBCO *)p); + case TREC_CHUNK: + return sizeofW(StgTRecChunk); + default: + return sizeW_fromITBL(info); + } +} |