From 2bdaebe8c7ad816eac546ec634f3cc2fb8950e79 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 6 Jul 2020 16:20:40 +0900 Subject: [PATCH] wrap uncaught non-exceptions (issue #664) --- include/chibi/sexp.h | 5 +++-- sexp.c | 5 +++-- vm.c | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h index 975b4216..7803c08c 100644 --- a/include/chibi/sexp.h +++ b/include/chibi/sexp.h @@ -597,9 +597,10 @@ struct sexp_struct { #define SEXP_RAWDOT SEXP_MAKE_IMMEDIATE(7) /* internal use */ #define SEXP_STRING_OPORT SEXP_MAKE_IMMEDIATE(8) /* internal use */ #define SEXP_TRAMPOLINE SEXP_MAKE_IMMEDIATE(9) /* internal use */ -#define SEXP_ABI_ERROR SEXP_MAKE_IMMEDIATE(10) /* internal use */ +#define SEXP_UNCAUGHT SEXP_MAKE_IMMEDIATE(10) /* internal use */ +#define SEXP_ABI_ERROR SEXP_MAKE_IMMEDIATE(11) /* internal use */ #if SEXP_USE_OBJECT_BRACE_LITERALS -#define SEXP_CLOSE_BRACE SEXP_MAKE_IMMEDIATE(11) /* internal use */ +#define SEXP_CLOSE_BRACE SEXP_MAKE_IMMEDIATE(12) /* internal use */ #endif #if SEXP_USE_LIMITED_MALLOC diff --git a/sexp.c b/sexp.c index 2dae62f1..e39877e8 100644 --- a/sexp.c +++ b/sexp.c @@ -811,8 +811,9 @@ sexp sexp_print_exception_op (sexp ctx, sexp self, sexp_sint_t n, sexp exn, sexp sexp_gc_var2(ls, tmp); /* unwrap continuable exceptions */ if (sexp_exceptionp(exn) - && sexp_exception_kind(exn) == sexp_global(ctx, SEXP_G_CONTINUABLE_SYMBOL) - && sexp_exceptionp(sexp_exception_irritants(exn))) { + && ((sexp_exception_kind(exn) == sexp_global(ctx, SEXP_G_CONTINUABLE_SYMBOL) + && sexp_exceptionp(sexp_exception_irritants(exn))) + || sexp_exception_kind(exn) == SEXP_UNCAUGHT)) { return sexp_print_exception_op(ctx, self, n, sexp_exception_irritants(exn), out); } sexp_gc_preserve2(ctx, ls, tmp); diff --git a/vm.c b/vm.c index 1949a0b3..7c807464 100644 --- a/vm.c +++ b/vm.c @@ -1121,6 +1121,9 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) { #if SEXP_USE_GREEN_THREADS sexp_context_errorp(ctx) = 1; #endif + if (!sexp_exceptionp(_ARG1)) { + _ARG1 = sexp_make_exception(ctx, SEXP_UNCAUGHT, SEXP_FALSE, _ARG1, self, SEXP_FALSE); + } goto end_loop; } stack[top] = SEXP_ONE;