Project

General

Profile

Actions

Bug #20285

open

Stale inline method caches when refinement modules are reopened

Added by jhawthorn (John Hawthorn) about 2 months ago. Updated about 2 months ago.


Description

This is essentially the same issue as #11672, but for inline method caches rather than class caches.

In Ruby 3.3 we started using inline caches for refinements. However, we weren't clearing inline caches when defined on a reopened refinement module.

class C
end

module R
  refine C do
    def m
      :foo
    end
  end
end

using R
def m
  C.new.m
end

raise unless :foo == m()

module R
  refine C do
    alias m m
    def m
      :bar
    end
  end
end

v = m()
raise "expected :bar, got #{v.inspect}" unless :bar == v

This will raise in Ruby 3.3 as the inline cache finds a stale refinement, but passes in previous versions.


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #11672: refinement Closedko1 (Koichi Sasada)Actions

Updated by jhawthorn (John Hawthorn) about 2 months ago

  • Backport changed from 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: UNKNOWN to 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED

Fixed by https://github.com/ruby/ruby/pull/10037

I'll mark this as requiring a backport for 3.3, but I think there's probably minimal impact from this issue.

Actions #2

Updated by jhawthorn (John Hawthorn) about 2 months ago

Actions #3

Updated by jhawthorn (John Hawthorn) about 2 months ago

  • Subject changed from Stale inline method caches when refinement modules are reloaded to Stale inline method caches when refinement modules are reopened
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0