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)); }
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(); }
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; }
/* * 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)); }
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; } }
static inline mrb_int to_int(mrb_state *mrb, mrb_value x) { x = mrb_to_int(mrb, x); return mrb_fixnum(x); }