10 slurpClosurezh ( P_ closure )
12 W_ info, ptrs, nptrs, p, ptrs_arr, dat_arr;
13 info = %GET_STD_INFO(UNTAG(closure));
15 ptrs = TO_W_(%INFO_PTRS(info));
16 nptrs = TO_W_(%INFO_NPTRS(info));
19 clos = UNTAG(closure);
22 (len) = foreign "C" gtc_heap_view_closureSize(clos "ptr");
24 W_ ptrs_arr_sz, ptrs_arr_cards, dat_arr_sz;
25 dat_arr_sz = SIZEOF_StgArrWords + WDS(len);
27 ALLOC_PRIM_P (dat_arr_sz, slurpClosurezh, closure);
29 dat_arr = Hp - dat_arr_sz + WDS(1);
32 SET_HDR(dat_arr, stg_ARR_WORDS_info, CCCS);
33 StgArrWords_bytes(dat_arr) = WDS(len);
37 W_[BYTE_ARR_CTS(dat_arr) + WDS(p)] = W_[clos + WDS(p)];
44 ("ptr" ptrArray) = foreign "C" gtc_heap_view_closurePtrs(MyCapability() "ptr", clos "ptr");
46 return (info, dat_arr, ptrArray);
50 reallyUnsafePtrEqualityUpToTag (W_ clos1, W_ clos2)
54 return (clos1 == clos2);
65 // Taken from stg_unpackClosurezh in rts/PrimOps.cmm
68 /* args: R1 = closure to analyze */
74 info = %GET_STD_INFO(clos);
76 (len) = foreign "C" gtc_heap_view_closureSize(clos "ptr") [R1];
79 data_arr_sz = SIZEOF_StgArrWords + WDS(len);
81 ALLOC_PRIM (data_arr_sz, R1_PTR, slurpClosurezh);
84 data_arr = Hp - data_arr_sz + WDS(1);
86 SET_HDR(data_arr, stg_ARR_WORDS_info, CCCS);
87 StgArrWords_bytes(data_arr) = WDS(len);
92 // W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = StgClosure_payload(clos, p);
93 W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = W_[clos + WDS(p)];
100 ("ptr" ptrArray) = foreign "C" gtc_heap_view_closurePtrs(MyCapability() "ptr", clos "ptr") [];
102 RET_NPP(info, data_arr, ptrArray);
105 reallyUnsafePtrEqualityUpToTag
111 RET_N(clos1 == clos2);