Fix issue with Array#rindex when rb_equal modifies receiver array

Fixes [Bug #15951]

Closes: https://github.com/ruby/ruby/pull/2250
This commit is contained in:
Luke Gruber 2019-06-22 11:25:52 -04:00 коммит произвёл Nobuyoshi Nakada
Родитель fd9ac1e76b
Коммит c033dc3073
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4BC7D6DF58D8DF60
2 изменённых файлов: 13 добавлений и 0 удалений

Просмотреть файл

@ -1805,6 +1805,9 @@ rb_ary_rindex(int argc, VALUE *argv, VALUE ary)
if (rb_equal(e, val)) { if (rb_equal(e, val)) {
return LONG2NUM(i); return LONG2NUM(i);
} }
if (i > RARRAY_LEN(ary)) {
break;
}
} }
return Qnil; return Qnil;
} }

Просмотреть файл

@ -1438,6 +1438,16 @@ class TestArray < Test::Unit::TestCase
assert_nil(a.rindex([1,2])) assert_nil(a.rindex([1,2]))
assert_equal(3, a.rindex(99) {|x| x == [1,2,3] }) assert_equal(3, a.rindex(99) {|x| x == [1,2,3] })
bug15951 = "[Bug #15951]"
o2 = Object.new
def o2.==(other)
other.replace([]) if Array === other
false
end
a = Array.new(10)
a.fill(o2)
assert_nil(a.rindex(a), bug15951)
end end
def test_shift def test_shift