factor/native/word.c

89 lines
1.8 KiB
C
Raw Normal View History

2004-07-16 02:26:21 -04:00
#include "factor.h"
WORD* word(FIXNUM primitive, CELL parameter, CELL plist)
{
WORD* word = (WORD*)allot_object(WORD_TYPE,sizeof(WORD));
word->xt = primitive_to_xt(primitive);
word->primitive = primitive;
word->parameter = parameter;
word->plist = plist;
return word;
}
/* When a word is executed we jump to the value of the xt field. However this
value is an unportable function pointer, so in the image we store a primitive
number that indexes a list of xts. */
void update_xt(WORD* word)
{
word->xt = primitive_to_xt(word->primitive);
}
void primitive_wordp(void)
{
check_non_empty(env.dt);
env.dt = tag_boolean(TAG(env.dt) == WORD_TYPE);
}
/* <word> ( primitive parameter plist -- word ) */
void primitive_word(void)
{
CELL plist = env.dt;
FIXNUM primitive;
CELL parameter = dpop();
check_non_empty(plist);
check_non_empty(parameter);
primitive = untag_fixnum(dpop());
env.dt = tag_word(word(primitive,parameter,plist));
}
void primitive_word_primitive(void)
{
env.dt = tag_fixnum(untag_word(env.dt)->primitive);
}
void primitive_set_word_primitive(void)
{
WORD* word = untag_word(env.dt);
word->primitive = untag_fixnum(dpop());
update_xt(word);
env.dt = dpop();
}
void primitive_word_parameter(void)
{
env.dt = untag_word(env.dt)->parameter;
}
void primitive_set_word_parameter(void)
{
check_non_empty(dpeek());
untag_word(env.dt)->parameter = dpop();
env.dt = dpop();
}
void primitive_word_plist(void)
{
env.dt = untag_word(env.dt)->plist;
}
void primitive_set_word_plist(void)
{
check_non_empty(dpeek());
untag_word(env.dt)->plist = dpop();
env.dt = dpop();
}
void fixup_word(WORD* word)
{
word->xt = primitive_to_xt(word->primitive);
fixup(&word->parameter);
fixup(&word->plist);
}
void collect_word(WORD* word)
{
copy_object(&word->parameter);
copy_object(&word->plist);
}