1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* array.c (rb_ary_dup): make returned array the same class as the original

array [Bug #7768] [ruby-core:51792]
* test/ruby/test_array.rb (class TestArray): add test

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39004 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
charliesome 2013-02-01 14:05:49 +00:00
parent 3fe939564f
commit 86aa98fed4
3 changed files with 15 additions and 1 deletions

View file

@ -1,3 +1,9 @@
Fri Feb 1 23:04:00 2013 Charlie Somerville <charlie@charliesomerville.com>
* array.c (rb_ary_dup): make returned array the same class as the original
array [Bug #7768] [ruby-core:51792]
* test/ruby/test_array.rb (class TestArray): add test
Fri Feb 1 16:35:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Feb 1 16:35:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* marshal.c (r_object0): prohibit setting instance variables of * marshal.c (r_object0): prohibit setting instance variables of

View file

@ -1778,7 +1778,8 @@ rb_ary_empty_p(VALUE ary)
VALUE VALUE
rb_ary_dup(VALUE ary) rb_ary_dup(VALUE ary)
{ {
VALUE dup = rb_ary_new2(RARRAY_LEN(ary)); VALUE ary_class = rb_obj_class(ary);
VALUE dup = ary_new(ary_class ? ary_class : rb_cArray, RARRAY_LEN(ary));
MEMCPY(RARRAY_PTR(dup), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary)); MEMCPY(RARRAY_PTR(dup), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
ARY_SET_LEN(dup, RARRAY_LEN(ary)); ARY_SET_LEN(dup, RARRAY_LEN(ary));
return dup; return dup;

View file

@ -2283,4 +2283,11 @@ class TestArray < Test::Unit::TestCase
assert_include([4, 7], a.bsearch {|x| (2**100).coerce((1 - x / 4) * (2**100)).first }) assert_include([4, 7], a.bsearch {|x| (2**100).coerce((1 - x / 4) * (2**100)).first })
end end
def test_array_uniq_returns_same_class # [ruby-core:51792]
klass = Class.new(Array)
assert_equal klass, klass.new(2).uniq.class
assert_equal klass, klass.new(1).uniq.class
assert_equal klass, klass.new(0).uniq.class
end
end end