summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-31 13:56:07 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-31 13:56:07 +0000
commit9ebb8799041fe9ad3064dbfa32d1f8ba53d964ab (patch)
treee0bac940f5944a01d82ffaa3a860b6ce878f7042 /array.c
parent670c707a2fbd2dfb9289c703ed4b1eb613abcd11 (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.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/array.c b/array.c
index 732b981b29..3fbcf640bd 100644
--- a/array.c
+++ b/array.c
@@ -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));
}
}