summaryrefslogtreecommitdiffstats
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
commite4869cbc22daf447d595ee5a5c68ed0c3cdc1e83 (patch)
treee23a7aa60c53d60b0efbf7446abc63ac420de584 /range.c
parent3d2dbb7d0cb6254265f069786b5d66433eefd9fc (diff)
downloadruby-e4869cbc22daf447d595ee5a5c68ed0c3cdc1e83.tar.gz
ruby-e4869cbc22daf447d595ee5a5c68ed0c3cdc1e83.tar.xz
ruby-e4869cbc22daf447d595ee5a5c68ed0c3cdc1e83.zip
* range.c (range_step): should not add up errors on loops.
[ruby-dev:37691] git-svn-id: http://svn.ruby-lang.org/repos/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 32c0024a3..74f9e569f 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 {