factor/native/word.c

83 lines
1.6 KiB
C
Raw Normal View History

2004-07-16 02:26:21 -04:00
#include "factor.h"
2004-08-05 15:18:31 -04:00
WORD* word(CELL primitive, CELL parameter, CELL plist)
2004-07-16 02:26:21 -04:00
{
2004-08-05 16:49:55 -04:00
WORD* word = allot_object(WORD_TYPE,sizeof(WORD));
2004-07-16 02:26:21 -04:00
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)
{
drepl(tag_boolean(typep(WORD_TYPE,dpeek())));
2004-07-16 02:26:21 -04:00
}
/* <word> ( primitive parameter plist -- word ) */
void primitive_word(void)
{
CELL plist = dpop();
2004-07-16 02:26:21 -04:00
FIXNUM primitive;
CELL parameter = dpop();
2004-07-29 17:18:41 -04:00
primitive = to_fixnum(dpop());
dpush(tag_word(word(primitive,parameter,plist)));
2004-07-16 02:26:21 -04:00
}
void primitive_word_primitive(void)
{
drepl(tag_fixnum(untag_word(dpeek())->primitive));
2004-07-16 02:26:21 -04:00
}
void primitive_set_word_primitive(void)
{
WORD* word = untag_word(dpop());
2004-07-29 17:18:41 -04:00
word->primitive = to_fixnum(dpop());
2004-07-16 02:26:21 -04:00
update_xt(word);
}
void primitive_word_parameter(void)
{
drepl(untag_word(dpeek())->parameter);
2004-07-16 02:26:21 -04:00
}
void primitive_set_word_parameter(void)
{
WORD* word = untag_word(dpop());
word->parameter = dpop();
2004-07-16 02:26:21 -04:00
}
void primitive_word_plist(void)
{
drepl(untag_word(dpeek())->plist);
2004-07-16 02:26:21 -04:00
}
void primitive_set_word_plist(void)
{
WORD* word = untag_word(dpop());
word->plist = dpop();
2004-07-16 02:26:21 -04:00
}
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);
}