Actions
Bug #20285
openStale inline method caches when refinement modules are reopened
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.
Updated by jhawthorn (John Hawthorn) 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.
Updated by jhawthorn (John Hawthorn) 2 months ago
- Related to Bug #11672: refinement added
Updated by jhawthorn (John Hawthorn) 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
Like0
Like0Like0Like0