diff options
author | Antoine Latter <aslatter@gmail.com> | 2010-01-01 18:33:46 +0000 |
---|---|---|
committer | Antoine Latter <aslatter@gmail.com> | 2010-01-01 18:33:46 +0000 |
commit | 17c8229adf9f268097e4c87053d940a918c3a26f (patch) | |
tree | 578661321f7a92f51f397ac5a0bf2e26a1683f5e /includes | |
parent | a0e32f1151a9bc765527bd9ee48a54a27ce1750e (diff) | |
download | haskell-17c8229adf9f268097e4c87053d940a918c3a26f.tar.gz |
FIX #38000 Store StgArrWords payload size in bytes
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Cmm.h | 3 | ||||
-rw-r--r-- | includes/mkDerivedConstants.c | 2 | ||||
-rw-r--r-- | includes/rts/storage/ClosureMacros.h | 7 | ||||
-rw-r--r-- | includes/rts/storage/Closures.h | 2 |
4 files changed, 10 insertions, 4 deletions
diff --git a/includes/Cmm.h b/includes/Cmm.h index 52b5bec415..0088c1aa05 100644 --- a/includes/Cmm.h +++ b/includes/Cmm.h @@ -413,6 +413,9 @@ /* The offset of the payload of an array */ #define BYTE_ARR_CTS(arr) ((arr) + SIZEOF_StgArrWords) +/* The number of words allocated in an array payload */ +#define BYTE_ARR_WDS(arr) ROUNDUP_BYTES_TO_WDS(StgArrWords_bytes(arr)) + /* Getting/setting the info pointer of a closure */ #define SET_INFO(p,info) StgHeader_info(p) = info #define GET_INFO(p) StgHeader_info(p) diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c index 7efcf47d48..c003a9484b 100644 --- a/includes/mkDerivedConstants.c +++ b/includes/mkDerivedConstants.c @@ -276,7 +276,7 @@ main(int argc, char *argv[]) closure_field(StgMutArrPtrs, size); closure_size(StgArrWords); - closure_field(StgArrWords, words); + closure_field(StgArrWords, bytes); closure_payload(StgArrWords, payload); closure_field(StgTSO, _link); diff --git a/includes/rts/storage/ClosureMacros.h b/includes/rts/storage/ClosureMacros.h index 56e7dca204..fa6a2a5448 100644 --- a/includes/rts/storage/ClosureMacros.h +++ b/includes/rts/storage/ClosureMacros.h @@ -127,7 +127,7 @@ #define SET_ARR_HDR(c,info,costCentreStack,n_words) \ SET_HDR(c,info,costCentreStack); \ - (c)->words = n_words; + (c)->bytes = n_words*sizeof(W_); // Use when changing a closure from one kind to another #define OVERWRITE_INFO(c, new_info) \ @@ -280,8 +280,11 @@ INLINE_HEADER StgOffset ap_sizeW( StgAP* x ) INLINE_HEADER StgOffset pap_sizeW( StgPAP* x ) { return PAP_sizeW(x->n_args); } +INLINE_HEADER StgWord arr_words_words( StgArrWords* x) +{ return ROUNDUP_BYTES_TO_WDS(x->bytes); } + INLINE_HEADER StgOffset arr_words_sizeW( StgArrWords* x ) -{ return sizeofW(StgArrWords) + x->words; } +{ return sizeofW(StgArrWords) + arr_words_words(x); } INLINE_HEADER StgOffset mut_arr_ptrs_sizeW( StgMutArrPtrs* x ) { return sizeofW(StgMutArrPtrs) + x->size; } diff --git a/includes/rts/storage/Closures.h b/includes/rts/storage/Closures.h index a0ff738aa7..7671c7b47e 100644 --- a/includes/rts/storage/Closures.h +++ b/includes/rts/storage/Closures.h @@ -137,7 +137,7 @@ typedef struct StgBlockingQueue_ { typedef struct { StgHeader header; - StgWord words; + StgWord bytes; StgWord payload[FLEXIBLE_ARRAY]; } StgArrWords; |