summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-06-28 09:13:54 +0900
committerGitHub <[email protected]>2021-06-28 09:13:54 +0900
commitd63c0df6bcd5851522c4b982dba4e0a93f44a2d7 (patch)
tree83c1d2a39786d802d3d09da6d5a4be56d9fe12c2 /mrbgems/mruby-compiler
parente462b42ff05254f8142662c24b426b5af3b98173 (diff)
parentc182903ea0ee5c904725f336373f608962059996 (diff)
downloadmruby-d63c0df6bcd5851522c4b982dba4e0a93f44a2d7.tar.gz
mruby-d63c0df6bcd5851522c4b982dba4e0a93f44a2d7.zip
Merge pull request #5493 from dearblue/binding.2
Fixed finding variables from `proc` in `binding.eval` failed
Diffstat (limited to 'mrbgems/mruby-compiler')
-rw-r--r--mrbgems/mruby-compiler/core/parse.y16
-rw-r--r--mrbgems/mruby-compiler/core/y.tab.c16
2 files changed, 32 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index 96615e3bb..7d9db4a2b 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -7759,3 +7759,19 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
}
#endif
}
+
+typedef mrb_bool mrb_parser_foreach_top_variable_func(mrb_state *mrb, mrb_sym sym, void *user);
+void mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user);
+
+void
+mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user)
+{
+ const mrb_ast_node *n = p->tree;
+ if ((intptr_t)n->car == NODE_SCOPE) {
+ n = n->cdr->car;
+ for (; n; n = n->cdr) {
+ mrb_sym sym = (intptr_t)n->car;
+ if (sym && !func(mrb, sym, user)) break;
+ }
+ }
+}
diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c
index 3b2ce8043..9cd36ec7b 100644
--- a/mrbgems/mruby-compiler/core/y.tab.c
+++ b/mrbgems/mruby-compiler/core/y.tab.c
@@ -13951,3 +13951,19 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
}
#endif
}
+
+typedef mrb_bool mrb_parser_foreach_top_variable_func(mrb_state *mrb, mrb_sym sym, void *user);
+void mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user);
+
+void
+mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user)
+{
+ const mrb_ast_node *n = p->tree;
+ if ((intptr_t)n->car == NODE_SCOPE) {
+ n = n->cdr->car;
+ for (; n; n = n->cdr) {
+ mrb_sym sym = (intptr_t)n->car;
+ if (sym && !func(mrb, sym, user)) break;
+ }
+ }
+}