[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]