Exception handling

This commit is contained in:
2026-09-03 09:34:54 -07:00
parent 07060a17fe
commit dc313fafa0
12 changed files with 209 additions and 96 deletions
+17 -2
View File
@@ -17,7 +17,8 @@ int main(int argc, const char **argv) {
ReadStream s;
read_stream_init(&s, src, src_len);
LispVal *r;
CONDITION_CASE(
bool had_toplevel_error = false;
HANDLER_BIND1(
LIST(Qt),
{
while ((r = read(&s))) {
@@ -29,9 +30,23 @@ int main(int argc, const char **argv) {
Fprint_condition(EXCEPTION_NAME(), EXCEPTION_DATA(),
Qerror_write_byte); //
fprintf(stderr, "\nBacktrace (toplevel comes last):\n");
LispVal *backtrace = Fbacktrace();
DOLIST(frame, backtrace) {
LispVal *name = FIRST(frame);
bool evaled = !NILP(THIRD(frame));
LispVal *args = FOURTH(frame);
fprintf(stderr, " %c ", evaled ? '-' : '*');
Fprinc(name, Qerror_write_byte);
Fprinc(args, Qerror_write_byte);
fputc('\n', stderr);
}
CLEAR_EXCEPTION();
had_toplevel_error = true;
goto toplevel_error;
});
toplevel_error:
unwind_to(toplevel);
lisp_shutdown();
free(src);
return 0;
return had_toplevel_error ? EXIT_FAILURE : EXIT_SUCCESS;
}