3 StgWord closureSize(StgClosure *closure) {
4 ASSERT(LOOKS_LIKE_CLOSURE_PTR(closure));
5 return closure_sizeW(closure);
9 closure_ptrs_in_large_bitmap(StgClosure *ptrs[], StgWord *nptrs, StgClosure **p, StgLargeBitmap *large_bitmap, nat size )
16 for (i = 0; i < size; b++) {
17 bitmap = large_bitmap->bitmap[b];
18 j = stg_min(size-i, BITS_IN(W_));
20 for (; j > 0; j--, p++) {
21 if ((bitmap & 1) == 0) {
22 ptrs[(*nptrs)++] = *p;
30 char *closure_type_names[] = {
31 [INVALID_OBJECT] = "INVALID_OBJECT",
33 [CONSTR_1_0] = "CONSTR_1_0",
34 [CONSTR_0_1] = "CONSTR_0_1",
35 [CONSTR_2_0] = "CONSTR_2_0",
36 [CONSTR_1_1] = "CONSTR_1_1",
37 [CONSTR_0_2] = "CONSTR_0_2",
38 [CONSTR_STATIC] = "CONSTR_STATIC",
39 [CONSTR_NOCAF_STATIC] = "CONSTR_NOCAF_STATIC",
41 [FUN_1_0] = "FUN_1_0",
42 [FUN_0_1] = "FUN_0_1",
43 [FUN_2_0] = "FUN_2_0",
44 [FUN_1_1] = "FUN_1_1",
45 [FUN_0_2] = "FUN_0_2",
46 [FUN_STATIC] = "FUN_STATIC",
48 [THUNK_1_0] = "THUNK_1_0",
49 [THUNK_0_1] = "THUNK_0_1",
50 [THUNK_2_0] = "THUNK_2_0",
51 [THUNK_1_1] = "THUNK_1_1",
52 [THUNK_0_2] = "THUNK_0_2",
53 [THUNK_STATIC] = "THUNK_STATIC",
54 [THUNK_SELECTOR] = "THUNK_SELECTOR",
58 [AP_STACK] = "AP_STACK",
60 [IND_PERM] = "IND_PERM",
61 [IND_STATIC] = "IND_STATIC",
62 [RET_BCO] = "RET_BCO",
63 [RET_SMALL] = "RET_SMALL",
64 [RET_BIG] = "RET_BIG",
65 [RET_DYN] = "RET_DYN",
66 [RET_FUN] = "RET_FUN",
67 [UPDATE_FRAME] = "UPDATE_FRAME",
68 [CATCH_FRAME] = "CATCH_FRAME",
69 [UNDERFLOW_FRAME] = "UNDERFLOW_FRAME",
70 [STOP_FRAME] = "STOP_FRAME",
71 [BLACKHOLE] = "BLACKHOLE",
72 [BLOCKING_QUEUE] = "BLOCKING_QUEUE",
73 [MVAR_CLEAN] = "MVAR_CLEAN",
74 [MVAR_DIRTY] = "MVAR_DIRTY",
75 [ARR_WORDS] = "ARR_WORDS",
76 [MUT_ARR_PTRS_CLEAN] = "MUT_ARR_PTRS_CLEAN",
77 [MUT_ARR_PTRS_DIRTY] = "MUT_ARR_PTRS_DIRTY",
78 [MUT_ARR_PTRS_FROZEN0] = "MUT_ARR_PTRS_FROZEN0",
79 [MUT_ARR_PTRS_FROZEN] = "MUT_ARR_PTRS_FROZEN",
80 [MUT_VAR_CLEAN] = "MUT_VAR_CLEAN",
81 [MUT_VAR_DIRTY] = "MUT_VAR_DIRTY",
84 [MUT_PRIM] = "MUT_PRIM",
87 [TREC_CHUNK] = "TREC_CHUNK",
88 [ATOMICALLY_FRAME] = "ATOMICALLY_FRAME",
89 [CATCH_RETRY_FRAME] = "CATCH_RETRY_FRAME",
90 [CATCH_STM_FRAME] = "CATCH_STM_FRAME",
91 [WHITEHOLE] = "WHITEHOLE"
95 void closure_ptrs_in_pap_payload(StgClosure *ptrs[], StgWord *nptrs, StgClosure *fun, StgClosure **payload, StgWord size) {
97 StgFunInfoTable *fun_info;
99 fun_info = get_fun_itbl(UNTAG_CLOSURE(fun));
100 ASSERT(fun_info->i.type != PAP);
101 StgClosure **p = payload;
103 switch (fun_info->f.fun_type) {
105 bitmap = BITMAP_BITS(fun_info->f.b.bitmap);
108 closure_ptrs_in_large_bitmap(ptrs, nptrs, payload, GET_FUN_LARGE_BITMAP(fun_info), size);
111 closure_ptrs_in_large_bitmap(ptrs, nptrs, payload, BCO_BITMAP(fun), size);
114 bitmap = BITMAP_BITS(stg_arg_bitmaps[fun_info->f.fun_type]);
117 if ((bitmap & 1) == 0) {
118 ptrs[(*nptrs)++] = *p;
120 bitmap = bitmap >> 1;
128 StgMutArrPtrs *closurePtrs(Capability *cap, StgClosure *closure) {
129 ASSERT(LOOKS_LIKE_CLOSURE_PTR(closure));
131 StgWord size = closureSize(closure);
135 // First collect all pointers here, with the comfortable memory bound
136 // of the whole closure. Afterwards we know how many pointers are in
137 // the closure and then we can allocate space on the heap and copy them
139 StgClosure *ptrs[size];
144 StgInfoTable *info = get_itbl(closure);
145 StgThunkInfoTable *thunk_info;
146 StgFunInfoTable *fun_info;
148 switch (info->type) {
150 barf("Invalid Object");
165 case CONSTR_NOCAF_STATIC:
175 end = closure->payload + info->layout.payload.ptrs;
176 for (ptr = closure->payload; ptr < end; ptr++) {
177 ptrs[nptrs++] = *ptr;
188 end = ((StgThunk *)closure)->payload + info->layout.payload.ptrs;
189 for (ptr = ((StgThunk *)closure)->payload; ptr < end; ptr++) {
190 ptrs[nptrs++] = *ptr;
195 ptrs[nptrs++] = ((StgSelector *)closure)->selectee;
199 ptrs[nptrs++] = ((StgAP *)closure)->fun;
200 closure_ptrs_in_pap_payload(ptrs, &nptrs,
201 ((StgAP *)closure)->fun,
202 ((StgAP *)closure)->payload,
203 ((StgAP *)closure)->n_args);
207 ptrs[nptrs++] = ((StgPAP *)closure)->fun;
208 closure_ptrs_in_pap_payload(ptrs, &nptrs,
209 ((StgPAP *)closure)->fun,
210 ((StgPAP *)closure)->payload,
211 ((StgPAP *)closure)->n_args);
215 ptrs[nptrs++] = ((StgAP_STACK *)closure)->fun;
216 for (i = 0; i < ((StgAP_STACK *)closure)->size; ++i) {
217 ptrs[nptrs++] = ((StgAP_STACK *)closure)->payload[i];
222 ptrs[nptrs++] = (StgClosure *)((StgBCO *)closure)->instrs;
223 ptrs[nptrs++] = (StgClosure *)((StgBCO *)closure)->literals;
224 ptrs[nptrs++] = (StgClosure *)((StgBCO *)closure)->ptrs;
231 ptrs[nptrs++] = (StgClosure *)(((StgInd *)closure)->indirectee);
234 case MUT_ARR_PTRS_CLEAN:
235 case MUT_ARR_PTRS_DIRTY:
236 case MUT_ARR_PTRS_FROZEN:
237 for (i = 0; i < ((StgMutArrPtrs *)closure)->ptrs; ++i) {
238 ptrs[nptrs++] = ((StgMutArrPtrs *)closure)->payload[i];
243 fprintf(stderr,"closurePtrs: Cannot handle type %s yet\n", closure_type_names[info->type]);
247 size = nptrs + mutArrPtrsCardTableSize(nptrs);
249 (StgMutArrPtrs *)allocate(cap, sizeofW(StgMutArrPtrs) + size);
250 TICK_ALLOC_PRIM(sizeofW(StgMutArrPtrs), nptrs, 0);
251 SET_HDR(arr, &stg_MUT_ARR_PTRS_FROZEN_info, CCCS);
255 for (i = 0; i<nptrs; i++) {
256 arr->payload[i] = ptrs[i];