summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-25 11:42:31 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-25 11:42:31 +0000
commit413cece5c94ca0ad400a1276d35680940e612a7d (patch)
tree5be6f667920e6dd7bca9130204f52946a376d4e6
parentbc1827e8825c558bcda14a214280caf83dc1215b (diff)
no longer rescue exceptions of #coerce in Integer#step
* numeric.c (num_step_negative_p): no more error hiding. * test/ruby/test_float.rb, test/ruby/test_numeric.rb: follow the change. [Feature #7688] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58475 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--NEWS2
-rw-r--r--numeric.c17
-rw-r--r--test/ruby/test_float.rb2
-rw-r--r--test/ruby/test_numeric.rb4
4 files changed, 8 insertions, 17 deletions
diff --git a/NEWS b/NEWS
index d7f79727a2..9c805927f6 100644
--- a/NEWS
+++ b/NEWS
@@ -28,6 +28,8 @@ with all sufficient information, see the ChangeLog file or Redmine
* Integer
* Integer.sqrt [Feature #13219]
+ * Integer#step does no longer rescue exceptions when given
+ a step value which cannot be compared with #> to 0. [Feature #7688]
* IO
diff --git a/numeric.c b/numeric.c
index dda44c0a77..713a3e482e 100644
--- a/numeric.c
+++ b/numeric.c
@@ -446,12 +446,6 @@ coerce_failed(VALUE x, VALUE y)
y, rb_obj_class(x));
}
-static VALUE
-coerce_rescue_quiet(VALUE arg, VALUE errinfo)
-{
- return Qundef;
-}
-
static int
do_coerce(VALUE *x, VALUE *y, int err)
{
@@ -2585,17 +2579,11 @@ ruby_num_interval_step_size(VALUE from, VALUE to, VALUE step, int excl)
}
}
-static VALUE
-num_step_compare_with_zero(VALUE num)
-{
- VALUE zero = INT2FIX(0);
- return rb_check_funcall(num, '>', 1, &zero);
-}
-
static int
num_step_negative_p(VALUE num)
{
const ID mid = '<';
+ VALUE zero = INT2FIX(0);
VALUE r;
if (FIXNUM_P(num)) {
@@ -2606,7 +2594,8 @@ num_step_negative_p(VALUE num)
if (method_basic_p(rb_cInteger))
return BIGNUM_NEGATIVE_P(num);
}
- r = rb_rescue(num_step_compare_with_zero, num, coerce_rescue_quiet, Qnil);
+
+ r = rb_check_funcall(num, '>', 1, &zero);
if (r == Qundef) {
coerce_failed(num, INT2FIX(0));
}
diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb
index 2b6724a963..579b1d186a 100644
--- a/test/ruby/test_float.rb
+++ b/test/ruby/test_float.rb
@@ -788,7 +788,7 @@ class TestFloat < Test::Unit::TestCase
end
def test_num2dbl
- assert_raise(TypeError) do
+ assert_raise(ArgumentError, "comparison of String with 0 failed") do
1.0.step(2.0, "0.5") {}
end
assert_raise(TypeError) do
diff --git a/test/ruby/test_numeric.rb b/test/ruby/test_numeric.rb
index 4f4fd5cc3e..49008247ed 100644
--- a/test/ruby/test_numeric.rb
+++ b/test/ruby/test_numeric.rb
@@ -261,8 +261,8 @@ class TestNumeric < Test::Unit::TestCase
assert_raise(ArgumentError) { 1.step(10, 1, 0).size }
assert_raise(ArgumentError) { 1.step(10, 0) { } }
assert_raise(ArgumentError) { 1.step(10, 0).size }
- assert_raise(TypeError) { 1.step(10, "1") { } }
- assert_raise(TypeError) { 1.step(10, "1").size }
+ assert_raise(ArgumentError) { 1.step(10, "1") { } }
+ assert_raise(ArgumentError) { 1.step(10, "1").size }
assert_raise(TypeError) { 1.step(10, nil) { } }
assert_raise(TypeError) { 1.step(10, nil).size }
assert_nothing_raised { 1.step(by: 0, to: nil) }