ruby-changes:51504
From: mame <ko1@a...>
Date: Fri, 22 Jun 2018 11:58:43 +0900 (JST)
Subject: [ruby-changes:51504] mame:r63714 (trunk): range.c: Range#to_a now raises RangeError if it is endless
mame 2018-06-22 11:58:37 +0900 (Fri, 22 Jun 2018) New Revision: 63714 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63714 Log: range.c: Range#to_a now raises RangeError if it is endless Fixes [Bug #14845] Modified files: trunk/range.c trunk/test/ruby/test_range.rb Index: range.c =================================================================== --- range.c (revision 63713) +++ range.c (revision 63714) @@ -755,6 +755,26 @@ range_size(VALUE range) https://github.com/ruby/ruby/blob/trunk/range.c#L755 return Qnil; } +/* + * call-seq: + * rng.to_a -> array + * rng.entries -> array + * + * Returns an array containing the items in <i>rng</i>. + * + * (1..7).to_a #=> [1, 2, 3, 4, 5, 6, 7] + * (1..).to_a #=> RangeError: cannot convert endless range to an array + */ + +static VALUE +range_to_a(VALUE range) +{ + if (NIL_P(RANGE_END(range))) { + rb_raise(rb_eRangeError, "cannot convert endless range to an array"); + } + return rb_call_super(0, 0); +} + static VALUE range_enum_size(VALUE range, VALUE args, VALUE eobj) { @@ -1459,6 +1479,8 @@ Init_Range(void) https://github.com/ruby/ruby/blob/trunk/range.c#L1479 rb_define_method(rb_cRange, "min", range_min, -1); rb_define_method(rb_cRange, "max", range_max, -1); rb_define_method(rb_cRange, "size", range_size, 0); + rb_define_method(rb_cRange, "to_a", range_to_a, 0); + rb_define_method(rb_cRange, "entries", range_to_a, 0); rb_define_method(rb_cRange, "to_s", range_to_s, 0); rb_define_method(rb_cRange, "inspect", range_inspect, 0); Index: test/ruby/test_range.rb =================================================================== --- test/ruby/test_range.rb (revision 63713) +++ test/ruby/test_range.rb (revision 63714) @@ -794,4 +794,10 @@ class TestRange < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_range.rb#L794 end (a.."c").each {|x, &b| assert_nil(b)} end + + def test_to_a + assert_equal([1,2,3,4,5], (1..5).to_a) + assert_equal([1,2,3,4], (1...5).to_a) + assert_raise(RangeError) { (1..).to_a } + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/