diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | array.c | 5 |
2 files changed, 12 insertions, 1 deletions
@@ -1,3 +1,11 @@ +Mon Jan 31 04:45:12 2011 NARUSE, Yui <naruse@ruby-lang.org> + + * array.c (rb_ary_uniq_bang): call ARY_SET_LEN(ary, 0) before + rb_resize_capa because rb_resize_capa expects resized length is + smaller than current array length. call rb_ary_unshare before + rb_resize_capa because rb_resize_capa losts the reference to + original shared array. + Sun Jan 30 17:19:46 2011 Tanaka Akira <akr@fsij.org> * missing/crypt.c: parenthesize macro arguments. @@ -3484,8 +3484,11 @@ rb_ary_uniq_bang(VALUE ary) if (RARRAY_LEN(ary) == (i = RHASH_SIZE(hash))) { return Qnil; } - ary_resize_capa(ary, i); ARY_SET_LEN(ary, 0); + if (ARY_SHARED_P(ary) && !ARY_EMBED_P(ary)) { + rb_ary_unshare(ary); + } + ary_resize_capa(ary, i); st_foreach(RHASH_TBL(hash), push_value, ary); } else { |