- info = get_itbl((p));
- switch (info->type) {
- case THUNK_1_0:
- case THUNK_0_1:
- case THUNK_2_0:
- case THUNK_1_1:
- case THUNK_0_2:
- case THUNK_SELECTOR:
- nw = MIN_UPD_SIZE;
- break;
- case THUNK:
- nw = info->layout.payload.ptrs + info->layout.payload.nptrs;
- if (nw < MIN_UPD_SIZE)
- nw = MIN_UPD_SIZE;
- break;
- case AP:
- nw = sizeofW(StgPAP) - sizeofW(StgHeader) + ((StgPAP *)p)->n_args;
- break;
- case AP_STACK:
- nw = sizeofW(StgAP_STACK) - sizeofW(StgHeader)
- + ((StgAP_STACK *)p)->size;
- break;
- case CAF_BLACKHOLE:
- case BLACKHOLE:
- case SE_BLACKHOLE:
- case SE_CAF_BLACKHOLE:
- nw = info->layout.payload.ptrs + info->layout.payload.nptrs;
- break;
- default:
- barf("Unexpected closure type %u in LDV_recordDead_FILL_SLOP_DYNAMIC()", info->type);
- break;
- }
- LDV_recordDead((StgClosure *)(p), nw + sizeofW(StgHeader));
- for (i = 0; i < nw; i++) {
- ((StgClosure *)(p))->payload[i] = 0;
+ // very like FILL_SLOP(), except that we call LDV_recordDead().
+ size = closure_sizeW(p);
+
+ LDV_recordDead((StgClosure *)(p), size);
+
+ if (size > sizeofW(StgThunkHeader)) {
+ for (i = 0; i < size - sizeofW(StgThunkHeader); i++) {
+ ((StgThunk *)(p))->payload[i] = 0;
+ }