Files
thesis-lisp/vm/include/vmstate.h
T
2021-04-06 17:38:09 +03:00

56 lines
1.1 KiB
C

#pragma once
#include <stddef.h>
#include <stdint.h>
#include "vector.h"
struct vm_value;
#define REF_NATIVE (1 << 0)
struct vm_ref_entry {
size_t unit_index;
int flags;
size_t ref_index;
uintptr_t address;
};
struct vm_func_entry {
size_t argc;
uint32_t *bytecode;
};
struct vm_state {
// Runtime stack
uint64_t *stack;
size_t sp, stack_size;
struct vector ref_table;
struct vector functions;
size_t fp, ip;
uint64_t *global_pool;
size_t global_pool_size;
};
void vm_state_init(struct vm_state *vm,
size_t stack_size,
size_t global_pool_size);
struct vm_func_entry *vm_add_function(struct vm_state *vm);
struct vm_ref_entry *vm_add_ref(struct vm_state *vm);
// Bytecode interpretation
int vm_eval_step(struct vm_state *vm);
// Stack frames
uint64_t vm_get_arg(struct vm_state *vm, size_t index);
// Stack operation
void push(struct vm_state *vm, uint64_t w);
uint64_t pop(struct vm_state *vm);
void push_ref(struct vm_state *vm, struct vm_value *ref);
void push_integer(struct vm_state *vm, int64_t w);
uint64_t pop_integer(struct vm_state *vm);