summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-metaprog/src/metaprog.c
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-metaprog/src/metaprog.c')
-rw-r--r--mrbgems/mruby-metaprog/src/metaprog.c37
1 files changed, 3 insertions, 34 deletions
diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c
index f2f2e7dda..4bf31cbeb 100644
--- a/mrbgems/mruby-metaprog/src/metaprog.c
+++ b/mrbgems/mruby-metaprog/src/metaprog.c
@@ -21,6 +21,8 @@ typedef enum {
NOEX_RESPONDS = 0x80
} mrb_method_flag_t;
+mrb_value mrb_proc_local_variables(mrb_state *mrb, const struct RProc *proc);
+
static mrb_value
mrb_f_nil(mrb_state *mrb, mrb_value cv)
{
@@ -133,40 +135,7 @@ mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_local_variables(mrb_state *mrb, mrb_value self)
{
- const struct RProc *proc;
- const mrb_irep *irep;
- mrb_value vars;
- size_t i;
-
- proc = mrb->c->ci[-1].proc;
-
- if (proc == NULL || MRB_PROC_CFUNC_P(proc)) {
- return mrb_ary_new(mrb);
- }
- vars = mrb_hash_new(mrb);
- while (proc) {
- if (MRB_PROC_CFUNC_P(proc)) break;
- irep = proc->body.irep;
- if (irep->lv) {
- for (i = 0; i + 1 < irep->nlocals; ++i) {
- if (irep->lv[i]) {
- mrb_sym sym = irep->lv[i];
- const char *name = mrb_sym_name(mrb, sym);
- switch (name[0]) {
- case '*': case '&':
- break;
- default:
- mrb_hash_set(mrb, vars, mrb_symbol_value(sym), mrb_true_value());
- break;
- }
- }
- }
- }
- if (MRB_PROC_SCOPE_P(proc)) break;
- proc = proc->upper;
- }
-
- return mrb_hash_keys(mrb, vars);
+ return mrb_proc_local_variables(mrb, mrb->c->ci[-1].proc);
}
KHASH_DECLARE(st, mrb_sym, char, FALSE)