summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-04 23:20:39 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-04 23:20:39 +0000
commitf3844ccf44060801c7ceed331efa025d73e8f718 (patch)
treee23a7aa60c53d60b0efbf7446abc63ac420de584 /range.c
parent3c66767bda0dbd0a92ead7c2e2721614a9f82bbe (diff)
* range.c (range_step): should not add up errors on loops.
[ruby-dev:37691] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21330 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r--range.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/range.c b/range.c
index 32c0024a34..74f9e569f5 100644
--- a/range.c
+++ b/range.c
@@ -343,10 +343,13 @@ range_step(int argc, VALUE *argv, VALUE range)
!NIL_P(rb_check_to_integer(b, "to_int")) ||
!NIL_P(rb_check_to_integer(e, "to_int"))) {
ID op = EXCL(range) ? '<' : rb_intern("<=");
+ VALUE v = b;
+ int i = 0;
- while (RTEST(rb_funcall(b, op, 1, e))) {
- rb_yield(b);
- b = rb_funcall(b, '+', 1, step);
+ while (RTEST(rb_funcall(v, op, 1, e))) {
+ rb_yield(v);
+ i++;
+ v = rb_funcall(b, '+', 1, rb_funcall(INT2NUM(i), '*', 1, step));
}
}
else {