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

ruby-changes:50412

From: nobu <ko1@a...>
Date: Thu, 22 Feb 2018 21:51:47 +0900 (JST)
Subject: [ruby-changes:50412] nobu:r62528 (trunk): Fix CMDARG manipulation

nobu	2018-02-22 21:51:41 +0900 (Thu, 22 Feb 2018)

  New Revision: 62528

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

  Log:
    Fix CMDARG manipulation
    
    * parse.y: Fix CMDARG manipulation. Use CMDARG_P to identify
      keyword_do/keyword_do_block.  [Feature #14506] [Fix GH-1823]
    
    From: Ilya Bylich <ibylich@g...>

  Modified files:
    trunk/parse.y
    trunk/test/ripper/test_scanner_events.rb
Index: test/ripper/test_scanner_events.rb
===================================================================
--- test/ripper/test_scanner_events.rb	(revision 62527)
+++ test/ripper/test_scanner_events.rb	(revision 62528)
@@ -60,11 +60,11 @@ class TestRipper::ScannerEvents < Test:: https://github.com/ruby/ruby/blob/trunk/test/ripper/test_scanner_events.rb#L60
                   [[1, 7], :on_rparen, ")", Ripper::EXPR_ENDFN],
                   [[1, 8], :on_kw, "end", Ripper::EXPR_END]],
                  Ripper.lex("def m(a)end")
