summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2019-10-04 01:29:21 +0900
committerYusuke Endoh <mame@ruby-lang.org>2019-10-04 02:30:36 +0900
commit711c40ebdcd0974ef3e6ac6870412dc88ae25f3e (patch)
tree01e4b774c92c8a873bac38826ab7136c631c396d /parse.y
parent8f7fca784a46c4d4213ed7b166945f5b9143062d (diff)
Refactor parser_params by removing "in_main" flag
The relation between parser_param#base_block and #in_main were very subtle. A main script (that is passed via a command line) was parsed under base_block = TOPLEVEL_BINDING and in_main = 1. A script loaded by Kernel#require was parsed under base_block = NULL and in_main = 0. If base_block is non-NULL and in_main == 0, it is parsed by Kernel#eval or family. However, we know that TOPLEVEL_BINDING has no local variables when a main script is parsed. So, we don't have to parse a main script under base_block = TOPLEVEL_BINDING. Instead, this change parses a main script under base_block = 0. If base_block is non-NULL, it is parsed by Kernel#eval or family. By this simplication, "in_main" is no longer needed.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/2519
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y6
1 files changed, 2 insertions, 4 deletions
diff --git a/parse.y b/parse.y
index 33fa0e7944..651e2cea6e 100644
--- a/parse.y
+++ b/parse.y
@@ -270,7 +270,6 @@ struct parser_params {
unsigned int debug: 1;
unsigned int has_shebang: 1;
unsigned int in_defined: 1;
- unsigned int in_main: 1;
unsigned int in_kwarg: 1;
unsigned int in_def: 1;
unsigned int in_class: 1;
@@ -330,7 +329,7 @@ static int parser_yyerror(struct parser_params*, const YYLTYPE *yylloc, const ch
#ifdef RIPPER
#define compile_for_eval (0)
#else
-#define compile_for_eval (p->base_block != 0 && !p->in_main)
+#define compile_for_eval (p->base_block != 0)
#endif
#define token_column ((int)(p->lex.ptok - p->lex.pbeg))
@@ -11649,7 +11648,7 @@ static void
local_push(struct parser_params *p, int toplevel_scope)
{
struct local_vars *local;
- int inherits_dvars = toplevel_scope && (compile_for_eval || p->in_main /* is p->in_main really needed? */);
+ int inherits_dvars = toplevel_scope && compile_for_eval;
int warn_unused_vars = RTEST(ruby_verbose);
local = ALLOC(struct local_vars);
@@ -12309,7 +12308,6 @@ rb_parser_set_context(VALUE vparser, const struct rb_block *base, int main)
TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p);
p->error_buffer = main ? Qfalse : Qnil;
p->base_block = base;
- p->in_main = main;
return vparser;
}
#endif