From db885d0850653425b2c7896f9e6730c57b030ab1 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 20 Apr 2018 00:23:01 +0000 Subject: [PATCH] range.c: step in bignum * range.c (range_step): honor step in bignum addition. [Feature #12912] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63208 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- range.c | 2 +- test/ruby/test_range.rb | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/range.c b/range.c index 71d81fa6c4..67ead72e78 100644 --- a/range.c +++ b/range.c @@ -408,7 +408,7 @@ range_step(int argc, VALUE *argv, VALUE range) } while (FIXABLE(i)); b = LONG2NUM(i); - for (;; b = rb_funcallv(b, id_succ, 0, 0)) + for (;; b = rb_big_plus(b, step)) rb_yield(b); } else if (FIXNUM_P(b) && FIXNUM_P(e) && FIXNUM_P(step)) { /* fixnums are special */ diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index dbfe495f29..beb0b956cd 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -245,10 +245,13 @@ class TestRange < Test::Unit::TestCase (2**32-1 .. ).step(2) {|x| a << x; break if a.size == 2 } assert_equal([4294967295, 4294967297], a) - a = [] max = RbConfig::LIMITS["FIXNUM_MAX"] + a = [] (max..).step {|x| a << x; break if a.size == 2 } assert_equal([max, max+1], a) + a = [] + (max..).step(max) {|x| a << x; break if a.size == 4 } + assert_equal([max, 2*max, 3*max, 4*max], a) o1 = Object.new o2 = Object.new