-    assert_equal [[[1, 0], :on_int, "1", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+    assert_equal [[[1, 0], :on_int, "1", Ripper::EXPR_END],
                   [[1, 1], :on_nl, "\n", Ripper::EXPR_BEG],
-                  [[2, 0], :on_int, "2", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+                  [[2, 0], :on_int, "2", Ripper::EXPR_END],
                   [[2, 1], :on_nl, "\n", Ripper::EXPR_BEG],
-                  [[3, 0], :on_int, "3", Ripper::EXPR_END | Ripper::EXPR_ENDARG]],
+                  [[3, 0], :on_int, "3", Ripper::EXPR_END]],
                  Ripper.lex("1\n2\n3")
     assert_equal [[[1, 0], :on_heredoc_beg, "<<""EOS", Ripper::EXPR_BEG],
                   [[1, 5], :on_nl, "\n", Ripper::EXPR_BEG],
@@ -86,21 +86,21 @@ class TestRipper::ScannerEvents < Test:: https://github.com/ruby/ruby/blob/trunk/test/ripper/test_scanner_events.rb#L86
                  Ripper.lex("/foo\n\u3020/")
     assert_equal [[[1, 0], :on_tstring_beg, "'", Ripper::EXPR_BEG],
                   [[1, 1], :on_tstring_content, "foo\n\xe3\x80\xa0", Ripper::EXPR_BEG],
-                  [[2, 3], :on_tstring_end, "'", Ripper::EXPR_END | Ripper::EXPR_ENDARG]],
+                  [[2, 3], :on_tstring_end, "'", Ripper::EXPR_END]],
                  Ripper.lex("'foo\n\xe3\x80\xa0'")
     assert_equal [[[1, 0], :on_tstring_beg, "'", Ripper::EXPR_BEG],
                   [[1, 1], :on_tstring_content, "\u3042\n\u3044", Ripper::EXPR_BEG],
-                  [[2, 3], :on_tstring_end, "'", Ripper::EXPR_END | Ripper::EXPR_ENDARG]],
+                  [[2, 3], :on_tstring_end, "'", Ripper::EXPR_END]],
                  Ripper.lex("'\u3042\n\u3044'")
-    assert_equal [[[1, 0], :on_rational, "1r", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+    assert_equal [[[1, 0], :on_rational, "1r", Ripper::EXPR_END],
                   [[1, 2], :on_nl, "\n", Ripper::EXPR_BEG],
-                  [[2, 0], :on_imaginary, "2i", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+                  [[2, 0], :on_imaginary, "2i", Ripper::EXPR_END],
                   [[2, 2], :on_nl, "\n", Ripper::EXPR_BEG],
-                  [[3, 0], :on_imaginary, "3ri", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+                  [[3, 0], :on_imaginary, "3ri", Ripper::EXPR_END],
                   [[3, 3], :on_nl, "\n", Ripper::EXPR_BEG],
-                  [[4, 0], :on_rational, "4.2r", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+                  [[4, 0], :on_rational, "4.2r", Ripper::EXPR_END],
                   [[4, 4], :on_nl, "\n", Ripper::EXPR_BEG],
-                  [[5, 0], :on_imaginary, "5.6ri", Ripper::EXPR_END | Ripper::EXPR_ENDARG],
+                  [[5, 0], :on_imaginary, "5.6ri", Ripper::EXPR_END],
                  ],
                  Ripper.lex("1r\n2i\n3ri\n4.2r\n5.6ri")
      assert_equal [[[1, 0], :on_heredoc_beg, "<<~EOS", Ripper::EXPR_BEG],
Index: parse.y
===================================================================
--- parse.y	(revision 62527)
+++ parse.y	(revision 62528)
@@ -2159,14 +2159,12 @@ command_args	:   { https://github.com/ruby/ruby/blob/trunk/parse.y#L2159
 			    lookahead = 1;
 			}
 			if (lookahead) CMDARG_POP();
-			$<val>$ = p->cmdarg_stack;
 			CMDARG_PUSH(1);
 			if (lookahead) CMDARG_PUSH(0);
 		    }
 		  call_args
 		    {
-			/* CMDARG_POP() */
-			CMDARG_SET($<val>1);
+			CMDARG_POP();
 			$$ = $2;
 		    }
 		;
@@ -2287,18 +2285,12 @@ primary		: literal https://github.com/ruby/ruby/blob/trunk/parse.y#L2285
 		    /*% %*/
 		    /*% ripper: paren!(0) %*/
 		    }
-		| tLPAREN_ARG
+		| tLPAREN_ARG stmt {SET_LEX_STATE(EXPR_ENDARG);} rparen
 		    {
-			$<val>1 = p->cmdarg_stack;
-			CMDARG_SET(0);
-		    }
-		  stmt {SET_LEX_STATE(EXPR_ENDARG);} rparen
-		    {
-			CMDARG_SET($<val>1);
 		    /*%%%*/
-			$$ = $3;
+			$$ = $2;
 		    /*% %*/
-		    /*% ripper: paren!($3) %*/
+		    /*% ripper: paren!($2) %*/
 		    }
 		| tLPAREN compstmt ')'
 		    {
@@ -3034,13 +3026,11 @@ lambda		:   { https://github.com/ruby/ruby/blob/trunk/parse.y#L3026
 		    }
 		  f_larglist
 		    {
-			$<val>$ = p->cmdarg_stack;
-			CMDARG_SET(0);
+			CMDARG_PUSH(0);
 		    }
 		  lambda_body
 		    {
 			p->lex.lpar_beg = $<num>2;
-			CMDARG_SET($<val>4);
 			CMDARG_POP();
 		    /*%%%*/
 			$$ = NEW_LAMBDA($3, $5, &@$);
@@ -3217,14 +3207,12 @@ brace_block	: '{' brace_body '}' https://github.com/ruby/ruby/blob/trunk/parse.y#L3207
 		;
 
 brace_body	: {$<vars>$ = dyna_push(p);}
-		  {$<val>$ = p->cmdarg_stack >> 1; CMDARG_SET(0);}
 		  opt_block_param compstmt
 		    {
 		    /*%%%*/
-			$$ = NEW_ITER($3, $4, &@$);
+			$$ = NEW_ITER($2, $3, &@$);
 		    /*% %*/
-		    /*% ripper: brace_block!(escape_Qundef($3), $4) %*/
-			CMDARG_SET($<val>2);
+		    /*% ripper: brace_block!(escape_Qundef($2), $3) %*/
 			dyna_pop(p, $<vars>1);
 		    }
 		;
@@ -3649,7 +3637,7 @@ string_dvar	: tGVAR https://github.com/ruby/ruby/blob/trunk/parse.y#L3637
 
 symbol		: tSYMBEG sym
 		    {
-			SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+			SET_LEX_STATE(EXPR_END);
 		    /*%%%*/
 			$$ = $2;
 		    /*% %*/
@@ -3665,7 +3653,7 @@ sym		: fname https://github.com/ruby/ruby/blob/trunk/parse.y#L3653
 
 dsym		: tSYMBEG xstring_contents tSTRING_END
 		    {
-			SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+			SET_LEX_STATE(EXPR_END);
 		    /*%%%*/
 			$$ = dsym_node(p, $2, &@$);
 		    /*% %*/
@@ -5792,7 +5780,7 @@ parser_string_term(struct parser_params https://github.com/ruby/ruby/blob/trunk/parse.y#L5780
     if (func & STR_FUNC_REGEXP) {
 	set_yylval_num(regx_options(p));
 	dispatch_scan_event(p, tREGEXP_END);
-	SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+	SET_LEX_STATE(EXPR_END);
 	return tREGEXP_END;
     }
     if ((func & STR_FUNC_LABEL) && IS_LABEL_SUFFIX(0)) {
@@ -5800,7 +5788,7 @@ parser_string_term(struct parser_params https://github.com/ruby/ruby/blob/trunk/parse.y#L5788
 	SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
 	return tLABEL_END;
     }
-    SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+    SET_LEX_STATE(EXPR_END);
     return tSTRING_END;
 }
 
@@ -5816,7 +5804,7 @@ parse_string(struct parser_params *p, rb https://github.com/ruby/ruby/blob/trunk/parse.y#L5804
 
     if (func & STR_FUNC_TERM) {
 	if (func & STR_FUNC_QWORDS) nextc(p); /* delayed term */
-	SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+	SET_LEX_STATE(EXPR_END);
 	p->lex.strterm = 0;
 	return func & STR_FUNC_REGEXP ? tREGEXP_END : tSTRING_END;
     }
@@ -6163,7 +6151,7 @@ set_number_literal(struct parser_params https://github.com/ruby/ruby/blob/trunk/parse.y#L6151
     }
     set_yylval_literal(v);
     add_mark_object(p, v);
-    SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+    SET_LEX_STATE(EXPR_END);
     return type;
 }
 
@@ -7434,8 +7422,6 @@ parse_ident(struct parser_params *p, int https://github.com/ruby/ruby/blob/trunk/parse.y#L7422
 		if (COND_P()) return keyword_do_cond;
 		if (CMDARG_P() && !IS_lex_state_for(state, EXPR_CMDARG))
 		    return keyword_do_block;
-		if (IS_lex_state_for(state, (EXPR_BEG | EXPR_ENDARG)))
-		    return keyword_do_block;
 		return keyword_do;
 	    }
 	    if (IS_lex_state_for(state, (EXPR_BEG | EXPR_LABELED)))

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

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