#define INLINE inline static typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; typedef signed char s8; typedef signed short s16; typedef signed int s32; typedef signed long long s64; #ifdef _WIN64 typedef long long F_FIXNUM; typedef unsigned long long CELL; #else typedef long F_FIXNUM; typedef unsigned long CELL; #endif #define CELLS ((signed)sizeof(CELL)) #define WORD_SIZE (CELLS*8) #define HALF_WORD_SIZE (CELLS*4) #define HALF_WORD_MASK (((unsigned long)1<> TAG_BITS; } INLINE CELL tag_fixnum(F_FIXNUM untagged) { return RETAG(untagged << TAG_BITS,FIXNUM_TYPE); } INLINE void *untag_object(CELL tagged) { return (void *)UNTAG(tagged); } typedef void *XT; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; /* tagged */ CELL capacity; } F_ARRAY; typedef F_ARRAY F_BYTE_ARRAY; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; /* tagged num of chars */ CELL length; /* tagged */ CELL aux; /* tagged */ CELL hashcode; } F_STRING; /* The compiled code heap is structured into blocks. */ typedef struct { char type; /* this is WORD_TYPE or QUOTATION_TYPE */ char last_scan; /* the youngest generation in which this block's literals may live */ char needs_fixup; /* is this a new block that needs full fixup? */ CELL code_length; /* # bytes */ CELL literals; /* # bytes */ CELL relocation; /* tagged pointer to byte-array or f */ } F_CODE_BLOCK; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { /* TAGGED header */ CELL header; /* TAGGED hashcode */ CELL hashcode; /* TAGGED word name */ CELL name; /* TAGGED word vocabulary */ CELL vocabulary; /* TAGGED definition */ CELL def; /* TAGGED property assoc for library code */ CELL props; /* TAGGED t or f, t means its compiled with the optimizing compiler, f means its compiled with the non-optimizing compiler */ CELL optimizedp; /* TAGGED call count for profiling */ CELL counter; /* TAGGED machine code for sub-primitive */ CELL subprimitive; /* UNTAGGED execution token: jump here to execute word */ XT xt; /* UNTAGGED compiled code block */ F_CODE_BLOCK *code; /* UNTAGGED profiler stub */ F_CODE_BLOCK *profiling; } F_WORD; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; CELL object; } F_WRAPPER; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; CELL numerator; CELL denominator; } F_RATIO; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { /* We use a union here to force the float value to be aligned on an 8-byte boundary. */ union { CELL header; long long padding; }; double n; } F_FLOAT; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; /* tagged */ CELL array; /* tagged */ CELL compiledp; /* UNTAGGED */ XT xt; /* UNTAGGED compiled code block */ F_CODE_BLOCK *code; } F_QUOTATION; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; CELL real; CELL imaginary; } F_COMPLEX; /* Assembly code makes assumptions about the layout of this struct */ typedef struct { CELL header; /* tagged */ CELL alien; /* tagged */ CELL expired; /* untagged */ CELL displacement; } F_ALIEN; typedef struct { CELL header; /* tagged byte array holding a C string */ CELL path; /* OS-specific handle */ void *dll; } F_DLL; typedef struct { CELL header; /* tagged */ CELL length; } F_CALLSTACK; typedef struct { XT xt; /* Frame size in bytes */ CELL size; } F_STACK_FRAME; /* These are really just arrays, but certain elements have special significance */ typedef struct { CELL header; /* tagged */ CELL capacity; /* tagged */ CELL class; /* tagged fixnum */ CELL size; /* tagged fixnum */ CELL echelon; } F_TUPLE_LAYOUT; typedef struct { CELL header; /* tagged layout */ CELL layout; } F_TUPLE;