From 9ce9a7f510e6ba407c2e14d3eae4d603b38edde7 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 22 Oct 2021 13:58:02 +0200 Subject: Prepare compilation pipeline --- src/bytecode/vm.h | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 6c5dfa7..f9e64d1 100644 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -18,27 +18,33 @@ typedef struct VM { Object *stack; } VM; -VM vm_init(void); -void vm_free(VM vm); -void vm_interpret(VM vm); +void vm_init(VM *vm); +void vm_free(VM *vm); +void vm_reset(VM *vm); +void vm_interpret(VM vm, Chunk *chunk); -VM -vm_init(void) { - VM vm = { - .chunk = chunk_init(), - }; - array_init(vm.stack, VM_STACK_CAP); - return vm; +void +vm_init(VM *vm) { + *vm = (VM){0}; + array_init(vm->stack, VM_STACK_CAP); +} + +void +vm_free(VM *vm) { + array_free(vm->stack); } void -vm_free(VM vm) { - chunk_free(vm.chunk); - array_free(vm.stack); +vm_reset(VM *vm) { + vm_free(vm); + vm_init(vm); } void -vm_interpret(VM vm) { +vm_interpret(VM vm, Chunk *chunk) { + vm.chunk = chunk; + vm.pc = vm.chunk->code; + if (vm.chunk->code == NULL || array_size(vm.chunk->code) == 0) { error_push((Error){ .type = ERR_TYPE_RUNTIME, @@ -47,7 +53,6 @@ vm_interpret(VM vm) { return; } - vm.pc = vm.chunk->code; u8 *last = vm.chunk->code + array_size(vm.chunk->code); while (vm.pc < last) { #ifdef DEBUG_TRACE_EXECUTION -- cgit v1.2.1