diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-10-16 19:19:10 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-10-16 19:19:10 +0400 |
commit | 2a1250fa5738d97a215af8b939318013f8ebf926 (patch) | |
tree | e12faa2b834e9ba69c12ccc67ee5040596fc0743 | |
parent | fc6ce7d1c1852385b35b3a41feb4c47d9e1ce945 (diff) | |
download | php-git-2a1250fa5738d97a215af8b939318013f8ebf926.tar.gz |
Micro optimization for zend_hash_next_index_insert_new()
-rw-r--r-- | Zend/zend_hash.c | 18 | ||||
-rw-r--r-- | Zend/zend_hash.h | 1 |
2 files changed, 12 insertions, 7 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 6304737f04..dfd63aa7e1 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -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) diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 5a36ddf28f..2b9beca0fc 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -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) |