diff options
author | Koichi Sasada <[email protected]> | 2024-11-05 04:54:06 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2024-11-08 18:02:46 +0900 |
commit | aa63699d10e489bc6d9c13406fc47f581001568b () | |
tree | c01cefb86da657d39e3a8f50771cb84827d5b003 /load.c | |
parent | 075a102c937969c62a6798b32b3c3188df91a075 (diff) |
support `require` in non-main Ractors
Many libraries should be loaded on the main ractor because of setting constants with unshareable objects and so on. This allows to call `requore` on non-main Ractors by asking the main ractor to call `require` on it. The calling ractor waits for the result of `require` from the main ractor. If the `require` call failed with some reasons, an exception objects will be deliverred from the main ractor to the calling ractor if it is copy-able. Same on `require_relative` and `require` by `autoload`. Now `Ractor.new{pp obj}` works well (the first call of `pp` requires `pp` library implicitly). [Feature #20627]
Notes: Merged: https://.com/ruby/ruby/pull/11142
-rw-r--r-- | load.c | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -18,6 +18,7 @@ #include "darray.h" #include "ruby/encoding.h" #include "ruby/util.h" static VALUE ruby_dln_libmap; @@ -1383,17 +1384,25 @@ static VALUE rb_require_string_internal(VALUE fname, bool resurrect) { rb_execution_context_t *ec = GET_EC(); - int result = require_internal(ec, fname, 1, RTEST(ruby_verbose)); - if (result > TAG_RETURN) { - EC_JUMP_TAG(ec, result); - } - if (result < 0) { if (resurrect) fname = rb_str_resurrect(fname); - load_failed(fname); } - return RBOOL(result); } VALUE |