From ab7d7c155fb1bec5eed8f97462fbb656ea27dbb5 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 22 Oct 2021 11:24:09 +0200 Subject: Add VM structure and fix AdressSanitizer bugs --- src/bytecode/chunk.h | 35 +++++++++++++++++++++++++++-------- src/bytecode/debug.h | 26 +++++++++++++------------- src/bytecode/main.c | 39 ++++++++++++++++++--------------------- src/bytecode/vm.h | 27 +++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 42 deletions(-) create mode 100644 src/bytecode/vm.h diff --git a/src/bytecode/chunk.h b/src/bytecode/chunk.h index 6157057..e3c7383 100644 --- a/src/bytecode/chunk.h +++ b/src/bytecode/chunk.h @@ -15,20 +15,39 @@ typedef struct Chunk { LineInfo *lines; } Chunk; -void add_code(Chunk chunk, u8 byte, size_t line, size_t col); -size_t add_constant(Chunk chunk, Object obj); +Chunk * chunk_init(void); +void add_code(Chunk *chunk, u8 byte, size_t line, size_t col); +size_t add_constant(Chunk *chunk, Object obj); +void chunk_free(Chunk *chunk); + +Chunk * +chunk_init(void) { + Chunk *chunk = malloc(sizeof(Chunk)); + array_init(chunk->code, 0); + array_init(chunk->constants, 0); + array_init(chunk->lines, 0); + return chunk; +} + +void +chunk_free(Chunk *chunk) { + array_free(chunk->code); + array_free(chunk->constants); + array_free(chunk->lines); + free(chunk); +} void -add_code(Chunk chunk, u8 byte, size_t line, size_t col) { - array_push(chunk.code, byte); +add_code(Chunk *chunk, u8 byte, size_t line, size_t col) { + array_push(chunk->code, byte); LineInfo info = (LineInfo){line, col}; - array_push(chunk.lines, info); + array_push(chunk->lines, info); } size_t -add_constant(Chunk chunk, Object obj) { - size_t pos = array_size(chunk.constants); - array_push(chunk.constants, obj); +add_constant(Chunk *chunk, Object obj) { + size_t pos = array_size(chunk->constants); + array_push(chunk->constants, obj); return pos; } diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index ceedfbf..c891b77 100644 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h @@ -3,47 +3,47 @@ #include "chunk.h" -void disassemble_chunk(Chunk chunk, const char *name); -size_t disassemble_instruction(Chunk chunk, size_t offset); +void disassemble_chunk(Chunk *chunk, const char *name); +size_t disassemble_instruction(Chunk *chunk, size_t offset); void -disassemble_chunk(Chunk chunk, const char *name) { +disassemble_chunk(Chunk *chunk, const char *name) { printf("== %s ==\n", name); printf("code:\n"); size_t offset = 0; - while (offset < array_size(chunk.code)) { + while (offset < array_size(chunk->code)) { offset = disassemble_instruction(chunk, offset); } printf("\nconstants:\n"); offset = 0; - while (offset < array_size(chunk.constants)) { + while (offset < array_size(chunk->constants)) { printf("\t%04ld -> ", offset); - display(chunk.constants[offset]); + display(chunk->constants[offset]); printf("\n"); offset++; } } size_t -disassemble_instruction(Chunk chunk, size_t offset) { +disassemble_instruction(Chunk *chunk, size_t offset) { printf("\t%04ld ", offset); if (offset > 0 - && chunk.lines[offset].line == chunk.lines[offset - 1].line - && chunk.lines[offset].col == chunk.lines[offset - 1].col) { + && chunk->lines[offset].line == chunk->lines[offset - 1].line + && chunk->lines[offset].col == chunk->lines[offset - 1].col) { printf("%4s|%-4s ", " ", " "); } else { - printf("%4ld:%-4ld ", chunk.lines[offset].line, chunk.lines[offset].col); + printf("%4ld:%-4ld ", chunk->lines[offset].line, chunk->lines[offset].col); } - u8 instruction = chunk.code[offset]; + u8 instruction = chunk->code[offset]; switch (instruction) { case OP_RETURN: { printf("OP_RETURN\n"); return offset + 1; } break; case OP_CONSTANT: { - u8 constant = chunk.code[offset + 1]; + u8 constant = chunk->code[offset + 1]; printf("%-16s %4d (", "OP_CONSTANT", constant); - display(chunk.constants[constant]); + display(chunk->constants[constant]); printf(")\n"); return offset + 2; } break; diff --git a/src/bytecode/main.c b/src/bytecode/main.c index c994e08..ca1f441 100644 --- a/src/bytecode/main.c +++ b/src/bytecode/main.c @@ -4,9 +4,8 @@ #include #include -#include "types.h" -#include "chunk.h" -#include "darray.h" +#include "vm.h" + #include "ops.h" #include "debug.h" #include "errors.c" @@ -14,9 +13,16 @@ #include "read_line.c" #include "string_view.c" +static VM vm; + void init(void) { - // STUB + vm = vm_init(); +} + +void +halt(void) { + vm_free(vm); } void @@ -27,26 +33,14 @@ process_source(const StringView *source) { return; } - // Test chunks and debugging utilities. - // Initialize chunk. - Chunk chunk = {0}; - array_init(chunk.code, 0); - array_init(chunk.constants, 0); - array_init(chunk.lines, 0); - // Push some test instructions. - size_t const_idx = add_constant(chunk, 7); - add_code(chunk, OP_CONSTANT, 1, 1); - add_code(chunk, const_idx, 1, 1); - add_code(chunk, OP_RETURN, 1, 1); + size_t const_idx = add_constant(vm.chunk, 7); + add_code(vm.chunk, OP_CONSTANT, 1, 1); + add_code(vm.chunk, const_idx, 1, 1); + add_code(vm.chunk, OP_RETURN, 1, 1); // Disassemble the chunk. - disassemble_chunk(chunk, "test chunk"); - - // Free chunk. - array_free(chunk.code); - array_free(chunk.constants); - array_free(chunk.lines); + disassemble_chunk(vm.chunk, "test chunk"); array_free(tokens); } @@ -183,6 +177,7 @@ main(int argc, char *argv[]) { case 'i': { // Interactive mode. run_repl(); + halt(); return EXIT_SUCCESS; } break; default: { @@ -195,6 +190,7 @@ main(int argc, char *argv[]) { // Run from stdin. if (optind == argc) { run_stdin(); + halt(); return EXIT_SUCCESS; } @@ -205,5 +201,6 @@ main(int argc, char *argv[]) { optind++; } + halt(); return EXIT_SUCCESS; } diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h new file mode 100644 index 0000000..36547cb --- /dev/null +++ b/src/bytecode/vm.h @@ -0,0 +1,27 @@ +#ifndef BDL_VM_H +#define BDL_VM_H + +#include "types.h" +#include "chunk.h" + +typedef struct VM { + Chunk *chunk; +} VM; + +VM vm_init(void); +void vm_free(VM vm); + +VM +vm_init(void) { + VM vm = { + .chunk = chunk_init(), + }; + return vm; +} + +void +vm_free(VM vm) { + chunk_free(vm.chunk); +} + +#endif // BDL_VM_H -- cgit v1.2.1