]> granicus.if.org Git - php/commitdiff
Combine code for keyed/unkeyed list()
authorNikita Popov <nikic@php.net>
Wed, 28 Sep 2016 19:41:56 +0000 (21:41 +0200)
committerNikita Popov <nikic@php.net>
Wed, 28 Sep 2016 19:43:48 +0000 (21:43 +0200)
Zend/zend_compile.c

index 1501acec1e9b6d2fd2db2ef689dc763d816635e7..87590e71e410dd18ae3c404f96d02c500e9d0c53 100644 (file)
@@ -2804,75 +2804,54 @@ static void zend_verify_list_assign_target(zend_ast *var_ast, zend_bool old_styl
 }
 /* }}} */
 
-static void zend_compile_unkeyed_list_assign(zend_ast_list *list, znode *expr_node, zend_bool old_style) /* {{{ */
+static void zend_compile_list_assign(
+               znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style) /* {{{ */
 {
+       zend_ast_list *list = zend_ast_get_list(ast);
        uint32_t i;
        zend_bool has_elems = 0;
+       zend_bool is_keyed =
+               list->children > 0 && list->child[0] != NULL && list->child[0]->child[1] != NULL;
 
        for (i = 0; i < list->children; ++i) {
                zend_ast *elem_ast = list->child[i];
-               zend_ast *var_ast;
+               zend_ast *var_ast, *key_ast;
                znode fetch_result, dim_node;
 
                if (elem_ast == NULL) {
-                       continue;
+                       if (is_keyed) {
+                               zend_error(E_COMPILE_ERROR,
+                                       "Cannot use empty array entries in keyed array assignment");
+                       } else {
+                               continue;
+                       }
                }
+
                if (elem_ast->attr) {
                        zend_error(E_COMPILE_ERROR, "[] and list() assignments cannot be by reference");
                }
 
                var_ast = elem_ast->child[0];
+               key_ast = elem_ast->child[1];
                has_elems = 1;
 
-               dim_node.op_type = IS_CONST;
-               ZVAL_LONG(&dim_node.u.constant, i);
-
-               if (expr_node->op_type == IS_CONST) {
-                       Z_TRY_ADDREF(expr_node->u.constant);
-               }
-
-               if (elem_ast->child[1] != NULL) {
-                       zend_error(E_COMPILE_ERROR, "Cannot mix keyed and unkeyed array entries in assignments");
-               }
-
-               zend_verify_list_assign_target(var_ast, old_style);
-
-               zend_emit_op(&fetch_result, ZEND_FETCH_LIST, expr_node, &dim_node);
-               zend_emit_assign_znode(var_ast, &fetch_result);
-       }
-
-       if (has_elems == 0) {
-               zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list");
-       }
-
-}
-/* }}} */
-
-static void zend_compile_keyed_list_assign(zend_ast_list *list, znode *expr_node, zend_bool old_style) /* {{{ */
-{
-       uint32_t i;
-
-       for (i = 0; i < list->children; ++i) {
-               zend_ast *elem_ast = list->child[i];
-               zend_ast *var_ast, *key_ast;
-               znode fetch_result, dim_node;
-
-               if (elem_ast == NULL) {
-                       zend_error(E_COMPILE_ERROR, "Cannot use empty array entries in keyed array assignment");
-               }
-               if (elem_ast->attr) {
-                       zend_error(E_COMPILE_ERROR, "[] and list() assignments cannot be by reference");
-               }
+               if (is_keyed) {
+                       if (key_ast == NULL) {
+                               zend_error(E_COMPILE_ERROR,
+                                       "Cannot mix keyed and unkeyed array entries in assignments");
+                       }
 
-               var_ast = elem_ast->child[0];
-               key_ast = elem_ast->child[1];
+                       zend_compile_expr(&dim_node, key_ast);
+               } else {
+                       if (key_ast != NULL) {
+                               zend_error(E_COMPILE_ERROR,
+                                       "Cannot mix keyed and unkeyed array entries in assignments");
+                       }
 
-               if (key_ast == NULL) {
-                       zend_error(E_COMPILE_ERROR, "Cannot mix keyed and unkeyed array entries in assignments");
+                       dim_node.op_type = IS_CONST;
+                       ZVAL_LONG(&dim_node.u.constant, i);
                }
 
-               zend_compile_expr(&dim_node, key_ast);
-
                if (expr_node->op_type == IS_CONST) {
                        Z_TRY_ADDREF(expr_node->u.constant);
                }
@@ -2882,17 +2861,9 @@ static void zend_compile_keyed_list_assign(zend_ast_list *list, znode *expr_node
                zend_emit_op(&fetch_result, ZEND_FETCH_LIST, expr_node, &dim_node);
                zend_emit_assign_znode(var_ast, &fetch_result);
        }
-}
-/* }}} */
-
-static void zend_compile_list_assign(znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style) /* {{{ */
-{
-       zend_ast_list *list = zend_ast_get_list(ast);
 
-       if (list->children > 0 && list->child[0] != NULL && list->child[0]->child[1] != NULL /* has key */) {
-               zend_compile_keyed_list_assign(list, expr_node, old_style);
-       } else {
-               zend_compile_unkeyed_list_assign(list, expr_node, old_style);
+       if (has_elems == 0) {
+               zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list");
        }
 
        *result = *expr_node;