Skip to content

Commit 432f3d9

Browse files
committed
Support every argument syntax for clone()
see php/php-src#18938
1 parent 8ab65b4 commit 432f3d9

File tree

4 files changed

+2499
-1893
lines changed

4 files changed

+2499
-1893
lines changed

‎grammar/php.y

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,22 @@ argument_list:
785785
| '(' variadic_placeholder ')' { init($2); }
786786
;
787787

788+
clone_argument_list:
789+
'(' ')' { $$ = array(); }
790+
| '(' non_empty_clone_argument_list optional_comma ')' { $$ = $2; }
791+
| '(' expr ',' ')' { init(Node\Arg[$2, false, false]); }
792+
| '(' variadic_placeholder ')' { init($2); }
793+
;
794+
795+
non_empty_clone_argument_list:
796+
expr ',' argument
797+
{ init(new Node\Arg($1, false, false, stackAttributes(#1)), $3); }
798+
| argument_no_expr
799+
{ init($1); }
800+
| non_empty_clone_argument_list ',' argument
801+
{/* asd */ push($1, $3); }
802+
;
803+
788804
variadic_placeholder:
789805
T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; }
790806
;
@@ -794,14 +810,18 @@ non_empty_argument_list:
794810
| non_empty_argument_list ',' argument { push($1, $3); }
795811
;
796812

797-
argument:
798-
expr { $$ = Node\Arg[$1, false, false]; }
799-
| ampersand variable { $$ = Node\Arg[$2, true, false]; }
813+
argument_no_expr:
814+
ampersand variable { $$ = Node\Arg[$2, true, false]; }
800815
| T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; }
801816
| identifier_maybe_reserved ':' expr
802817
{ $$ = new Node\Arg($3, false, false, attributes(), $1); }
803818
;
804819

820+
argument:
821+
expr { $$ = Node\Arg[$1, false, false]; }
822+
| argument_no_expr { $$ = $1; }
823+
;
824+
805825
global_var_list:
806826
non_empty_global_var_list no_comma
807827
;
@@ -1015,6 +1035,7 @@ expr:
10151035
}
10161036
| new_expr
10171037
| match
1038+
| T_CLONE clone_argument_list { $$ = Expr\FuncCall[new Node\Name($1, stackAttributes(#1)), $2]; }
10181039
| T_CLONE expr { $$ = Expr\Clone_[$2]; }
10191040
| variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; }
10201041
| variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; }

0 commit comments

Comments
 (0)