handle runtime error
This commit is contained in:
parent
fe88ba7096
commit
cefa9a9885
|
@ -441,10 +441,11 @@ pic_codegen(pic_state *pic, pic_value obj, struct pic_env *env)
|
||||||
if (! pic->jmp) {
|
if (! pic->jmp) {
|
||||||
jmp_buf jmp;
|
jmp_buf jmp;
|
||||||
|
|
||||||
pic->jmp = &jmp;
|
if (setjmp(jmp) == 0) {
|
||||||
if (setjmp(*pic->jmp) != 0) {
|
pic->jmp = &jmp;
|
||||||
|
}
|
||||||
|
else {
|
||||||
/* error occured */
|
/* error occured */
|
||||||
|
|
||||||
pic->jmp = NULL;
|
pic->jmp = NULL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,9 @@ pic_car(pic_state *pic, pic_value obj)
|
||||||
{
|
{
|
||||||
struct pic_pair *pair;
|
struct pic_pair *pair;
|
||||||
|
|
||||||
|
if (! pic_pair_p(obj)) {
|
||||||
|
pic_error(pic, "pair required");
|
||||||
|
}
|
||||||
pair = (struct pic_pair *)obj.u.data;
|
pair = (struct pic_pair *)obj.u.data;
|
||||||
|
|
||||||
return pair->car;
|
return pair->car;
|
||||||
|
@ -28,6 +31,9 @@ pic_cdr(pic_state *pic, pic_value obj)
|
||||||
{
|
{
|
||||||
struct pic_pair *pair;
|
struct pic_pair *pair;
|
||||||
|
|
||||||
|
if (! pic_pair_p(obj)) {
|
||||||
|
pic_error(pic, "pair required");
|
||||||
|
}
|
||||||
pair = (struct pic_pair *)obj.u.data;
|
pair = (struct pic_pair *)obj.u.data;
|
||||||
|
|
||||||
return pair->cdr;
|
return pair->cdr;
|
||||||
|
|
30
src/vm.c
30
src/vm.c
|
@ -64,6 +64,7 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
{
|
{
|
||||||
struct pic_code *pc;
|
struct pic_code *pc;
|
||||||
int ai = pic_gc_arena_preserve(pic);
|
int ai = pic_gc_arena_preserve(pic);
|
||||||
|
jmp_buf jmp;
|
||||||
|
|
||||||
#if PIC_DIRECT_THREADED_VM
|
#if PIC_DIRECT_THREADED_VM
|
||||||
static void *oplabels[] = {
|
static void *oplabels[] = {
|
||||||
|
@ -76,6 +77,13 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
|
|
||||||
pc = proc->u.irep->code;
|
pc = proc->u.irep->code;
|
||||||
|
|
||||||
|
if (setjmp(jmp) == 0) {
|
||||||
|
pic->jmp = &jmp;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto L_RAISE;
|
||||||
|
}
|
||||||
|
|
||||||
/* adjust call frame */
|
/* adjust call frame */
|
||||||
pic->sp[0] = pic_obj_value(proc);
|
pic->sp[0] = pic_obj_value(proc);
|
||||||
pic->ci->argc = 1;
|
pic->ci->argc = 1;
|
||||||
|
@ -158,11 +166,17 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
pic_value v;
|
pic_value v;
|
||||||
pic_callinfo *ci;
|
pic_callinfo *ci;
|
||||||
|
|
||||||
v = POP();
|
L_RAISE:
|
||||||
ci = POPCI();
|
if (pic->errmsg) {
|
||||||
pc = ci->pc;
|
goto L_STOP;
|
||||||
pic->sp -= ci->argc;
|
}
|
||||||
PUSH(v);
|
else {
|
||||||
|
v = POP();
|
||||||
|
ci = POPCI();
|
||||||
|
pc = ci->pc;
|
||||||
|
pic->sp -= ci->argc;
|
||||||
|
PUSH(v);
|
||||||
|
}
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
CASE(OP_LAMBDA) {
|
CASE(OP_LAMBDA) {
|
||||||
|
@ -232,8 +246,14 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
CASE(OP_STOP) {
|
CASE(OP_STOP) {
|
||||||
pic_value val;
|
pic_value val;
|
||||||
|
|
||||||
|
L_STOP:
|
||||||
val = POP();
|
val = POP();
|
||||||
|
|
||||||
|
pic->jmp = NULL;
|
||||||
|
if (pic->errmsg) {
|
||||||
|
return pic_undef_value();
|
||||||
|
}
|
||||||
|
|
||||||
#if VM_DEBUG
|
#if VM_DEBUG
|
||||||
puts("**VM END STATE**");
|
puts("**VM END STATE**");
|
||||||
printf("stbase = %p\nsp = %p\n", pic->stbase, pic->sp);
|
printf("stbase = %p\nsp = %p\n", pic->stbase, pic->sp);
|
||||||
|
|
|
@ -87,6 +87,11 @@ main()
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
v = pic_run(pic, proc, pic_nil_value());
|
v = pic_run(pic, proc, pic_nil_value());
|
||||||
|
if (pic_undef_p(v)) {
|
||||||
|
printf("runtime error: %s\n", pic->errmsg);
|
||||||
|
pic->errmsg = NULL;
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
/* print */
|
/* print */
|
||||||
printf("=> ");
|
printf("=> ");
|
||||||
|
|
Loading…
Reference in New Issue