prohibit load by `autoload` on non-main Ractor

fix [Bug #18120]
This commit is contained in:
Koichi Sasada 2021-12-15 01:11:45 +09:00
Родитель 2e6e2fd9da
Коммит 397a509b6d
2 изменённых файлов: 15 добавлений и 0 удалений

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

@ -211,6 +211,17 @@ assert_equal '[:a, :b, :c, :d, :e, :f, :g]', %q{
Ractor.make_shareable(closure).call Ractor.make_shareable(closure).call
} }
# Now autoload in non-main Ractor is not supported
assert_equal 'ok', %q{
autoload :Foo, 'foo.rb'
r = Ractor.new do
p Foo
rescue Ractor::UnsafeError
:ok
end
r.take
}
### ###
### ###
# Ractor still has several memory corruption so skip huge number of tests # Ractor still has several memory corruption so skip huge number of tests

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

@ -2553,6 +2553,10 @@ rb_autoload_load(VALUE mod, ID id)
src = rb_sourcefile(); src = rb_sourcefile();
if (src && loading && strcmp(src, loading) == 0) return Qfalse; if (src && loading && strcmp(src, loading) == 0) return Qfalse;
if (UNLIKELY(!rb_ractor_main_p())) {
rb_raise(rb_eRactorUnsafeError, "require by autoload on non-main Ractor is not supported (%s)", rb_id2name(id));
}
if ((ce = rb_const_lookup(mod, id))) { if ((ce = rb_const_lookup(mod, id))) {
flag = ce->flag & (CONST_DEPRECATED | CONST_VISIBILITY_MASK); flag = ce->flag & (CONST_DEPRECATED | CONST_VISIBILITY_MASK);
} }