コード例 #1
0
static mrb_value
mrb_f_caller(mrb_state *mrb, mrb_value self)
{
  mrb_value bt, v, length;
  mrb_int bt_len, argc, lev, n;

  bt = mrb_get_backtrace(mrb);
  bt_len = RARRAY_LEN(bt);
  argc = mrb_get_args(mrb, "|oo", &v, &length);

  switch (argc) {
    case 0:
      lev = 1;
      n = bt_len - lev;
      break;
    case 1:
      if (mrb_type(v) == MRB_TT_RANGE) {
        mrb_int beg, len;
        if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == 1) {
          lev = beg;
          n = len;
        }
        else {
          return mrb_nil_value();
        }
      }
      else {
        v = mrb_to_int(mrb, v);
        lev = mrb_fixnum(v);
        if (lev < 0) {
          mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%S)", v);
        }
        n = bt_len - lev;
      }
      break;
    case 2:
      lev = mrb_fixnum(mrb_to_int(mrb, v));
      n = mrb_fixnum(mrb_to_int(mrb, length));
      if (lev < 0) {
        mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%S)", v);
      }
      if (n < 0) {
        mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (%S)", length);
      }
      break;
    default:
      lev = n = 0;
      break;
  }

  if (n == 0) {
    return mrb_ary_new(mrb);
  }

  return mrb_funcall(mrb, bt, "[]", 2, mrb_fixnum_value(lev), mrb_fixnum_value(n));
}
コード例 #2
0
ファイル: gc.c プロジェクト: Kazu-zamasu/mruby_efi_shell
static mrb_value
gc_step_ratio_set(mrb_state *mrb, mrb_value obj)
{
  mrb_value ratio;
  mrb_get_args(mrb, "o", &ratio);
  mrb->gc_step_ratio = mrb_fixnum(mrb_to_int(mrb, ratio));
  return mrb_nil_value();
}
コード例 #3
0
ファイル: numeric.c プロジェクト: kkkkkt/mruby
static mrb_value
bit_coerce(mrb_state *mrb, mrb_value x)
{
  while (!mrb_fixnum_p(x)) {
    if (mrb_float_p(x)) {
      mrb_raise(mrb, E_TYPE_ERROR, "can't convert Float into Integer");
    }
    x = mrb_to_int(mrb, x);
  }
  return x;
}
コード例 #4
0
ファイル: range.c プロジェクト: deweerdt/h2o
/*
 *  call-seq:
 *     rng.last    -> obj
 *     rng.last(n) -> an_array
 *
 *  Returns the last object in the range,
 *  or an array of the last +n+ elements.
 *
 *  Note that with no arguments +last+ will return the object that defines
 *  the end of the range even if #exclude_end? is +true+.
 *
 *    (10..20).last      #=> 20
 *    (10...20).last     #=> 20
 *    (10..20).last(3)   #=> [18, 19, 20]
 *    (10...20).last(3)  #=> [17, 18, 19]
 */
static mrb_value
mrb_range_last(mrb_state *mrb, mrb_value range)
{
  mrb_value num;
  mrb_value array;
  struct RRange *r = mrb_range_ptr(mrb, range);

  if (mrb_get_args(mrb, "|o", &num) == 0) {
    return r->edges->end;
  }

  array = mrb_funcall(mrb, range, "to_a", 0);
  return mrb_funcall(mrb, array, "last", 1, mrb_to_int(mrb, num));
}
コード例 #5
0
ファイル: hash.c プロジェクト: Zyxwvu/mruby
mrb_value
mrb_hash(mrb_state *mrb, mrb_value obj)
{
  mrb_value hval = mrb_funcall(mrb, obj, "Hash", 0);
retry:
  switch (mrb_type(hval)) {
    case MRB_TT_FIXNUM:
      return hval;

    default:
      hval = mrb_to_int(mrb, hval);
      goto retry;
  }
}
コード例 #6
0
ファイル: numeric_ext.c プロジェクト: IceDragon200/mruby
static inline mrb_int
to_int(mrb_state *mrb, mrb_value x)
{
  x = mrb_to_int(mrb, x);
  return mrb_fixnum(x);
}