From: Nikita Popov Date: Wed, 9 Jul 2014 20:47:36 +0000 (+0200) Subject: Port throw X-Git-Tag: POST_AST_MERGE^2~168 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5bf0c28fe32ea3bf6e7f5c6271b3ce6c68805af0;p=php Port throw --- diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 8904d90a97..b3d6969867 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -72,7 +72,6 @@ enum _zend_ast_kind { ZEND_AST_GLOBAL, ZEND_AST_UNSET, ZEND_AST_RETURN, - ZEND_AST_ECHO, }; typedef unsigned short zend_ast_kind; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 4a19f74d31..aefd99bbd3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6986,6 +6986,15 @@ void zend_compile_echo(zend_ast *ast TSRMLS_DC) { emit_op(NULL, ZEND_ECHO, &expr_node, NULL TSRMLS_CC); } +void zend_compile_throw(zend_ast *ast TSRMLS_DC) { + zend_ast *expr_ast = ast->child[0]; + + znode expr_node; + zend_compile_expr(&expr_node, expr_ast TSRMLS_CC); + + emit_op(NULL, ZEND_THROW, &expr_node, NULL TSRMLS_CC); +} + void zend_compile_binary_op(znode *result, zend_ast *ast TSRMLS_DC) { zend_ast *left_ast = ast->child[0]; zend_ast *right_ast = ast->child[1]; @@ -7741,9 +7750,12 @@ void zend_compile_stmt(zend_ast *ast TSRMLS_DC) { case ZEND_AST_RETURN: zend_compile_return(ast TSRMLS_CC); return; - case ZEND_AST_ECHO: + case ZEND_ECHO: zend_compile_echo(ast TSRMLS_CC); return; + case ZEND_THROW: + zend_compile_throw(ast TSRMLS_CC); + return; EMPTY_SWITCH_DEFAULT_CASE() } } diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 9091886422..1e3153121d 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -348,7 +348,7 @@ unticked_statement: | T_GLOBAL global_var_list ';' | T_STATIC static_var_list ';' | T_ECHO echo_expr_list ';' - | T_INLINE_HTML { $$.u.ast = zend_ast_create_unary(ZEND_AST_ECHO, AST_ZVAL(&$1)); AS($$); } + | T_INLINE_HTML { $$.u.ast = zend_ast_create_unary(ZEND_ECHO, AST_ZVAL(&$1)); AS($$); } | expr ';' { AC($1); zend_do_free(&$1 TSRMLS_CC); } | T_UNSET '(' unset_variables ')' ';' | T_FOREACH '(' variable T_AS @@ -364,7 +364,7 @@ unticked_statement: | T_TRY { zend_do_try(&$1 TSRMLS_CC); } '{' inner_statement_list '}' catch_statement { zend_do_bind_catch(&$1, &$6 TSRMLS_CC); } finally_statement { zend_do_end_finally(&$1, &$6, &$8 TSRMLS_CC); } - | T_THROW expr ';' { AC($2); zend_do_throw(&$2 TSRMLS_CC); } + | T_THROW expr ';' { $$.u.ast = zend_ast_create_unary(ZEND_THROW, $2.u.ast); AS($$); } | T_GOTO T_STRING ';' { zend_do_goto(&$2 TSRMLS_CC); } ; @@ -746,7 +746,7 @@ echo_expr_list: | echo_expr ; echo_expr: - expr { $$.u.ast = zend_ast_create_unary(ZEND_AST_ECHO, $1.u.ast); AS($$); } + expr { $$.u.ast = zend_ast_create_unary(ZEND_ECHO, $1.u.ast); AS($$); } ; for_expr: