Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Require parenthesis around yield expressions

If yield is used in an expression context parenthesis are now required.
This ensures that the code is unambiguos.

Yield statements can still be used without parenthesis (which should be
the most common case).

Also yield expressions without value can be used without parenthesis,
too (this should be the most common case for coroutines).

If the yield expression is used in a context where parenthesis are required
anyway, no additional parenthesis have to be inserted.

Examples:

    // Statements don't need parenthesis
    yield $foo;
    yield $foo => $bar;

    // Yield without value doesn't need parenthesis either
    $data = yield;

    // Parentheses don't have to be duplicated
    foo(yield $bar);
    if (yield $bar) { ... }

    // But we have to use parentheses here
    $foo = (yield $bar);

This commit also fixes an issue with by-ref passing of $foo[0] like
variables. They previously weren't properly fetched for write.

Additionally this fixes valgrind warnings which were caused by access to
uninitialized memory in zend_is_function_or_method_call().
  • Loading branch information...
commit 80748631aa1c4193cbc68f8854d82e7a57817fe2 1 parent 1f70a4c
Nikita Popov nikic authored
2  Zend/tests/generators/send_returns_current.phpt
@@ -6,7 +6,7 @@ $generator->send() returns the yielded value
6 6 function reverseEchoGenerator() {
7 7 $data = yield;
8 8 while (true) {
9   - $data = yield strrev($data);
  9 + $data = (yield strrev($data));
10 10 }
11 11 }
12 12
26 Zend/tests/generators/yield_array_offset_by_ref.phpt
... ... @@ -0,0 +1,26 @@
  1 +--TEST--
  2 +Array offsets can be yielded by reference
  3 +--FILE--
  4 +<?php
  5 +
  6 +function &gen(array &$array) {
  7 + yield $array[0];
  8 +}
  9 +
  10 +$array = [1, 2, 3];
  11 +$gen = gen($array);
  12 +foreach ($gen as &$val) {
  13 + $val *= -1;
  14 +}
  15 +var_dump($array);
  16 +
  17 +?>
  18 +--EXPECT--
  19 +array(3) {
  20 + [0]=>
  21 + &int(-1)
  22 + [1]=>
  23 + int(2)
  24 + [2]=>
  25 + int(3)
  26 +}
23 Zend/tests/generators/yield_in_parenthesis.phpt
... ... @@ -0,0 +1,23 @@
  1 +--TEST--
  2 +No additional parenthesis are required around yield if they are already present
  3 +--FILE--
  4 +<?php
  5 +
  6 +function gen() {
  7 + if (yield $foo); elseif (yield $foo);
  8 + if (yield $foo): elseif (yield $foo): endif;
  9 + while (yield $foo);
  10 + do {} while (yield $foo);
  11 + switch (yield $foo) {}
  12 + (yield $foo);
  13 + die(yield $foo);
  14 + func(yield $foo);
  15 + $foo->func(yield $foo);
  16 + new Foo(yield $foo);
  17 +}
  18 +
  19 +echo "Done";
  20 +
  21 +?>
  22 +--EXPECT--
  23 +Done
12 Zend/zend_compile.c
@@ -2663,7 +2663,7 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC) /* {{{ */
2663 2663 }
2664 2664 /* }}} */
2665 2665
2666   -void zend_do_yield(znode *result, const znode *value, const znode *key TSRMLS_DC) /* {{{ */
  2666 +void zend_do_yield(znode *result, znode *value, const znode *key, zend_bool is_variable TSRMLS_DC) /* {{{ */
