summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-02 07:15:28 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-02 07:15:28 +0000
commit7f31465bb51a54b55985e7bbe7b20d70b3e06aae (patch)
treec00cce58ac836377a41d29e82491555c8a47600a /range.c
parent546d98b7e89d24ce920b9d1d05382607e8a97747 (diff)
* range.c (range_step): do not forcefully convert steps into
integers. [ruby-dev:34571] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16269 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r--range.c24
1 files changed, 5 insertions, 19 deletions
diff --git a/range.c b/range.c
index 01524e15e0..5835d80c23 100644
--- a/range.c
+++ b/range.c
@@ -296,7 +296,6 @@ static VALUE
range_step(int argc, VALUE *argv, VALUE range)
{
VALUE b, e, step, tmp;
- long unit;
RETURN_ENUMERATOR(range, argc, argv);
@@ -304,33 +303,20 @@ range_step(int argc, VALUE *argv, VALUE range)
e = RANGE_END(range);
if (argc == 0) {
step = INT2FIX(1);
- unit = 1;
}
else {
rb_scan_args(argc, argv, "01", &step);
- tmp = rb_check_to_integer(step, "to_int");
- if (!NIL_P(tmp)) {
- if (FIXNUM_P(tmp))
- unit = FIX2LONG(tmp);
- else
- unit = rb_cmpint(tmp, step, INT2FIX(0));
- step = tmp;
+ if (rb_funcall(step, '<', 1, INT2FIX(0))) {
+ rb_raise(rb_eArgError, "step can't be negative");
}
- else {
- tmp = rb_funcall(rb_funcall(b, '+', 1, step), '-', 1, b);
- unit = rb_cmpint(tmp, step, INT2FIX(0));
+ else if (!rb_funcall(step, '>', 1, INT2FIX(0))) {
+ rb_raise(rb_eArgError, "step can't be 0");
}
}
- if (unit < 0) {
- rb_raise(rb_eArgError, "step can't be negative");
- }
- if (unit == 0) {
- rb_raise(rb_eArgError, "step can't be 0");
- }
if (FIXNUM_P(b) && FIXNUM_P(e) && FIXNUM_P(step)) { /* fixnums are special */
long end = FIX2LONG(e);
- long i;
+ long i, unit = FIX2LONG(step);
if (!EXCL(range))
end += 1;