diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-31 13:56:07 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-31 13:56:07 +0000 |
commit | 9ebb8799041fe9ad3064dbfa32d1f8ba53d964ab (patch) | |
tree | e0bac940f5944a01d82ffaa3a860b6ce878f7042 /array.c | |
parent | 670c707a2fbd2dfb9289c703ed4b1eb613abcd11 (diff) |
merges r20071 from trunk into ruby_1_9_1.
* array.c (rb_ary_decrement_share): fix to work recycling
shared-array without the following. [ruby-dev:36991]
* array.c (ary_make_substitution): don't recycle substitution array.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@20081 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -177,7 +177,7 @@ rb_ary_decrement_share(VALUE shared) { if (shared) { int num = ARY_SHARED_NUM(shared) - 1; - if (num == 0 && RBASIC(shared)->klass) { + if (num == 0) { rb_ary_free(shared); rb_gc_force_recycle(shared); } @@ -202,13 +202,19 @@ rb_ary_unshare_safe(VALUE ary) { } } -static void -rb_ary_set_shared(VALUE ary, VALUE shared) -{ +static VALUE +rb_ary_increment_share(VALUE shared) { int num = ARY_SHARED_NUM(shared); if (num >= 0) { ARY_SET_SHARED_NUM(shared, num + 1); } + return shared; +} + +static void +rb_ary_set_shared(VALUE ary, VALUE shared) +{ + rb_ary_increment_share(shared); FL_SET_SHARED(ary); ARY_SET_SHARED(ary, shared); } @@ -396,7 +402,7 @@ ary_make_substitution(VALUE ary) return subst; } else { - return ary_make_shared(ary); + return rb_ary_increment_share(ary_make_shared(ary)); } } |