]> granicus.if.org Git - php/commitdiff
Port echo
authorNikita Popov <nikic@php.net>
Mon, 7 Jul 2014 19:14:14 +0000 (21:14 +0200)
committerNikita Popov <nikic@php.net>
Mon, 7 Jul 2014 19:14:14 +0000 (21:14 +0200)
Zend/zend_ast.h
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_language_parser.y

index b3d696986763c81552119629e8108a743cd7a214..8904d90a979d4e49f332cc11e7b293878339137a 100644 (file)
@@ -72,6 +72,7 @@ enum _zend_ast_kind {
        ZEND_AST_GLOBAL,
        ZEND_AST_UNSET,
        ZEND_AST_RETURN,
+       ZEND_AST_ECHO,
 };
 
 typedef unsigned short zend_ast_kind;
index e64ba51320e995d724d0a6d7bec842c8c46f0311..4a19f74d319f0ebb12ac68df3bbabbcd70fb314d 100644 (file)
@@ -627,16 +627,6 @@ void fetch_simple_variable(znode *result, znode *varname, int bp TSRMLS_DC) /* {
 }
 /* }}} */
 
-void zend_do_echo(znode *arg TSRMLS_DC) /* {{{ */
-{
-       zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
-
-       opline->opcode = ZEND_ECHO;
-       SET_NODE(opline->op1, arg);
-       SET_UNUSED(opline->op2);
-}
-/* }}} */
-
 void zend_do_abstract_method(const znode *function_name, znode *modifiers, const znode *body TSRMLS_DC) /* {{{ */
 {
        char *method_type;
@@ -6987,6 +6977,15 @@ void zend_compile_return(zend_ast *ast TSRMLS_DC) {
        }
 }
 
+void zend_compile_echo(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_ECHO, &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];
@@ -7742,6 +7741,9 @@ void zend_compile_stmt(zend_ast *ast TSRMLS_DC) {
                case ZEND_AST_RETURN:
                        zend_compile_return(ast TSRMLS_CC);
                        return;
+               case ZEND_AST_ECHO:
+                       zend_compile_echo(ast TSRMLS_CC);
+                       return;
                EMPTY_SWITCH_DEFAULT_CASE()
        }
 }
index d0365ac6c40964dfae6bbfc836903e6641253382..c7d3e06a8346dfc7ad897e42785abe00d884f014 100644 (file)
@@ -478,7 +478,6 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar
 void zend_do_fetch_static_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC);
 void zend_do_fetch_global_variable(znode *varname, const znode *static_assignment, int fetch_type TSRMLS_DC);
 
-void zend_do_echo(znode *arg TSRMLS_DC);
 typedef int (*unary_op_type)(zval *, zval * TSRMLS_DC);
 typedef int (*binary_op_type)(zval *, zval *, zval * TSRMLS_DC);
 ZEND_API unary_op_type get_unary_op(int opcode);
index 1ed1510136a1ec53734336e8b2a1fd67f678200c..9091886422090e4bb1c3dad9eadf72218f8ccfc5 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                   { zend_do_echo(&$1 TSRMLS_CC); }
+       |       T_INLINE_HTML { $$.u.ast = zend_ast_create_unary(ZEND_AST_ECHO, AST_ZVAL(&$1)); AS($$); }
        |       expr ';'                                { AC($1); zend_do_free(&$1 TSRMLS_CC); }
        |       T_UNSET '(' unset_variables ')' ';'
        |       T_FOREACH '(' variable T_AS
@@ -742,10 +742,12 @@ class_constant_declaration:
 ;
 
 echo_expr_list:
-               echo_expr_list ',' expr { AC($3); zend_do_echo(&$3 TSRMLS_CC); }
-       |       expr                                    { AC($1); zend_do_echo(&$1 TSRMLS_CC); }
+               echo_expr_list ',' echo_expr
+       |       echo_expr
+;
+echo_expr:
+       expr { $$.u.ast = zend_ast_create_unary(ZEND_AST_ECHO, $1.u.ast); AS($$); }
 ;
-
 
 for_expr:
                /* empty */                     { $$.op_type = IS_CONST;  ZVAL_BOOL(&$$.u.constant, 1); }