From 7bef465e9b590d4045f5a3babb89ca839d15311f Mon Sep 17 00:00:00 2001 From: mrkn Date: Fri, 21 Dec 2018 13:05:16 +0000 Subject: range.c: reject ArithmeticSequence in rb_range_values Reject ArithmeticSequence in rb_range_values so that methods like Array#[] raises TypeError for ArithmeticSequence as an index. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66478 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- enumerator.c | 2 +- internal.h | 1 + range.c | 3 +++ test/ruby/test_array.rb | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/enumerator.c b/enumerator.c index 338a9e7584..021daeba59 100644 --- a/enumerator.c +++ b/enumerator.c @@ -169,7 +169,7 @@ struct enum_chain { long pos; }; -static VALUE rb_cArithSeq; +VALUE rb_cArithSeq; /* * Enumerator diff --git a/internal.h b/internal.h index b62feb9cf1..433ab6635d 100644 --- a/internal.h +++ b/internal.h @@ -1414,6 +1414,7 @@ void rb_encdb_set_unicode(int index); PUREFUNC(int rb_data_is_encoding(VALUE obj)); /* enum.c */ +extern VALUE rb_cArithSeq; VALUE rb_f_send(int argc, VALUE *argv, VALUE recv); VALUE rb_nmin_run(VALUE obj, VALUE num, int by, int rev, int ary); diff --git a/range.c b/range.c index dab8314400..ac9affd872 100644 --- a/range.c +++ b/range.c @@ -1141,6 +1141,9 @@ rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp) e = RANGE_END(range); excl = EXCL(range); } + else if (RTEST(rb_obj_is_kind_of(range, rb_cArithSeq))) { + return (int)Qfalse; + } else { VALUE x; b = rb_check_funcall(range, id_beg, 0, 0); diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index 4660891e10..0d0fa94de3 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -2244,6 +2244,7 @@ class TestArray < Test::Unit::TestCase def test_aref assert_raise(ArgumentError) { [][0, 0, 0] } + assert_raise(TypeError) { [][(1..10).step(2)] } end def test_fetch -- cgit v1.2.3