diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-04-17 01:22:26 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-04-17 01:22:26 +0000 |
commit | f168dbd9ef3d27ec629d323f8a0834d63b5d7baa (patch) | |
tree | 92a52b64fe4beb45c51cbb4bc763888f9fcdf40a /parse.y | |
parent | 58a2084483ce8baaf90d7b1cb00e3fa9570fbc79 (diff) |
parse.y: fix cmdarg in command_args
* parse.y (call_args): fix invalid CMDARG state after command_args
followed by tLBRACE_ARG. [ruby-core:86551] [Bug #14690]
From: Ilya Bylich <ibylich@gmail.com>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63168 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -2170,7 +2170,20 @@ command_args : { } call_args { + /* call_args can be followed by tLBRACE_ARG (that does CMDARG_PUSH(0) in the lexer) + * but the push must be done after CMDARG_POP() in the parser. + * So this code does CMDARG_POP() to pop 0 pushed by tLBRACE_ARG, + * CMDARG_POP() to pop 1 pushed by command_args, + * and CMDARG_PUSH(0) to restore back the flag set by tLBRACE_ARG. + */ + int lookahead = 0; + switch (yychar) { + case tLBRACE_ARG: + lookahead = 1; + } + if (lookahead) CMDARG_POP(); CMDARG_POP(); + if (lookahead) CMDARG_PUSH(0); $$ = $2; } ; |