]> granicus.if.org Git - php/commitdiff
Port throw
authorNikita Popov <nikic@php.net>
Wed, 9 Jul 2014 20:47:36 +0000 (22:47 +0200)
committerNikita Popov <nikic@php.net>
Wed, 9 Jul 2014 20:48:42 +0000 (22:48 +0200)
Zend/zend_ast.h
Zend/zend_compile.c
Zend/zend_language_parser.y

index 8904d90a979d4e49f332cc11e7b293878339137a..b3d696986763c81552119629e8108a743cd7a214 100644 (file)
@@ -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;
index 4a19f74d319f0ebb12ac68df3bbabbcd70fb314d..aefd99bbd345e5eb4d516d7e84b6589265e2aced 100644 (file)
@@ -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()
        }
 }
index 9091886422090e4bb1c3dad9eadf72218f8ccfc5..1e3153121d9c77857854a90e263560344e717ff6 100644 (file)
@@ -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: