rosella/interp.h

73 lines
1.4 KiB
C

#ifndef INTERP_H_9c7eea5c5cd0f7a32b79a8ca0ab2969f
#define INTERP_H_9c7eea5c5cd0f7a32b79a8ca0ab2969f
#include "gc.h"
typedef struct interp_state
{
gc_root_t lambda;
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 globals;
gc_root_t instances;
gc_root_t byte_code;
gc_root_t tail_call;
gc_root_t transients;
int ntransients;
} 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 = UNDEFINED;
state->k.value = UNDEFINED;
interp_tail_call(state, old_k, values, NIL, NIL);
}
#endif
/* vim:set sw=2 expandtab: */