From 5eacf68c2a918e245625aeac66e7895635662d30 Mon Sep 17 00:00:00 2001 From: wanabe Date: Fri, 31 Oct 2008 03:49:29 +0000 Subject: [PATCH] * 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/trunk@20071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ array.c | 16 +++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a02c4238fa..e8b444932e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Fri Oct 31 12:42:45 2008 wanabe + + * 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. + Fri Oct 31 12:27:52 2008 Yuki Sonoda (Yugui) * spec/default.mspec: supports that the build directory != srcdir. diff --git a/array.c b/array.c index d5da7f1bd1..91bbcf36c1 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)); } }