X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FPrimOps.cmm;h=cb8626e5dde6c2db2bb6ded34687dd59290ec628;hb=90ef8ab26efb2fc4172944f1066f122d3a6e7c7d;hp=7c75fca0e8f843018fb76a17379bb7d33e64cd2d;hpb=0598a001b9d852a044a49f8fb6ab1a6b02a77d9e;p=ghc-hetmet.git diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index 7c75fca..cb8626e 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -1869,7 +1869,7 @@ unpackClosurezh_fast // TODO: Consider the absence of ptrs or nonptrs as a special case ? W_ info, ptrs, nptrs, p, ptrs_arr, nptrs_arr; - info = %GET_STD_INFO(R1); + info = %GET_STD_INFO(UNTAG(R1)); // Some closures have non-standard layout, so we omit those here. W_ type; @@ -1899,6 +1899,9 @@ out: ALLOC_PRIM (ptrs_arr_sz + nptrs_arr_sz, R1_PTR, unpackClosurezh_fast); + W_ clos; + clos = UNTAG(R1); + ptrs_arr = Hp - nptrs_arr_sz - ptrs_arr_sz + WDS(1); nptrs_arr = Hp - nptrs_arr_sz + WDS(1); @@ -1907,7 +1910,7 @@ out: p = 0; for: if(p < ptrs) { - W_[ptrs_arr + SIZEOF_StgMutArrPtrs + WDS(p)] = StgClosure_payload(R1,p); + W_[ptrs_arr + SIZEOF_StgMutArrPtrs + WDS(p)] = StgClosure_payload(clos,p); p = p + 1; goto for; } @@ -1917,7 +1920,7 @@ for: p = 0; for2: if(p < nptrs) { - W_[BYTE_ARR_CTS(nptrs_arr) + WDS(p)] = StgClosure_payload(R1, p+ptrs); + W_[BYTE_ARR_CTS(nptrs_arr) + WDS(p)] = StgClosure_payload(clos, p+ptrs); p = p + 1; goto for2; }