73 lines
1.4 KiB
C
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: */
|