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];
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()
}
}
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: