From ff7bb4723b88ce6461ef6276a441fae4c69bd71d Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 12 Jun 2013 03:00:24 +0000 Subject: array.c: fix false assertion * array.c (FL_SET_EMBED): shared object is frozen even when get unshared. * array.c (rb_ary_modify): ARY_SET_CAPA needs unshared array. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41245 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ array.c | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 11e4bea721..d5aa621434 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Jun 12 12:00:15 2013 Nobuyoshi Nakada + + * array.c (FL_SET_EMBED): shared object is frozen even when get + unshared. + + * array.c (rb_ary_modify): ARY_SET_CAPA needs unshared array. + Wed Jun 12 07:32:01 2013 Tanaka Akira * random.c (rand_int): Use rb_big_uminus. diff --git a/array.c b/array.c index e8920c08cb..400403e22f 100644 --- a/array.c +++ b/array.c @@ -65,7 +65,6 @@ memfill(register VALUE *mem, register long size, register VALUE val) #define ARY_OWNS_HEAP_P(a) (!FL_TEST((a), ELTS_SHARED|RARRAY_EMBED_FLAG)) #define FL_SET_EMBED(a) do { \ assert(!ARY_SHARED_P(a)); \ - assert(!OBJ_FROZEN(a)); \ FL_SET((a), RARRAY_EMBED_FLAG); \ } while (0) #define FL_UNSET_EMBED(ary) FL_UNSET((ary), RARRAY_EMBED_FLAG|RARRAY_EMBED_LEN_MASK) @@ -279,10 +278,10 @@ rb_ary_modify(VALUE ary) } else if (ARY_SHARED_NUM(shared) == 1 && len > (RARRAY_LEN(shared)>>1)) { long shift = RARRAY_PTR(ary) - RARRAY_PTR(shared); + FL_UNSET_SHARED(ary); ARY_SET_PTR(ary, RARRAY_PTR(shared)); ARY_SET_CAPA(ary, RARRAY_LEN(shared)); MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+shift, VALUE, len); - FL_UNSET_SHARED(ary); FL_SET_EMBED(shared); rb_ary_decrement_share(shared); } -- cgit v1.2.3