summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-04-09 11:20:55 +0200
committerNikita Popov <nikic@php.net>2014-04-09 12:31:21 +0200
commitad2ef3d97edab0d0ce034e65b7e3da1a38cc15dd (patch)
tree70d5aecb331426e5058b28e6d97b0c80e969fa4a /Zend/zend_hash.c
parentf485c84a142a28c594dd7bcc3760a406dd4c5883 (diff)
downloadphp-git-ad2ef3d97edab0d0ce034e65b7e3da1a38cc15dd.tar.gz
Add only_integer_keys option to zend_hash_reindex
This allows to either do a full reindex, or only reindex the integer keys.
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r--Zend/zend_hash.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index a33e8726e2..309631338a 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -480,7 +480,7 @@ ZEND_API int zend_hash_rehash(HashTable *ht)
return SUCCESS;
}
-ZEND_API void zend_hash_reindex(HashTable *ht) {
+ZEND_API void zend_hash_reindex(HashTable *ht, zend_bool only_integer_keys) {
Bucket *p;
uint nIndex;
ulong offset = 0;
@@ -492,8 +492,9 @@ ZEND_API void zend_hash_reindex(HashTable *ht) {
memset(ht->arBuckets, 0, ht->nTableSize * sizeof(Bucket *));
for (p = ht->pListHead; p != NULL; p = p->pListNext) {
- if (p->nKeyLength == 0) {
+ if (!only_integer_keys || p->nKeyLength == 0) {
p->h = offset++;
+ p->nKeyLength = 0;
}
nIndex = p->h & ht->nTableMask;
@@ -1353,7 +1354,7 @@ ZEND_API void _zend_hash_splice(HashTable *ht, uint nDataSize, copy_ctor_func_t
ZEND_HASH_IF_FULL_DO_RESIZE(ht);
}
- zend_hash_reindex(ht);
+ zend_hash_reindex(ht, 1);
}
/* }}} */
@@ -1403,15 +1404,7 @@ ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func,
HANDLE_UNBLOCK_INTERRUPTIONS();
if (renumber) {
- p = ht->pListHead;
- i=0;
- while (p != NULL) {
- p->nKeyLength = 0;
- p->h = i++;
- p = p->pListNext;
- }
- ht->nNextFreeElement = i;
- zend_hash_rehash(ht);
+ zend_hash_reindex(ht, 0);
}
return SUCCESS;
}