示例#1
0
文件: error.c 项目: koba-e964/picrin
static pic_value
raise_continuable(pic_state *pic)
{
  pic_get_args(pic, "");

  return pic_call(pic, pic_closure_ref(pic, 0), 1, pic_closure_ref(pic, 1));
}
示例#2
0
文件: error.c 项目: koba-e964/picrin
static pic_value
raise(pic_state *pic)
{
  pic_get_args(pic, "");

  pic_call(pic, pic_closure_ref(pic, 0), 1, pic_closure_ref(pic, 1));

  pic_error(pic, "handler returned", 2, pic_closure_ref(pic, 0), pic_closure_ref(pic, 1));
}
示例#3
0
文件: error.c 项目: koba-e964/picrin
static pic_value
pic_error_with_exception_handler(pic_state *pic)
{
  pic_value handler, thunk;
  pic_value stack, exc = pic_ref(pic, "picrin.base", "current-exception-handlers");

  pic_get_args(pic, "ll", &handler, &thunk);

  stack = pic_call(pic, exc, 0);

  return pic_dynamic_bind(pic, exc, pic_cons(pic, handler, stack), thunk);
}
示例#4
0
文件: error.c 项目: koba-e964/picrin
void
pic_end_try(pic_state *pic, pic_value cookie)
{
  struct checkpoint *here = (struct checkpoint *)pic_obj_ptr(pic_car(pic, cookie));
  pic_value out = pic_cdr(pic, cookie);

  pic->cp = here;

  pic_call(pic, out, 0); /* exit */

  pic_exit_point(pic);
}
示例#5
0
文件: error.c 项目: koba-e964/picrin
static pic_value
native_exception_handler(pic_state *pic)
{
  pic_value err;

  pic_get_args(pic, "o", &err);

  pic->err = err;

  pic_call(pic, pic_closure_ref(pic, 0), 1, pic_false_value(pic));

  PIC_UNREACHABLE();
}
示例#6
0
文件: error.c 项目: koba-e964/picrin
pic_value
pic_raise_continuable(pic_state *pic, pic_value err)
{
  pic_value stack, exc = pic_ref(pic, "picrin.base", "current-exception-handlers");

  stack = pic_call(pic, exc, 0);

  if (pic_nil_p(pic, stack)) {
    pic_panic(pic, "no exception handler");
  }

  return pic_dynamic_bind(pic, exc, pic_cdr(pic, stack), pic_lambda(pic, raise_continuable, 2, pic_car(pic, stack), err));
}
main ()
{
  pic_call ();
  nonpic_call ();

  if (hit_pic_call != 1)
    abort ();

  if (hit_nonpic_call != 1)
    abort ();

  exit (0);
} 
main ()
{
  nonpic_nothing ();
  pic_call ();

  if (hit_nonpic_nothing != 2)
    abort ();

  if (hit_pic_call != 1)
    abort ();

  exit (0);
} 
示例#9
0
文件: error.c 项目: koba-e964/picrin
pic_value
pic_start_try(pic_state *pic, PIC_JMPBUF *jmp)
{
  struct cont *cont;
  pic_value handler;
  pic_value var, old_val, new_val;
  pic_value in, out;
  struct checkpoint *here;

  /* call/cc */

  cont = pic_alloca_cont(pic);
  pic_save_point(pic, cont, jmp);
  handler = pic_lambda(pic, native_exception_handler, 1, pic_make_cont(pic, cont));

  /* with-exception-handler */

  var = pic_ref(pic, "picrin.base", "current-exception-handlers");
  old_val = pic_call(pic, var, 0);
  new_val = pic_cons(pic, handler, old_val);

  in = pic_lambda(pic, dynamic_set, 2, var, new_val);
  out = pic_lambda(pic, dynamic_set, 2, var, old_val);

  /* dynamic-wind */

  pic_call(pic, in, 0);       /* enter */

  here = pic->cp;
  pic->cp = (struct checkpoint *)pic_obj_alloc(pic, sizeof(struct checkpoint), PIC_TYPE_CP);
  pic->cp->prev = here;
  pic->cp->depth = here->depth + 1;
  pic->cp->in = pic_proc_ptr(pic, in);
  pic->cp->out = pic_proc_ptr(pic, out);

  return pic_cons(pic, pic_obj_value(here), out);
}
示例#10
0
文件: error.c 项目: koba-e964/picrin
void
pic_raise(pic_state *pic, pic_value err)
{
  pic_value stack, exc = pic_ref(pic, "picrin.base", "current-exception-handlers");

  stack = pic_call(pic, exc, 0);

  if (pic_nil_p(pic, stack)) {
    pic_panic(pic, "no exception handler");
  }

  pic_dynamic_bind(pic, exc, pic_cdr(pic, stack), pic_lambda(pic, raise, 2, pic_car(pic, stack), err));

  PIC_UNREACHABLE();
}