add pic_atpanic

This commit is contained in:
Yuichi Nishiwaki 2016-02-21 18:59:18 +09:00
parent 7a440186c6
commit 54301ce98c
4 changed files with 12 additions and 6 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -76,6 +76,7 @@ struct pic_state {
size_t arena_size, arena_idx;
pic_value err;
pic_panicf panicf;
char *native_stack_start;
};

View File

@ -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 */