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)
```
This commit is contained in:
yui-knk 2024-01-05 19:45:19 +09:00 коммит произвёл Yuichiro Kaneko
Родитель e7b0a01002
Коммит bf72cb84ca
2 изменённых файлов: 27 добавлений и 1 удалений

Просмотреть файл

@ -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 {

Просмотреть файл

@ -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