summaryrefslogtreecommitdiff
path: root/imemo.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-09-09 12:11:30 -0400
committerPeter Zhu <[email protected]>2024-09-10 10:09:50 -0400
commit22f12b0a62c512f115cd60d4192e53921b11f0c7 (patch)
treea88d0324e549f926d18ee94e90a10efc456cb6e0 /imemo.c
parenta79907ed5e8014215a658f4731ff33df3aca9eaa (diff)
Use rb_id_table_foreach_values for marking CC table
We don't use the key, so we can speed it up by not needing to convert the key to ID in the iterator.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/11580
Diffstat (limited to 'imemo.c')
-rw-r--r--imemo.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/imemo.c b/imemo.c
index bf852e8809..ac094eb931 100644
--- a/imemo.c
+++ b/imemo.c
@@ -179,11 +179,17 @@ rb_imemo_memsize(VALUE obj)
* ========================================================================= */
static enum rb_id_table_iterator_result
-cc_table_mark_i(ID id, VALUE ccs_ptr, void *data)
+cc_table_mark_i(VALUE ccs_ptr, void *data)
{
struct rb_class_cc_entries *ccs = (struct rb_class_cc_entries *)ccs_ptr;
VM_ASSERT(vm_ccs_p(ccs));
- VM_ASSERT(id == ccs->cme->called_id);
+#if VM_CHECK_MODE > 0
+ VALUE klass = (VALUE)data;
+
+ VALUE lookup_val;
+ VM_ASSERT(rb_id_table_lookup(RCLASS_CC_TBL(klass), ccs->cme->called_id, &lookup_val));
+ VM_ASSERT(lookup_val == ccs_ptr);
+#endif
if (METHOD_ENTRY_INVALIDATED(ccs->cme)) {
rb_vm_ccs_free(ccs);
@@ -193,7 +199,7 @@ cc_table_mark_i(ID id, VALUE ccs_ptr, void *data)
rb_gc_mark_movable((VALUE)ccs->cme);
for (int i=0; i<ccs->len; i++) {
- VM_ASSERT((VALUE)data == ccs->entries[i].cc->klass);
+ VM_ASSERT(klass == ccs->entries[i].cc->klass);
VM_ASSERT(vm_cc_check_cme(ccs->entries[i].cc, ccs->cme));
rb_gc_mark_movable((VALUE)ccs->entries[i].cc);
@@ -207,7 +213,7 @@ rb_cc_table_mark(VALUE klass)
{
struct rb_id_table *cc_tbl = RCLASS_CC_TBL(klass);
if (cc_tbl) {
- rb_id_table_foreach(cc_tbl, cc_table_mark_i, (void *)klass);
+ rb_id_table_foreach_values(cc_tbl, cc_table_mark_i, (void *)klass);
}
}