diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-02-20 14:56:55 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-02-20 14:56:55 +0900 |
| commit | 0d7f5b8216b88a37407c8885a8fc523e38bff616 (patch) | |
| tree | be9da4ed31fd40726558a53847f4cdca7dd5711d /mrbgems/mruby-metaprog/src | |
| parent | 8ed15c078b8f953f360034ef003b16a911a6dbbc (diff) | |
| download | mruby-0d7f5b8216b88a37407c8885a8fc523e38bff616.tar.gz mruby-0d7f5b8216b88a37407c8885a8fc523e38bff616.zip | |
metaprog.c: fix a `methods()` bug with `false` argument; fix #5351
Diffstat (limited to 'mrbgems/mruby-metaprog/src')
| -rw-r--r-- | mrbgems/mruby-metaprog/src/metaprog.c | 32 |
1 files changed, 14 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<kh_end(set);i++) { + for (khint_t i=0; i<kh_end(set); i++) { if (kh_exist(set, i)) { mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i))); } } kh_destroy(st, mrb, set); - if (undef) kh_destroy(st, mrb, undef); return ary; } |
