From 26c5b458a067388da968465ba9e102a084bf7a2c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 26 Oct 2021 16:26:25 +0200 Subject: Add stack trace for function call debugging --- src/bytecode/vm.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/bytecode') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 33582b1..3f59aff 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -60,6 +60,22 @@ vm_reset(VM *vm) { } // Helper macros for a more clear VM switch. +#ifdef DEBUG +#define STACK_TRACE() \ + fprintf(stderr, "stack trace:\n"); \ + for (ssize_t i = array_size(vm->frames) - 1; i >= 0 ; i--) { \ + CallFrame frame = vm->frames[i]; \ + Chunk *chunk = frame.chunk; \ + size_t instruction = vm->pc - chunk->code - 1; \ + fprintf(stderr, "\t%-4ld -> ", i); \ + fprintf(stderr, "%.*s",(int)array_size(chunk->name), chunk->name); \ + fprintf(stderr, ":%ld:%ld\n", chunk->lines[instruction].line, chunk->lines[instruction].col); \ + vm->pc = frame.rp; \ + } +#else +#define STACK_TRACE() +#endif + #define RUNTIME_ERROR(ERR) \ error_push((Error){ \ .type = ERR_TYPE_RUNTIME, \ @@ -67,6 +83,7 @@ vm_reset(VM *vm) { .line = frame->chunk->lines[vm->pc - frame->chunk->code - 1].line, \ .col = frame->chunk->lines[vm->pc - frame->chunk->code - 1].col, \ }); \ + STACK_TRACE() \ return #define FIXNUM_ARITHMETIC_OP(OP) \ -- cgit v1.2.1