/* node.h */ #ifndef _NODE_H #define _NODE_H #include "runtime.h" #include "newmacros.h" /* ------------- INDIR | *node 00| ------------- --------------------------- VAP/CAP | info x1| args ... | --------------------------- --------------------------- CONSTR | conInfo 10| args ... | --------------------------- | arity | 0 | It's a VAP node if info[0] == 0 | ... | ... | info | need | size | | ... | ... | | 0 | arity | | constptr | | code | .... | ... | CONSTR/WCONSTR/I32/FLOAT/STRING etc | *function name This line only if profiling constptr | size << 16 | arity:16 | link field | CAF_fun This line only if arity == 0 | CAF/VAP/CAP etc | ... coninfo | size:8, psize:8, number:12, 00:2, tag:2 Must be same as in (new)macros.h size = Size of node psize = Number of pointers number = Constructor number coninfo | size:LARGE_SIZE, xx:LARGE_EXTRA 01:2, tag:2 Must be same as in (new)macros.h size = Size of node, all words are pointers coninfo | size:LARGE_SIZE, xx:LARGE_EXTRA 11:2, tag:2 Must be same as in (new)macros.h size = Size of node, all words are integers cinfo | need, size ,words ,0 need = Number of argument needed (>0) size = Number of arguments availible words = Number of arguments that aren't pointers | *fInfo */ #define ABS(a) ((a)<0?-(a):a) #define EXT_LARGETAG(x) ( (MASK_CON|MASK_WTAG) & (UInt)(x)) #define GET_LARGETAG(p) EXT_LARGETAG(*(p)) #define EXT_TAG(x) ( MASK_WTAG & (UInt)(x)) #define GET_TAG(p) EXT_TAG(*(p)) #define ZAPPED(p) (ZAP_BIT & (UInt)*(p)) #define ZAP(p) (*(UInt*)(p) |= ZAP_BIT ) #define EXT_WADDRESS(x) ((NodePtr)(~MASK_WTAG & ~ZAP_BIT & (UInt)(x))) #define EXT_HADDRESS(x) ((NodePtr)(~MASK_HTAG & ~ZAP_BIT & (UInt)(x))) #define EXT_IND_ADDRESS(x) EXT_WADDRESS(x) #define GET_IND_ADDRESS(p) EXT_IND_ADDRESS(*(p)) #define BUILD_IND(p) ((Node) (IND_TAG | (UInt)(p))) #define GET_HOLE_INFO ((Node) (CON_TAG | (UInt)&cinfo_Dummy_hole)) #define EXT_FINFO(p) (Finfo)EXT_HADDRESS(p) #define GET_FINFO(p) EXT_FINFO(*(p)) #ifdef TPROF #define FINFO_ENTERPTR(p) (NS+2+(CodePtr)p) /*PH*/ #define FINFO_CODE(p) (NS+NS+2+(CodePtr)p) /*PH*/ #else /*#define FINFO_NATIVECODE(p) (NS+2+(CodePtr)p) DAVID */ #define FINFO_CODE(p) (NS/*+NS*/+2+(CodePtr)p) /* DAVID */ #endif #define FINFO_ARITY(p) (((UChar *)(p))[1]) #define FINFO_CAF(p) (FINFO_CONST(p)[2]) #define FINFO_CONST(p) (*((NodePtr **)(2+(CodePtr)p))) #define VAP_CONST(p) FINFO_CONST(GET_FINFO(p)) #define VAP_CODE(p) FINFO_CODE(GET_FINFO(p)) #define EXT_CINFO(p) EXT_FINFO(p) #define GET_CINFO(p) EXT_CINFO(*(p)) #define CINFO_NEED(p) (((UChar *)(p))[0]) #define CINFO_SIZE(p) (((UChar *)(p))[1]) #define CINFO_FINFO(p) ((Finfo)((UInt)p+(UInt)2*CINFO_NEED(p))) #define CINFO_CODE(p) FINFO_CODE(CINFO_FINFO(p)) #define EXT_CONINFO(p) (Coninfo)(~MASK_WTAG & (UInt)p) #define GET_CONINFO(p) EXT_CONINFO(*(p)) #define CONINFO_SIZE(p) (((p)>>24)&0xff) #define CONINFO_PSIZE(p) (((p)>>16)&0xff) #define CONINFO_NUMBER(p) (((p)>>4)&0xfff) #define CONINFO_LARGESIZES(p) (((Int)p)>>(4+LARGE_EXTRA)) #define CONINFO_LARGESIZEU(p) (ABS(((Int)p)>>(4+LARGE_EXTRA))) #define CONINFO_LARGEEXTRA(p) (((p)>>4)&((1<