10 slurpClosurezh ( P_ closure )
12 W_ info, ptrs, nptrs, p, ptrs_arr, nptrs_arr;
13 info = %GET_STD_INFO(UNTAG(closure));
15 ptrs = TO_W_(%INFO_PTRS(info));
16 nptrs = TO_W_(%INFO_NPTRS(info));
18 W_ ptrs_arr_sz, ptrs_arr_cards, nptrs_arr_sz;
19 nptrs_arr_sz = SIZEOF_StgArrWords + WDS(nptrs);
20 ptrs_arr_cards = mutArrPtrsCardWords(ptrs);
21 ptrs_arr_sz = SIZEOF_StgMutArrPtrs + WDS(ptrs) + WDS(ptrs_arr_cards);
23 ALLOC_PRIM_P (ptrs_arr_sz + nptrs_arr_sz, stg_unpackClosurezh, closure);
26 clos = UNTAG(closure);
28 ptrs_arr = Hp - nptrs_arr_sz - ptrs_arr_sz + WDS(1);
29 nptrs_arr = Hp - nptrs_arr_sz + WDS(1);
31 SET_HDR(ptrs_arr, stg_MUT_ARR_PTRS_FROZEN_info, CCCS);
32 StgMutArrPtrs_ptrs(ptrs_arr) = ptrs;
33 StgMutArrPtrs_size(ptrs_arr) = ptrs + ptrs_arr_cards;
38 W_[ptrs_arr + SIZEOF_StgMutArrPtrs + WDS(p)] = StgClosure_payload(clos,p);
42 /* We can leave the card table uninitialised, since the array is
43 allocated in the nursery. The GC will fill it in if/when the array
46 SET_HDR(nptrs_arr, stg_ARR_WORDS_info, CCCS);
47 StgArrWords_bytes(nptrs_arr) = WDS(nptrs);
51 W_[BYTE_ARR_CTS(nptrs_arr) + WDS(p)] = StgClosure_payload(clos, p+ptrs);
55 return (info, ptrs_arr, nptrs_arr);
59 reallyUnsafePtrEqualityUpToTag (W_ clos1, W_ clos2)
63 return (clos1 == clos2);
74 // Taken from stg_unpackClosurezh in rts/PrimOps.cmm
77 /* args: R1 = closure to analyze */
83 info = %GET_STD_INFO(clos);
85 (len) = foreign "C" gtc_heap_view_closureSize(clos "ptr") [R1];
88 data_arr_sz = SIZEOF_StgArrWords + WDS(len);
90 ALLOC_PRIM (data_arr_sz, R1_PTR, slurpClosurezh);
93 data_arr = Hp - data_arr_sz + WDS(1);
95 SET_HDR(data_arr, stg_ARR_WORDS_info, CCCS);
96 StgArrWords_bytes(data_arr) = WDS(len);
101 // W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = StgClosure_payload(clos, p);
102 W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = W_[clos + WDS(p)];
109 ("ptr" ptrArray) = foreign "C" gtc_heap_view_closurePtrs(MyCapability() "ptr", clos "ptr") [];
111 RET_NPP(info, data_arr, ptrArray);
114 reallyUnsafePtrEqualityUpToTag
120 RET_N(clos1 == clos2);