From a17e79a1606d84042cf2ce9950b488459a518049 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 17 Sep 2014 21:58:51 +0900 Subject: [PATCH] add pic_raise_continuable --- error.c | 98 +++++++++++++++++++++++------------------- include/picrin/error.h | 1 + 2 files changed, 54 insertions(+), 45 deletions(-) diff --git a/error.c b/error.c index bc618630..feaefa92 100644 --- a/error.c +++ b/error.c @@ -33,6 +33,39 @@ pic_warnf(pic_state *pic, const char *fmt, ...) fprintf(stderr, "warn: %s\n", pic_str_cstr(pic_str_ptr(pic_car(pic, err_line)))); } +void +pic_errorf(pic_state *pic, const char *fmt, ...) +{ + va_list ap; + pic_value err_line, irrs; + const char *msg; + + va_start(ap, fmt); + err_line = pic_xvformat(pic, fmt, ap); + va_end(ap); + + msg = pic_str_cstr(pic_str_ptr(pic_car(pic, err_line))); + irrs = pic_cdr(pic, err_line); + + pic_error(pic, msg, irrs); +} + +const char * +pic_errmsg(pic_state *pic) +{ + pic_str *str; + + assert(! pic_undef_p(pic->err)); + + if (! pic_error_p(pic->err)) { + str = pic_format(pic, "~s", pic->err); + } else { + str = pic_error_ptr(pic->err)->msg; + } + + return pic_str_cstr(str); +} + void pic_push_try(pic_state *pic, struct pic_proc *handler) { @@ -88,6 +121,25 @@ pic_make_error(pic_state *pic, pic_sym type, const char *msg, pic_value irrs) return e; } +pic_value +pic_raise_continuable(pic_state *pic, pic_value err) +{ + pic_value v; + + if (pic->try_jmp_idx == 0) { + pic_errorf(pic, "no exception handler registered"); + } + if (pic->try_jmps[pic->try_jmp_idx - 1].handler == NULL) { + pic_errorf(pic, "uncontinuable exception handler is on top"); + } + else { + pic->try_jmp_idx--; + v = pic_apply1(pic, pic->try_jmps[pic->try_jmp_idx].handler, err); + ++pic->try_jmp_idx; + } + return v; +} + noreturn void pic_raise(pic_state *pic, pic_value err) { @@ -120,39 +172,6 @@ pic_error(pic_state *pic, const char *msg, pic_value irrs) pic_throw(pic, pic_intern_cstr(pic, ""), msg, irrs); } -const char * -pic_errmsg(pic_state *pic) -{ - pic_str *str; - - assert(! pic_undef_p(pic->err)); - - if (! pic_error_p(pic->err)) { - str = pic_format(pic, "~s", pic->err); - } else { - str = pic_error_ptr(pic->err)->msg; - } - - return pic_str_cstr(str); -} - -void -pic_errorf(pic_state *pic, const char *fmt, ...) -{ - va_list ap; - pic_value err_line, irrs; - const char *msg; - - va_start(ap, fmt); - err_line = pic_xvformat(pic, fmt, ap); - va_end(ap); - - msg = pic_str_cstr(pic_str_ptr(pic_car(pic, err_line))); - irrs = pic_cdr(pic, err_line); - - pic_error(pic, msg, irrs); -} - static pic_value pic_error_with_exception_handler(pic_state *pic) { @@ -193,18 +212,7 @@ pic_error_raise_continuable(pic_state *pic) pic_get_args(pic, "o", &v); - if (pic->try_jmp_idx == 0) { - pic_errorf(pic, "no exception handler registered"); - } - if (pic->try_jmps[pic->try_jmp_idx - 1].handler == NULL) { - pic_errorf(pic, "uncontinuable exception handler is on top"); - } - else { - pic->try_jmp_idx--; - v = pic_apply1(pic, pic->try_jmps[pic->try_jmp_idx].handler, v); - ++pic->try_jmp_idx; - } - return v; + return pic_raise_continuable(pic, v); } noreturn static pic_value diff --git a/include/picrin/error.h b/include/picrin/error.h index 1b96f3ee..9541ab55 100644 --- a/include/picrin/error.h +++ b/include/picrin/error.h @@ -34,6 +34,7 @@ struct pic_jmpbuf { void pic_push_try(pic_state *, struct pic_proc *); void pic_pop_try(pic_state *); +pic_value pic_raise_continuable(pic_state *, pic_value); noreturn void pic_raise(pic_state *, pic_value); noreturn void pic_throw(pic_state *, pic_sym, const char *, pic_list); noreturn void pic_error(pic_state *, const char *, pic_list);