summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-metaprog/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-02-25 21:15:24 +0900
committerGitHub <[email protected]>2021-02-25 21:15:24 +0900
commit192f3df9a1fca043801e42febcd4b105fa1d5733 (patch)
tree2e83f49a75fb581e522a7d388c5cc86f978cd1a7 /mrbgems/mruby-metaprog/src
parentf1c2096f8ed966cf055d1a32271748b5fad4ffe0 (diff)
parent927615e1f072d8fff3d9b84660cdce15a239e36c (diff)
downloadmruby-192f3df9a1fca043801e42febcd4b105fa1d5733.tar.gz
mruby-192f3df9a1fca043801e42febcd4b105fa1d5733.zip
Merge pull request #5362 from dearblue/binding
Binding
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..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)