/*
* vm.h
*/
#ifndef __VM_H_
#define __VM_H_
struct ast;
struct value;
struct activation;
struct iprogram;
typedef unsigned char * vm_label_t;
#define INSTR_HALT 128
#define INSTR_PUSH_VALUE 129
#define INSTR_PUSH_LOCAL 130
#define INSTR_POP_LOCAL 131
#define INSTR_JZ 132
#define INSTR_JMP 133
#define INSTR_CALL 134
#define INSTR_RET 135
#define INSTR_GOTO 136
#define INSTR_SET_ACTIVATION 137
#define INSTR_COW_LOCAL 138
#define INSTR_EXTERNAL 139
#define INSTR_NOP 140
#define INSTR_PUSH_ZERO 141
#define INSTR_PUSH_ONE 142
#define INSTR_PUSH_TWO 143
#define INSTR_INIT_LOCAL 144
struct vm {
vm_label_t program; /* vm bytecode array */
size_t prog_size; /* size of bytecode array */
vm_label_t pc;
struct value *vstack; /* vm's working stack */
size_t vstack_size; /* size of array for stack */
struct value *vstack_ptr; /* ptr to top of stack */
vm_label_t *cstack; /* vm's call stack */
size_t cstack_size; /* size of call stack array */
vm_label_t *cstack_ptr; /* ptr to top of call stack */
unsigned char *astack;
size_t astack_size; /* size of activation stack */
unsigned char *astack_ptr; /* top of activation stack */
unsigned char *astack_hi; /* hiwater mark on activation stack */
struct activation *current_ar; /* current activation record */
};
/*
* Return codes for vm_run() function.
*/
#define VM_TERMINATED 0 /* INSTR_HALT was executed */
#define VM_RETURNED 1 /* INSTR_RET, but ar->caller was NULL */
#define VM_TIME_EXPIRED 2 /* executed for entire time slice */
#define VM_WAITING 3 /* entered a wait state (TBI) */
struct vm *vm_new(vm_label_t, size_t);
void vm_free(struct vm *);
void ast_gen(vm_label_t *, struct ast *);
void iprogram_gen(vm_label_t *, struct iprogram *);
void vm_set_pc(struct vm *, vm_label_t);
int vm_run(struct vm *, int);
#endif