diff options
| author | LLLL Colonq <llll@colonq> | 2026-07-21 20:56:52 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-07-21 20:56:52 -0400 |
| commit | a5e153d8558a43fbdc78f5b9fdaff426feea4654 (patch) | |
| tree | c35d2fb6770cc9975467da7731533a090ac8b447 /pit/src/native.c | |
| parent | 88f0059c7e8e7680e39611e865b0356bc510adc8 (diff) | |
pit: Backtraces
Diffstat (limited to 'pit/src/native.c')
| -rw-r--r-- | pit/src/native.c | 21 |
1 files changed, 12 insertions, 9 deletions
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; } |
