summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2025-10-31 08:08:57 -0700
committerJohn Hawthorn <john@hawthorn.email>2025-10-31 13:32:48 -0700
commitb931199d458fe24167be51157867ec9e6fa12eaa (patch)
treeb898f82aebf41a5c705e5d3f6b8172cccb08a67a
parent4fc9ad5264af5f866520511a58ce57ea3af099cb (diff)
Avoid duping cc table when cme == NULL
-rw-r--r--vm_insnhelper.c22
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))) {