From 82bb954c23c1a38ec051971530e0549936e5e784 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 17 Mar 2026 08:39:21 +0900 Subject: [PATCH] vm.c: extract vm_define_method() to consolidate OP_TDEF and OP_SDEF Co-authored-by: Claude --- src/vm.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/vm.c b/src/vm.c index 145596587..ffefc6799 100644 --- a/src/vm.c +++ b/src/vm.c @@ -2112,6 +2112,21 @@ vm_op_div(mrb_state *mrb, uint32_t a, mrb_sym *midp) return VM_NEXT; } +static mrb_sym +vm_define_method(mrb_state *mrb, struct RClass *tc, const mrb_irep *irep, uint16_t b, uint16_t c) +{ + struct RProc *p = mrb_proc_new(mrb, irep->reps[c]); + mrb_sym mid = irep->syms[b]; + mrb_method_t m; + + p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT; + MRB_METHOD_FROM_PROC(m, p); + MRB_METHOD_SET_VISIBILITY(m, MRB_METHOD_VDEFAULT_FL); + mrb_define_method_raw(mrb, tc, mid, m); + mrb_method_added(mrb, tc, mid); + return mid; +} + /** * @brief Executes a sequence of mruby bytecode instructions. * @@ -3647,17 +3662,8 @@ RETRY_TRY_BLOCK: CASE(OP_TDEF, BBB) { struct RClass *tc = check_target_class(mrb); - struct RProc *p; - mrb_method_t m; - if (mrb_unlikely(!tc)) goto L_RAISE; - p = mrb_proc_new(mrb, irep->reps[c]); - mid = irep->syms[b]; - p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT; - MRB_METHOD_FROM_PROC(m, p); - MRB_METHOD_SET_VISIBILITY(m, MRB_METHOD_VDEFAULT_FL); - mrb_define_method_raw(mrb, tc, mid, m); - mrb_method_added(mrb, tc, mid); + mid = vm_define_method(mrb, tc, irep, b, c); ci = mrb->c->ci; mrb_gc_arena_restore(mrb, ai); regs[a] = mrb_symbol_value(mid); @@ -3666,15 +3672,7 @@ RETRY_TRY_BLOCK: CASE(OP_SDEF, BBB) { struct RClass *tc = mrb_class_ptr(mrb_singleton_class(mrb, regs[a])); - struct RProc *p = mrb_proc_new(mrb, irep->reps[c]); - mrb_method_t m; - - mid = irep->syms[b]; - p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT; - MRB_METHOD_FROM_PROC(m, p); - MRB_METHOD_SET_VISIBILITY(m, MRB_METHOD_VDEFAULT_FL); - mrb_define_method_raw(mrb, tc, mid, m); - mrb_method_added(mrb, tc, mid); + mid = vm_define_method(mrb, tc, irep, b, c); ci = mrb->c->ci; mrb_gc_arena_restore(mrb, ai); regs[a] = mrb_symbol_value(mid);