diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-12-01 11:14:36 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-12-01 13:18:32 +0900 |
commit | 8247b8eddeb2a504a5c9776d1f77d413c8146897 (patch) | |
tree | a0464f31f918b06b6d5a377aed8a3d173a61f9dc /ractor.c | |
parent | d2cfb5228a89678a712efd381e049391800373e1 (diff) |
should not use rb_ary_modify()
ractor_copy() used rb_ary_modify() to make sure this array is not
sharing anything, but it also checks frozen flag. So frozen arrays
raises an error. To solve this issue, this patch introduces new
function rb_ary_cancel_sharing() which makes sure the array does not
share another array and it doesn't check frozen flag.
[Bug #17343]
A test is quoted from https://github.com/ruby/ruby/pull/3817
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3831
Diffstat (limited to 'ractor.c')
-rw-r--r-- | ractor.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -2314,7 +2314,7 @@ obj_traverse_replace_i(VALUE obj, struct obj_traverse_replace_data *data) case T_ARRAY: { - rb_ary_modify(obj); + rb_ary_cancel_sharing(obj); #if USE_TRANSIENT_HEAP if (data->move) rb_ary_transient_heap_evacuate(obj, TRUE); #endif @@ -2537,7 +2537,8 @@ copy_leave(VALUE obj, struct obj_traverse_replace_data *data) return traverse_cont; } -static VALUE ractor_copy(VALUE obj) +static VALUE +ractor_copy(VALUE obj) { VALUE val = rb_obj_traverse_replace(obj, copy_enter, copy_leave, false); if (val != Qundef) { |