From: yui-knk Date: Fri, 5 Jan 2024 10:45:19 +0000 (+0900) Subject: Include the first constant name into `Ractor::IsolationError` message X-Git-Tag: v3_4_0_preview1~2080 X-Git-Url: https://repo.or.cz/ruby.git/commitdiff_plain/bf72cb84ca52bc062cc1711c03622ed6c928fed8 Include the first constant name into `Ractor::IsolationError` message If lhs of assignment is top-level constant reference, the first constant name is omitted from error message. This commit fixes it. ``` # shareable_constant_value: literal ::C = ["Not " + "shareable"] # Before # => cannot assign unshareable object to (Ractor::IsolationError) # After # => cannot assign unshareable object to ::C (Ractor::IsolationError) ``` --- diff --git a/ruby_parser.c b/ruby_parser.c index 04a49da0ec..c48f563744 100644 --- a/ruby_parser.c +++ b/ruby_parser.c @@ -1060,6 +1060,7 @@ rb_node_const_decl_val(const NODE *node) } else if (n && nd_type_p(n, NODE_COLON3)) { // ::Const::Name + rb_ary_push(path, rb_id2str(RNODE_COLON3(n)->nd_mid)); rb_ary_push(path, rb_str_new(0, 0)); } else { diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index 6b8c196a84..b6d306352c 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -1537,12 +1537,37 @@ x = __ENCODING__ end def test_shareable_constant_value_unshareable_literal - assert_raise_separately(Ractor::IsolationError, /unshareable/, + assert_raise_separately(Ractor::IsolationError, /unshareable object to C/, "#{<<~"begin;"}\n#{<<~'end;'}") begin; # shareable_constant_value: literal C = ["Not " + "shareable"] end; + + assert_raise_separately(Ractor::IsolationError, /unshareable object to B::C/, + "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + # shareable_constant_value: literal + B = Class.new + B::C = ["Not " + "shareable"] + end; + + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + assert_raise_with_message(Ractor::IsolationError, /unshareable object to ::C/) do + # shareable_constant_value: literal + ::C = ["Not " + "shareable"] + end + end; + + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + assert_raise_with_message(Ractor::IsolationError, /unshareable object to ::B::C/) do + # shareable_constant_value: literal + ::B = Class.new + ::B::C = ["Not " + "shareable"] + end + end; end def test_shareable_constant_value_nonliteral