summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-06-01 22:58:17 +0900
committerGitHub <[email protected]>2020-06-01 22:58:17 +0900
commit0a5983dd5ed4c300bbed21298a1f9d2c2fcf4db3 (patch)
treef6596b54d61fdfe93faa33c7b503399b61a40657 /mrbgems
parentaec40d10b86e4e372aaadbd6d4dc84664a291c3e (diff)
parentfc80e4b6513599bbae2948ad762bf0d1505e7700 (diff)
downloadmruby-0a5983dd5ed4c300bbed21298a1f9d2c2fcf4db3.tar.gz
mruby-0a5983dd5ed4c300bbed21298a1f9d2c2fcf4db3.zip
Merge pull request #5014 from dearblue/local_variables
Get local variable names from orphan block; ref #3710
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-metaprog/src/metaprog.c27
-rw-r--r--mrbgems/mruby-metaprog/test/metaprog.rb9
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