]> granicus.if.org Git - php/commitdiff
Micro optimization for zend_hash_next_index_insert_new()
authorDmitry Stogov <dmitry@zend.com>
Thu, 16 Oct 2014 15:19:10 +0000 (19:19 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 16 Oct 2014 15:19:10 +0000 (19:19 +0400)
Zend/zend_hash.c
Zend/zend_hash.h

index 6304737f04e8feee3cf7eccb987f1db1695671b2..dfd63aa7e196f3bb08db6b3a84e87c4760180ca5 100644 (file)
@@ -444,11 +444,15 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
 
                HANDLE_BLOCK_INTERRUPTIONS();
                /* incremental initialization of empty Buckets */
-               if (h >= ht->nNumUsed) {
-                       Bucket *q = ht->arData + ht->nNumUsed;
-                       while (q != p) {
-                               ZVAL_UNDEF(&q->val);
-                               q++;
+               if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) == (HASH_ADD_NEW|HASH_ADD_NEXT)) {
+                       ht->nNumUsed = h + 1;
+               } else if (h >= ht->nNumUsed) {
+                       if (h > ht->nNumUsed) {
+                               Bucket *q = ht->arData + ht->nNumUsed;
+                               while (q != p) {
+                                       ZVAL_UNDEF(&q->val);
+                                       q++;
+                               }
                        }
                        ht->nNumUsed = h + 1;
                }
@@ -537,12 +541,12 @@ ZEND_API zval *_zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData
 
 ZEND_API zval *_zend_hash_next_index_insert(HashTable *ht, zval *pData ZEND_FILE_LINE_DC)
 {
-       return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD ZEND_FILE_LINE_RELAY_CC);
+       return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC);
 }
 
 ZEND_API zval *_zend_hash_next_index_insert_new(HashTable *ht, zval *pData ZEND_FILE_LINE_DC)
 {
-       return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW ZEND_FILE_LINE_RELAY_CC);
+       return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC);
 }
 
 static void zend_hash_do_resize(HashTable *ht)
index 5a36ddf28fc0537b3544d7da025bf3fba28d9240..2b9beca0fcc1faf26ee3c805fd439e51e48654c2 100644 (file)
@@ -32,6 +32,7 @@
 #define HASH_ADD                               (1<<1)
 #define HASH_UPDATE_INDIRECT   (1<<2)
 #define HASH_ADD_NEW                   (1<<3)
+#define HASH_ADD_NEXT                  (1<<4)
 
 #define INVALID_IDX ((uint32_t) -1)