diff --git a/UPGRADING b/UPGRADING index 7a3aff95da8ef..858e1cffa9535 100644 --- a/UPGRADING +++ b/UPGRADING @@ -122,3 +122,6 @@ PHP 8.6 UPGRADE NOTES - JSON: . Improve performance of encoding arrays and objects. + +- Standard: + . Improved performance of array_fill_keys(). diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 57020bbcad0b2..3a501b7f37df1 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -473,6 +473,17 @@ static zend_always_inline bool zend_hash_str_exists_ind(const HashTable *ht, con Z_TYPE_P(Z_INDIRECT_P(zv)) != IS_UNDEF); } +static zend_always_inline zval *zend_symtable_add(HashTable *ht, zend_string *key, zval *pData) +{ + zend_ulong idx; + + if (ZEND_HANDLE_NUMERIC(key, idx)) { + return zend_hash_index_add(ht, idx, pData); + } else { + return zend_hash_add(ht, key, pData); + } +} + static zend_always_inline zval *zend_symtable_add_new(HashTable *ht, zend_string *key, zval *pData) { zend_ulong idx; diff --git a/ext/standard/array.c b/ext/standard/array.c index 4097d71899011..32d28fe70220a 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2830,16 +2830,19 @@ PHP_FUNCTION(array_fill_keys) ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(keys), entry) { ZVAL_DEREF(entry); - Z_TRY_ADDREF_P(val); if (Z_TYPE_P(entry) == IS_LONG) { - zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(entry), val); + zend_hash_index_add(Z_ARRVAL_P(return_value), Z_LVAL_P(entry), val); } else { zend_string *tmp_key; zend_string *key = zval_get_tmp_string(entry, &tmp_key); - zend_symtable_update(Z_ARRVAL_P(return_value), key, val); + zend_symtable_add(Z_ARRVAL_P(return_value), key, val); zend_tmp_string_release(tmp_key); } } ZEND_HASH_FOREACH_END(); + + if (Z_REFCOUNTED_P(val)) { + GC_ADDREF_EX(Z_COUNTED_P(val), zend_hash_num_elements(Z_ARRVAL_P(return_value))); + } } /* }}} */