3 bool typep(CELL type, CELL tagged)
7 if(TAG(tagged) == type)
10 else if(type >= HEADER_TYPE)
12 if(TAG(tagged) == OBJECT_TYPE)
14 if(untag_header(get(UNTAG(tagged))) == type)
22 CELL type_of(CELL tagged)
24 CELL tag = TAG(tagged);
25 if(tag != OBJECT_TYPE)
28 return untag_header(get(UNTAG(tagged)));
31 void type_check(CELL type, CELL tagged)
33 if(type < HEADER_TYPE)
35 if(TAG(tagged) == type)
38 else if(type >= HEADER_TYPE)
40 if(TAG(tagged) == OBJECT_TYPE)
42 if(untag_header(get(UNTAG(tagged))) == type)
47 type_error(type,tagged);
51 * It is up to the caller to fill in the object's fields in a meaningful
54 void* allot_object(CELL type, CELL length)
56 CELL* object = allot(length);
57 *object = tag_header(type);
61 CELL object_size(CELL pointer)
80 size = sizeof(COMPLEX);
83 size = untagged_object_size(UNTAG(pointer));
86 critical_error("Cannot determine size",pointer);
87 size = 0; /* Can't happen */
94 CELL untagged_object_size(CELL pointer)
98 switch(untag_header(get(pointer)))
101 return align8(sizeof(WORD));
108 size = ASIZE(pointer);
111 size = sizeof(VECTOR);
114 size = SSIZE(pointer);
120 size = sizeof(BIGNUM);
123 size = sizeof(FLOAT);
126 size = sizeof(HANDLE);
129 critical_error("Cannot determine size",relocating);
130 size = -1;/* can't happen */
137 void primitive_type_of(void)
139 check_non_empty(env.dt);
140 env.dt = tag_fixnum(type_of(env.dt));
143 void primitive_size_of(void)
145 check_non_empty(env.dt);
146 env.dt = tag_fixnum(object_size(env.dt));