summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-metaprog
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-05-26 20:32:04 +0900
committerKOBAYASHI Shuji <[email protected]>2019-05-26 20:32:04 +0900
commit779251de64bdf63f71b02927db511fb8633c5d60 (patch)
tree8d7147c841cd412b2ccaaa440078a2232c93d79e /mrbgems/mruby-metaprog
parent4261ba944330f27dcb80e5e4580f73bd6b3a7106 (diff)
downloadmruby-779251de64bdf63f71b02927db511fb8633c5d60.tar.gz
mruby-779251de64bdf63f71b02927db511fb8633c5d60.zip
Move `mrb_mod_s_nesting()` to `mruby-metaprog` gem from the core
Diffstat (limited to 'mrbgems/mruby-metaprog')
-rw-r--r--mrbgems/mruby-metaprog/src/metaprog.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c
index 0aafb4c34..38f75d460 100644
--- a/mrbgems/mruby-metaprog/src/metaprog.c
+++ b/mrbgems/mruby-metaprog/src/metaprog.c
@@ -657,8 +657,30 @@ mrb_mod_s_constants(mrb_state *mrb, mrb_value mod)
return mrb_nil_value(); /* not reached */
}
-/* implementation of Module.nesting */
-mrb_value mrb_mod_s_nesting(mrb_state*, mrb_value);
+mrb_value
+mrb_mod_s_nesting(mrb_state *mrb, mrb_value mod)
+{
+ struct RProc *proc;
+ mrb_value ary;
+ struct RClass *c = NULL;
+
+ mrb_get_args(mrb, "");
+ ary = mrb_ary_new(mrb);
+ proc = mrb->c->ci[-1].proc; /* callee proc */
+ mrb_assert(!MRB_PROC_CFUNC_P(proc));
+ while (proc) {
+ if (MRB_PROC_SCOPE_P(proc)) {
+ struct RClass *c2 = MRB_PROC_TARGET_CLASS(proc);
+
+ if (c2 != c) {
+ c = c2;
+ mrb_ary_push(mrb, ary, mrb_obj_value(c));
+ }
+ }
+ proc = proc->upper;
+ }
+ return ary;
+}
void
mrb_mruby_metaprog_gem_init(mrb_state* mrb)