#ifndef INTERP_H_9c7eea5c5cd0f7a32b79a8ca0ab2969f #define INTERP_H_9c7eea5c5cd0f7a32b79a8ca0ab2969f #include "gc.h" typedef struct interp_state { gc_root_t lambda; gc_root_t frame; gc_root_t argv; gc_root_t kw_args; gc_root_t kw_vals; gc_root_t ctx; gc_root_t k; gc_root_t in1; gc_root_t in2; gc_root_t in3; fixnum_t nframe; } interp_state_t; void interpreter_init(void); value_t run_interpreter(value_t lambda, value_t argv); static inline void interp_call ( interp_state_t *state, value_t lambda, value_t argv, value_t kw_args, value_t kw_vals, value_t k ) { state->lambda.value = lambda; state->argv.value = argv; state->kw_args.value = kw_args; state->kw_vals.value = kw_vals; /* ctx is unchanged by normal calls */ state->k.value = k; } static inline void interp_tail_call ( interp_state_t *state, value_t lambda, value_t argv, value_t kw_args, value_t kw_vals ) { state->lambda.value = lambda; state->argv.value = argv; state->kw_args.value = kw_args; state->kw_vals.value = kw_vals; /* ctx and k are unchanged by tail-calls */ } static inline void interp_return_values(interp_state_t *state, value_t values) { value_t old_k = state->k.value; state->ctx.value = FALSE_VALUE; state->k.value = FALSE_VALUE; interp_tail_call(state, old_k, values, NIL, NIL); } #endif /* vim:set sw=2 expandtab: */