56 lines
1.1 KiB
C
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);
|