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:
|