2667 2667 {
2668 2668 zend_op *opline;
2669 2669
@@ -2673,6 +2673,14 @@ void zend_do_yield(znode *result, const znode *value, const znode *key TSRMLS_DC
2673 2673
2674 2674 CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR;
2675 2675
  2676 + if (is_variable) {
  2677 + if ((CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) && !zend_is_function_or_method_call(value)) {
  2678 + zend_do_end_variable_parse(value, BP_VAR_W, 0 TSRMLS_CC);
  2679 + } else {
  2680 + zend_do_end_variable_parse(value, BP_VAR_R, 0 TSRMLS_CC);
  2681 + }
  2682 + }
  2683 +
2676 2684 opline = get_next_op(CG(active_op_array) TSRMLS_CC);
2677 2685
2678 2686 opline->opcode = ZEND_YIELD;
@@ -2680,7 +2688,7 @@ void zend_do_yield(znode *result, const znode *value, const znode *key TSRMLS_DC
2680 2688 if (value) {
2681 2689 SET_NODE(opline->op1, value);
2682 2690
2683   - if (zend_is_function_or_method_call(value)) {
  2691 + if (is_variable && zend_is_function_or_method_call(value)) {
2684 2692 opline->extended_value = ZEND_RETURNS_FUNCTION;
2685 2693 }
2686 2694 } else {
2  Zend/zend_compile.h
@@ -490,7 +490,7 @@ void zend_do_build_full_name(znode *result, znode *prefix, znode *name, int is_c
490 490 int zend_do_begin_class_member_function_call(znode *class_name, znode *method_name TSRMLS_DC);
491 491 void zend_do_end_function_call(znode *function_name, znode *result, const znode *argument_list, int is_method, int is_dynamic_fcall TSRMLS_DC);
492 492 void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC);
493   -void zend_do_yield(znode *result, const znode *value, const znode *key TSRMLS_DC);
  493 +void zend_do_yield(znode *result, znode *value, const znode *key, zend_bool is_variable TSRMLS_DC);
494 494 void zend_do_delegate_yield(znode *result, const znode *value TSRMLS_DC);
495 495 void zend_do_handle_exception(TSRMLS_D);
496 496
91 Zend/zend_language_parser.y
@@ -278,10 +278,10 @@ statement:
278 278
279 279 unticked_statement:
280 280 '{' inner_statement_list '}'
281   - | T_IF '(' expr ')' { zend_do_if_cond(&$3, &$4 TSRMLS_CC); } statement { zend_do_if_after_statement(&$4, 1 TSRMLS_CC); } elseif_list else_single { zend_do_if_end(TSRMLS_C); }
282   - | T_IF '(' expr ')' ':' { zend_do_if_cond(&$3, &$4 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$4, 1 TSRMLS_CC); } new_elseif_list new_else_single T_ENDIF ';' { zend_do_if_end(TSRMLS_C); }
283   - | T_WHILE '(' { $1.u.op.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' { zend_do_while_cond(&$4, &$5 TSRMLS_CC); } while_statement { zend_do_while_end(&$1, &$5 TSRMLS_CC); }
284   - | T_DO { $1.u.op.opline_num = get_next_op_number(CG(active_op_array)); zend_do_do_while_begin(TSRMLS_C); } statement T_WHILE '(' { $5.u.op.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' ';' { zend_do_do_while_end(&$1, &$5, &$7 TSRMLS_CC); }
  281 + | T_IF parenthesis_expr { zend_do_if_cond(&$2, &$1 TSRMLS_CC); } statement { zend_do_if_after_statement(&$1, 1 TSRMLS_CC); } elseif_list else_single { zend_do_if_end(TSRMLS_C); }
  282 + | T_IF parenthesis_expr ':' { zend_do_if_cond(&$2, &$1 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$1, 1 TSRMLS_CC); } new_elseif_list new_else_single T_ENDIF ';' { zend_do_if_end(TSRMLS_C); }
  283 + | T_WHILE { $1.u.op.opline_num = get_next_op_number(CG(active_op_array)); } parenthesis_expr { zend_do_while_cond(&$3, &$$ TSRMLS_CC); } while_statement { zend_do_while_end(&$1, &$4 TSRMLS_CC); }
  284 + | T_DO { $1.u.op.opline_num = get_next_op_number(CG(active_op_array)); zend_do_do_while_begin(TSRMLS_C); } statement T_WHILE { $4.u.op.opline_num = get_next_op_number(CG(active_op_array)); } parenthesis_expr ';' { zend_do_do_while_end(&$1, &$4, &$6 TSRMLS_CC); }
285 285 | T_FOR
286 286 '('
287 287 for_expr
@@ -291,7 +291,7 @@ unticked_statement:
291 291 for_expr
292 292 ')' { zend_do_free(&$9 TSRMLS_CC); zend_do_for_before_statement(&$4, &$7 TSRMLS_CC); }
293 293 for_statement { zend_do_for_end(&$7 TSRMLS_CC); }
294   - | T_SWITCH '(' expr ')' { zend_do_switch_cond(&$3 TSRMLS_CC); } switch_case_list { zend_do_switch_end(&$6 TSRMLS_CC); }
  294 + | T_SWITCH parenthesis_expr { zend_do_switch_cond(&$2 TSRMLS_CC); } switch_case_list { zend_do_switch_end(&$4 TSRMLS_CC); }
295 295 | T_BREAK ';' { zend_do_brk_cont(ZEND_BRK, NULL TSRMLS_CC); }
296 296 | T_BREAK expr ';' { zend_do_brk_cont(ZEND_BRK, &$2 TSRMLS_CC); }
297 297 | T_CONTINUE ';' { zend_do_brk_cont(ZEND_CONT, NULL TSRMLS_CC); }
@@ -299,7 +299,7 @@ unticked_statement:
299 299 | T_RETURN ';' { zend_do_return(NULL, 0 TSRMLS_CC); }
300 300 | T_RETURN expr_without_variable ';' { zend_do_return(&$2, 0 TSRMLS_CC); }
301 301 | T_RETURN variable ';' { zend_do_return(&$2, 1 TSRMLS_CC); }
302   - | T_YIELD expr T_DOUBLE_ARROW expr ';' { zend_do_yield(&$$, &$4, &$2 TSRMLS_CC); }
  302 + | yield_expr ';' { $$ = $1; }
303 303 | T_GLOBAL global_var_list ';'
304 304 | T_STATIC static_var_list ';'
305 305 | T_ECHO echo_expr_list ';'
@@ -484,13 +484,13 @@ while_statement:
484 484
485 485 elseif_list:
486 486 /* empty */
487   - | elseif_list T_ELSEIF '(' expr ')' { zend_do_if_cond(&$4, &$5 TSRMLS_CC); } statement { zend_do_if_after_statement(&$5, 0 TSRMLS_CC); }
  487 + | elseif_list T_ELSEIF parenthesis_expr { zend_do_if_cond(&$3, &$2 TSRMLS_CC); } statement { zend_do_if_after_statement(&$2, 0 TSRMLS_CC); }
488 488 ;
489 489
490 490
491 491 new_elseif_list:
492 492 /* empty */
493   - | new_elseif_list T_ELSEIF '(' expr ')' ':' { zend_do_if_cond(&$4, &$5 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$5, 0 TSRMLS_CC); }
  493 + | new_elseif_list T_ELSEIF parenthesis_expr ':' { zend_do_if_cond(&$3, &$2 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$2, 0 TSRMLS_CC); }
494 494 ;
495 495
496 496
@@ -533,8 +533,9 @@ optional_class_type:
533 533
534 534
535 535 function_call_parameter_list:
536   - non_empty_function_call_parameter_list { $$ = $1; }
537   - | /* empty */ { Z_LVAL($$.u.constant) = 0; }
  536 + '(' ')' { Z_LVAL($$.u.constant) = 0; }
  537 + | '(' non_empty_function_call_parameter_list ')' { $$ = $2; }
  538 + | '(' yield_expr ')' { Z_LVAL($$.u.constant) = 1; zend_do_pass_param(&$2, ZEND_SEND_VAL, Z_LVAL($$.u.constant) TSRMLS_CC); }
538 539 ;
539 540
540 541
@@ -774,7 +775,7 @@ expr_without_variable:
774 775 | expr '>' expr { zend_do_binary_op(ZEND_IS_SMALLER, &$$, &$3, &$1 TSRMLS_CC); }
775 776 | expr T_IS_GREATER_OR_EQUAL expr { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$3, &$1 TSRMLS_CC); }
776 777 | expr T_INSTANCEOF class_name_reference { zend_do_instanceof(&$$, &$1, &$3, 0 TSRMLS_CC); }
777   - | '(' expr ')' { $$ = $2; }
  778 + | parenthesis_expr { $$ = $1; }
778 779 | new_expr { $$ = $1; }
779 780 | '(' new_expr ')' { $$ = $2; } instance_call { $$ = $5; }
780 781 | expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); }
@@ -797,8 +798,9 @@ expr_without_variable:
797 798 | combined_scalar { $$ = $1; }
798 799 | '`' backticks_expr '`' { zend_do_shell_exec(&$$, &$2 TSRMLS_CC); }
799 800 | T_PRINT expr { zend_do_print(&$$, &$2 TSRMLS_CC); }
800   - | T_YIELD { zend_do_yield(&$$, NULL, NULL TSRMLS_CC); }
801   - | T_YIELD expr { zend_do_yield(&$$, &$2, NULL TSRMLS_CC); }
  801 + | T_YIELD { zend_do_yield(&$$, NULL, NULL, 0 TSRMLS_CC); }
  802 + /*| T_YIELD expr_without_variable { zend_do_yield(&$$, &$2, NULL, 0 TSRMLS_CC); }
  803 + | T_YIELD variable { zend_do_yield(&$$, &$2, NULL, 1 TSRMLS_CC); }*/
802 804 | T_YIELD '*' expr { zend_do_delegate_yield(&$$, &$3 TSRMLS_CC); }
803 805 | function is_reference { zend_do_begin_lambda_function_declaration(&$$, &$1, $2.op_type, 0 TSRMLS_CC); }
804 806 '(' parameter_list ')' lexical_vars
@@ -808,6 +810,13 @@ expr_without_variable:
808 810 '{' inner_statement_list '}' { zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ = $4; }
809 811 ;
810 812
  813 +yield_expr:
  814 + T_YIELD expr_without_variable { zend_do_yield(&$$, &$2, NULL, 0 TSRMLS_CC); }
  815 + | T_YIELD variable { zend_do_yield(&$$, &$2, NULL, 1 TSRMLS_CC); }
  816 + | T_YIELD expr T_DOUBLE_ARROW expr_without_variable { zend_do_yield(&$$, &$4, &$2, 0 TSRMLS_CC); }
  817 + | T_YIELD expr T_DOUBLE_ARROW variable { zend_do_yield(&$$, &$4, &$2, 1 TSRMLS_CC); }
  818 +;
  819 +
811 820 combined_scalar_offset:
812 821 combined_scalar '[' dim_offset ']' { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
813 822 | combined_scalar_offset '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
@@ -834,30 +843,22 @@ lexical_var_list:
834 843 ;
835 844
836 845 function_call:
837   - namespace_name '(' { $2.u.op.opline_num = zend_do_begin_function_call(&$1, 1 TSRMLS_CC); }
838   - function_call_parameter_list
839   - ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, $2.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
840   - | T_NAMESPACE T_NS_SEPARATOR namespace_name '(' { $1.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$1.u.constant); zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC); $4.u.op.opline_num = zend_do_begin_function_call(&$1, 0 TSRMLS_CC); }
841   - function_call_parameter_list
842   - ')' { zend_do_end_function_call(&$1, &$$, &$6, 0, $4.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
843   - | T_NS_SEPARATOR namespace_name '(' { $3.u.op.opline_num = zend_do_begin_function_call(&$2, 0 TSRMLS_CC); }
844   - function_call_parameter_list
845   - ')' { zend_do_end_function_call(&$2, &$$, &$5, 0, $3.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
846   - | class_name T_PAAMAYIM_NEKUDOTAYIM variable_name '(' { $4.u.op.opline_num = zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
847   - function_call_parameter_list
848   - ')' { zend_do_end_function_call($4.u.op.opline_num?NULL:&$3, &$$, &$6, $4.u.op.opline_num, $4.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
849   - | class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
850   - function_call_parameter_list
851   - ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
852   - | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_name '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
853   - function_call_parameter_list
854   - ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
855   - | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
856   - function_call_parameter_list
857   - ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
858   - | variable_without_objects '(' { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&$1, 0 TSRMLS_CC); }
859   - function_call_parameter_list ')'
860   - { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
  846 + namespace_name { $$.u.op.opline_num = zend_do_begin_function_call(&$1, 1 TSRMLS_CC); }
  847 + function_call_parameter_list { zend_do_end_function_call(&$1, &$$, &$3, 0, $2.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
  848 + | T_NAMESPACE T_NS_SEPARATOR namespace_name { $1.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$1.u.constant); zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC); $$.u.op.opline_num = zend_do_begin_function_call(&$1, 0 TSRMLS_CC); }
  849 + function_call_parameter_list { zend_do_end_function_call(&$1, &$$, &$5, 0, $4.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
  850 + | T_NS_SEPARATOR namespace_name { $$.u.op.opline_num = zend_do_begin_function_call(&$2, 0 TSRMLS_CC); }
  851 + function_call_parameter_list { zend_do_end_function_call(&$2, &$$, &$4, 0, $3.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
  852 + | class_name T_PAAMAYIM_NEKUDOTAYIM variable_name { $$.u.op.opline_num = zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
  853 + function_call_parameter_list { zend_do_end_function_call($4.u.op.opline_num?NULL:&$3, &$$, &$5, $4.u.op.opline_num, $4.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
  854 + | class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
  855 + function_call_parameter_list { zend_do_end_function_call(NULL, &$$, &$5, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
  856 + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_name { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
  857 + function_call_parameter_list { zend_do_end_function_call(NULL, &$$, &$5, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
  858 + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
  859 + function_call_parameter_list { zend_do_end_function_call(NULL, &$$, &$5, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
  860 + | variable_without_objects { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&$1, 0 TSRMLS_CC); }
  861 + function_call_parameter_list { zend_do_end_function_call(&$1, &$$, &$3, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
861 862 ;
862 863
863 864 class_name:
@@ -902,7 +903,7 @@ dynamic_class_name_variable_property:
902 903 exit_expr:
903 904 /* empty */ { memset(&$$, 0, sizeof(znode)); $$.op_type = IS_UNUSED; }
904 905 | '(' ')' { memset(&$$, 0, sizeof(znode)); $$.op_type = IS_UNUSED; }
905   - | '(' expr ')' { $$ = $2; }
  906 + | parenthesis_expr { $$ = $1; }
906 907 ;
907 908
908 909 backticks_expr:
@@ -913,8 +914,8 @@ backticks_expr:
913 914
914 915
915 916 ctor_arguments:
916   - /* empty */ { Z_LVAL($$.u.constant)=0; }
917   - | '(' function_call_parameter_list ')' { $$ = $2; }
  917 + /* empty */ { Z_LVAL($$.u.constant) = 0; }
  918 + | function_call_parameter_list { $$ = $1; }
918 919 ;
919 920
920 921
@@ -986,6 +987,11 @@ expr:
986 987 | expr_without_variable { $$ = $1; }
987 988 ;
988 989
  990 +parenthesis_expr:
  991 + '(' expr ')' { $$ = $2; }
  992 + | '(' yield_expr ')' { $$ = $2; }
  993 +;
  994 +
989 995
990 996 r_variable:
991 997 variable { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); $$ = $1; }
@@ -1025,9 +1031,8 @@ array_method_dereference:
1025 1031 ;
1026 1032
1027 1033 method:
1028   - '(' { zend_do_pop_object(&$1 TSRMLS_CC); zend_do_begin_method_call(&$1 TSRMLS_CC); }
1029   - function_call_parameter_list ')'
1030   - { zend_do_end_function_call(&$1, &$$, &$3, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
  1034 + { zend_do_pop_object(&$$ TSRMLS_CC); zend_do_begin_method_call(&$$ TSRMLS_CC); }
  1035 + function_call_parameter_list { zend_do_end_function_call(&$1, &$$, &$2, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
1031 1036 ;
1032 1037
1033 1038 method_or_not:

0 comments on commit 8074863

Please sign in to comment.
Something went wrong with that request. Please try again.