Project

General

Profile

Misc #16961

Updated by k0kubun (Takashi Kokubun) over 4 years ago

## Background 
 * In [Bug #15589], I'm going to make `Integer#zero?` faster (comparable to `== 0`) on JIT by making sure the method is inlinable by MJIT. 
   * Currently `Integer#zero?` is not defined and it's implemented as `Numeric#zero?`. 
   * However, `Numeric#zero?`'s method definition handles not only `Integer` but also `Rational` and `Complex`. Because `rb_equal` which calls `rb_funcall` is used for `Rational` and `Complex`, we can't predict what'd happen there and it prevents `Numeric#zero?` from being inlined by MJIT. Moreover, reducing inlined code size is always good for JIT-ed code. So specializing `Numeric#zero?` to `Integer#zero?` will be beneficial for MJIT's inlining regardless of `rb_funcall`'s presence. 
   * So I'd like to define `Integer#zero?` for optimizing JIT-ed code of `zero?` call against `Integer`. 

 ## Discussion 
 Theoretically, overriding a method in a subclass in Ruby core might change an existing application's behavior (If a user overwrote (In the above background, `Numeric#zero?` could be overridden and then Ruby core overwrote `Integer#zero?`, the user's definition it would get suddenly ignored for Integer). 

 How should we decide whether the change is acceptable or not? Some possible ideas: 

 * Search all gems using gem-codesearch and check if there's any code to be broken. 
   * In `Integer#zero?`'s case I found [this code](https://github.com/ninjudd/rupture/blob/v0.3.0/lib/rupture/core_ext.rb#L18-L20) but it's not gonna be broken by overriding `Integer#zero?`. Other `zero?` method definitions seemed for other classes, but I can double check every occurrence if this will be the measure. 
 * Discuss and make a decision on case-by-case basis. 
   * In `Integer#zero?`'s case we'll discuss whether overriding `Integer#zero?` is acceptable or not. 

Back