|
29 | 29 | #include "ruby/st.h" |
30 | 30 | #include "ruby/thread.h" |
31 | 31 | #include "ruby/util.h" |
| 32 | +#include "ruby/ractor.h" |
32 | 33 | #include "vm_core.h" |
33 | 34 | #include "builtin.h" |
34 | 35 |
|
@@ -107,10 +108,12 @@ should_be_T_ARRAY(VALUE ary) |
107 | 108 | } while (0) |
108 | 109 | #define FL_UNSET_SHARED(ary) FL_UNSET((ary), RARRAY_SHARED_FLAG) |
109 | 110 |
|
| 111 | +#define ARY_SET_PTR_FORCE(ary, p) \ |
| 112 | + RARRAY(ary)->as.heap.ptr = (p); |
110 | 113 | #define ARY_SET_PTR(ary, p) do { \ |
111 | 114 | RUBY_ASSERT(!ARY_EMBED_P(ary)); \ |
112 | 115 | RUBY_ASSERT(!OBJ_FROZEN(ary)); \ |
113 | | - RARRAY(ary)->as.heap.ptr = (p); \ |
| 116 | + ARY_SET_PTR_FORCE(ary, p); \ |
114 | 117 | } while (0) |
115 | 118 | #define ARY_SET_EMBED_LEN(ary, n) do { \ |
116 | 119 | long tmp_n = (n); \ |
@@ -148,11 +151,13 @@ should_be_T_ARRAY(VALUE ary) |
148 | 151 |
|
149 | 152 | #define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? ary_embed_capa(ary) : \ |
150 | 153 | ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : ARY_HEAP_CAPA(ary)) |
| 154 | +#define ARY_SET_CAPA_FORCE(ary, n) \ |
| 155 | + RARRAY(ary)->as.heap.aux.capa = (n); |
151 | 156 | #define ARY_SET_CAPA(ary, n) do { \ |
152 | 157 | RUBY_ASSERT(!ARY_EMBED_P(ary)); \ |
153 | 158 | RUBY_ASSERT(!ARY_SHARED_P(ary)); \ |
154 | 159 | RUBY_ASSERT(!OBJ_FROZEN(ary)); \ |
155 | | - RARRAY(ary)->as.heap.aux.capa = (n); \ |
| 160 | + ARY_SET_CAPA_FORCE(ary, n); \ |
156 | 161 | } while (0) |
157 | 162 |
|
158 | 163 | #define ARY_SHARED_ROOT_OCCUPIED(ary) (!OBJ_FROZEN(ary) && ARY_SHARED_ROOT_REFCNT(ary) == 1) |
@@ -560,8 +565,8 @@ rb_ary_cancel_sharing(VALUE ary) |
560 | 565 | VALUE *ptr = ary_heap_alloc_buffer(len); |
561 | 566 | MEMCPY(ptr, ARY_HEAP_PTR(ary), VALUE, len); |
562 | 567 | rb_ary_unshare(ary); |
563 | | - ARY_SET_CAPA(ary, len); |
564 | | - ARY_SET_PTR(ary, ptr); |
| 568 | + ARY_SET_CAPA_FORCE(ary, len); |
| 569 | + ARY_SET_PTR_FORCE(ary, ptr); |
565 | 570 | } |
566 | 571 |
|
567 | 572 | rb_gc_writebarrier_remember(ary); |
@@ -4729,6 +4734,8 @@ rb_ary_replace(VALUE copy, VALUE orig) |
4729 | 4734 | ARY_SET_PTR(copy, ARY_HEAP_PTR(orig)); |
4730 | 4735 | ARY_SET_LEN(copy, ARY_HEAP_LEN(orig)); |
4731 | 4736 | rb_ary_set_shared(copy, shared_root); |
| 4737 | + |
| 4738 | + RUBY_ASSERT(RB_OBJ_SHAREABLE_P(copy) ? RB_OBJ_SHAREABLE_P(shared_root) : 1); |
4732 | 4739 | } |
4733 | 4740 | ary_verify(copy); |
4734 | 4741 | return copy; |
@@ -8883,7 +8890,7 @@ Init_Array(void) |
8883 | 8890 |
|
8884 | 8891 | rb_define_method(rb_cArray, "deconstruct", rb_ary_deconstruct, 0); |
8885 | 8892 |
|
8886 | | - rb_cArray_empty_frozen = rb_ary_freeze(rb_ary_new()); |
| 8893 | + rb_cArray_empty_frozen = RB_OBJ_SET_SHAREABLE(rb_ary_freeze(rb_ary_new())); |
8887 | 8894 | rb_vm_register_global_object(rb_cArray_empty_frozen); |
8888 | 8895 | } |
8889 | 8896 |
|
|
0 commit comments