summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
-rw-r--r--range.c60
1 files changed, 56 insertions, 4 deletions
@@ -309,6 +309,34 @@ range_each_func(VALUE range, int (*func)(VALUE, VALUE), VALUE arg)
}
}
static int
discrete_object_p(VALUE obj)
{
@@ -430,9 +458,18 @@ range_step_size(VALUE range, VALUE args, VALUE eobj)
*
* For non-Numeric ranges, step absence is an error:
*
- * ('a'..'z').step { p _1 }
* # raises: step is required for non-numeric ranges (ArgumentError)
*
*/
static VALUE
range_step(int argc, VALUE *argv, VALUE range)
@@ -445,11 +482,15 @@ range_step(int argc, VALUE *argv, VALUE range)
const VALUE b_num_p = rb_obj_is_kind_of(b, rb_cNumeric);
const VALUE e_num_p = rb_obj_is_kind_of(e, rb_cNumeric);
if (rb_check_arity(argc, 0, 1))
step = argv[0];
else {
- if (b_num_p || (NIL_P(b) && e_num_p))
step = INT2FIX(1);
else
rb_raise(rb_eArgError, "step is required for non-numeric ranges");
@@ -520,8 +561,19 @@ range_step(int argc, VALUE *argv, VALUE range)
}
else if (b_num_p && step_num_p && ruby_float_step(b, e, step, EXCL(range), TRUE)) {
/* done */
- }
- else {
v = b;
if (!NIL_P(e)) {
if (b_num_p && step_num_p && r_less(step, INT2FIX(0)) < 0) {