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
This commit is contained in:
nobu 2013-06-12 03:00:24 +00:00
parent 299d96cadd
commit ff7bb4723b
2 changed files with 8 additions and 2 deletions

View File

@ -1,3 +1,10 @@
Wed Jun 12 12:00:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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 <akr@fsij.org>
* random.c (rand_int): Use rb_big_uminus.

View File

@ -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);
}