@@ -6262,17 +6262,22 @@ ZEND_VM_C_LABEL(add_unpack_again):
62626262 zval * val ;
62636263
62646264 if (HT_IS_PACKED (ht ) && (zend_hash_num_elements (result_ht ) == 0 || HT_IS_PACKED (result_ht ))) {
6265- zend_hash_extend (result_ht , result_ht -> nNumUsed + zend_hash_num_elements (ht ), 1 );
6266- ZEND_HASH_FILL_PACKED (result_ht ) {
6267- ZEND_HASH_PACKED_FOREACH_VAL (ht , val ) {
6268- if (UNEXPECTED (Z_ISREF_P (val )) &&
6269- UNEXPECTED (Z_REFCOUNT_P (val ) == 1 )) {
6270- val = Z_REFVAL_P (val );
6271- }
6272- Z_TRY_ADDREF_P (val );
6273- ZEND_HASH_FILL_ADD (val );
6274- } ZEND_HASH_FOREACH_END ();
6275- } ZEND_HASH_FILL_END ();
6265+ /* zend_hash_extend() skips initialization when the number of elements is 0,
6266+ * but the code below expects that result_ht is initialized as packed.
6267+ * We can just skip the work in that case. */
6268+ if (result_ht -> nNumUsed + zend_hash_num_elements (ht ) > 0 ) {
6269+ zend_hash_extend (result_ht , result_ht -> nNumUsed + zend_hash_num_elements (ht ), 1 );
6270+ ZEND_HASH_FILL_PACKED (result_ht ) {
6271+ ZEND_HASH_PACKED_FOREACH_VAL (ht , val ) {
6272+ if (UNEXPECTED (Z_ISREF_P (val )) &&
6273+ UNEXPECTED (Z_REFCOUNT_P (val ) == 1 )) {
6274+ val = Z_REFVAL_P (val );
6275+ }
6276+ Z_TRY_ADDREF_P (val );
6277+ ZEND_HASH_FILL_ADD (val );
6278+ } ZEND_HASH_FOREACH_END ();
6279+ } ZEND_HASH_FILL_END ();
6280+ }
62766281 } else {
62776282 zend_string * key ;
62786283
0 commit comments