summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-10-16 19:19:10 +0400
committerDmitry Stogov <dmitry@zend.com>2014-10-16 19:19:10 +0400
commit2a1250fa5738d97a215af8b939318013f8ebf926 (patch)
treee12faa2b834e9ba69c12ccc67ee5040596fc0743
parentfc6ce7d1c1852385b35b3a41feb4c47d9e1ce945 (diff)
downloadphp-git-2a1250fa5738d97a215af8b939318013f8ebf926.tar.gz
Micro optimization for zend_hash_next_index_insert_new()
-rw-r--r--Zend/zend_hash.c18
-rw-r--r--Zend/zend_hash.h1
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)