summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-metaprog/src
diff options
context:
space:
mode:
authordearblue <[email protected]>2021-02-22 23:32:18 +0900
committerdearblue <[email protected]>2021-02-22 23:32:18 +0900
commit792f6ac6700469ddf9be8f87ca3376082f9af7f3 (patch)
treef04a5ffe00d4f442286a833b06d472941b20c93c /mrbgems/mruby-metaprog/src
parent935ffa46a3a89a5f1662e5a4111ca0ed19566698 (diff)
downloadmruby-792f6ac6700469ddf9be8f87ca3376082f9af7f3.tar.gz
mruby-792f6ac6700469ddf9be8f87ca3376082f9af7f3.zip
Adjustment of the current HEAD and bindings, and separation
Make changes to make `Binding` work. At the same time, it separates `Binding#eval`, which depends on `mruby-eval`, from `mruby-binding-core`.
Diffstat (limited to 'mrbgems/mruby-metaprog/src')
-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..99a1b46da 100644
--- a/mrbgems/mruby-metaprog/src/metaprog.c
+++ b/mrbgems/mruby-metaprog/src/metaprog.c
@@ -117,6 +117,8 @@ mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)
return val;
}
+mrb_value mrb_proc_local_variables(mrb_state *mrb, const struct RProc *proc);
+
/* 15.3.1.2.7 */
/* 15.3.1.3.28 */
/*
@@ -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)