[前][次][番号順一覧][スレッド一覧]

ruby-changes:48278

From: nobu <ko1@a...>
Date: Tue, 24 Oct 2017 16:41:54 +0900 (JST)
Subject: [ruby-changes:48278] nobu:r60393 (trunk): parse.y: rb_parser_set_options

nobu	2017-10-24 16:41:48 +0900 (Tue, 24 Oct 2017)

  New Revision: 60393

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=60393

  Log:
    parse.y: rb_parser_set_options
    
    * parse.y (yycompile0): append top-level addenda before appending
      prelude nodes.
    
    * parse.y (rb_parser_set_options): set top-level addendum options
      before parsing.

  Modified files:
    trunk/node.h
    trunk/parse.y
    trunk/ruby.c
Index: ruby.c
===================================================================
--- ruby.c	(revision 60392)
+++ ruby.c	(revision 60393)
@@ -1646,6 +1646,10 @@ process_options(int argc, char **argv, r https://github.com/ruby/ruby/blob/trunk/ruby.c#L1646
     /* need to acquire env from toplevel_binding each time, since it
      * may update after eval() */
 
+    base_block = toplevel_context(toplevel_binding);
+    rb_parser_set_context(parser, base_block, TRUE);
+    rb_parser_set_options(parser, opt->do_print, opt->do_loop, opt->do_line, opt->do_split);
+
     if (opt->e_script) {
 	VALUE progname = rb_progname;
 	rb_encoding *eenc;
@@ -1669,15 +1673,10 @@ process_options(int argc, char **argv, r https://github.com/ruby/ruby/blob/trunk/ruby.c#L1673
 	    require_libraries(&opt->req_list);
 	}
         ruby_set_script_name(progname);
-
-	base_block = toplevel_context(toplevel_binding);
-	rb_parser_set_context(parser, base_block, TRUE);
 	tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1);
     }
     else {
 	VALUE f;
-	base_block = toplevel_context(toplevel_binding);
-	rb_parser_set_context(parser, base_block, TRUE);
 	f = open_load_file(script_name, &opt->xflag);
 	tree = load_file(parser, opt->script_name, f, 1, opt);
     }
@@ -1715,11 +1714,7 @@ process_options(int argc, char **argv, r https://github.com/ruby/ruby/blob/trunk/ruby.c#L1714
 	if (!dump) return Qtrue;
     }
 
