diff options
| author | dearblue <[email protected]> | 2020-05-31 15:44:57 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2020-05-31 15:56:04 +0900 |
| commit | fc80e4b6513599bbae2948ad762bf0d1505e7700 (patch) | |
| tree | 861731d89c3d40748c0269ea408e63dff504bd6f | |
| parent | d5cca2bdb2a0352e3253cf3ba2a79157dde5f163 (diff) | |
| download | mruby-fc80e4b6513599bbae2948ad762bf0d1505e7700.tar.gz mruby-fc80e4b6513599bbae2948ad762bf0d1505e7700.zip | |
Get local variable names from orphan block; ref #3710
| -rw-r--r-- | mrbgems/mruby-metaprog/src/metaprog.c | 27 | ||||
| -rw-r--r-- | mrbgems/mruby-metaprog/test/metaprog.rb | 9 |
2 files changed, 22 insertions, 14 deletions
diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index b4895a9d1..4334fe983 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -146,24 +146,23 @@ mrb_local_variables(mrb_state *mrb, mrb_value self) while (proc) { if (MRB_PROC_CFUNC_P(proc)) break; irep = proc->body.irep; - if (!irep->lv) break; - for (i = 0; i + 1 < irep->nlocals; ++i) { - if (irep->lv[i].name) { - mrb_sym sym = irep->lv[i].name; - 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 (irep->lv) { + for (i = 0; i + 1 < irep->nlocals; ++i) { + if (irep->lv[i].name) { + mrb_sym sym = irep->lv[i].name; + 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_ENV_P(proc)) break; + if (MRB_PROC_SCOPE_P(proc)) break; proc = proc->upper; - //if (MRB_PROC_SCOPE_P(proc)) break; - if (!proc->c) break; } return mrb_hash_keys(mrb, vars); diff --git a/mrbgems/mruby-metaprog/test/metaprog.rb b/mrbgems/mruby-metaprog/test/metaprog.rb index 30b75bd60..82ba0a3a5 100644 --- a/mrbgems/mruby-metaprog/test/metaprog.rb +++ b/mrbgems/mruby-metaprog/test/metaprog.rb @@ -114,6 +114,15 @@ assert('Kernel.local_variables', '15.3.1.2.7') do # Kernel#local_variables: 15.3.1.3.28 local_variables.sort }.call(-1, -2) + + a = Object.new + def a.hoge(vars, *, **) + Proc.new { + x, y = 1, 2 + local_variables.sort + } + end + assert_equal([:vars, :x, :y]) { a.hoge(0).call } end assert('Kernel#define_singleton_method') do |
