Optimize callcache invalidation for refinements

Fixes [Bug #21201]

This change addresses a performance regression where defining methods
inside `refine` blocks caused severe slowdowns. The issue was due to
`rb_clear_all_refinement_method_cache()` triggering a full object
space scan via `rb_objspace_each_objects` to find and invalidate
affected callcaches, which is very inefficient.

To fix this, I introduce `vm->cc_refinement_table` to track
callcaches related to refinements. This allows us to invalidate
only the necessary callcaches without scanning the entire heap,
resulting in significant performance improvement.
This commit is contained in:
alpaca-tc 2025-04-06 01:50:08 +09:00 committed by Koichi Sasada
parent d0b5f31554
commit c8ddc0a843
Notes: git 2025-06-09 03:33:51 +00:00
9 changed files with 111 additions and 17 deletions

6
st.c
View file

@ -2465,6 +2465,12 @@ set_init_numtable(void)
return set_init_table_with_size(NULL, &type_numhash, 0);
}
set_table *
set_init_numtable_with_size(st_index_t size)
{
return set_init_table_with_size(NULL, &type_numhash, size);
}
size_t
set_table_size(const struct set_table *tbl)
{