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:
parent
299d96cadd
commit
ff7bb4723b
@ -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.
|
||||
|
3
array.c
3
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user