-    if (opt->do_print) {
-	tree = rb_parser_append_print(parser, tree);
-    }
     if (opt->do_loop) {
-	tree = rb_parser_while_loop(parser, tree, opt->do_line, opt->do_split);
 	rb_define_global_function("sub", rb_f_sub, -1);
 	rb_define_global_function("gsub", rb_f_gsub, -1);
 	rb_define_global_function("chop", rb_f_chop, 0);
Index: parse.y
===================================================================
--- parse.y	(revision 60392)
+++ parse.y	(revision 60393)
@@ -234,6 +234,11 @@ struct parser_params { https://github.com/ruby/ruby/blob/trunk/parse.y#L234
 #ifndef RIPPER
     /* Ruby core only */
 
+    unsigned int do_print: 1;
+    unsigned int do_loop: 1;
+    unsigned int do_chomp: 1;
+    unsigned int do_split: 1;
+
     NODE *eval_tree_begin;
     NODE *eval_tree;
     VALUE error_buffer;
@@ -5398,6 +5403,8 @@ vtable_included(const struct vtable * tb https://github.com/ruby/ruby/blob/trunk/parse.y#L5403
 static void parser_prepare(struct parser_params *parser);
 
 #ifndef RIPPER
+static NODE *parser_append_options(struct parser_params *parser, NODE *node);
+
 static VALUE
 debug_lines(VALUE fname)
 {
@@ -5492,10 +5499,11 @@ yycompile0(VALUE arg) https://github.com/ruby/ruby/blob/trunk/parse.y#L5499
     else {
 	VALUE opt = parser->compile_option;
 	NODE *prelude;
+	NODE *body = parser_append_options(parser, tree->nd_body);
 	if (!opt) opt = rb_obj_hide(rb_ident_hash_new());
 	rb_hash_aset(opt, rb_sym_intern_ascii_cstr("coverage_enabled"), cov);
-	prelude = NEW_PRELUDE(ruby_eval_tree_begin, tree->nd_body, opt);
-	nd_set_column(prelude, nd_column(tree->nd_body));
+	prelude = NEW_PRELUDE(ruby_eval_tree_begin, body, opt);
+	nd_set_column(prelude, nd_column(body));
 	tree->nd_body = prelude;
     }
     return (VALUE)tree;
@@ -11237,78 +11245,43 @@ parser_reg_compile(struct parser_params* https://github.com/ruby/ruby/blob/trunk/parse.y#L11245
 #endif
 
 #ifndef RIPPER
-NODE*
-rb_parser_append_print(VALUE vparser, NODE *node)
+void
+rb_parser_set_options(VALUE vparser, int print, int loop, int chomp, int split)
 {
-    NODE *prelude = 0;
-    NODE *scope = node;
     struct parser_params *parser;
-
-    if (!node) return node;
-
     TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, parser);
-
-    node = node->nd_body;
-
-    if (nd_type(node) == NODE_PRELUDE) {
-	prelude = node;
-	node = node->nd_body;
-    }
-
-    node = block_append(node,
-			new_fcall(rb_intern("print"),
-				  NEW_ARRAY(new_gvar(idLASTLINE, 0)), 0),
-			0);
-    if (prelude) {
-	prelude->nd_body = node;
-	scope->nd_body = prelude;
-    }
-    else {
-	scope->nd_body = node;
-    }
-
-    return scope;
+    parser->do_print = print;
+    parser->do_loop = loop;
+    parser->do_chomp = chomp;
+    parser->do_split = split;
 }
 
-NODE *
-rb_parser_while_loop(VALUE vparser, NODE *node, int chomp, int split)
+static NODE *
+parser_append_options(struct parser_params *parser, NODE *node)
 {
-    NODE *prelude = 0;
-    NODE *scope = node;
-    struct parser_params *parser;
-
-    if (!node) return node;
-
-    TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, parser);
-
-    node = node->nd_body;
-
-    if (nd_type(node) == NODE_PRELUDE) {
-	prelude = node;
-	node = node->nd_body;
-    }
-    if (split) {
-	node = block_append(NEW_GASGN(rb_intern("$F"),
-				      new_call(new_gvar(idLASTLINE, 0),
-					       rb_intern("split"), 0, 0)),
-			    node, 0);
-    }
-    if (chomp) {
-	node = block_append(new_call(new_gvar(idLASTLINE, 0),
-				     rb_intern("chomp!"), 0, 0), node, 0);
+    if (parser->do_print) {
+	node = block_append(node,
+			    new_fcall(rb_intern("print"),
+				      NEW_ARRAY(new_gvar(idLASTLINE, 0)), 0),
+			    0);
     }
 
-    node = NEW_OPT_N(node);
+    if (parser->do_loop) {
+	if (parser->do_split) {
+	    node = block_append(NEW_GASGN(rb_intern("$F"),
+					  new_call(new_gvar(idLASTLINE, 0),
+						   rb_intern("split"), 0, 0)),
+				node, 0);
+	}
+	if (parser->do_chomp) {
+	    node = block_append(new_call(new_gvar(idLASTLINE, 0),
+					 rb_intern("chomp!"), 0, 0), node, 0);
+	}
 
-    if (prelude) {
-	prelude->nd_body = node;
-	scope->nd_body = prelude;
-    }
-    else {
-	scope->nd_body = node;
+	node = NEW_OPT_N(node);
     }
 
-    return scope;
+    return node;
 }
 
 void
Index: node.h
===================================================================
--- node.h	(revision 60392)
+++ node.h	(revision 60393)
@@ -448,8 +448,7 @@ VALUE rb_parser_encoding(VALUE); https://github.com/ruby/ruby/blob/trunk/node.h#L448
 VALUE rb_parser_get_yydebug(VALUE);
 VALUE rb_parser_set_yydebug(VALUE, VALUE);
 VALUE rb_parser_dump_tree(NODE *node, int comment);
-NODE *rb_parser_append_print(VALUE, NODE *);
-NODE *rb_parser_while_loop(VALUE, NODE *, int, int);
+void rb_parser_set_options(VALUE, int, int, int, int);
 
 NODE *rb_parser_compile_cstr(VALUE, const char*, const char*, int, int);
 NODE *rb_parser_compile_string(VALUE, const char*, VALUE, int);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]