/* * rng.length/rng.size -> anInteger * ----- * Returns the number of objects in rng. * (1..10).length #=> 10 * (1...10).length #=> 9 */ static VALUE range_length(range) VALUE range; { VALUE beg, end; long size; beg = rb_ivar_get(range, id_beg); end = rb_ivar_get(range, id_end); if (RTEST(rb_funcall(beg, '>', 1, end))) { return INT2FIX(0); } if (FIXNUM_P(beg) && FIXNUM_P(end)) { if (EXCL(range)) { return INT2NUM(NUM2LONG(end) - NUM2LONG(beg)); } else { return INT2NUM(NUM2LONG(end) - NUM2LONG(beg) + 1); } } if (!rb_obj_is_kind_of(beg, rb_cInteger)) { return rb_length_by_each(range); } size = rb_funcall(end, '-', 1, beg); if (!EXCL(range)) { size = rb_funcall(size, '+', 1, INT2FIX(1)); } return size; }