Skip to content

Commit ae84505

Browse files
committed
WIP
1 parent 19daac5 commit ae84505

3 files changed

Lines changed: 23 additions & 41 deletions

File tree

imemo.c

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -516,41 +516,6 @@ rb_free_const_table(struct rb_id_table *tbl)
516516
rb_id_table_free(tbl);
517517
}
518518

519-
// alive: if false, target pointers can be freed already.
520-
static void
521-
vm_ccs_free(struct rb_class_cc_entries *ccs, int alive, VALUE klass)
522-
{
523-
if (ccs->entries) {
524-
for (int i=0; i<ccs->len; i++) {
525-
const struct rb_callcache *cc = ccs->entries[i].cc;
526-
if (!alive) {
527-
// ccs can be free'ed.
528-
if (rb_gc_pointer_to_heap_p((VALUE)cc) &&
529-
!rb_objspace_garbage_object_p((VALUE)cc) &&
530-
IMEMO_TYPE_P(cc, imemo_callcache) &&
531-
cc->klass == klass) {
532-
// OK. maybe target cc.
533-
}
534-
else {
535-
continue;
536-
}
537-
}
538-
539-
VM_ASSERT(!vm_cc_super_p(cc) && !vm_cc_refinement_p(cc));
540-
vm_cc_invalidate(cc);
541-
}
542-
ruby_xfree(ccs->entries);
543-
}
544-
ruby_xfree(ccs);
545-
}
546-
547-
void
548-
rb_vm_ccs_free(struct rb_class_cc_entries *ccs)
549-
{
550-
RB_DEBUG_COUNTER_INC(ccs_free);
551-
vm_ccs_free(ccs, true, Qundef);
552-
}
553-
554519
static inline void
555520
imemo_fields_free(struct rb_fields *fields)
556521
{

vm_callinfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,4 @@ vm_cc_check_cme(const struct rb_callcache *cc, const rb_callable_method_entry_t
626626

627627
#endif
628628

629-
// gc.c
630-
void rb_vm_ccs_free(struct rb_class_cc_entries *ccs);
631-
632629
#endif /* RUBY_VM_CALLINFO_H */

vm_method.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
173193
void
174194
rb_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

Comments
 (0)