Commit 05b3c284e56 for php.net
commit 05b3c284e56df736cb7078d5dd6ba23c0bd31c7f
Author: Ilija Tovilo <ilija.tovilo@me.com>
Date: Fri Mar 27 14:24:47 2026 +0100
Slightly optimize hash add_new for packed arrays (GH-21539)
No need to check for UNDEF, assume the index is undefined. This eliminates the
offset calculation, lookup and type check. Though of course dwarfed by the
conversion to a proper hash table.
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 959becb5747..7bcb97c392b 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -1111,7 +1111,10 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) != (HASH_ADD_NEW|HASH_ADD_NEXT)
&& h < ht->nNumUsed) {
zv = ht->arPacked + h;
- if (Z_TYPE_P(zv) != IS_UNDEF) {
+ if (flag & HASH_ADD_NEW) {
+ ZEND_ASSERT(Z_TYPE_P(zv) == IS_UNDEF);
+ goto convert_to_hash;
+ } else if (Z_TYPE_P(zv) != IS_UNDEF) {
if (flag & HASH_LOOKUP) {
return zv;
}