diff options
Diffstat (limited to 'ractor.c')
| -rw-r--r-- | ractor.c | 23 |
1 files changed, 10 insertions, 13 deletions
@@ -3045,7 +3045,7 @@ rb_obj_traverse(VALUE obj, } static int -frozen_shareable_p(VALUE obj, bool *made_shareable) +allow_frozen_shareable_p(VALUE obj) { if (!RB_TYPE_P(obj, T_DATA)) { return true; @@ -3055,13 +3055,6 @@ frozen_shareable_p(VALUE obj, bool *made_shareable) if (type->flags & RUBY_TYPED_FROZEN_SHAREABLE) { return true; } - else if (made_shareable && rb_obj_is_proc(obj)) { - // special path to make shareable Proc. - rb_proc_ractor_make_shareable(obj); - *made_shareable = true; - VM_ASSERT(RB_OBJ_SHAREABLE_P(obj)); - return false; - } } return false; @@ -3071,20 +3064,24 @@ static enum obj_traverse_iterator_result make_shareable_check_shareable(VALUE obj) { VM_ASSERT(!SPECIAL_CONST_P(obj)); - bool made_shareable = false; if (rb_ractor_shareable_p(obj)) { return traverse_skip; } - if (!frozen_shareable_p(obj, &made_shareable)) { - if (made_shareable) { - return traverse_skip; + else if (!allow_frozen_shareable_p(obj)) { + if (rb_obj_is_proc(obj)) { + rb_proc_ractor_make_shareable(obj); + return traverse_cont; } else { rb_raise(rb_eRactorError, "can not make shareable object for %"PRIsVALUE, obj); } } + if (RB_TYPE_P(obj, T_IMEMO)) { + return traverse_skip; + } + if (!RB_OBJ_FROZEN_RAW(obj)) { rb_funcall(obj, idFreeze, 0); @@ -3156,7 +3153,7 @@ shareable_p_enter(VALUE obj) return traverse_skip; } else if (RB_OBJ_FROZEN_RAW(obj) && - frozen_shareable_p(obj, NULL)) { + allow_frozen_shareable_p(obj)) { return traverse_cont; } |
