* 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
This commit is contained in:
nobu 2018-04-20 00:23:01 +00:00
Родитель ad5a6aa790
Коммит db885d0850
2 изменённых файлов: 5 добавлений и 2 удалений

Просмотреть файл

@ -408,7 +408,7 @@ range_step(int argc, VALUE *argv, VALUE range)
} while (FIXABLE(i)); } while (FIXABLE(i));
b = LONG2NUM(i); b = LONG2NUM(i);
for (;; b = rb_funcallv(b, id_succ, 0, 0)) for (;; b = rb_big_plus(b, step))
rb_yield(b); rb_yield(b);
} }
else if (FIXNUM_P(b) && FIXNUM_P(e) && FIXNUM_P(step)) { /* fixnums are special */ else if (FIXNUM_P(b) && FIXNUM_P(e) && FIXNUM_P(step)) { /* fixnums are special */

Просмотреть файл

@ -245,10 +245,13 @@ class TestRange < Test::Unit::TestCase
(2**32-1 .. ).step(2) {|x| a << x; break if a.size == 2 } (2**32-1 .. ).step(2) {|x| a << x; break if a.size == 2 }
assert_equal([4294967295, 4294967297], a) assert_equal([4294967295, 4294967297], a)
a = []
max = RbConfig::LIMITS["FIXNUM_MAX"] max = RbConfig::LIMITS["FIXNUM_MAX"]
a = []
(max..).step {|x| a << x; break if a.size == 2 } (max..).step {|x| a << x; break if a.size == 2 }
assert_equal([max, max+1], a) 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 o1 = Object.new
o2 = Object.new o2 = Object.new