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.