From d9474f1d7c0c6674179fd0f27cd1c084c8227ed5 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 22 Oct 2021 12:05:41 +0200 Subject: Add interpretation function for VM --- src/bytecode/vm.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 36547cb..d53fcf9 100644 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -2,14 +2,19 @@ #define BDL_VM_H #include "types.h" +#include "errors.h" #include "chunk.h" +#include "ops.h" +#include "debug.h" typedef struct VM { Chunk *chunk; + u8 *pc; } VM; VM vm_init(void); void vm_free(VM vm); +void vm_interpret(VM vm); VM vm_init(void) { @@ -24,4 +29,51 @@ vm_free(VM vm) { chunk_free(vm.chunk); } +void +vm_interpret(VM vm) { + if (vm.chunk->code == NULL || array_size(vm.chunk->code) == 0) { + error_push((Error){ + .type = ERR_TYPE_RUNTIME, + .value = ERR_EMPTY_CHUNK, + }); + return; + } + + vm.pc = vm.chunk->code; + u8 *last = vm.chunk->code + array_size(vm.chunk->code); + while (vm.pc < last) { +#ifdef DEBUG_TRACE_EXECUTION + disassemble_instruction(vm.chunk, (vm.pc - vm.chunk->code)); +#endif + u8 instruction = *vm.pc++; + switch (instruction) { + case OP_CONSTANT: { + u8 constant = *vm.pc++; + Object obj = vm.chunk->constants[constant]; + display(obj); + printf("\n"); + } break; + case OP_RETURN: { + return; + } break; + default: { + error_push((Error){ + .type = ERR_TYPE_RUNTIME, + .value = ERR_NOT_IMPLEMENTED, + .line = vm.chunk->lines[0].line, + .col = vm.chunk->lines[0].col, + }); + return; + } break; + } + } + + error_push((Error){ + .type = ERR_TYPE_RUNTIME, + .value = ERR_PC_OOB, + .line = vm.chunk->lines[0].line, + .col = vm.chunk->lines[0].col, + }); +} + #endif // BDL_VM_H -- cgit v1.2.1