summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-17 01:22:26 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-17 01:22:26 +0000
commitf168dbd9ef3d27ec629d323f8a0834d63b5d7baa (patch)
tree92a52b64fe4beb45c51cbb4bc763888f9fcdf40a /parse.y
parent58a2084483ce8baaf90d7b1cb00e3fa9570fbc79 (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.y13
1 files changed, 13 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 21cb2884f7..655cd85031 100644
--- a/parse.y
+++ b/parse.y
@@ -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;
}
;