Lines Matching refs:ht

31 # define HT_ASSERT(ht, expr) \  argument
32 ZEND_ASSERT((expr) || (HT_FLAGS(ht) & HASH_FLAG_ALLOW_COW_VIOLATION))
34 # define HT_ASSERT(ht, expr) argument
37 #define HT_ASSERT_RC1(ht) HT_ASSERT(ht, GC_REFCOUNT(ht) == 1) argument
48 static void _zend_is_inconsistent(const HashTable *ht, const char *file, int line) in _zend_is_inconsistent() argument
50 if ((HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) == HT_OK) { in _zend_is_inconsistent()
53 switch (HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) { in _zend_is_inconsistent()
55 zend_output_debug_string(1, "%s(%d) : ht=%p is being destroyed", file, line, ht); in _zend_is_inconsistent()
58 zend_output_debug_string(1, "%s(%d) : ht=%p is already destroyed", file, line, ht); in _zend_is_inconsistent()
61 zend_output_debug_string(1, "%s(%d) : ht=%p is being cleaned", file, line, ht); in _zend_is_inconsistent()
64 zend_output_debug_string(1, "%s(%d) : ht=%p is inconsistent", file, line, ht); in _zend_is_inconsistent()
71 HT_FLAGS(ht) = (HT_FLAGS(ht) & ~HASH_FLAG_CONSISTENCY) | (n); \
78 #define ZEND_HASH_IF_FULL_DO_RESIZE(ht) \ argument
79 if ((ht)->nNumUsed >= (ht)->nTableSize) { \
80 zend_hash_do_resize(ht); \
83 static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht);
120 static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *ht) in zend_hash_real_init_packed_ex() argument
122 …HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PER… in zend_hash_real_init_packed_ex()
123 HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED; in zend_hash_real_init_packed_ex()
124 HT_HASH_RESET_PACKED(ht); in zend_hash_real_init_packed_ex()
127 static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht) in zend_hash_real_init_mixed_ex() argument
129 uint32_t nSize = ht->nTableSize; in zend_hash_real_init_mixed_ex()
131 ht->nTableMask = HT_SIZE_TO_MASK(nSize); in zend_hash_real_init_mixed_ex()
132 …HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_P… in zend_hash_real_init_mixed_ex()
133 HT_FLAGS(ht) |= HASH_FLAG_INITIALIZED; in zend_hash_real_init_mixed_ex()
134 if (EXPECTED(ht->nTableMask == HT_SIZE_TO_MASK(HT_MIN_SIZE))) { in zend_hash_real_init_mixed_ex()
135 Bucket *arData = ht->arData; in zend_hash_real_init_mixed_ex()
163 HT_HASH_RESET(ht); in zend_hash_real_init_mixed_ex()
167 static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, int packed) in zend_hash_real_init_ex() argument
169 HT_ASSERT_RC1(ht); in zend_hash_real_init_ex()
170 ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)); in zend_hash_real_init_ex()
172 zend_hash_real_init_packed_ex(ht); in zend_hash_real_init_ex()
174 zend_hash_real_init_mixed_ex(ht); in zend_hash_real_init_ex()
195 static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDest… in _zend_hash_init_int() argument
197 GC_SET_REFCOUNT(ht, 1); in _zend_hash_init_int()
198 …GC_TYPE_INFO(ht) = IS_ARRAY | (persistent ? (GC_PERSISTENT << GC_FLAGS_SHIFT) : (GC_COLLECTABLE <<… in _zend_hash_init_int()
199 HT_FLAGS(ht) = HASH_FLAG_STATIC_KEYS; in _zend_hash_init_int()
200 ht->nTableMask = HT_MIN_MASK; in _zend_hash_init_int()
201 HT_SET_DATA_ADDR(ht, &uninitialized_bucket); in _zend_hash_init_int()
202 ht->nNumUsed = 0; in _zend_hash_init_int()
203 ht->nNumOfElements = 0; in _zend_hash_init_int()
204 ht->nInternalPointer = 0; in _zend_hash_init_int()
205 ht->nNextFreeElement = 0; in _zend_hash_init_int()
206 ht->pDestructor = pDestructor; in _zend_hash_init_int()
207 ht->nTableSize = zend_hash_check_size(nSize); in _zend_hash_init_int()
210 ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor,… in _zend_hash_init() argument
212 _zend_hash_init_int(ht, nSize, pDestructor, persistent); in _zend_hash_init()
217 HashTable *ht = emalloc(sizeof(HashTable)); in _zend_new_array_0() local
218 _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0); in _zend_new_array_0()
219 return ht; in _zend_new_array_0()
224 HashTable *ht = emalloc(sizeof(HashTable)); in _zend_new_array() local
225 _zend_hash_init_int(ht, nSize, ZVAL_PTR_DTOR, 0); in _zend_new_array()
226 return ht; in _zend_new_array()
229 static void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht) in zend_hash_packed_grow() argument
231 HT_ASSERT_RC1(ht); in zend_hash_packed_grow()
232 if (ht->nTableSize >= HT_MAX_SIZE) { in zend_hash_packed_grow()
233 …_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, siz… in zend_hash_packed_grow()
235 ht->nTableSize += ht->nTableSize; in zend_hash_packed_grow()
236 …HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_… in zend_hash_packed_grow()
239 ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed) in zend_hash_real_init() argument
241 IS_CONSISTENT(ht); in zend_hash_real_init()
243 HT_ASSERT_RC1(ht); in zend_hash_real_init()
244 zend_hash_real_init_ex(ht, packed); in zend_hash_real_init()
247 ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht) in zend_hash_real_init_packed() argument
249 IS_CONSISTENT(ht); in zend_hash_real_init_packed()
251 HT_ASSERT_RC1(ht); in zend_hash_real_init_packed()
252 zend_hash_real_init_packed_ex(ht); in zend_hash_real_init_packed()
255 ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht) in zend_hash_real_init_mixed() argument
257 IS_CONSISTENT(ht); in zend_hash_real_init_mixed()
259 HT_ASSERT_RC1(ht); in zend_hash_real_init_mixed()
260 zend_hash_real_init_mixed_ex(ht); in zend_hash_real_init_mixed()
263 ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht) in zend_hash_packed_to_hash() argument
265 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_packed_to_hash()
266 Bucket *old_buckets = ht->arData; in zend_hash_packed_to_hash()
267 uint32_t nSize = ht->nTableSize; in zend_hash_packed_to_hash()
269 HT_ASSERT_RC1(ht); in zend_hash_packed_to_hash()
270 HT_FLAGS(ht) &= ~HASH_FLAG_PACKED; in zend_hash_packed_to_hash()
271 new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_packed_to_hash()
272 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_packed_to_hash()
273 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_packed_to_hash()
274 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_packed_to_hash()
275 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_packed_to_hash()
276 zend_hash_rehash(ht); in zend_hash_packed_to_hash()
279 ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht) in zend_hash_to_packed() argument
281 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_to_packed()
282 Bucket *old_buckets = ht->arData; in zend_hash_to_packed()
284 HT_ASSERT_RC1(ht); in zend_hash_to_packed()
285 new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_to_packed()
286 HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_to_packed()
287 ht->nTableMask = HT_MIN_MASK; in zend_hash_to_packed()
288 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_to_packed()
289 HT_HASH_RESET_PACKED(ht); in zend_hash_to_packed()
290 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_to_packed()
291 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_to_packed()
294 ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed) in zend_hash_extend() argument
296 HT_ASSERT_RC1(ht); in zend_hash_extend()
298 if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) { in zend_hash_extend()
299 if (nSize > ht->nTableSize) { in zend_hash_extend()
300 ht->nTableSize = zend_hash_check_size(nSize); in zend_hash_extend()
302 zend_hash_real_init(ht, packed); in zend_hash_extend()
305 ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_PACKED); in zend_hash_extend()
306 if (nSize > ht->nTableSize) { in zend_hash_extend()
307 ht->nTableSize = zend_hash_check_size(nSize); in zend_hash_extend()
308 …HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_… in zend_hash_extend()
311 ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED)); in zend_hash_extend()
312 if (nSize > ht->nTableSize) { in zend_hash_extend()
313 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_extend()
314 Bucket *old_buckets = ht->arData; in zend_hash_extend()
316 ht->nTableSize = nSize; in zend_hash_extend()
317 …new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_extend()
318 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_extend()
319 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_extend()
320 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_extend()
321 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_extend()
322 zend_hash_rehash(ht); in zend_hash_extend()
328 ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed) in zend_hash_discard() argument
333 arData = ht->arData; in zend_hash_discard()
334 p = arData + ht->nNumUsed; in zend_hash_discard()
336 ht->nNumUsed = nNumUsed; in zend_hash_discard()
340 ht->nNumOfElements--; in zend_hash_discard()
342 nIndex = p->h | ht->nTableMask; in zend_hash_discard()
347 static uint32_t zend_array_recalc_elements(HashTable *ht) in zend_array_recalc_elements() argument
350 uint32_t num = ht->nNumOfElements; in zend_array_recalc_elements()
352 ZEND_HASH_FOREACH_VAL(ht, val) { in zend_array_recalc_elements()
363 ZEND_API uint32_t zend_array_count(HashTable *ht) in zend_array_count() argument
366 if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_HAS_EMPTY_IND)) { in zend_array_count()
367 num = zend_array_recalc_elements(ht); in zend_array_count()
368 if (UNEXPECTED(ht->nNumOfElements == num)) { in zend_array_count()
369 HT_FLAGS(ht) &= ~HASH_FLAG_HAS_EMPTY_IND; in zend_array_count()
371 } else if (UNEXPECTED(ht == &EG(symbol_table))) { in zend_array_count()
372 num = zend_array_recalc_elements(ht); in zend_array_count()
374 num = zend_hash_num_elements(ht); in zend_array_count()
380 static zend_always_inline HashPosition _zend_hash_get_valid_pos(const HashTable *ht, HashPosition p… in _zend_hash_get_valid_pos() argument
382 while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arData[pos].val)) { in _zend_hash_get_valid_pos()
388 static zend_always_inline HashPosition _zend_hash_get_current_pos(const HashTable *ht) in _zend_hash_get_current_pos() argument
390 return _zend_hash_get_valid_pos(ht, ht->nInternalPointer); in _zend_hash_get_current_pos()
393 ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht) in zend_hash_get_current_pos() argument
395 return _zend_hash_get_current_pos(ht); in zend_hash_get_current_pos()
398 ZEND_API uint32_t ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPosition pos) in zend_hash_iterator_add() argument
404 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_add()
405 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_add()
408 if (iter->ht == NULL) { in zend_hash_iterator_add()
409 iter->ht = ht; in zend_hash_iterator_add()
427 iter->ht = ht; in zend_hash_iterator_add()
435 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos(uint32_t idx, HashTable *ht) in zend_hash_iterator_pos() argument
440 if (UNEXPECTED(iter->ht != ht)) { in zend_hash_iterator_pos()
441 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_pos()
442 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_pos()
443 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_pos()
445 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos()
446 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_pos()
448 iter->ht = ht; in zend_hash_iterator_pos()
449 iter->pos = _zend_hash_get_current_pos(ht); in zend_hash_iterator_pos()
456 HashTable *ht = Z_ARRVAL_P(array); in zend_hash_iterator_pos_ex() local
460 if (UNEXPECTED(iter->ht != ht)) { in zend_hash_iterator_pos_ex()
461 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_pos_ex()
462 && EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos_ex()
463 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_pos_ex()
466 ht = Z_ARRVAL_P(array); in zend_hash_iterator_pos_ex()
467 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos_ex()
468 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_pos_ex()
470 iter->ht = ht; in zend_hash_iterator_pos_ex()
471 iter->pos = _zend_hash_get_current_pos(ht); in zend_hash_iterator_pos_ex()
482 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_del()
483 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_del()
484 ZEND_ASSERT(HT_ITERATORS_COUNT(iter->ht) != 0); in zend_hash_iterator_del()
485 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_del()
487 iter->ht = NULL; in zend_hash_iterator_del()
490 while (idx > 0 && EG(ht_iterators)[idx - 1].ht == NULL) { in zend_hash_iterator_del()
497 static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(HashTable *ht) in _zend_hash_iterators_remove() argument
503 if (iter->ht == ht) { in _zend_hash_iterators_remove()
504 iter->ht = HT_POISONED_PTR; in _zend_hash_iterators_remove()
510 static zend_always_inline void zend_hash_iterators_remove(HashTable *ht) in zend_hash_iterators_remove() argument
512 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_iterators_remove()
513 _zend_hash_iterators_remove(ht); in zend_hash_iterators_remove()
517 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht, HashPosition start) in zend_hash_iterators_lower_pos() argument
521 HashPosition res = ht->nNumUsed; in zend_hash_iterators_lower_pos()
524 if (iter->ht == ht) { in zend_hash_iterators_lower_pos()
534 ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosit… in _zend_hash_iterators_update() argument
540 if (iter->ht == ht && iter->pos == from) { in _zend_hash_iterators_update()
547 ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step) in zend_hash_iterators_advance() argument
553 if (iter->ht == ht) { in zend_hash_iterators_advance()
560 static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key, zend… in zend_hash_find_bucket() argument
572 arData = ht->arData; in zend_hash_find_bucket()
573 nIndex = h | ht->nTableMask; in zend_hash_find_bucket()
601 static zend_always_inline Bucket *zend_hash_str_find_bucket(const HashTable *ht, const char *str, s… in zend_hash_str_find_bucket() argument
607 arData = ht->arData; in zend_hash_str_find_bucket()
608 nIndex = h | ht->nTableMask; in zend_hash_str_find_bucket()
611 ZEND_ASSERT(idx < HT_IDX_TO_HASH(ht->nTableSize)); in zend_hash_str_find_bucket()
624 static zend_always_inline Bucket *zend_hash_index_find_bucket(const HashTable *ht, zend_ulong h) in zend_hash_index_find_bucket() argument
630 arData = ht->arData; in zend_hash_index_find_bucket()
631 nIndex = h | ht->nTableMask; in zend_hash_index_find_bucket()
634 ZEND_ASSERT(idx < HT_IDX_TO_HASH(ht->nTableSize)); in zend_hash_index_find_bucket()
644 static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_string *key, zval *p… in _zend_hash_add_or_update_i() argument
651 IS_CONSISTENT(ht); in _zend_hash_add_or_update_i()
652 HT_ASSERT_RC1(ht); in _zend_hash_add_or_update_i()
654 if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) { in _zend_hash_add_or_update_i()
655 zend_hash_real_init_mixed(ht); in _zend_hash_add_or_update_i()
658 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
662 } else if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in _zend_hash_add_or_update_i()
663 zend_hash_packed_to_hash(ht); in _zend_hash_add_or_update_i()
666 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
670 p = zend_hash_find_bucket(ht, key, 0); in _zend_hash_add_or_update_i()
696 if (ht->pDestructor) { in _zend_hash_add_or_update_i()
697 ht->pDestructor(data); in _zend_hash_add_or_update_i()
704 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
708 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
712 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_add_or_update_i()
715 idx = ht->nNumUsed++; in _zend_hash_add_or_update_i()
716 ht->nNumOfElements++; in _zend_hash_add_or_update_i()
717 arData = ht->arData; in _zend_hash_add_or_update_i()
721 nIndex = h | ht->nTableMask; in _zend_hash_add_or_update_i()
729 static zend_always_inline zval *_zend_hash_str_add_or_update_i(HashTable *ht, const char *str, size… in _zend_hash_str_add_or_update_i() argument
736 IS_CONSISTENT(ht); in _zend_hash_str_add_or_update_i()
737 HT_ASSERT_RC1(ht); in _zend_hash_str_add_or_update_i()
739 if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) { in _zend_hash_str_add_or_update_i()
740 zend_hash_real_init_mixed(ht); in _zend_hash_str_add_or_update_i()
742 } else if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in _zend_hash_str_add_or_update_i()
743 zend_hash_packed_to_hash(ht); in _zend_hash_str_add_or_update_i()
745 p = zend_hash_str_find_bucket(ht, str, len, h); in _zend_hash_str_add_or_update_i()
771 if (ht->pDestructor) { in _zend_hash_str_add_or_update_i()
772 ht->pDestructor(data); in _zend_hash_str_add_or_update_i()
779 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_str_add_or_update_i()
782 idx = ht->nNumUsed++; in _zend_hash_str_add_or_update_i()
783 ht->nNumOfElements++; in _zend_hash_str_add_or_update_i()
784 p = ht->arData + idx; in _zend_hash_str_add_or_update_i()
785 p->key = key = zend_string_init(str, len, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in _zend_hash_str_add_or_update_i()
787 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_str_add_or_update_i()
789 nIndex = h | ht->nTableMask; in _zend_hash_str_add_or_update_i()
790 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in _zend_hash_str_add_or_update_i()
791 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx); in _zend_hash_str_add_or_update_i()
796 ZEND_API zval* ZEND_FASTCALL zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, … in zend_hash_add_or_update() argument
799 return zend_hash_add(ht, key, pData); in zend_hash_add_or_update()
801 return zend_hash_add_new(ht, key, pData); in zend_hash_add_or_update()
803 return zend_hash_update(ht, key, pData); in zend_hash_add_or_update()
806 return zend_hash_update_ind(ht, key, pData); in zend_hash_add_or_update()
810 ZEND_API zval* ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData) in zend_hash_add() argument
812 return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD); in zend_hash_add()
815 ZEND_API zval* ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData) in zend_hash_update() argument
817 return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE); in zend_hash_update()
820 ZEND_API zval* ZEND_FASTCALL zend_hash_update_ind(HashTable *ht, zend_string *key, zval *pData) in zend_hash_update_ind() argument
822 return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT); in zend_hash_update_ind()
825 ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData) in zend_hash_add_new() argument
827 return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW); in zend_hash_add_new()
830 ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_or_update(HashTable *ht, const char *str, size_t len… in zend_hash_str_add_or_update() argument
833 return zend_hash_str_add(ht, str, len, pData); in zend_hash_str_add_or_update()
835 return zend_hash_str_add_new(ht, str, len, pData); in zend_hash_str_add_or_update()
837 return zend_hash_str_update(ht, str, len, pData); in zend_hash_str_add_or_update()
840 return zend_hash_str_update_ind(ht, str, len, pData); in zend_hash_str_add_or_update()
844 ZEND_API zval* ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval … in zend_hash_str_update() argument
848 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE); in zend_hash_str_update()
851 ZEND_API zval* ZEND_FASTCALL zend_hash_str_update_ind(HashTable *ht, const char *str, size_t len, z… in zend_hash_str_update_ind() argument
855 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT); in zend_hash_str_update_ind()
858 ZEND_API zval* ZEND_FASTCALL zend_hash_str_add(HashTable *ht, const char *str, size_t len, zval *pD… in zend_hash_str_add() argument
862 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD); in zend_hash_str_add()
865 ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_new(HashTable *ht, const char *str, size_t len, zval… in zend_hash_str_add_new() argument
869 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD_NEW); in zend_hash_str_add_new()
872 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_empty_element(HashTable *ht, zend_ulong h) in zend_hash_index_add_empty_element() argument
877 return zend_hash_index_add(ht, h, &dummy); in zend_hash_index_add_empty_element()
880 ZEND_API zval* ZEND_FASTCALL zend_hash_add_empty_element(HashTable *ht, zend_string *key) in zend_hash_add_empty_element() argument
885 return zend_hash_add(ht, key, &dummy); in zend_hash_add_empty_element()
888 ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_empty_element(HashTable *ht, const char *str, size_t… in zend_hash_str_add_empty_element() argument
893 return zend_hash_str_add(ht, str, len, &dummy); in zend_hash_str_add_empty_element()
896 static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, zend_ulong h, zval … in _zend_hash_index_add_or_update_i() argument
902 IS_CONSISTENT(ht); in _zend_hash_index_add_or_update_i()
903 HT_ASSERT_RC1(ht); in _zend_hash_index_add_or_update_i()
905 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in _zend_hash_index_add_or_update_i()
906 if (h < ht->nNumUsed) { in _zend_hash_index_add_or_update_i()
907 p = ht->arData + h; in _zend_hash_index_add_or_update_i()
913 if (ht->pDestructor) { in _zend_hash_index_add_or_update_i()
914 ht->pDestructor(&p->val); in _zend_hash_index_add_or_update_i()
921 } else if (EXPECTED(h < ht->nTableSize)) { in _zend_hash_index_add_or_update_i()
923 p = ht->arData + h; in _zend_hash_index_add_or_update_i()
926 if (h > ht->nNumUsed) { in _zend_hash_index_add_or_update_i()
927 Bucket *q = ht->arData + ht->nNumUsed; in _zend_hash_index_add_or_update_i()
934 ht->nNextFreeElement = ht->nNumUsed = h + 1; in _zend_hash_index_add_or_update_i()
936 } else if ((h >> 1) < ht->nTableSize && in _zend_hash_index_add_or_update_i()
937 (ht->nTableSize >> 1) < ht->nNumOfElements) { in _zend_hash_index_add_or_update_i()
938 zend_hash_packed_grow(ht); in _zend_hash_index_add_or_update_i()
941 if (ht->nNumUsed >= ht->nTableSize) { in _zend_hash_index_add_or_update_i()
942 ht->nTableSize += ht->nTableSize; in _zend_hash_index_add_or_update_i()
945 zend_hash_packed_to_hash(ht); in _zend_hash_index_add_or_update_i()
947 } else if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) { in _zend_hash_index_add_or_update_i()
948 if (h < ht->nTableSize) { in _zend_hash_index_add_or_update_i()
949 zend_hash_real_init_packed_ex(ht); in _zend_hash_index_add_or_update_i()
952 zend_hash_real_init_mixed(ht); in _zend_hash_index_add_or_update_i()
955 p = zend_hash_index_find_bucket(ht, h); in _zend_hash_index_add_or_update_i()
960 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_index_add_or_update_i()
963 idx = ht->nNumUsed++; in _zend_hash_index_add_or_update_i()
964 nIndex = h | ht->nTableMask; in _zend_hash_index_add_or_update_i()
965 p = ht->arData + idx; in _zend_hash_index_add_or_update_i()
966 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in _zend_hash_index_add_or_update_i()
967 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx); in _zend_hash_index_add_or_update_i()
968 if ((zend_long)h >= (zend_long)ht->nNextFreeElement) { in _zend_hash_index_add_or_update_i()
969 ht->nNextFreeElement = h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX; in _zend_hash_index_add_or_update_i()
972 ht->nNumOfElements++; in _zend_hash_index_add_or_update_i()
980 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_or_update(HashTable *ht, zend_ulong h, zval *pData… in zend_hash_index_add_or_update() argument
983 return zend_hash_index_add(ht, h, pData); in zend_hash_index_add_or_update()
985 return zend_hash_index_add_new(ht, h, pData); in zend_hash_index_add_or_update()
987 ZEND_ASSERT(h == ht->nNextFreeElement); in zend_hash_index_add_or_update()
988 return zend_hash_next_index_insert(ht, pData); in zend_hash_index_add_or_update()
990 ZEND_ASSERT(h == ht->nNextFreeElement); in zend_hash_index_add_or_update()
991 return zend_hash_next_index_insert_new(ht, pData); in zend_hash_index_add_or_update()
994 return zend_hash_index_update(ht, h, pData); in zend_hash_index_add_or_update()
998 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_add() argument
1000 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD); in zend_hash_index_add()
1003 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_add_new() argument
1005 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD | HASH_ADD_NEW); in zend_hash_index_add_new()
1008 ZEND_API zval* ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_update() argument
1010 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_UPDATE); in zend_hash_index_update()
1013 ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData) in zend_hash_next_index_insert() argument
1015 return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT); in zend_hash_next_index_insert()
1018 ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData) in zend_hash_next_index_insert_new() argument
1020 …return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW |… in zend_hash_next_index_insert_new()
1023 static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) in zend_hash_do_resize() argument
1026 IS_CONSISTENT(ht); in zend_hash_do_resize()
1027 HT_ASSERT_RC1(ht); in zend_hash_do_resize()
1029 …if (ht->nNumUsed > ht->nNumOfElements + (ht->nNumOfElements >> 5)) { /* additional term is there t… in zend_hash_do_resize()
1030 zend_hash_rehash(ht); in zend_hash_do_resize()
1031 } else if (ht->nTableSize < HT_MAX_SIZE) { /* Let's double the table size */ in zend_hash_do_resize()
1032 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_do_resize()
1033 uint32_t nSize = ht->nTableSize + ht->nTableSize; in zend_hash_do_resize()
1034 Bucket *old_buckets = ht->arData; in zend_hash_do_resize()
1036 ht->nTableSize = nSize; in zend_hash_do_resize()
1037 …new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_do_resize()
1038 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_do_resize()
1039 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_do_resize()
1040 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_do_resize()
1041 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_do_resize()
1042 zend_hash_rehash(ht); in zend_hash_do_resize()
1044 …_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, siz… in zend_hash_do_resize()
1048 ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) in zend_hash_rehash() argument
1053 IS_CONSISTENT(ht); in zend_hash_rehash()
1055 if (UNEXPECTED(ht->nNumOfElements == 0)) { in zend_hash_rehash()
1056 if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) { in zend_hash_rehash()
1057 ht->nNumUsed = 0; in zend_hash_rehash()
1058 HT_HASH_RESET(ht); in zend_hash_rehash()
1063 HT_HASH_RESET(ht); in zend_hash_rehash()
1065 p = ht->arData; in zend_hash_rehash()
1066 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_rehash()
1068 nIndex = p->h | ht->nTableMask; in zend_hash_rehash()
1069 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1070 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i); in zend_hash_rehash()
1072 } while (++i < ht->nNumUsed); in zend_hash_rehash()
1074 uint32_t old_num_used = ht->nNumUsed; in zend_hash_rehash()
1080 if (EXPECTED(!HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1081 while (++i < ht->nNumUsed) { in zend_hash_rehash()
1086 nIndex = q->h | ht->nTableMask; in zend_hash_rehash()
1088 Z_NEXT(q->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1089 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); in zend_hash_rehash()
1090 if (UNEXPECTED(ht->nInternalPointer == i)) { in zend_hash_rehash()
1091 ht->nInternalPointer = j; in zend_hash_rehash()
1098 uint32_t iter_pos = zend_hash_iterators_lower_pos(ht, 0); in zend_hash_rehash()
1100 while (++i < ht->nNumUsed) { in zend_hash_rehash()
1105 nIndex = q->h | ht->nTableMask; in zend_hash_rehash()
1107 Z_NEXT(q->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1108 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); in zend_hash_rehash()
1109 if (UNEXPECTED(ht->nInternalPointer == i)) { in zend_hash_rehash()
1110 ht->nInternalPointer = j; in zend_hash_rehash()
1114 zend_hash_iterators_update(ht, iter_pos, j); in zend_hash_rehash()
1115 iter_pos = zend_hash_iterators_lower_pos(ht, iter_pos + 1); in zend_hash_rehash()
1123 ht->nNumUsed = j; in zend_hash_rehash()
1126 nIndex = p->h | ht->nTableMask; in zend_hash_rehash()
1127 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1128 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i); in zend_hash_rehash()
1130 } while (++i < ht->nNumUsed); in zend_hash_rehash()
1134 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1135 _zend_hash_iterators_update(ht, old_num_used, ht->nNumUsed); in zend_hash_rehash()
1141 static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, Bucket *p, Bucket … in _zend_hash_del_el_ex() argument
1143 if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { in _zend_hash_del_el_ex()
1147 HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val); in _zend_hash_del_el_ex()
1151 ht->nNumOfElements--; in _zend_hash_del_el_ex()
1152 if (ht->nInternalPointer == idx || UNEXPECTED(HT_HAS_ITERATORS(ht))) { in _zend_hash_del_el_ex()
1158 if (new_idx >= ht->nNumUsed) { in _zend_hash_del_el_ex()
1160 } else if (Z_TYPE(ht->arData[new_idx].val) != IS_UNDEF) { in _zend_hash_del_el_ex()
1164 if (ht->nInternalPointer == idx) { in _zend_hash_del_el_ex()
1165 ht->nInternalPointer = new_idx; in _zend_hash_del_el_ex()
1167 zend_hash_iterators_update(ht, idx, new_idx); in _zend_hash_del_el_ex()
1169 if (ht->nNumUsed - 1 == idx) { in _zend_hash_del_el_ex()
1171 ht->nNumUsed--; in _zend_hash_del_el_ex()
1172 } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF))); in _zend_hash_del_el_ex()
1173 ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed); in _zend_hash_del_el_ex()
1178 if (ht->pDestructor) { in _zend_hash_del_el_ex()
1182 ht->pDestructor(&tmp); in _zend_hash_del_el_ex()
1188 static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bucket *p) in _zend_hash_del_el() argument
1192 if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { in _zend_hash_del_el()
1193 uint32_t nIndex = p->h | ht->nTableMask; in _zend_hash_del_el()
1194 uint32_t i = HT_HASH(ht, nIndex); in _zend_hash_del_el()
1197 prev = HT_HASH_TO_BUCKET(ht, i); in _zend_hash_del_el()
1200 prev = HT_HASH_TO_BUCKET(ht, i); in _zend_hash_del_el()
1205 _zend_hash_del_el_ex(ht, idx, p, prev); in _zend_hash_del_el()
1208 ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p) in zend_hash_del_bucket() argument
1210 IS_CONSISTENT(ht); in zend_hash_del_bucket()
1211 HT_ASSERT_RC1(ht); in zend_hash_del_bucket()
1212 _zend_hash_del_el(ht, HT_IDX_TO_HASH(p - ht->arData), p); in zend_hash_del_bucket()
1215 ZEND_API int ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key) in zend_hash_del() argument
1223 IS_CONSISTENT(ht); in zend_hash_del()
1224 HT_ASSERT_RC1(ht); in zend_hash_del()
1227 nIndex = h | ht->nTableMask; in zend_hash_del()
1229 idx = HT_HASH(ht, nIndex); in zend_hash_del()
1231 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_del()
1236 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_del()
1245 ZEND_API int ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key) in zend_hash_del_ind() argument
1253 IS_CONSISTENT(ht); in zend_hash_del_ind()
1254 HT_ASSERT_RC1(ht); in zend_hash_del_ind()
1257 nIndex = h | ht->nTableMask; in zend_hash_del_ind()
1259 idx = HT_HASH(ht, nIndex); in zend_hash_del_ind()
1261 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_del_ind()
1272 if (ht->pDestructor) { in zend_hash_del_ind()
1276 ht->pDestructor(&tmp); in zend_hash_del_ind()
1280 HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; in zend_hash_del_ind()
1283 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_del_ind()
1293 ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *str, size_t len) in zend_hash_str_del_ind() argument
1301 IS_CONSISTENT(ht); in zend_hash_str_del_ind()
1302 HT_ASSERT_RC1(ht); in zend_hash_str_del_ind()
1305 nIndex = h | ht->nTableMask; in zend_hash_str_del_ind()
1307 idx = HT_HASH(ht, nIndex); in zend_hash_str_del_ind()
1309 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_str_del_ind()
1320 if (ht->pDestructor) { in zend_hash_str_del_ind()
1321 ht->pDestructor(data); in zend_hash_str_del_ind()
1324 HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; in zend_hash_str_del_ind()
1327 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_str_del_ind()
1337 ZEND_API int ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *str, size_t len) in zend_hash_str_del() argument
1345 IS_CONSISTENT(ht); in zend_hash_str_del()
1346 HT_ASSERT_RC1(ht); in zend_hash_str_del()
1349 nIndex = h | ht->nTableMask; in zend_hash_str_del()
1351 idx = HT_HASH(ht, nIndex); in zend_hash_str_del()
1353 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_str_del()
1358 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_str_del()
1367 ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h) in zend_hash_index_del() argument
1374 IS_CONSISTENT(ht); in zend_hash_index_del()
1375 HT_ASSERT_RC1(ht); in zend_hash_index_del()
1377 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_index_del()
1378 if (h < ht->nNumUsed) { in zend_hash_index_del()
1379 p = ht->arData + h; in zend_hash_index_del()
1381 _zend_hash_del_el_ex(ht, HT_IDX_TO_HASH(h), p, NULL); in zend_hash_index_del()
1387 nIndex = h | ht->nTableMask; in zend_hash_index_del()
1389 idx = HT_HASH(ht, nIndex); in zend_hash_index_del()
1391 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_index_del()
1393 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_index_del()
1402 ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) in zend_hash_destroy() argument
1406 IS_CONSISTENT(ht); in zend_hash_destroy()
1407 HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); in zend_hash_destroy()
1409 if (ht->nNumUsed) { in zend_hash_destroy()
1410 p = ht->arData; in zend_hash_destroy()
1411 end = p + ht->nNumUsed; in zend_hash_destroy()
1412 if (ht->pDestructor) { in zend_hash_destroy()
1415 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_destroy()
1416 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1418 ht->pDestructor(&p->val); in zend_hash_destroy()
1423 ht->pDestructor(&p->val); in zend_hash_destroy()
1427 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1429 ht->pDestructor(&p->val); in zend_hash_destroy()
1437 ht->pDestructor(&p->val); in zend_hash_destroy()
1447 if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_destroy()
1457 zend_hash_iterators_remove(ht); in zend_hash_destroy()
1458 } else if (EXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) { in zend_hash_destroy()
1461 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_destroy()
1464 ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht) in zend_array_destroy() argument
1468 IS_CONSISTENT(ht); in zend_array_destroy()
1469 HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); in zend_array_destroy()
1472 GC_REMOVE_FROM_BUFFER(ht); in zend_array_destroy()
1473 GC_TYPE_INFO(ht) = IS_NULL /*???| (GC_WHITE << 16)*/; in zend_array_destroy()
1475 if (ht->nNumUsed) { in zend_array_destroy()
1477 if (UNEXPECTED(ht->pDestructor != ZVAL_PTR_DTOR)) { in zend_array_destroy()
1478 zend_hash_destroy(ht); in zend_array_destroy()
1482 p = ht->arData; in zend_array_destroy()
1483 end = p + ht->nNumUsed; in zend_array_destroy()
1486 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_array_destroy()
1490 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_array_destroy()
1507 } else if (EXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) { in zend_array_destroy()
1510 zend_hash_iterators_remove(ht); in zend_array_destroy()
1512 efree(HT_GET_DATA_ADDR(ht)); in zend_array_destroy()
1514 FREE_HASHTABLE(ht); in zend_array_destroy()
1517 ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht) in zend_hash_clean() argument
1521 IS_CONSISTENT(ht); in zend_hash_clean()
1522 HT_ASSERT_RC1(ht); in zend_hash_clean()
1524 if (ht->nNumUsed) { in zend_hash_clean()
1525 p = ht->arData; in zend_hash_clean()
1526 end = p + ht->nNumUsed; in zend_hash_clean()
1527 if (ht->pDestructor) { in zend_hash_clean()
1528 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1529 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1531 ht->pDestructor(&p->val); in zend_hash_clean()
1536 ht->pDestructor(&p->val); in zend_hash_clean()
1540 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1542 ht->pDestructor(&p->val); in zend_hash_clean()
1550 ht->pDestructor(&p->val); in zend_hash_clean()
1558 if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1559 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1576 if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { in zend_hash_clean()
1577 HT_HASH_RESET(ht); in zend_hash_clean()
1580 ht->nNumUsed = 0; in zend_hash_clean()
1581 ht->nNumOfElements = 0; in zend_hash_clean()
1582 ht->nNextFreeElement = 0; in zend_hash_clean()
1583 ht->nInternalPointer = 0; in zend_hash_clean()
1586 ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht) in zend_symtable_clean() argument
1590 IS_CONSISTENT(ht); in zend_symtable_clean()
1591 HT_ASSERT_RC1(ht); in zend_symtable_clean()
1593 if (ht->nNumUsed) { in zend_symtable_clean()
1594 p = ht->arData; in zend_symtable_clean()
1595 end = p + ht->nNumUsed; in zend_symtable_clean()
1596 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_symtable_clean()
1600 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_symtable_clean()
1617 HT_HASH_RESET(ht); in zend_symtable_clean()
1619 ht->nNumUsed = 0; in zend_symtable_clean()
1620 ht->nNumOfElements = 0; in zend_symtable_clean()
1621 ht->nNextFreeElement = 0; in zend_symtable_clean()
1622 ht->nInternalPointer = 0; in zend_symtable_clean()
1625 ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht) in zend_hash_graceful_destroy() argument
1630 IS_CONSISTENT(ht); in zend_hash_graceful_destroy()
1631 HT_ASSERT_RC1(ht); in zend_hash_graceful_destroy()
1633 p = ht->arData; in zend_hash_graceful_destroy()
1634 for (idx = 0; idx < ht->nNumUsed; idx++, p++) { in zend_hash_graceful_destroy()
1636 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_graceful_destroy()
1638 if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) { in zend_hash_graceful_destroy()
1639 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_graceful_destroy()
1645 ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht) in zend_hash_graceful_reverse_destroy() argument
1650 IS_CONSISTENT(ht); in zend_hash_graceful_reverse_destroy()
1651 HT_ASSERT_RC1(ht); in zend_hash_graceful_reverse_destroy()
1653 idx = ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
1654 p = ht->arData + ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
1659 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_graceful_reverse_destroy()
1662 if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) { in zend_hash_graceful_reverse_destroy()
1663 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_graceful_reverse_destroy()
1678 ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func) in zend_hash_apply() argument
1684 IS_CONSISTENT(ht); in zend_hash_apply()
1686 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply()
1687 p = ht->arData + idx; in zend_hash_apply()
1692 HT_ASSERT_RC1(ht); in zend_hash_apply()
1693 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply()
1702 ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_fun… in zend_hash_apply_with_argument() argument
1708 IS_CONSISTENT(ht); in zend_hash_apply_with_argument()
1710 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_argument()
1711 p = ht->arData + idx; in zend_hash_apply_with_argument()
1716 HT_ASSERT_RC1(ht); in zend_hash_apply_with_argument()
1717 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply_with_argument()
1726 ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int num_a… in zend_hash_apply_with_arguments() argument
1734 IS_CONSISTENT(ht); in zend_hash_apply_with_arguments()
1736 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_arguments()
1737 p = ht->arData + idx; in zend_hash_apply_with_arguments()
1746 HT_ASSERT_RC1(ht); in zend_hash_apply_with_arguments()
1747 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply_with_arguments()
1758 ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func) in zend_hash_reverse_apply() argument
1764 IS_CONSISTENT(ht); in zend_hash_reverse_apply()
1766 idx = ht->nNumUsed; in zend_hash_reverse_apply()
1769 p = ht->arData + idx; in zend_hash_reverse_apply()
1775 HT_ASSERT_RC1(ht); in zend_hash_reverse_apply()
1776 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_reverse_apply()
2090 ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key) in zend_hash_find() argument
2094 IS_CONSISTENT(ht); in zend_hash_find()
2096 p = zend_hash_find_bucket(ht, key, 0); in zend_hash_find()
2100 ZEND_API zval* ZEND_FASTCALL _zend_hash_find_known_hash(const HashTable *ht, zend_string *key) in _zend_hash_find_known_hash() argument
2104 IS_CONSISTENT(ht); in _zend_hash_find_known_hash()
2106 p = zend_hash_find_bucket(ht, key, 1); in _zend_hash_find_known_hash()
2110 ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len) in zend_hash_str_find() argument
2115 IS_CONSISTENT(ht); in zend_hash_str_find()
2118 p = zend_hash_str_find_bucket(ht, str, len, h); in zend_hash_str_find()
2122 ZEND_API zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_string *key) in zend_hash_exists() argument
2126 IS_CONSISTENT(ht); in zend_hash_exists()
2128 p = zend_hash_find_bucket(ht, key, 0); in zend_hash_exists()
2132 ZEND_API zend_bool ZEND_FASTCALL zend_hash_str_exists(const HashTable *ht, const char *str, size_t … in zend_hash_str_exists() argument
2137 IS_CONSISTENT(ht); in zend_hash_str_exists()
2140 p = zend_hash_str_find_bucket(ht, str, len, h); in zend_hash_str_exists()
2144 ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h) in zend_hash_index_find() argument
2148 IS_CONSISTENT(ht); in zend_hash_index_find()
2150 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_index_find()
2151 if (h < ht->nNumUsed) { in zend_hash_index_find()
2152 p = ht->arData + h; in zend_hash_index_find()
2160 p = zend_hash_index_find_bucket(ht, h); in zend_hash_index_find()
2164 ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h) in _zend_hash_index_find() argument
2168 IS_CONSISTENT(ht); in _zend_hash_index_find()
2170 p = zend_hash_index_find_bucket(ht, h); in _zend_hash_index_find()
2174 ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h) in zend_hash_index_exists() argument
2178 IS_CONSISTENT(ht); in zend_hash_index_exists()
2180 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_index_exists()
2181 if (h < ht->nNumUsed) { in zend_hash_index_exists()
2182 if (Z_TYPE(ht->arData[h].val) != IS_UNDEF) { in zend_hash_index_exists()
2189 p = zend_hash_index_find_bucket(ht, h); in zend_hash_index_exists()
2194 ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos) in zend_hash_internal_pointer_reset_ex() argument
2196 IS_CONSISTENT(ht); in zend_hash_internal_pointer_reset_ex()
2197 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_internal_pointer_reset_ex()
2198 *pos = _zend_hash_get_valid_pos(ht, 0); in zend_hash_internal_pointer_reset_ex()
2205 ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos) in zend_hash_internal_pointer_end_ex() argument
2209 IS_CONSISTENT(ht); in zend_hash_internal_pointer_end_ex()
2210 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_internal_pointer_end_ex()
2212 idx = ht->nNumUsed; in zend_hash_internal_pointer_end_ex()
2215 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_internal_pointer_end_ex()
2220 *pos = ht->nNumUsed; in zend_hash_internal_pointer_end_ex()
2224 ZEND_API int ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos) in zend_hash_move_forward_ex() argument
2228 IS_CONSISTENT(ht); in zend_hash_move_forward_ex()
2229 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_move_forward_ex()
2231 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_move_forward_ex()
2232 if (idx < ht->nNumUsed) { in zend_hash_move_forward_ex()
2235 if (idx >= ht->nNumUsed) { in zend_hash_move_forward_ex()
2236 *pos = ht->nNumUsed; in zend_hash_move_forward_ex()
2239 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_move_forward_ex()
2249 ZEND_API int ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos) in zend_hash_move_backwards_ex() argument
2253 IS_CONSISTENT(ht); in zend_hash_move_backwards_ex()
2254 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_move_backwards_ex()
2256 if (idx < ht->nNumUsed) { in zend_hash_move_backwards_ex()
2259 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_move_backwards_ex()
2264 *pos = ht->nNumUsed; in zend_hash_move_backwards_ex()
2273 ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_inde… in zend_hash_get_current_key_ex() argument
2278 IS_CONSISTENT(ht); in zend_hash_get_current_key_ex()
2279 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_ex()
2280 if (idx < ht->nNumUsed) { in zend_hash_get_current_key_ex()
2281 p = ht->arData + idx; in zend_hash_get_current_key_ex()
2293 ZEND_API void ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashP… in zend_hash_get_current_key_zval_ex() argument
2298 IS_CONSISTENT(ht); in zend_hash_get_current_key_zval_ex()
2299 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_zval_ex()
2300 if (idx >= ht->nNumUsed) { in zend_hash_get_current_key_zval_ex()
2303 p = ht->arData + idx; in zend_hash_get_current_key_zval_ex()
2312 ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos) in zend_hash_get_current_key_type_ex() argument
2317 IS_CONSISTENT(ht); in zend_hash_get_current_key_type_ex()
2318 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_type_ex()
2319 if (idx < ht->nNumUsed) { in zend_hash_get_current_key_type_ex()
2320 p = ht->arData + idx; in zend_hash_get_current_key_type_ex()
2331 ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos) in zend_hash_get_current_data_ex() argument
2336 IS_CONSISTENT(ht); in zend_hash_get_current_data_ex()
2337 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_data_ex()
2338 if (idx < ht->nNumUsed) { in zend_hash_get_current_data_ex()
2339 p = ht->arData + idx; in zend_hash_get_current_data_ex()
2389 ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, compare_func_t compar… in zend_hash_sort_ex() argument
2394 IS_CONSISTENT(ht); in zend_hash_sort_ex()
2395 HT_ASSERT_RC1(ht); in zend_hash_sort_ex()
2397 if (!(ht->nNumOfElements>1) && !(renumber && ht->nNumOfElements>0)) { /* Doesn't require sorting */ in zend_hash_sort_ex()
2401 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_sort_ex()
2402 i = ht->nNumUsed; in zend_hash_sort_ex()
2404 for (j = 0, i = 0; j < ht->nNumUsed; j++) { in zend_hash_sort_ex()
2405 p = ht->arData + j; in zend_hash_sort_ex()
2408 ht->arData[i] = *p; in zend_hash_sort_ex()
2414 sort((void *)ht->arData, i, sizeof(Bucket), compar, in zend_hash_sort_ex()
2416 ((HT_FLAGS(ht) & HASH_FLAG_PACKED) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap))); in zend_hash_sort_ex()
2418 ht->nNumUsed = i; in zend_hash_sort_ex()
2419 ht->nInternalPointer = 0; in zend_hash_sort_ex()
2423 p = ht->arData + j; in zend_hash_sort_ex()
2431 ht->nNextFreeElement = i; in zend_hash_sort_ex()
2433 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_sort_ex()
2435 zend_hash_packed_to_hash(ht); in zend_hash_sort_ex()
2439 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_sort_ex()
2440 Bucket *old_buckets = ht->arData; in zend_hash_sort_ex()
2442 …new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); in zend_hash_sort_ex()
2443 HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_sort_ex()
2444 ht->nTableMask = HT_MIN_MASK; in zend_hash_sort_ex()
2445 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_sort_ex()
2446 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_sort_ex()
2447 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_sort_ex()
2448 HT_HASH_RESET_PACKED(ht); in zend_hash_sort_ex()
2450 zend_hash_rehash(ht); in zend_hash_sort_ex()
2565 ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t … in zend_hash_minmax() argument
2570 IS_CONSISTENT(ht); in zend_hash_minmax()
2572 if (ht->nNumOfElements == 0 ) { in zend_hash_minmax()
2578 if (idx == ht->nNumUsed) { in zend_hash_minmax()
2581 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) break; in zend_hash_minmax()
2584 res = ht->arData + idx; in zend_hash_minmax()
2585 for (; idx < ht->nNumUsed; idx++) { in zend_hash_minmax()
2586 p = ht->arData + idx; in zend_hash_minmax()
2645 ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht) in zend_symtable_to_proptable() argument
2651 if (UNEXPECTED(HT_IS_PACKED(ht))) { in zend_symtable_to_proptable()
2655 ZEND_HASH_FOREACH_STR_KEY(ht, str_key) { in zend_symtable_to_proptable()
2661 if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { in zend_symtable_to_proptable()
2662 GC_ADDREF(ht); in zend_symtable_to_proptable()
2665 return ht; in zend_symtable_to_proptable()
2669 HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); in zend_symtable_to_proptable()
2671 ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) { in zend_symtable_to_proptable()
2698 ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, zend_bool always_duplic… in zend_proptable_to_symtable() argument
2704 ZEND_HASH_FOREACH_STR_KEY(ht, str_key) { in zend_proptable_to_symtable()
2716 return zend_array_dup(ht); in zend_proptable_to_symtable()
2719 if (EXPECTED(!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE))) { in zend_proptable_to_symtable()
2720 GC_ADDREF(ht); in zend_proptable_to_symtable()
2723 return ht; in zend_proptable_to_symtable()
2727 HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); in zend_proptable_to_symtable()
2729 ZEND_HASH_FOREACH_KEY_VAL_IND(ht, num_key, str_key, zv) { in zend_proptable_to_symtable()