From 54301ce98c54f4c181918edea73a9e4a60ad276f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 21 Feb 2016 18:59:18 +0900 Subject: [PATCH] add pic_atpanic --- extlib/benz/error.c | 13 +++++++------ extlib/benz/include/picrin.h | 3 +++ extlib/benz/include/picrin/private/state.h | 1 + extlib/benz/state.c | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 744b7dab..24acabfb 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -8,15 +8,16 @@ #include "picrin/private/state.h" void -pic_panic(pic_state PIC_UNUSED(*pic), const char *msg) +pic_panic(pic_state *pic, const char *msg) { - extern PIC_NORETURN void abort(); + if (pic->panicf) { + pic->panicf(pic, msg); + } -#if DEBUG - fprintf(stderr, "abort: %s\n", msg); -#else - (void)msg; +#if PIC_ENABLE_STDIO + fprintf(stderr, "picrin panic!: %s\n", msg); #endif + PIC_ABORT(pic); } diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 330421b0..7147991f 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -96,6 +96,9 @@ const char *pic_current_library(pic_state *); void pic_import(pic_state *, const char *lib); void pic_export(pic_state *, pic_value sym); +typedef void (*pic_panicf)(pic_state *, const char *msg); + +pic_panicf pic_atpanic(pic_state *, pic_panicf f); PIC_NORETURN void pic_panic(pic_state *, const char *msg); PIC_NORETURN void pic_errorf(pic_state *, const char *fmt, ...); PIC_NORETURN void pic_raise(pic_state *, pic_value v); diff --git a/extlib/benz/include/picrin/private/state.h b/extlib/benz/include/picrin/private/state.h index 48341157..a2b859a0 100644 --- a/extlib/benz/include/picrin/private/state.h +++ b/extlib/benz/include/picrin/private/state.h @@ -76,6 +76,7 @@ struct pic_state { size_t arena_size, arena_idx; pic_value err; + pic_panicf panicf; char *native_stack_start; }; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 4d002d4e..aac2910e 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -276,6 +276,7 @@ pic_open(pic_allocf allocf, void *userdata) pic->ireps.prev = &pic->ireps; /* raised error object */ + pic->panicf = NULL; pic->err = pic_invalid_value(pic); /* file pool */