Project

General

Profile

Feature #20429

Updated by byroot (Jean Boussier) 7 months ago

MRI has a number of core methods with special handling in the interpreter and both JITs that if they are redefined negatively impact Ruby performance. 

 The methods currently are (I may be missing a few): 

   - `Integer`: `#+`, `#-`, `#*`, `#/`, `#%`, `#<`, `#>`, `#<=`, `#>=` 
   - `Float`: `#+`, `#-`, `#*`, `#/`, `#<`, `#>`, `#<=`, `#>=` 
   - `String`: `#freeze`, `#size`, `#length`, `#empty?`, `#+`, `#succ`, `#%`, `#-@` 
   - `Array`: `#size`, `#length`, `#empty?`, `#hash` 
   - `Hash`: `Array`: `#size`, `#length`, `#empty?`, `#[]`, `#[]=` 


 Noticing that a dependency do redefine one of these methods can be non-trivial, so I'd like to emit a `:performance` warning when it happens. 

 I can't really think of much reasons to redefine these aside from fun hacks, so I believe discouraging it would be valuable. 

 Patch: https://github.com/ruby/ruby/pull/10532 

Back