@@ -6325,17 +6325,22 @@ ZEND_VM_C_LABEL(add_unpack_again):
6325
6325
zval * val ;
6326
6326
6327
6327
if (HT_IS_PACKED (ht ) && (zend_hash_num_elements (result_ht ) == 0 || HT_IS_PACKED (result_ht ))) {
6328
- zend_hash_extend (result_ht , result_ht -> nNumUsed + zend_hash_num_elements (ht ), 1 );
6329
- ZEND_HASH_FILL_PACKED (result_ht ) {
6330
- ZEND_HASH_PACKED_FOREACH_VAL (ht , val ) {
6331
- if (UNEXPECTED (Z_ISREF_P (val )) &&
6332
- UNEXPECTED (Z_REFCOUNT_P (val ) == 1 )) {
6333
- val = Z_REFVAL_P (val );
6334
- }
6335
- Z_TRY_ADDREF_P (val );
6336
- ZEND_HASH_FILL_ADD (val );
6337
- } ZEND_HASH_FOREACH_END ();
6338
- } ZEND_HASH_FILL_END ();
6328
+ /* zend_hash_extend() skips initialization when the number of elements is 0,
6329
+ * but the code below expects that result_ht is initialized as packed.
6330
+ * We can just skip the work in that case. */
6331
+ if (result_ht -> nNumUsed + zend_hash_num_elements (ht ) > 0 ) {
6332
+ zend_hash_extend (result_ht , result_ht -> nNumUsed + zend_hash_num_elements (ht ), 1 );
6333
+ ZEND_HASH_FILL_PACKED (result_ht ) {
6334
+ ZEND_HASH_PACKED_FOREACH_VAL (ht , val ) {
6335
+ if (UNEXPECTED (Z_ISREF_P (val )) &&
6336
+ UNEXPECTED (Z_REFCOUNT_P (val ) == 1 )) {
6337
+ val = Z_REFVAL_P (val );
6338
+ }
6339
+ Z_TRY_ADDREF_P (val );
6340
+ ZEND_HASH_FILL_ADD (val );
6341
+ } ZEND_HASH_FOREACH_END ();
6342
+ } ZEND_HASH_FILL_END ();
6343
+ }
6339
6344
} else {
6340
6345
zend_string * key ;
6341
6346
0 commit comments