From 6420e283a163caf1c13e26a86fae07ef54876d8d Mon Sep 17 00:00:00 2001 From: bog Date: Sat, 17 Feb 2024 22:06:20 +0100 Subject: [PATCH] :bug: :bug: void function and compiler segfault. --- lang/src/compiler.c | 1 + vm/src/vm.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lang/src/compiler.c b/lang/src/compiler.c index cd3f08f..3a9dde9 100644 --- a/lang/src/compiler.c +++ b/lang/src/compiler.c @@ -76,6 +76,7 @@ int compiler_compile(struct compiler* self, struct node* ident = idents.data[j]; struct type* ty = malloc(sizeof(struct type)); + type_init(ty, TYPE_VOID); compiler_get_type(self, param, ty); sym_table_declare_const(&compiler.sym_table, diff --git a/vm/src/vm.c b/vm/src/vm.c index 73990b5..88a670a 100644 --- a/vm/src/vm.c +++ b/vm/src/vm.c @@ -208,13 +208,19 @@ int vm_exec(struct vm* self, struct program* program) vec_free(&args); struct value* ret_val = - fun->program.constant_pool.data[my_frame->stack[my_frame->sp - 1]]; + (my_frame->sp > 0) + ? fun->program.constant_pool.data + [my_frame->stack[my_frame->sp - 1]] + : NULL; - struct value* new_ret = value_new_clone(ret_val); + struct value* new_ret = ret_val ? value_new_clone(ret_val) : NULL; vm_remove_frame(self); - vm_push(self, program_push_constant(program, new_ret)); + if (new_ret) + { + vm_push(self, program_push_constant(program, new_ret)); + } self->pc = ret_addr + 1;