]> granicus.if.org Git - php/commitdiff
Port goto
authorNikita Popov <nikic@php.net>
Wed, 9 Jul 2014 21:11:32 +0000 (23:11 +0200)
committerNikita Popov <nikic@php.net>
Wed, 9 Jul 2014 21:11:32 +0000 (23:11 +0200)
Zend/zend_compile.c
Zend/zend_language_parser.y

index f198e429ab120093fd3e53059013981131f69cc6..4d893f777eeb165829f5b71b3ea5500ad305de4f 100644 (file)
@@ -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()
        }
 }
index 1e15c04b3911c37069d635982dad65a90bd7d8bf..dbecd9da4afe8d9d4af82972706612ac557da03b 100644 (file)
@@ -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: