Project

General

Profile

Bug #21830

Updated by fxn (Xavier Noria) 1 day ago

If you enable `Ruby::Box`, decorations to `Kernel#require` do not work. 

 For example, given _foo.rb_: `foo.rb`: 

 ```ruby 
 # foo.rb 

 % cat foo.rb 
 module M 
   def require(_path) 
     puts 'decorated' "decorated" 
     super 
   end 
 end 

 Kernel.prepend(M) 

 p require 'tsort' 
 ``` 

 the decoration works normally: 

 ``` 
 % ruby -v foo.rb 
 ruby 4.0.0 (2025-12-25 revision 553f1675f3) +YJIT +PRISM [arm64-darwin25] 
 decorated 
 true 
 ``` 

 but it and the same code does not work with the feature enabled: 

 ``` 
 % RUBY_BOX=1 ruby -v foo.rb 
 ruby 4.0.0 (2025-12-25 revision 553f1675f3) +YJIT +PRISM [arm64-darwin25] 
 ruby: warning: Ruby::Box is experimental, and the behavior may change in the future! 
 See https://docs.ruby-lang.org/en/4.0/Ruby/Box.html for known issues, etc. 
 true 
 ``` 

 With this, Zeitwerk cannot work because it totally depends on a `Kernel#require` decoration of `Kernel#require` (done [here](https://github.com/fxn/zeitwerk/blob/main/lib/zeitwerk/core_ext/kernel.rb)). 

 Bootsnap also depends on the ability of decorating `Kernel#require` (done [here](https://github.com/rails/bootsnap/blob/main/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb)). 

 On one hand, these gems are walking a fine line in the border of the public interface of Ruby. On the other hand, it is a goal of boxes to be transparent to the code being loaded under them. 

 @tagomoris (Satoshi Tagomori) what should be the way to go in your opinion? 

 /cc @byroot (Jean Boussier)

Back