factor/native/types.c

117 lines
1.8 KiB
C
Raw Normal View History

2004-07-16 02:26:21 -04:00
#include "factor.h"
CELL type_of(CELL tagged)
{
CELL tag = TAG(tagged);
if(tag != OBJECT_TYPE)
return tag;
else
return untag_header(get(UNTAG(tagged)));
}
2004-08-23 01:13:09 -04:00
bool typep(CELL type, CELL tagged)
{
return type_of(tagged) == type;
}
2004-07-16 02:26:21 -04:00
void type_check(CELL type, CELL tagged)
{
2004-08-23 01:13:09 -04:00
if(type_of(tagged) != type)
type_error(type,tagged);
2004-07-16 02:26:21 -04:00
}
/*
* It is up to the caller to fill in the object's fields in a meaningful
* fashion!
*/
2004-08-05 16:49:55 -04:00
void* allot_object(CELL type, CELL length)
2004-07-16 02:26:21 -04:00
{
2004-08-04 22:43:58 -04:00
CELL* object = allot(length);
*object = tag_header(type);
2004-08-05 16:49:55 -04:00
return object;
2004-07-16 02:26:21 -04:00
}
CELL object_size(CELL pointer)
{
2004-08-05 20:29:52 -04:00
CELL size;
2004-07-16 02:26:21 -04:00
switch(TAG(pointer))
{
2004-08-06 02:51:32 -04:00
case FIXNUM_TYPE:
size = 0;
break;
2004-07-16 02:26:21 -04:00
case CONS_TYPE:
2004-08-05 20:29:52 -04:00
size = sizeof(CONS);
break;
2004-07-16 02:26:21 -04:00
case WORD_TYPE:
2004-08-05 20:29:52 -04:00
size = sizeof(WORD);
break;
2004-08-04 22:43:58 -04:00
case RATIO_TYPE:
2004-08-05 20:29:52 -04:00
size = sizeof(RATIO);
break;
case COMPLEX_TYPE:
size = sizeof(COMPLEX);
break;
2004-07-16 02:26:21 -04:00
case OBJECT_TYPE:
2004-08-05 20:29:52 -04:00
size = untagged_object_size(UNTAG(pointer));
break;
2004-07-16 02:26:21 -04:00
default:
2004-07-20 02:59:32 -04:00
critical_error("Cannot determine size",pointer);
2004-08-05 20:29:52 -04:00
size = 0; /* Can't happen */
break;
2004-07-16 02:26:21 -04:00
}
2004-08-05 20:29:52 -04:00
return align8(size);
2004-07-16 02:26:21 -04:00
}
CELL untagged_object_size(CELL pointer)
{
CELL size;
switch(untag_header(get(pointer)))
{
2004-07-27 23:29:37 -04:00
case WORD_TYPE:
2004-08-27 02:09:24 -04:00
size = sizeof(WORD);
break;
2004-07-16 02:26:21 -04:00
case F_TYPE:
case T_TYPE:
size = CELLS * 2;
break;
case ARRAY_TYPE:
2004-08-24 23:46:55 -04:00
case BIGNUM_TYPE:
2004-07-16 02:26:21 -04:00
size = ASIZE(pointer);
break;
case VECTOR_TYPE:
size = sizeof(VECTOR);
break;
case STRING_TYPE:
size = SSIZE(pointer);
break;
case SBUF_TYPE:
size = sizeof(SBUF);
break;
2004-08-05 17:33:02 -04:00
case FLOAT_TYPE:
size = sizeof(FLOAT);
break;
case PORT_TYPE:
size = sizeof(PORT);
2004-07-24 00:54:57 -04:00
break;
2004-07-16 02:26:21 -04:00
default:
2004-07-20 02:59:32 -04:00
critical_error("Cannot determine size",relocating);
2004-07-16 02:26:21 -04:00
size = -1;/* can't happen */
break;
}
return align8(size);
}
2004-08-06 02:51:32 -04:00
void primitive_type_of(void)
{
drepl(tag_fixnum(type_of(dpeek())));
2004-08-06 02:51:32 -04:00
}
void primitive_size_of(void)
{
drepl(tag_fixnum(object_size(dpeek())));
2004-08-06 02:51:32 -04:00
}