Project

General

Profile

Actions

Misc #16961

closed

Is overriding a method in a subclass considered as a breaking change or not?

Added by k0kubun (Takashi Kokubun) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Assignee:
-
[ruby-core:98796]

Description

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 Numeric#zero? and then Ruby core overwrote Integer#zero?, the user's definition 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 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.
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0