executing = F;
}
-#define EXECUTE(w) ((XT)(untag_word_fast(w)->xt))()
+INLINE void execute(F_WORD* word)
+{
+ ((XT)(word->xt))(word);
+}
void run(void)
{
if(callframe == F)
{
callframe = cpop();
- cpop();
+ executing = cpop();
continue;
}
callframe = get(callframe + CELLS);
if(TAG(next) == WORD_TYPE)
- {
- executing = next;
- EXECUTE(executing);
- }
+ execute(untag_word_fast(next));
else
dpush(next);
}
}
/* XT of deferred words */
-void undefined()
+void undefined(F_WORD* word)
{
- general_error(ERROR_UNDEFINED_WORD,executing);
+ general_error(ERROR_UNDEFINED_WORD,tag_word(word));
}
/* XT of compound definitions */
-void docol(void)
+void docol(F_WORD* word)
{
- call(untag_word_fast(executing)->parameter);
+ call(word->parameter);
+ executing = tag_word(word);
}
/* pushes word parameter */
-void dosym(void)
+void dosym(F_WORD* word)
{
- dpush(untag_word_fast(executing)->parameter);
+ dpush(word->parameter);
}
void primitive_execute(void)
{
- type_check(WORD_TYPE,dpeek());
- executing = dpop();
- EXECUTE(executing);
+ execute(untag_word(dpop()));
}
void primitive_call(void)
INLINE void call(CELL quot)
{
/* tail call optimization */
- if(callframe != F)
+ if(callframe == F)
+ /* put(cs - CELLS,executing) */;
+ else
{
cpush(executing);
cpush(callframe);
}
+
callframe = quot;
}
void clear_environment(void);
void run(void);
-void undefined(void);
-void docol(void);
-void dosym(void);
+void undefined(F_WORD* word);
+void docol(F_WORD* word);
+void dosym(F_WORD* word);
void primitive_execute(void);
void primitive_call(void);
void primitive_ifte(void);
-typedef void (*XT)(void);
-
typedef struct {
/* TAGGED header */
CELL header;
CELL allot_count;
} F_WORD;
+typedef void (*XT)(F_WORD* word);
+
INLINE F_WORD* untag_word_fast(CELL tagged)
{
return (F_WORD*)UNTAG(tagged);