diff options
| author | John Hawthorn <john@hawthorn.email> | 2025-10-31 08:08:57 -0700 |
|---|---|---|
| committer | John Hawthorn <john@hawthorn.email> | 2025-10-31 13:32:48 -0700 |
| commit | b931199d458fe24167be51157867ec9e6fa12eaa (patch) | |
| tree | b898f82aebf41a5c705e5d3f6b8172cccb08a67a | |
| parent | 4fc9ad5264af5f866520511a58ce57ea3af099cb (diff) | |
Avoid duping cc table when cme == NULL
| -rw-r--r-- | vm_insnhelper.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 1f6eb9222c..27177d9b13 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2143,17 +2143,6 @@ vm_populate_cc(VALUE klass, const struct rb_callinfo * const ci, ID mid) { ASSERT_vm_locking(); - VALUE cc_tbl = RCLASS_WRITABLE_CC_TBL(klass); - const VALUE original_cc_table = cc_tbl; - struct rb_class_cc_entries *ccs = NULL; - - if (!cc_tbl) { - cc_tbl = rb_vm_cc_table_create(1); - } - else if (rb_multi_ractor_p()) { - cc_tbl = rb_vm_cc_table_dup(cc_tbl); - } - RB_DEBUG_COUNTER_INC(cc_not_found_in_ccs); const rb_callable_method_entry_t *cme = rb_callable_method_entry(klass, mid); @@ -2166,12 +2155,23 @@ vm_populate_cc(VALUE klass, const struct rb_callinfo * const ci, ID mid) return &vm_empty_cc; } + VALUE cc_tbl = RCLASS_WRITABLE_CC_TBL(klass); + const VALUE original_cc_table = cc_tbl; + if (!cc_tbl) { + // Is this possible after rb_callable_method_entry ? + cc_tbl = rb_vm_cc_table_create(1); + } + else if (rb_multi_ractor_p()) { + cc_tbl = rb_vm_cc_table_dup(cc_tbl); + } + VM_ASSERT(cme == rb_callable_method_entry(klass, mid)); METHOD_ENTRY_CACHED_SET((struct rb_callable_method_entry_struct *)cme); VM_ASSERT(cc_tbl); + struct rb_class_cc_entries *ccs = NULL; { VALUE ccs_obj; if (UNLIKELY(rb_managed_id_table_lookup(cc_tbl, mid, &ccs_obj))) { |
