From a5e153d8558a43fbdc78f5b9fdaff426feea4654 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Tue, 21 Jul 2026 20:56:52 -0400 Subject: pit: Backtraces --- pit/src/native.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'pit/src/native.c') diff --git a/pit/src/native.c b/pit/src/native.c index 89d9c9b..2ffba0a 100644 --- a/pit/src/native.c +++ b/pit/src/native.c @@ -23,9 +23,9 @@ i64 pit_lex_file(pit_lexer *ret, char *path) { return 0; } -static i64 pit_dump_to_file_callback(u8 *buf, i64 len, void *data) { - if (fwrite(buf, sizeof(u8), (size_t) len, (FILE *) data) != (size_t) len) return -1; - return 0; +static pit_dump_condition pit_dump_to_file_callback(u8 *buf, i64 len, void *data) { + if (fwrite(buf, sizeof(u8), (size_t) len, (FILE *) data) != (size_t) len) return PIT_DUMP_CONDITION_FULL; + return PIT_DUMP_CONDITION_NORMAL; } void pit_dump_to_file(pit_runtime *rt, void *vf, pit_value v, bool readable) { pit_dump_with_callback(rt, v, readable, pit_dump_to_file_callback, vf); @@ -33,16 +33,19 @@ void pit_dump_to_file(pit_runtime *rt, void *vf, pit_value v, bool readable) { bool pit_runtime_print_error(pit_runtime *rt) { if (!pit_value_eq(rt->error, PIT_NIL)) { - // for (i64 i = 0; i < rt->backtrace->next; ++i) { - // pit_annotated_ref *a = pit_vec_get(pit_annotated_ref)(rt->backtrace, i); - // if (a == NULL) continue; - // fprintf(stderr, "on line %ld, column %ld\n", a->annotation.line, a->annotation.column); - // } - fprintf(stderr, "error at line %ld, column %ld:", rt->error_line, rt->error_column); + for (i64 i = 0; i < rt->backtrace->next; ++i) { + pit_backtrace_entry *a = pit_vec_get(pit_backtrace_entry)(rt->backtrace, i); + if (a == NULL) continue; + fprintf(stderr, "on line %ld, column %ld (call to ", a->ann.line, a->ann.column); + pit_dump_to_file(rt, stderr, a->val, false); + fprintf(stderr, "):\n"); + } + fprintf(stderr, "error at line %ld, column %ld: ", rt->error_line, rt->error_column); pit_dump_to_file(rt, stderr, rt->error, false); fprintf(stderr, "\n"); return true; } + pit_vec_reset(pit_backtrace_entry)(rt->backtrace); return false; } -- cgit v1.3.1