summaryrefslogtreecommitdiff
path: root/spec/ruby
diff options
context:
space:
mode:
authorRuby <test@ruby-lang.org>2023-07-26 13:39:31 +0900
committerKoichi Sasada <ko1@atdot.net>2023-07-28 10:51:11 +0900
commitc330037c1a38cc257dbe21022fcc7b13159c2821 (patch)
tree508edd219ceb6c97b83ef8888f505efc4fc95dcf /spec/ruby
parent44b19b01e22c0e2b24e97cbcab80aee953f978fd (diff)
`cc->cme` should not be marked.
cc is callcache. cc->klass (klass) should not be marked because if the klass is free'ed, the cc->klass will be cleared by `vm_cc_invalidate()`. cc->cme (cme) should not be marked because if cc is invalidated when cme is free'ed. - klass marks cme if klass uses cme. - caller classe's ccs->cme marks cc->cme. - if cc is invalidated (klass doesn't refer the cc), cc is invalidated by `vm_cc_invalidate()` and cc->cme is not be accessed. - On the multi-Ractors, cme will be collected with global GC so that it is safe if GC is not interleaving while accessing cc and cme. fix [Bug #19436] ```ruby 10_000.times{|i| # p i if (i%1_000) == 0 str = "x" * 1_000_000 def str.foo = nil eval "def call#{i}(s) = s.foo" send "call#{i}", str } ``` Without this patch: ``` real 1m5.639s user 0m6.637s sys 0m58.292s ``` and with this patch: ``` real 0m2.045s user 0m1.627s sys 0m0.164s ```
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8120
Diffstat (limited to 'spec/ruby')
0 files changed, 0 insertions, 0 deletions