php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #75576
Patch func-try-block revision 2017-11-27 02:54 UTC by enclaved at safe-mail dot net

Patch func-try-block for Scripting Engine problem Bug #75576

Patch version 2017-11-27 02:54 UTC

Return to Bug #75576 | Download this patch
Patch Revisions:

Developer: enclaved@safe-mail.net

diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 6d11afc..5154dee 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -225,7 +225,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
 /* Token used to force a parse error from the lexer */
 %token T_ERROR
 
-%type <ast> top_statement namespace_name name statement function_declaration_statement
+%type <ast> top_statement namespace_name name statement function_declaration_statement routine_body
 %type <ast> class_declaration_statement trait_declaration_statement
 %type <ast> interface_declaration_statement interface_extends_list
 %type <ast> group_use_declaration inline_use_declarations inline_use_declaration
@@ -249,7 +249,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
 %type <ast> non_empty_parameter_list argument_list non_empty_argument_list property_list
 %type <ast> class_const_list class_const_decl name_list trait_adaptations method_body non_empty_for_exprs
 %type <ast> ctor_arguments alt_if_stmt_without_else trait_adaptation_list lexical_vars
-%type <ast> lexical_var_list encaps_list
+%type <ast> lexical_var_list encaps_list try_catch_finally_statement
 %type <ast> array_pair non_empty_array_pair_list array_pair_list possible_array_pair
 %type <ast> isset_variable type return_type type_expr
 %type <ast> identifier
@@ -450,13 +450,17 @@ statement:
 		declare_statement
 			{ $$ = zend_ast_create(ZEND_AST_DECLARE, $3, $6); }
 	|	';'	/* empty statement */ { $$ = NULL; }
-	|	T_TRY '{' inner_statement_list '}' catch_list finally_statement
-			{ $$ = zend_ast_create(ZEND_AST_TRY, $3, $5, $6); }
+	|	try_catch_finally_statement { $$ = $1; }
 	|	T_THROW expr ';' { $$ = zend_ast_create(ZEND_AST_THROW, $2); }
 	|	T_GOTO T_STRING ';' { $$ = zend_ast_create(ZEND_AST_GOTO, $2); }
 	|	T_STRING ':' { $$ = zend_ast_create(ZEND_AST_LABEL, $1); }
 ;
 
+try_catch_finally_statement:
+		T_TRY '{' inner_statement_list '}' catch_list finally_statement
+			{ $$ = zend_ast_create(ZEND_AST_TRY, $3, $5, $6); }
+;
+
 catch_list:
 		/* empty */
 			{ $$ = zend_ast_create_list(0, ZEND_AST_CATCH_LIST); }
@@ -485,9 +489,15 @@ unset_variable:
 
 function_declaration_statement:
 	function returns_ref T_STRING backup_doc_comment '(' parameter_list ')' return_type
-	backup_fn_flags '{' inner_statement_list '}' backup_fn_flags
-		{ $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2 | $13, $1, $4,
-		      zend_ast_get_str($3), $6, NULL, $11, $8); CG(extra_fn_flags) = $9; }
+	backup_fn_flags routine_body backup_fn_flags
+		{ $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2 | $11, $1, $4,
+		      zend_ast_get_str($3), $6, NULL, $10, $8); CG(extra_fn_flags) = $9; }
+;
+
+routine_body:
+		'{' inner_statement_list '}' { $$ = $2; }
+	|	try_catch_finally_statement
+			{ $$ = zend_ast_create_list(1, ZEND_AST_STMT_LIST, $1); }
 ;
 
 is_reference:
@@ -780,7 +790,7 @@ absolute_trait_method_reference:
 
 method_body:
 		';' /* abstract method */		{ $$ = NULL; }
-	|	'{' inner_statement_list '}'	{ $$ = $2; }
+	|	routine_body					{ $$ = $1; }
 ;
 
 variable_modifiers:
@@ -979,15 +989,15 @@ expr_without_variable:
 	|	T_YIELD expr T_DOUBLE_ARROW expr { $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); CG(extra_fn_flags) |= ZEND_ACC_GENERATOR; }
 	|	T_YIELD_FROM expr { $$ = zend_ast_create(ZEND_AST_YIELD_FROM, $2); CG(extra_fn_flags) |= ZEND_ACC_GENERATOR; }
 	|	function returns_ref backup_doc_comment '(' parameter_list ')' lexical_vars return_type
-		backup_fn_flags '{' inner_statement_list '}' backup_fn_flags
-			{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2 | $13, $1, $3,
+		backup_fn_flags routine_body backup_fn_flags
+			{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2 | $11, $1, $3,
 				  zend_string_init("{closure}", sizeof("{closure}") - 1, 0),
-			      $5, $7, $11, $8); CG(extra_fn_flags) = $9; }
+			      $5, $7, $10, $8); CG(extra_fn_flags) = $9; }
 	|	T_STATIC function returns_ref backup_doc_comment '(' parameter_list ')' lexical_vars
-		return_type backup_fn_flags '{' inner_statement_list '}' backup_fn_flags
-			{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $3 | $14 | ZEND_ACC_STATIC, $2, $4,
+		return_type backup_fn_flags routine_body backup_fn_flags
+			{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $3 | $12 | ZEND_ACC_STATIC, $2, $4,
 			      zend_string_init("{closure}", sizeof("{closure}") - 1, 0),
-			      $6, $8, $12, $9); CG(extra_fn_flags) = $10; }
+			      $6, $8, $11, $9); CG(extra_fn_flags) = $10; }
 ;
 
 function:
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Apr 28 12:01:28 2024 UTC