Actions
Bug #20285
closedStale 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) 10 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) 10 months ago
- Related to Bug #11672: refinement added
Updated by jhawthorn (John Hawthorn) 10 months ago
- Subject changed from Stale inline method caches when refinement modules are reloaded to Stale inline method caches when refinement modules are reopened
Updated by k0kubun (Takashi Kokubun) 7 months ago
- Status changed from Assigned to Closed
Updated by k0kubun (Takashi Kokubun) 7 months ago
- Backport changed from 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED to 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONE
05787897f69087abdabee926971cdf364bd73730 seems to have backported this to ruby_3_3
.
Updated by k0kubun (Takashi Kokubun) 7 months ago
- Is duplicate of Bug #20246: Unexpected behavior for Regexp in Subexpression Calls on Ruby 3.3.0 added
Actions
Like0
Like0Like0Like0Like0Like0Like0