@@ -170,13 +170,33 @@ rb_vm_cc_table_dup(VALUE old_table)
170170 return new_table ;
171171}
172172
173+ static void
174+ vm_ccs_invalidate (struct rb_class_cc_entries * ccs )
175+ {
176+ if (ccs -> entries ) {
177+ for (int i = 0 ; i < ccs -> len ; i ++ ) {
178+ const struct rb_callcache * cc = ccs -> entries [i ].cc ;
179+ VM_ASSERT (!vm_cc_super_p (cc ) && !vm_cc_refinement_p (cc ));
180+ vm_cc_invalidate (cc );
181+ }
182+ }
183+ }
184+
185+ void
186+ rb_vm_ccs_invalidate_and_free (struct rb_class_cc_entries * ccs )
187+ {
188+ RB_DEBUG_COUNTER_INC (ccs_free );
189+ vm_ccs_invalidate (ccs );
190+ vm_ccs_free (ccs );
191+ }
192+
173193void
174194rb_vm_cc_table_delete (VALUE table , ID mid )
175195{
176196 struct rb_class_cc_entries * ccs ;
177197 if (rb_managed_id_table_lookup (table , mid , (VALUE * )& ccs )) {
178198 rb_managed_id_table_delete (table , mid );
179- rb_vm_ccs_free (ccs );
199+ rb_vm_ccs_invalidate_and_free (ccs );
180200 }
181201}
182202
@@ -334,7 +354,7 @@ invalidate_method_cache_in_cc_table(VALUE tbl, ID mid)
334354 struct rb_class_cc_entries * ccs = (struct rb_class_cc_entries * )ccs_data ;
335355 rb_yjit_cme_invalidate ((rb_callable_method_entry_t * )ccs -> cme );
336356 if (NIL_P (ccs -> cme -> owner )) invalidate_negative_cache (mid );
337- rb_vm_ccs_free (ccs );
357+ rb_vm_ccs_invalidate_and_free (ccs );
338358 rb_managed_id_table_delete (tbl , mid );
339359 RB_DEBUG_COUNTER_INC (cc_invalidate_leaf_ccs );
340360 }
@@ -1730,8 +1750,8 @@ cached_callable_method_entry(VALUE klass, ID mid)
17301750 return ccs -> cme ;
17311751 }
17321752 else {
1733- rb_vm_ccs_free (ccs );
17341753 rb_managed_id_table_delete (cc_tbl , mid );
1754+ rb_vm_ccs_invalidate_and_free (ccs );
17351755 }
17361756 }
17371757
0 commit comments