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;
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;
ZEND_HASH_IF_FULL_DO_RESIZE(ht);
}
- zend_hash_reindex(ht);
+ zend_hash_reindex(ht, 1);
}
/* }}} */
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;
}
ZEND_API int zend_hash_num_elements(const HashTable *ht);
ZEND_API int zend_hash_rehash(HashTable *ht);
-ZEND_API void zend_hash_reindex(HashTable *ht);
+ZEND_API void zend_hash_reindex(HashTable *ht, zend_bool only_integer_keys);
ZEND_API void _zend_hash_splice(HashTable *ht, uint nDataSize, copy_ctor_func_t pCopyConstructor, uint offset, uint length, void **list, uint list_count, HashTable *removed ZEND_FILE_LINE_DC);
#define zend_hash_splice(ht, nDataSize, pCopyConstructor, offset, length, list, list_count, removed) \
}
temp = hash->pListHead;
j = 0;
- while (temp != NULL) {
- temp->nKeyLength = 0;
- temp->h = j++;
- temp = temp->pListNext;
- }
- hash->nNextFreeElement = n_elems;
- zend_hash_rehash(hash);
+ zend_hash_reindex(hash, 0);
HANDLE_UNBLOCK_INTERRUPTIONS();
efree(elems);
/* If we did a shift... re-index like it did before */
if (!off_the_end) {
- zend_hash_reindex(Z_ARRVAL_P(stack));
+ zend_hash_reindex(Z_ARRVAL_P(stack), 1);
} else if (!key_len && index >= Z_ARRVAL_P(stack)->nNextFreeElement - 1) {
Z_ARRVAL_P(stack)->nNextFreeElement = Z_ARRVAL_P(stack)->nNextFreeElement - 1;
}
hash->pListTail = indirect[k][i];
}
- p = hash->pListHead;
- k = 0;
- while (p != NULL) {
- if (p->nKeyLength == 0)
- p->h = k++;
- p = p->pListNext;
- }
- hash->nNextFreeElement = array_size;
- zend_hash_rehash(hash);
+ zend_hash_reindex(hash, 1);
}
HANDLE_UNBLOCK_INTERRUPTIONS();