aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-24 05:30:42 +0000
committermrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-24 05:30:42 +0000
commit161ece479598629f4ace4fa23bfea7bc1331a8a0 (patch)
treea1a53636ef96bae6dc16fef9ec3ff0e3559bb3d6
parentc56f61161a7baefb3d1ed3f815e5dc544b3accd6 (diff)
downloadruby-161ece479598629f4ace4fa23bfea7bc1331a8a0.tar.gz
numeric.c: Fix negative step with float components
* numeric.c (ruby_float_step): fix negative step with float components. * test/ruby/test_numeric.c (test_step_bug15537): add tests. * test/ruby/test_range.c (test_step_bug15537): add tests. [Bug #15537] [ruby-core:91101] From: shuujii (Shuji KOBAYASHI) <shuujii@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--numeric.c4
-rw-r--r--test/ruby/test_numeric.rb14
-rw-r--r--test/ruby/test_range.rb5
3 files changed, 21 insertions, 2 deletions
diff --git a/numeric.c b/numeric.c
index 5cb1aad8a1..896d667cf8 100644
--- a/numeric.c
+++ b/numeric.c
@@ -2514,9 +2514,9 @@ int
ruby_float_step(VALUE from, VALUE to, VALUE step, int excl, int allow_endless)
{
if (RB_TYPE_P(from, T_FLOAT) || RB_TYPE_P(to, T_FLOAT) || RB_TYPE_P(step, T_FLOAT)) {
- double beg = NUM2DBL(from);
- double end = (allow_endless && NIL_P(to)) ? HUGE_VAL : NUM2DBL(to);
double unit = NUM2DBL(step);
+ double beg = NUM2DBL(from);
+ double end = (allow_endless && NIL_P(to)) ? (unit < 0 ? -1 : 1)*HUGE_VAL : NUM2DBL(to);
double n = ruby_float_step_size(beg, end, unit, excl);
long i;
diff --git a/test/ruby/test_numeric.rb b/test/ruby/test_numeric.rb
index e48c3448e8..f48bce5411 100644
--- a/test/ruby/test_numeric.rb
+++ b/test/ruby/test_numeric.rb
@@ -339,6 +339,20 @@ class TestNumeric < Test::Unit::TestCase
assert_step [bignum]*4, [bignum, by: 0, to: 0], inf: true
end
+ def test_step_bug15537
+ assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, 1, -2]
+ assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, to: 1, by: -2]
+ assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, 1, -2]
+ assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10, to: 1.0, by: -2]
+ assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10, 1.0, -2]
+
+ assert_step [10.0, 9.0, 8.0, 7.0], [10, by: -1.0], inf: true
+ assert_step [10.0, 9.0, 8.0, 7.0], [10, by: -1.0, to: nil], inf: true
+ assert_step [10.0, 9.0, 8.0, 7.0], [10, nil, -1.0], inf: true
+ assert_step [10.0, 9.0, 8.0, 7.0], [10.0, by: -1], inf: true
+ assert_step [10.0, 9.0, 8.0, 7.0], [10.0, nil, -1], inf: true
+ end
+
def test_num2long
assert_raise(TypeError) { 1 & nil }
assert_raise(TypeError) { 1 & 1.0 }
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index 65f3a8974d..6a2081fcd2 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -322,6 +322,11 @@ class TestRange < Test::Unit::TestCase
assert_equal(["a", "b", "c"], a)
end
+ def test_step_bug15537
+ assert_equal([10.0, 9.0, 8.0, 7.0], (10 ..).step(-1.0).take(4))
+ assert_equal([10.0, 9.0, 8.0, 7.0], (10.0 ..).step(-1).take(4))
+ end
+
def test_percent_step
aseq = (1..10) % 2
assert_equal(Enumerator::ArithmeticSequence, aseq.class)