diff options
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -307,23 +307,28 @@ range_step(argc, argv, range) VALUE *argv; VALUE range; { - VALUE b, e, step; + VALUE b, e, step, tmp; long unit; RETURN_ENUMERATOR(range, argc, argv); b = rb_ivar_get(range, id_beg); e = rb_ivar_get(range, id_end); - if (rb_scan_args(argc, argv, "01", &step) == 0) { + if (argc == 0) { step = INT2FIX(1); unit = 1; } - else if (FIXNUM_P(step)) { - unit = NUM2LONG(step); - } else { - VALUE tmp = rb_to_int(step); - unit = rb_cmpint(tmp, step, INT2FIX(0)); + rb_scan_args(argc, argv, "01", &step); + tmp = rb_check_to_integer(step, "to_int"); + if (!NIL_P(tmp)) { + step = tmp; + unit = NUM2LONG(step); + } + else { + tmp = rb_funcall(rb_funcall(b, '+', 1, step), '-', 1, b); + unit = rb_cmpint(tmp, step, INT2FIX(0)); + } } if (unit < 0) { rb_raise(rb_eArgError, "step can't be negative"); |