From 0d7f5b8216b88a37407c8885a8fc523e38bff616 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 20 Feb 2021 14:56:55 +0900 Subject: metaprog.c: fix a `methods()` bug with `false` argument; fix #5351 --- mrbgems/mruby-metaprog/src/metaprog.c | 32 ++++++++++++++------------------ mrbgems/mruby-metaprog/test/metaprog.rb | 2 ++ 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index bd61c9bc6..f2f2e7dda 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -207,39 +207,35 @@ method_entry_loop(mrb_state *mrb, struct RClass *klass, khash_t(st) *set, khash_ static mrb_value mrb_class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass *klass) { - khint_t i; mrb_value ary; - mrb_bool prepended = FALSE; struct RClass *oldklass; khash_t(st) *set = kh_init(st, mrb); - khash_t(st) *undef = (recur ? kh_init(st, mrb) : NULL); - if (!recur && (klass->flags & MRB_FL_CLASS_IS_PREPENDED)) { - MRB_CLASS_ORIGIN(klass); - prepended = TRUE; + if (!recur) { + if (klass->flags & MRB_FL_CLASS_IS_PREPENDED) { + MRB_CLASS_ORIGIN(klass); + } + method_entry_loop(mrb, klass, set, NULL); } + else { + khash_t(st) *undef = kh_init(st, mrb); - oldklass = 0; - while (klass && (klass != oldklass)) { - method_entry_loop(mrb, klass, set, undef); - if ((klass->tt == MRB_TT_ICLASS && !prepended) || - (klass->tt == MRB_TT_SCLASS)) { - } - else { - if (!recur) break; + oldklass = NULL; + while (klass && (klass != oldklass)) { + method_entry_loop(mrb, klass, set, undef); + oldklass = klass; + klass = klass->super; } - oldklass = klass; - klass = klass->super; + kh_destroy(st, mrb, undef); } ary = mrb_ary_new_capa(mrb, kh_size(set)); - for (i=0;i