2007-09-20 18:09:08 -04:00
|
|
|
extern void *primitives[];
|
|
|
|
|
|
|
|
/* Primitives are called with two parameters, the word itself and the current
|
|
|
|
callstack pointer. The DEFINE_PRIMITIVE() macro takes care of boilerplate to
|
|
|
|
save the current callstack pointer so that GC and other facilities can proceed
|
|
|
|
to inspect Factor stack frames below the primitive's C stack frame.
|
|
|
|
|
|
|
|
Usage:
|
|
|
|
|
|
|
|
DEFINE_PRIMITIVE(name)
|
|
|
|
{
|
|
|
|
... CODE ...
|
|
|
|
}
|
|
|
|
|
|
|
|
Becomes
|
|
|
|
|
2007-09-27 16:10:37 -04:00
|
|
|
F_FASTCALL void primitive_name(CELL word, F_STACK_FRAME *callstack_top)
|
2007-09-20 18:09:08 -04:00
|
|
|
{
|
2007-10-06 22:52:55 -04:00
|
|
|
save_callstack_top(callstack_top);
|
2007-09-20 18:09:08 -04:00
|
|
|
... CODE ...
|
|
|
|
}
|
|
|
|
|
2007-09-27 16:10:37 -04:00
|
|
|
On x86, F_FASTCALL expands into a GCC declaration which forces the two
|
|
|
|
parameters to be passed in registers. This simplifies the quotation compiler
|
2007-10-06 22:52:55 -04:00
|
|
|
and support code in cpu-x86.S.
|
|
|
|
|
|
|
|
We do the assignment of stack_chain->callstack_top in a ``noinline'' function
|
|
|
|
to inhibit assignment re-ordering. */
|
2007-09-20 18:09:08 -04:00
|
|
|
#define DEFINE_PRIMITIVE(name) \
|
|
|
|
INLINE void primitive_##name##_impl(void); \
|
|
|
|
\
|
2007-09-27 16:10:37 -04:00
|
|
|
F_FASTCALL void primitive_##name(CELL word, F_STACK_FRAME *callstack_top) \
|
2007-09-20 18:09:08 -04:00
|
|
|
{ \
|
2007-10-06 22:52:55 -04:00
|
|
|
save_callstack_top(callstack_top); \
|
2007-09-20 18:09:08 -04:00
|
|
|
primitive_##name##_impl(); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
INLINE void primitive_##name##_impl(void) \
|
|
|
|
|
|
|
|
/* Prototype for header files */
|
|
|
|
#define DECLARE_PRIMITIVE(name) \
|
2007-09-27 16:10:37 -04:00
|
|
|
F_FASTCALL void primitive_##name(CELL word, F_STACK_FRAME *callstack_top)
|