@@ -2263,6 +2263,8 @@ struct cross_ractor_require {
22632263 // autoload
22642264 VALUE module ;
22652265 ID name ;
2266+
2267+ bool silent ;
22662268};
22672269
22682270static void
@@ -2294,7 +2296,14 @@ require_body(VALUE data)
22942296
22952297 ID require ;
22962298 CONST_ID (require , "require" );
2297- crr -> result = rb_funcallv (Qnil , require , 1 , & crr -> feature );
2299+
2300+ if (crr -> silent ) {
2301+ int rb_require_internal_silent (VALUE fname );
2302+ crr -> result = INT2NUM (rb_require_internal_silent (crr -> feature ));
2303+ }
2304+ else {
2305+ crr -> result = rb_funcallv (Qnil , require , 1 , & crr -> feature );
2306+ }
22982307
22992308 return Qnil ;
23002309}
@@ -2338,10 +2347,21 @@ ractor_require_protect(VALUE crr_obj, VALUE (*func)(VALUE))
23382347 struct cross_ractor_require * crr ;
23392348 TypedData_Get_Struct (crr_obj , struct cross_ractor_require , & cross_ractor_require_data_type , crr );
23402349
2350+ VALUE debug , errinfo ;
2351+ if (crr -> silent ) {
2352+ debug = ruby_debug ;
2353+ errinfo = rb_errinfo ();
2354+ }
2355+
23412356 // catch any error
23422357 rb_rescue2 (func , (VALUE )crr ,
23432358 require_rescue , (VALUE )crr , rb_eException , 0 );
23442359
2360+ if (crr -> silent ) {
2361+ ruby_debug = debug ;
2362+ rb_set_errinfo (errinfo );
2363+ }
2364+
23452365 rb_rescue2 (require_result_copy_body , (VALUE )crr ,
23462366 require_result_copy_resuce , (VALUE )crr , rb_eException , 0 );
23472367
@@ -2357,8 +2377,11 @@ ractor_require_func(void *crr_obj)
23572377}
23582378
23592379VALUE
2360- rb_ractor_require (VALUE feature )
2380+ rb_ractor_require (VALUE feature , bool silent )
23612381{
2382+ // We're about to block on the main ractor, so if we're holding the global lock we'll deadlock.
2383+ ASSERT_vm_unlocking ();
2384+
23622385 struct cross_ractor_require * crr ;
23632386 VALUE crr_obj = TypedData_Make_Struct (0 , struct cross_ractor_require , & cross_ractor_require_data_type , crr );
23642387 FL_SET_RAW (crr_obj , RUBY_FL_SHAREABLE );
@@ -2368,6 +2391,7 @@ rb_ractor_require(VALUE feature)
23682391 crr -> port = ractor_port_new (GET_RACTOR ());
23692392 crr -> result = Qundef ;
23702393 crr -> exception = Qundef ;
2394+ crr -> silent = silent ;
23712395
23722396 rb_execution_context_t * ec = GET_EC ();
23732397 rb_ractor_t * main_r = GET_VM ()-> ractor .main_ractor ;
@@ -2395,7 +2419,7 @@ rb_ractor_require(VALUE feature)
23952419static VALUE
23962420ractor_require (rb_execution_context_t * ec , VALUE self , VALUE feature )
23972421{
2398- return rb_ractor_require (feature );
2422+ return rb_ractor_require (feature , false );
23992423}
24002424
24012425static VALUE
0 commit comments