From 953ebdf3345b24057a528d1979ff30c17f4e9dc7 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 14 Apr 2025 14:10:16 +0900 Subject: [PATCH] variable.c (mrb_vm_const_get): refactoring for singleton classes --- src/variable.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/variable.c b/src/variable.c index 1cd4e85d6..f897aabc1 100644 --- a/src/variable.c +++ b/src/variable.c @@ -826,32 +826,29 @@ mrb_value mrb_vm_const_get(mrb_state *mrb, mrb_sym sym) { const struct RProc *proc = mrb->c->ci->proc; - struct RClass *c = MRB_PROC_TARGET_CLASS(proc); + struct RClass *c = MRB_PROC_TARGET_CLASS(proc), *c2; mrb_value v; if (!c) c = mrb->object_class; if (iv_get(mrb, class_iv_ptr(c), sym, &v)) { return v; } - struct RClass *c2 = c; - while (c2 && c2->tt == MRB_TT_SCLASS) { - mrb_value klass; - - if (!iv_get(mrb, class_iv_ptr(c2), MRB_SYM(__attached__), &klass)) { - c2 = NULL; - break; - } - c2 = mrb_class_ptr(klass); - } - if (c2 && (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE)) c = c2; - proc = proc->upper; - while (proc) { + for (proc = proc->upper; proc; proc = proc->upper) { c2 = MRB_PROC_TARGET_CLASS(proc); if (!c2) c2 = mrb->object_class; - if (c2 && iv_get(mrb, class_iv_ptr(c2), sym, &v)) { + if (iv_get(mrb, class_iv_ptr(c2), sym, &v)) { return v; } - proc = proc->upper; + } + if (c->tt == MRB_TT_SCLASS) { + mrb_value klass; + for (c2 = c; c2 && c2->tt == MRB_TT_SCLASS; c2 = mrb_class_ptr(klass)) { + if (!iv_get(mrb, class_iv_ptr(c2), MRB_SYM(__attached__), &klass)) { + c2 = NULL; + break; + } + } + if (c2 && (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE)) c = c2; } return const_get(mrb, c, sym, TRUE); }