3 #define TAG(cell) ((CELL)(cell) & TAG_MASK)
4 #define RETAG(cell,tag) ((CELL)(cell) | (tag))
5 #define UNTAG(cell) ((CELL)(cell) & ~TAG_MASK)
13 #define COMPLEX_TYPE 5
15 #define GC_COLLECTED 7 /* See gc.c */
17 /*** Header types ***/
19 /* Canonical F object */
23 /* Canonical T object */
27 /* Empty stack marker */
32 #define VECTOR_TYPE 10
33 #define STRING_TYPE 11
35 #define HANDLE_TYPE 13
36 #define BIGNUM_TYPE 14
39 /* Pseudo-types. For error reporting only. */
40 #define INTEGER_TYPE 100 /* FIXNUM or BIGNUM */
41 #define RATIONAL_TYPE 101 /* INTEGER or RATIO */
42 #define REAL_TYPE 102 /* RATIONAL or FLOAT */
44 bool typep(CELL type, CELL tagged);
45 CELL type_of(CELL tagged);
46 void type_check(CELL type, CELL tagged);
48 INLINE void check_non_empty(CELL cell)
51 general_error(ERROR_UNDERFLOW,F);
54 INLINE CELL tag_boolean(CELL untagged)
56 return (untagged == false ? F : T);
59 INLINE bool untag_boolean(CELL tagged)
61 check_non_empty(tagged);
62 return (tagged == F ? false : true);
65 INLINE CELL tag_header(CELL cell)
67 return RETAG(cell << TAG_BITS,HEADER_TYPE);
70 INLINE CELL untag_header(CELL cell)
72 if(TAG(cell) != HEADER_TYPE)
73 critical_error("header type check",cell);
74 return cell >> TAG_BITS;
77 INLINE CELL tag_object(void* cell)
79 return RETAG(cell,OBJECT_TYPE);
82 INLINE CELL object_type(CELL tagged)
84 return untag_header(get(UNTAG(tagged)));
87 void* allot_object(CELL type, CELL length);
88 CELL untagged_object_size(CELL pointer);
89 CELL object_size(CELL pointer);