/* ----------------------------------------------------------------------------
- * $Id: Closures.h,v 1.17 2000/03/31 03:09:35 hwloidl Exp $
+ * $Id: Closures.h,v 1.27 2001/08/29 17:24:25 qrczak Exp $
*
* (c) The GHC Team, 1998-1999
*
/* All closures follow the generic format */
-typedef struct StgClosure_ {
+struct StgClosure_ {
StgHeader header;
- struct StgClosure_ *payload[0];
-} StgClosure;
+ struct StgClosure_ *payload[FLEXIBLE_ARRAY];
+};
/* What a stroke of luck - all our mutable closures follow the same
* basic layout, with the mutable link field as the second field after
typedef struct StgMutClosure_ {
StgHeader header;
- StgPtr *padding;
+ StgWord padding;
struct StgMutClosure_ *mut_link;
- struct StgClosure_ *payload[0];
+ struct StgClosure_ *payload[FLEXIBLE_ARRAY];
} StgMutClosure;
typedef struct {
StgHeader header;
StgWord n_args;
StgClosure *fun;
- StgPtr payload[0];
+ StgClosure *payload[FLEXIBLE_ARRAY];
} StgPAP;
typedef struct {
StgHeader header;
StgWord n_args;
StgClosure *fun;
- StgPtr payload[0];
+ StgClosure *payload[FLEXIBLE_ARRAY];
} StgAP_UPD;
typedef struct {
- StgHeader header;
- StgWord n_ptrs;
- StgWord n_words;
- StgWord n_instrs;
- StgWord stgexpr;
- StgPtr payload[0];
-} StgBCO;
-
-typedef struct {
StgHeader header;
StgClosure *indirectee;
} StgInd;
} StgIndOldGen;
typedef struct {
- StgHeader header;
- StgClosure *indirectee;
- StgClosure *static_link;
-} StgIndStatic;
-
-typedef struct StgCAF_ {
StgHeader header;
- StgClosure *body;
- StgMutClosure *mut_link;
- StgClosure *value;
- struct StgCAF_ *link;
-} StgCAF;
+ StgClosure *indirectee;
+ StgClosure *static_link;
+ struct _StgInfoTable *saved_info;
+} StgIndStatic;
typedef struct {
StgHeader header;
StgWord words;
- StgWord payload[0];
+ StgWord payload[FLEXIBLE_ARRAY];
} StgArrWords;
typedef struct {
StgHeader header;
StgWord ptrs;
StgMutClosure *mut_link; /* mutable list */
- StgClosure *payload[0];
+ StgClosure *payload[FLEXIBLE_ARRAY];
} StgMutArrPtrs;
typedef struct {
StgMutClosure *mut_link;
} StgMutVar;
+typedef struct {
+ StgHeader header;
+ StgArrWords *instrs; /* a pointer to an ArrWords */
+ StgArrWords *literals; /* a pointer to an ArrWords */
+ StgMutArrPtrs *ptrs; /* a pointer to a MutArrPtrs */
+ StgArrWords *itbls; /* a pointer to an ArrWords */
+} StgBCO;
+
/*
A collective typedef for all linkable stack frames i.e.
StgUpdateFrame, StgSeqFrame, StgCatchFrame
const struct _StgInfoTable* info;
StgWord liveness;
StgWord ret_addr;
- StgWord payload[0];
+ StgWord payload[FLEXIBLE_ARRAY];
} StgRetDyn;
/* Concurrent communication objects */
StgHeader header;
struct StgBlockingQueueElement_ *link; /* next elem in BQ */
StgMutClosure *mut_link; /* next elem in mutable list */
- struct StgClosure_ *payload[0];/* contents of the closure */
+ struct StgClosure_ *payload[FLEXIBLE_ARRAY];/* contents of the closure */
} StgBlockingQueueElement;
/* only difference to std code is type of the elem in the BQ */
/* this closure is hanging at the end of a blocking queue in (see RBH.c) */
typedef struct StgRBHSave_ {
StgHeader header;
- StgPtr payload[0]; /* 2 words ripped out of the guts of the */
+ StgClosure *payload[FLEXIBLE_ARRAY]; /* 2 words ripped out of the guts of the */
} StgRBHSave; /* closure holding the blocking queue */
typedef struct StgRBH_ {