From: Nikita Popov Date: Mon, 7 Jul 2014 19:14:14 +0000 (+0200) Subject: Port echo X-Git-Tag: POST_AST_MERGE^2~169 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=289265402a5cc2e3aa262421ad1a3565a87fcc62;p=php Port echo --- diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index b3d6969867..8904d90a97 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -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; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e64ba51320..4a19f74d31 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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() } } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index d0365ac6c4..c7d3e06a83 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -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); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 1ed1510136..9091886422 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 { 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); }