#ifndef _MUTLIB_H
#define _MUTLIB_H
#include "runtime.h"
extern Node ints[];
extern Node chars[];
#define MK_CDATA1(r,i) (r)[0] =(Node)CONSTRC(0,1,1) ; (r)[1+EXTRA] = (Node)(i)
#define MK_ENUM(r,i) (r)[0] =(Node)CONSTR(i,0,0)
#define MK_INT(r,i) (r)[0] = CONSTR_INT; (r)[1+EXTRA] = (Node)(i)
#define GET_INT(c) (NodePtr)&ints[TABLE_SIZE_INT*(HEAPOFFSET(c)+10)]
#define GET_CHAR(c) (NodePtr)&chars[TABLE_SIZE_INT*(HEAPOFFSET(c)+1)]
#define GET_BOOL(b) (b?(NodePtr)CON_TRUE:(NodePtr)CON_FALSE)
#define MK_VAP1(r,f,a) (r)[0] = ((UInt)f) | VAP_TAG; (r)[1+EXTRA] = (a)
#define MK_VAP2(r,f,a1,a2) (r)[0] = ((UInt)f) | VAP_TAG; (r)[1+EXTRA] = (a1); (r)[2+EXTRA] = (a2)
#define MK_CONS(r,f,a) (r)[0] = CONSTR_CONS; (r)[1+EXTRA] = (f); (r)[2+EXTRA] = (a)
#define GET_NIL() (NodePtr)CON_NIL
#define GET_ZAPSTK() &CON0_Prelude___ZapStk
#define GET_ZAPARG() &CON0_Prelude___ZapArg
#define CONSTR_CONS ((Node)CONSTR(1,2,0))
#define CONSTR_INT ((Node)CONSTRW(1,0))
#define CONSTR_FLOAT CONSTR_INT
#define CONSTR_DOUBLE ((Node)CONSTRW(2,0))
#define MASKPTR (sizeof(void *)-1)
#define ALIGNPTR(x) ((MASKPTR+(Int)(x)) & ~MASKPTR)
#define ALIGNPTR2(x) ((1+(Int)(x)) & ~1)
#define ALIGNPTR4(x) ((3+(Int)(x)) & ~3)
#define HEAP_ALLOC(r,i) r=hp;hp+=i
#define PUSH_STATE *--sp = (NodePtr)fp; *--sp=(NodePtr)ip;fp=sp;
#define POP_STATEVP \
sp=fp;ip=(CodePtr)*sp++;fp=(NodePtr*)*sp++; *sp=vapptr;vapptr=fp[2];IND_REMOVE(vapptr);constptr=VAP_CONST(vapptr);
#define POP_STATE(d) \
sp+=d;ip=(CodePtr)*sp++;fp=(NodePtr*)*sp++;vapptr=fp[2];IND_REMOVE(vapptr);constptr=VAP_CONST(vapptr);
#define UPDATE_VAP(p) SAVE_PROFINFO(vapptr);FILL_AT(SIZE_IND,vapptr); *vapptr= BUILD_IND(p);vapptr= p
extern int pendingIdx; /* deferred finalisers */
extern int excludeFinalisers; /* lock for atomic access to shared state */
#define FORCE_GC(c) \
PUSH_STATE; \
hp = callGc((c),hp,sp,fp); \
POP_STATE(0); \
if (pendingIdx && !excludeFinalisers) { \
Sp=sp; Fp=fp; Ip=ip; Hp=hp; \
runDeferredGCs(); \
sp=Sp; fp=Fp; ip=Ip; hp=Hp; \
}
#define BUFFER 100
#if defined(PROFILE) || defined(TPROF)
#define HEAP_CHECK_VAP(c) /* FORCE_GC(0) OC*/ ; if((hp+(c)+BUFFER>(NodePtr)sp)||(hp+(c)+BUFFER>profileHpLimit)){FORCE_GC(c);}
#define HEAP_CHECK_VAP_STMT(c,stmt) if((hp+(c)+BUFFER>(NodePtr)sp)||(hp+(c)+BUFFER>profileHpLimit)){FORCE_GC(c);stmt}
#define HEAP_CHECK_VAP_STMT2(c,stmt1,stmt2) if((hp+(c)+BUFFER>(NodePtr)sp)||(hp+(c)+BUFFER>profileHpLimit)){stmt1 FORCE_GC(c);stmt2}
#else
#define HEAP_CHECK_VAP(c) if(hp+(c)+BUFFER>(NodePtr)sp){FORCE_GC(c);}
#define HEAP_CHECK_VAP_STMT(c,stmt) if(hp+(c)+BUFFER>(NodePtr)sp){FORCE_GC(c);stmt}
#define HEAP_CHECK_VAP_STMT2(c,stmt1,stmt2) if(hp+(c)+BUFFER>(NodePtr)sp){stmt1 FORCE_GC(c);stmt2}
#endif
void mk_float(NodePtr p,float f);
float get_float_value(NodePtr p);
void mk_double(NodePtr p,double f);
double get_double_value(NodePtr p);
#endif
|