[bugfix] fix GC fault. call pic_get_backtrace function *before* you

allocate new area for error object.
This commit is contained in:
Yuichi Nishiwaki 2014-04-10 22:31:05 +09:00
parent a7565e7584
commit 183935a31e
1 changed files with 20 additions and 24 deletions

View File

@ -70,6 +70,23 @@ pic_pop_try(pic_state *pic)
pic->try_jmps = prev;
}
static struct pic_error *
error_new(pic_state *pic, short type, pic_str *msg, pic_value irrs)
{
struct pic_error *e;
pic_str *stack;
stack = pic_get_backtrace(pic);
e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
e->type = type;
e->msg = msg;
e->irrs = irrs;
e->stack = stack;
return e;
}
noreturn void
pic_throw(pic_state *pic, struct pic_error *e)
{
@ -94,19 +111,12 @@ pic_errorf(pic_state *pic, const char *fmt, ...)
{
va_list ap;
pic_value err_line;
struct pic_error *e;
va_start(ap, fmt);
err_line = pic_vformat(pic, fmt, ap);
va_end(ap);
e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
e->type = PIC_ERROR_OTHER;
e->msg = pic_str_ptr(pic_car(pic, err_line));
e->irrs = pic_cdr(pic, err_line);
e->stack = pic_get_backtrace(pic);
pic_throw(pic, e);
pic_throw(pic, error_new(pic, PIC_ERROR_OTHER, pic_str_ptr(pic_car(pic, err_line)), pic_cdr(pic, err_line)));
}
static pic_value
@ -134,17 +144,10 @@ noreturn static pic_value
pic_error_raise(pic_state *pic)
{
pic_value v;
struct pic_error *e;
pic_get_args(pic, "o", &v);
e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
e->type = PIC_ERROR_RAISED;
e->msg = pic_str_new_cstr(pic, "object is raised");
e->irrs = pic_list1(pic, v);
e->stack = pic_get_backtrace(pic);
pic_throw(pic, e);
pic_throw(pic, error_new(pic, PIC_ERROR_RAISED, pic_str_new_cstr(pic, "object is raised"), pic_list1(pic, v)));
}
noreturn static pic_value
@ -153,17 +156,10 @@ pic_error_error(pic_state *pic)
pic_str *str;
size_t argc;
pic_value *argv;
struct pic_error *e;
pic_get_args(pic, "s*", &str, &argc, &argv);
e = (struct pic_error *)pic_obj_alloc(pic, sizeof(struct pic_error), PIC_TT_ERROR);
e->type = PIC_ERROR_OTHER;
e->msg = str;
e->irrs = pic_list_by_array(pic, argc, argv);
e->stack = pic_get_backtrace(pic);
pic_throw(pic, e);
pic_throw(pic, error_new(pic, PIC_ERROR_OTHER, str, pic_list_by_array(pic, argc, argv)));
}
static pic_value