instance Eq Box, MVAR_DIRTY, MUT_VAR_DIRTY
[ghc-heap-view.git] / cbits / HeapViewPrim.cmm
1 #include "Cmm.h"
2
3 aToWordzh
4 {
5         W_ clos;
6         clos = R1;
7         RET_N(clos);
8 }
9
10 slurpClosurezh
11 {
12 /* args: R1 = closure to analyze */
13 // TODO: Consider the absence of ptrs or nonptrs as a special case ?
14
15     W_ clos, len;
16     clos = UNTAG(R1);
17
18     W_ info;
19     info = %GET_STD_INFO(clos);
20
21     (len) = foreign "C" closureSize(clos "ptr") [];
22
23     W_ data_arr_sz;
24     data_arr_sz = SIZEOF_StgArrWords  + WDS(len);
25
26     ALLOC_PRIM (data_arr_sz, R1_PTR, slurpClosurezh);
27
28     W_ data_arr;
29     data_arr = Hp - data_arr_sz + WDS(1);
30
31     SET_HDR(data_arr, stg_ARR_WORDS_info, CCCS);
32     StgArrWords_bytes(data_arr) = WDS(len);
33     W_ p;
34     p = 0;
35 for:
36     if(p < len) {
37          // W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = StgClosure_payload(clos, p);
38          W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = W_[clos + WDS(p)];
39          p = p + 1;
40          goto for;
41     }
42
43     W_ ptrArray;
44
45     ("ptr" ptrArray) = foreign "C" closurePtrs(MyCapability() "ptr", clos "ptr") [];
46
47     RET_NPP(info, data_arr, ptrArray);
48 }
49