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

index 12d51dc13779bf6c006490f9aebf2ee717927552..cb731a39da6566033634bc1c24235217c3901293 100644 (file)
@@ -74,6 +74,7 @@ enum _zend_ast_kind {
        ZEND_AST_GLOBAL,
        ZEND_AST_UNSET,
        ZEND_AST_RETURN,
+       ZEND_AST_LABEL,
 };
 
 typedef unsigned short zend_ast_kind;
index 664883657a764f56f414db6d1a9882519858926d..83caf8f07f730f4f63dd3c7fd3ddec74347ebedc 100644 (file)
@@ -7036,6 +7036,25 @@ void zend_compile_goto(zend_ast *ast TSRMLS_DC) {
        zend_resolve_goto_label(CG(active_op_array), opline, 0 TSRMLS_CC);
 }
 
+void zend_compile_label(zend_ast *ast TSRMLS_DC) {
+       zval *label = zend_ast_get_zval(ast->child[0]);
+       zend_label dest;
+
+       ZEND_ASSERT(Z_TYPE_P(label) == IS_STRING);
+
+       if (!CG(context).labels) {
+               ALLOC_HASHTABLE(CG(context).labels);
+               zend_hash_init(CG(context).labels, 8, NULL, ptr_dtor, 0);
+       }
+
+       dest.brk_cont = CG(context).current_brk_cont;
+       dest.opline_num = get_next_op_number(CG(active_op_array));
+
+       if (!zend_hash_add_mem(CG(context).labels, Z_STR_P(label), &dest, sizeof(zend_label))) {
+               zend_error_noreturn(E_COMPILE_ERROR, "Label '%s' already defined", Z_STRVAL_P(label));
+       }
+}
+
 void zend_compile_stmt_list(zend_ast *ast TSRMLS_DC) {
        zend_uint i;
        for (i = 0; i < ast->children; ++i) {
@@ -7818,6 +7837,9 @@ void zend_compile_stmt(zend_ast *ast TSRMLS_DC) {
                case ZEND_GOTO:
                        zend_compile_goto(ast TSRMLS_CC);
                        return;
+               case ZEND_AST_LABEL:
+                       zend_compile_label(ast TSRMLS_CC);
+                       return;
                EMPTY_SWITCH_DEFAULT_CASE()
        }
 }
index 27432886765a6c9e9f3226d4590c762ae5d05d8c..e3cd93782461a87352c9c19e3bd34b0b97131de0 100644 (file)
@@ -318,7 +318,7 @@ inner_statement:
 
 statement:
                unticked_statement { AS($$); DO_TICKS(); }
-       |       T_STRING ':' { zend_do_label(&$1 TSRMLS_CC); }
+       |       T_STRING ':' { $$.u.ast = zend_ast_create_unary(ZEND_AST_LABEL, AST_ZVAL(&$1)); AS($$); }
 ;
 
 unticked_statement: