VALUE rb_mod_ancestors_nocopy(VALUE mod) { VALUE ary = rb_attr_get(mod, idAncestors); if (NIL_P(ary)) { ary = rb_ary_new(); for (VALUE p = mod; p != 0; p = RCLASS_SUPER(p)) { rb_ary_push(ary, p); rb_mod_included_modules_nosuper(p, ary); } rb_ivar_set(mod, idAncestors, ary); } return ary; }
VALUE rb_mod_included_modules(VALUE mod) { VALUE ary = rb_ary_new(); bool mod_detected = false; for (VALUE p = mod; p != 0; p = RCLASS_SUPER(p)) { if (!mod_detected) { if (RCLASS_MODULE(p)) { mod_detected = true; } } else { if (!RCLASS_SINGLETON(p)) { break; } } rb_mod_included_modules_nosuper(p, ary); } return ary; }