Пример #1
0
Файл: port.c Проект: KeenS/benz
static pic_value
pic_port_call_with_port(pic_state *pic)
{
  struct pic_port *port;
  struct pic_proc *proc;
  pic_value value;

  pic_get_args(pic, "pl", &port, &proc);

  value = pic_apply1(pic, proc, pic_obj_value(port));

  pic_close_port(pic, port);

  return value;
}
Пример #2
0
pic_value
pic_native_exception_handler(pic_state *pic)
{
  pic_value err;
  struct pic_proc *cont;

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

  pic->err = err;

  cont = pic_proc_ptr(pic_proc_env_ref(pic, pic_get_proc(pic), "cont"));

  pic_apply1(pic, cont, pic_false_value());

  PIC_UNREACHABLE();
}
Пример #3
0
pic_value
pic_raise_continuable(pic_state *pic, pic_value err)
{
  struct pic_proc *handler;
  pic_value v;

  handler = pic_pop_handler(pic);

  pic_gc_protect(pic, pic_obj_value(handler));

  v = pic_apply1(pic, handler, err);

  pic_push_handler(pic, handler);

  return v;
}
Пример #4
0
static pic_value
native_exception_handler(pic_state *pic)
{
  pic_value err;
  struct pic_proc *cont;

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

  pic->err = err;

  cont = pic_proc_ptr(pic_attr_ref(pic, pic_obj_value(pic_get_proc(pic)), "@@escape"));

  pic_apply1(pic, cont, pic_false_value());

  PIC_UNREACHABLE();
}
Пример #5
0
pic_value
pic_raise_continuable(pic_state *pic, pic_value err)
{
  struct pic_proc *handler;
  pic_value v;

  if (pic->xp == pic->xpbase) {
    pic_panic(pic, "no exception handler registered");
  }

  handler = *--pic->xp;

  pic_gc_protect(pic, pic_obj_value(handler));

  v = pic_apply1(pic, handler, err);

  *pic->xp++ = handler;

  return v;
}
Пример #6
0
static pic_value
pic_dict_dictionary_for_each(pic_state *pic)
{
  struct pic_proc *proc;
  struct pic_dict *dict;
  khiter_t it;
  khash_t(dict) *kh;

  pic_get_args(pic, "ld", &proc, &dict);

  kh = &dict->hash;

  for (it = kh_begin(kh); it != kh_end(kh); ++it) {
    if (kh_exist(kh, it)) {
      pic_apply1(pic, proc, pic_obj_value(kh_key(kh, it)));
    }
  }

  return pic_undef_value();
}
Пример #7
0
pic_value
pic_callcc(pic_state *pic, struct pic_proc *proc)
{
  struct pic_cont cont;

  pic_save_point(pic, &cont);

  if (PIC_SETJMP(pic, cont.jmp)) {
    return pic_values_by_list(pic, cont.results);
  }
  else {
    pic_value val;

    val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, &cont)));

    pic->cc = pic->cc->prev;

    return val;
  }
}
Пример #8
0
pic_value
pic_callcc(pic_state *pic, struct pic_proc *proc)
{
  struct pic_cont *cont = pic_malloc(pic, sizeof(struct pic_cont));

  pic_save_point(pic, cont);

  if (PIC_SETJMP(pic, cont->jmp.buf)) {
    pic->jmp = pic->jmp->prev;

    return pic_values_by_list(pic, cont->results);
  }
  else {
    pic_value val;

    val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, cont)));

    pic->jmp = pic->jmp->prev;

    return val;
  }
}