summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorAntoine Latter <aslatter@gmail.com>2010-01-01 18:33:46 +0000
committerAntoine Latter <aslatter@gmail.com>2010-01-01 18:33:46 +0000
commit17c8229adf9f268097e4c87053d940a918c3a26f (patch)
tree578661321f7a92f51f397ac5a0bf2e26a1683f5e /includes
parenta0e32f1151a9bc765527bd9ee48a54a27ce1750e (diff)
downloadhaskell-17c8229adf9f268097e4c87053d940a918c3a26f.tar.gz
FIX #38000 Store StgArrWords payload size in bytes
Diffstat (limited to 'includes')
-rw-r--r--includes/Cmm.h3
-rw-r--r--includes/mkDerivedConstants.c2
-rw-r--r--includes/rts/storage/ClosureMacros.h7
-rw-r--r--includes/rts/storage/Closures.h2
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;