From: Nikita Popov Date: Wed, 9 Jul 2014 21:11:32 +0000 (+0200) Subject: Port goto X-Git-Tag: POST_AST_MERGE^2~166 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fc541418f2f77a56409e5d02a86e42bfa8a4ee44;p=php Port goto --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f198e429ab..4d893f777e 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7025,6 +7025,17 @@ void zend_compile_break_continue(zend_ast *ast TSRMLS_DC) { opline->op1.opline_num = CG(context).current_brk_cont; } +void zend_compile_goto(zend_ast *ast TSRMLS_DC) { + zend_ast *label_ast = ast->child[0]; + znode label_node; + zend_op *opline; + + zend_compile_expr(&label_node, label_ast TSRMLS_CC); + opline = emit_op(NULL, ZEND_GOTO, NULL, &label_node TSRMLS_CC); + opline->extended_value = CG(context).current_brk_cont; + zend_resolve_goto_label(CG(active_op_array), opline, 0 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]; @@ -7790,6 +7801,9 @@ void zend_compile_stmt(zend_ast *ast TSRMLS_DC) { case ZEND_CONT: zend_compile_break_continue(ast TSRMLS_CC); return; + case ZEND_GOTO: + zend_compile_goto(ast TSRMLS_CC); + return; EMPTY_SWITCH_DEFAULT_CASE() } } diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 1e15c04b39..dbecd9da4a 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -365,7 +365,7 @@ unticked_statement: catch_statement { zend_do_bind_catch(&$1, &$6 TSRMLS_CC); } finally_statement { zend_do_end_finally(&$1, &$6, &$8 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); } + | T_GOTO T_STRING ';' { $$.u.ast = zend_ast_create_unary(ZEND_GOTO, AST_ZVAL(&$2)); AS($$); } ; catch_statement: