@@ -10688,7 +10688,7 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1068810688 zend_ast_list * list = zend_ast_get_list (ast );
1068910689 zend_op * opline ;
1069010690 uint32_t i , opnum_init = -1 ;
10691- bool packed = 1 , use_template = false ;
10691+ bool packed = 1 ;
1069210692
1069310693 znode template_node ;
1069410694 template_node .op_type = IS_CONST ;
@@ -10702,9 +10702,6 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1070210702
1070310703 zend_array * template = NULL ;
1070410704 if (Z_TYPE (template_node .u .constant ) == IS_ARRAY ) {
10705- opnum_init = get_next_op_number ();
10706- zend_emit_op_tmp (result , ZEND_ARRAY_DUP , & template_node , NULL );
10707- use_template = true;
1070810705 template = Z_ARRVAL (template_node .u .constant );
1070910706 }
1071010707
@@ -10720,7 +10717,7 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1072010717 }
1072110718
1072210719 if (terminate_array_template (elem_ast )) {
10723- use_template = false ;
10720+ template = NULL ;
1072410721 }
1072510722
1072610723 value_ast = elem_ast -> child [0 ];
@@ -10739,7 +10736,7 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1073910736 key_ast = elem_ast -> child [1 ];
1074010737 by_ref = elem_ast -> attr ;
1074110738
10742- if (key_ast && !use_template ) {
10739+ if (key_ast && !template ) {
1074310740 zend_compile_expr (& key_node , key_ast );
1074410741 zend_handle_numeric_op (& key_node );
1074510742 key_node_ptr = & key_node ;
@@ -10752,7 +10749,7 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1075210749 zend_compile_expr (& value_node , value_ast );
1075310750 }
1075410751
10755- if (use_template ) {
10752+ if (template ) {
1075610753 zval * element ;
1075710754 if (key_ast ) {
1075810755 zval * key = zend_ast_get_zval (key_ast );
@@ -10805,15 +10802,20 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1080510802 // }
1080610803 }
1080710804
10808- if (use_template && value_ast -> kind == ZEND_AST_ZVAL ) {
10805+ if (value_ast -> kind == ZEND_AST_ZVAL ) {
1080910806 zval_ptr_dtor (& value_node .u .constant );
1081010807 if (key_node_ptr ) {
1081110808 zval_ptr_dtor (& key_node_ptr -> u .constant );
1081210809 }
1081310810 continue ;
1081410811 }
1081510812
10816- opline = zend_emit_op (NULL , ZEND_ARRAY_SET_PLACEHOLDER , NULL , & value_node );
10813+ if (opnum_init == -1 ) {
10814+ opnum_init = get_next_op_number ();
10815+ opline = zend_emit_op_tmp (result , ZEND_ARRAY_DUP , & template_node , & value_node );
10816+ } else {
10817+ opline = zend_emit_op (NULL , ZEND_ARRAY_SET_PLACEHOLDER , NULL , & value_node );
10818+ }
1081710819 opline -> extended_value = (uintptr_t ) element - (HT_IS_PACKED (template ) ? (uintptr_t ) template -> arPacked : (uintptr_t ) template -> arData );
1081810820 SET_NODE (opline -> result , result );
1081910821 } else if (opnum_init == -1 ) {
@@ -10834,10 +10836,12 @@ static void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
1083410836 }
1083510837
1083610838 /* Add a flag to INIT_ARRAY if we know this array cannot be packed */
10837- if (!packed && ! template ) {
10839+ if (!packed ) {
1083810840 ZEND_ASSERT (opnum_init != (uint32_t )-1 );
1083910841 opline = & CG (active_op_array )-> opcodes [opnum_init ];
10840- opline -> extended_value |= ZEND_ARRAY_NOT_PACKED ;
10842+ if (opline -> opcode == ZEND_INIT_ARRAY ) {
10843+ opline -> extended_value |= ZEND_ARRAY_NOT_PACKED ;
10844+ }
1084110845 }
1084210846}
1084310847/* }}} */
0 commit comments