Esempio n. 1
0
static void
os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
{
  struct os_each_object_data *d = (struct os_each_object_data*)ud;

  /* filter dead objects */
  if (mrb_object_dead_p(mrb, obj)) {
    return;
  }

  /* filter internal objects */
  switch (obj->tt) {
  case MRB_TT_ENV:
  case MRB_TT_ICLASS:
    return;
  default:
    break;
  }

  /* filter half baked (or internal) objects */
  if (!obj->c) return;

  /* filter class kind if target module defined */
  if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) {
    return;
  }

  mrb_yield(mrb, d->block, mrb_obj_value(obj));
  ++d->count;
}
Esempio n. 2
0
static mrb_value
reject_i(mrb_state *mrb, mrb_value i, mrb_value ary, int argc, mrb_value *argv)
{
    ENUM_WANT_SVALUE(mrb);

    if (!RTEST(mrb_yield(i))) {
      mrb_ary_push(mrb, ary, i);
    }
    return mrb_nil_value();
}
Esempio n. 3
0
static mrb_value
find_i(mrb_state *mrb, mrb_value i, mrb_value *memo, int argc, mrb_value *argv)
{
    ENUM_WANT_SVALUE(mrb);

    if (RTEST(mrb_yield(i))) {
      *memo = i;
      mrb_iter_break();
    }
    return mrb_nil_value();
}
Esempio n. 4
0
static mrb_value
grep_iter_i(mrb_state *mrb, mrb_value i, mrb_value args, int argc, mrb_value *argv)
{
    mrb_value *arg = &args;
    ENUM_WANT_SVALUE(mrb);

    if (RTEST(mrb_funcall(mrb, arg[0], "===", 1, i))) {
      mrb_ary_push(mrb, arg[1], mrb_yield(i));
    }
    return mrb_nil_value();
}
Esempio n. 5
0
static mrb_value
partition_i(mrb_state *mrb, mrb_value i, mrb_value *ary, int argc, mrb_value *argv)
{
    ENUM_WANT_SVALUE(mrb);

    if (RTEST(mrb_yield(i))) {
      mrb_ary_push(mrb, ary[0], i);
    }
    else {
      mrb_ary_push(mrb, ary[1], i);
    }
    return mrb_nil_value();
}
Esempio n. 6
0
static ssize_t
mrb_wslay_event_send_callback(wslay_event_context_ptr ctx,
  const uint8_t *buf, size_t len,
  int flags, void *user_data)
{
  mrb_wslay_user_data *data = (mrb_wslay_user_data *) user_data;
  mrb_state* mrb = data->mrb;
  int ai = mrb_gc_arena_save(mrb);

  struct mrb_jmpbuf *prev_jmp = mrb->jmp;
  struct mrb_jmpbuf c_jmp;
  mrb_int ret = -1;
  MRB_TRY(&c_jmp) {
    data->mrb->jmp = &c_jmp;

    errno = 0;
    mrb_value buf_obj = mrb_str_new_static(mrb, (const char *) buf, len);
    mrb_assert(mrb_type(data->send_callback) == MRB_TT_PROC);
    mrb_value sent = mrb_yield(mrb, data->send_callback, buf_obj);

    ret = mrb_int(mrb, sent);

    mrb_assert(ret >= 0&&ret <= len);

    mrb->jmp = prev_jmp;
  } MRB_CATCH(&c_jmp) {
    mrb->jmp = prev_jmp;
    if (mrb_obj_is_kind_of(mrb,
        mrb_obj_value(mrb->exc),
            mrb_class_get_under(mrb,
                mrb_module_get(mrb, "Errno"), "EAGAIN"))||
    mrb_obj_is_kind_of(mrb,
        mrb_obj_value(mrb->exc),
            mrb_class_get_under(mrb,
                mrb_module_get(mrb, "Errno"), "EWOULDBLOCK"))) {
      mrb->exc = NULL;
      wslay_event_set_error(ctx, WSLAY_ERR_WOULDBLOCK);
    } else {
      wslay_event_set_error(ctx, WSLAY_ERR_CALLBACK_FAILURE);
    }
  } MRB_END_EXC(&c_jmp);

  mrb_gc_arena_restore(mrb, ai);

  return ret;
}
Esempio n. 7
0
static mrb_value
mrb_queue_after(mrb_state *mrb, mrb_value self)
{
  mrb_float delay_f;
  mrb_value blk;
  dispatch_queue_t q;

  mrb_get_args(mrb, "f&", &delay_f, &blk);

  DISPATCH_ENSURE_BLOCK_GIVEN(mrb, blk);

  q = (dispatch_queue_t)DATA_PTR(self);

  dispatch_time_t pop_time = dispatch_time(DISPATCH_TIME_NOW, (dispatch_time_t)(delay_f * NSEC_PER_SEC));
  dispatch_after(pop_time, q, ^{
    mrb_yield(mrb, blk, mrb_nil_value());
  });
Esempio n. 8
0
static void
os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
{
  struct os_each_object_data *d = (struct os_each_object_data*)ud;

  /* filter dead objects */
  if (is_dead(mrb, obj)) {
    return;
  }

  /* filter class kind if target module defined */
  if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) {
    return;
  }

  mrb_yield(mrb, d->block, mrb_obj_value(obj));
  ++d->count;
}
Esempio n. 9
0
static mrb_value mrb_sample_buffer_each_method(mrb_state *mrb, mrb_value self)
{
  mrb_int i;
  mrb_value block;
  mrb_bool block_given;
  mrb_sample_buffer *b = mrb_data_check_get_ptr(mrb, self, &mrb_sample_buffer_type);

  mrb_get_args(mrb, "|&?", &block, &block_given);

  if (block_given) {
    for (i = 0; i < b->len; ++i) {
      mrb_yield(mrb, block, mrb_float_value(mrb, MRB_SAMPLE_BUFFER_DATA(b)[i]));
    }
    return self;
  } else {
    return mrb_funcall(mrb, self, "enum_for", 1, mrb_symbol_value(mrb_intern_lit(mrb, "each")));
  }
}
Esempio n. 10
0
static int
parser_settings_on_message_complete(http_parser* parser)
{
    mrb_value proc;
    mrb_value c;
    mrb_http_parser_context *context = (mrb_http_parser_context*) parser->data;
    mrb_state* mrb = context->mrb;

    proc = mrb_iv_get(context->mrb, context->instance, mrb_intern(context->mrb, "complete_cb"));

    c = mrb_class_new_instance(mrb, 0, NULL, _class_http_request);
    mrb_iv_set(mrb, c, mrb_intern(mrb, "parser_context"), mrb_obj_value(
                   Data_Wrap_Struct(mrb, mrb->object_class,
                                    NULL, (void*) context)));
    mrb_yield(context->mrb, proc, c);

    return 0;
}
Esempio n. 11
0
static mrb_value
bmfont_each_codepoint_from(mrb_state *mrb, mrb_value self)
{
  char *cstr;
  mrb_value blk;

  ALLEGRO_USTR *ustr;
  int pos = 0;
  int codepoint = 0;

  mrb_get_args(mrb, "z&", &cstr, &blk);

  ustr = al_ustr_new(cstr);

  for (codepoint = al_ustr_get_next(ustr, &pos); codepoint > 0; codepoint = al_ustr_get_next(ustr, &pos)) {
    mrb_yield(mrb, blk, mrb_fixnum_value(codepoint));
  }

  if (ustr) al_ustr_free(ustr);

  return mrb_nil_value();
}
Esempio n. 12
0
static void
mrb_wslay_event_on_msg_recv_callback(wslay_event_context_ptr ctx,
  const struct wslay_event_on_msg_recv_arg *arg, void *user_data)
{
  mrb_wslay_user_data *data = (mrb_wslay_user_data *) user_data;
  mrb_state *mrb = data->mrb;

  int ai = mrb_gc_arena_save(mrb);
  struct mrb_jmpbuf *prev_jmp = mrb->jmp;
  struct mrb_jmpbuf c_jmp;

  MRB_TRY(&c_jmp) {
    mrb->jmp = &c_jmp;

    mrb_value argv[4];
    argv[0] = mrb_fixnum_value(arg->rsv);
    argv[1] = MRB_GET_OPCODE(mrb_fixnum_value(arg->opcode));
    argv[2] = mrb_str_new(mrb, (const char *) arg->msg, arg->msg_length);
    argv[3] = MRB_GET_STATUSCODE(mrb_fixnum_value(arg->status_code));

    mrb_value on_msg_recv_arg = mrb_obj_new(mrb,
      mrb_class_get_under(mrb,
        mrb_module_get_under(mrb,
          mrb_module_get(mrb, "Wslay"), "Event"), "OnMsgRecvArg"), NELEMS(argv), argv);

    mrb_assert(mrb_type(data->on_msg_recv_callback) == MRB_TT_PROC);
    mrb_yield(mrb, data->on_msg_recv_callback, on_msg_recv_arg);

    mrb_gc_arena_restore(mrb, ai);

    mrb->jmp = prev_jmp;
  } MRB_CATCH(&c_jmp) {
    mrb->jmp = prev_jmp;
    wslay_event_set_error(ctx, WSLAY_ERR_CALLBACK_FAILURE);
    mrb_gc_arena_restore(mrb, ai);
    MRB_THROW(mrb->jmp);
  } MRB_END_EXC(&c_jmp);
}
Esempio n. 13
0
static mrb_value
mrb_f_fork(mrb_state *mrb, mrb_value klass)
{
  mrb_value b, result;
  int pid;

  mrb_get_args(mrb, "&", &b);

  switch (pid = fork()) {
  case 0:
    if (!mrb_nil_p(b)) {
      mrb_yield(mrb, b, result);
      _exit(0);
    }
    return mrb_nil_value();

  case -1:
    mrb_sys_fail(mrb, "fork failed");
    return mrb_nil_value();

  default:
    return mrb_fixnum_value(pid);
  }
}