Lines Matching refs:ht

38 # define HT_ASSERT(ht, expr) \  argument
39 ZEND_ASSERT((expr) || (HT_FLAGS(ht) & HASH_FLAG_ALLOW_COW_VIOLATION))
41 # define HT_ASSERT(ht, expr) argument
44 #define HT_ASSERT_RC1(ht) HT_ASSERT(ht, GC_REFCOUNT(ht) == 1) argument
55 static void _zend_is_inconsistent(const HashTable *ht, const char *file, int line) in _zend_is_inconsistent() argument
57 if ((HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) == HT_OK) { in _zend_is_inconsistent()
60 switch (HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) { in _zend_is_inconsistent()
62 zend_output_debug_string(1, "%s(%d) : ht=%p is being destroyed", file, line, ht); in _zend_is_inconsistent()
65 zend_output_debug_string(1, "%s(%d) : ht=%p is already destroyed", file, line, ht); in _zend_is_inconsistent()
68 zend_output_debug_string(1, "%s(%d) : ht=%p is being cleaned", file, line, ht); in _zend_is_inconsistent()
71 zend_output_debug_string(1, "%s(%d) : ht=%p is inconsistent", file, line, ht); in _zend_is_inconsistent()
78 HT_FLAGS(ht) = (HT_FLAGS(ht) & ~HASH_FLAG_CONSISTENCY) | (n); \
85 #define ZEND_HASH_IF_FULL_DO_RESIZE(ht) \ argument
86 if ((ht)->nNumUsed >= (ht)->nTableSize) { \
87 zend_hash_do_resize(ht); \
90 ZEND_API void *zend_hash_str_find_ptr_lc(const HashTable *ht, const char *str, size_t len) { in zend_hash_str_find_ptr_lc() argument
98 result = zend_hash_str_find_ptr(ht, lc_str, len); in zend_hash_str_find_ptr_lc()
104 ZEND_API void *zend_hash_find_ptr_lc(const HashTable *ht, zend_string *key) { in zend_hash_find_ptr_lc() argument
107 result = zend_hash_find_ptr(ht, lc_key); in zend_hash_find_ptr_lc()
112 static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht);
149 static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *ht) in zend_hash_real_init_packed_ex() argument
153 if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) { in zend_hash_real_init_packed_ex()
154 data = pemalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), 1); in zend_hash_real_init_packed_ex()
155 } else if (EXPECTED(ht->nTableSize == HT_MIN_SIZE)) { in zend_hash_real_init_packed_ex()
159 data = emalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK)); in zend_hash_real_init_packed_ex()
161 HT_SET_DATA_ADDR(ht, data); in zend_hash_real_init_packed_ex()
163 ht->u.v.flags = HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_real_init_packed_ex()
164 HT_HASH_RESET_PACKED(ht); in zend_hash_real_init_packed_ex()
167 static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht) in zend_hash_real_init_mixed_ex() argument
170 uint32_t nSize = ht->nTableSize; in zend_hash_real_init_mixed_ex()
174 if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) { in zend_hash_real_init_mixed_ex()
178 ht->nTableMask = HT_SIZE_TO_MASK(HT_MIN_SIZE); in zend_hash_real_init_mixed_ex()
179 HT_SET_DATA_ADDR(ht, data); in zend_hash_real_init_mixed_ex()
181 ht->u.v.flags = HASH_FLAG_STATIC_KEYS; in zend_hash_real_init_mixed_ex()
228 ht->nTableMask = HT_SIZE_TO_MASK(nSize); in zend_hash_real_init_mixed_ex()
229 HT_SET_DATA_ADDR(ht, data); in zend_hash_real_init_mixed_ex()
230 HT_FLAGS(ht) = HASH_FLAG_STATIC_KEYS; in zend_hash_real_init_mixed_ex()
231 HT_HASH_RESET(ht); in zend_hash_real_init_mixed_ex()
234 static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, bool packed) in zend_hash_real_init_ex() argument
236 HT_ASSERT_RC1(ht); in zend_hash_real_init_ex()
237 ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED); in zend_hash_real_init_ex()
239 zend_hash_real_init_packed_ex(ht); in zend_hash_real_init_ex()
241 zend_hash_real_init_mixed_ex(ht); in zend_hash_real_init_ex()
262 static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDest… in _zend_hash_init_int() argument
264 GC_SET_REFCOUNT(ht, 1); in _zend_hash_init_int()
265 …GC_TYPE_INFO(ht) = GC_ARRAY | (persistent ? ((GC_PERSISTENT|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT)… in _zend_hash_init_int()
266 HT_FLAGS(ht) = HASH_FLAG_UNINITIALIZED; in _zend_hash_init_int()
267 ht->nTableMask = HT_MIN_MASK; in _zend_hash_init_int()
268 HT_SET_DATA_ADDR(ht, &uninitialized_bucket); in _zend_hash_init_int()
269 ht->nNumUsed = 0; in _zend_hash_init_int()
270 ht->nNumOfElements = 0; in _zend_hash_init_int()
271 ht->nInternalPointer = 0; in _zend_hash_init_int()
272 ht->nNextFreeElement = ZEND_LONG_MIN; in _zend_hash_init_int()
273 ht->pDestructor = pDestructor; in _zend_hash_init_int()
274 ht->nTableSize = zend_hash_check_size(nSize); in _zend_hash_init_int()
277 ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor,… in _zend_hash_init() argument
279 _zend_hash_init_int(ht, nSize, pDestructor, persistent); in _zend_hash_init()
284 HashTable *ht = emalloc(sizeof(HashTable)); in _zend_new_array_0() local
285 _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0); in _zend_new_array_0()
286 return ht; in _zend_new_array_0()
291 HashTable *ht = emalloc(sizeof(HashTable)); in _zend_new_array() local
292 _zend_hash_init_int(ht, nSize, ZVAL_PTR_DTOR, 0); in _zend_new_array()
293 return ht; in _zend_new_array()
299 HashTable *ht = emalloc(sizeof(HashTable)); in zend_new_pair() local
300 _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0); in zend_new_pair()
301 ht->nNumUsed = ht->nNumOfElements = ht->nNextFreeElement = 2; in zend_new_pair()
302 zend_hash_real_init_packed_ex(ht); in zend_new_pair()
304 zv = ht->arPacked; in zend_new_pair()
308 return ht; in zend_new_pair()
311 ZEND_API void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht) in zend_hash_packed_grow() argument
313 HT_ASSERT_RC1(ht); in zend_hash_packed_grow()
314 if (ht->nTableSize >= HT_MAX_SIZE) { in zend_hash_packed_grow()
315 …_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, siz… in zend_hash_packed_grow()
317 uint32_t newTableSize = ht->nTableSize * 2; in zend_hash_packed_grow()
318 …HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_PACKED_SIZE_EX(newTableSize, HT_MIN_MASK)… in zend_hash_packed_grow()
319 ht->nTableSize = newTableSize; in zend_hash_packed_grow()
322 ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, bool packed) in zend_hash_real_init() argument
324 IS_CONSISTENT(ht); in zend_hash_real_init()
326 HT_ASSERT_RC1(ht); in zend_hash_real_init()
327 zend_hash_real_init_ex(ht, packed); in zend_hash_real_init()
330 ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht) in zend_hash_real_init_packed() argument
332 IS_CONSISTENT(ht); in zend_hash_real_init_packed()
334 HT_ASSERT_RC1(ht); in zend_hash_real_init_packed()
335 zend_hash_real_init_packed_ex(ht); in zend_hash_real_init_packed()
338 ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht) in zend_hash_real_init_mixed() argument
340 IS_CONSISTENT(ht); in zend_hash_real_init_mixed()
342 HT_ASSERT_RC1(ht); in zend_hash_real_init_mixed()
343 zend_hash_real_init_mixed_ex(ht); in zend_hash_real_init_mixed()
346 ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht) in zend_hash_packed_to_hash() argument
348 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_packed_to_hash()
349 zval *src = ht->arPacked; in zend_hash_packed_to_hash()
352 uint32_t nSize = ht->nTableSize; in zend_hash_packed_to_hash()
356 HT_ASSERT_RC1(ht); in zend_hash_packed_to_hash()
358 new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_packed_to_hash()
359 HT_FLAGS(ht) &= ~HASH_FLAG_PACKED; in zend_hash_packed_to_hash()
360 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_packed_to_hash()
361 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_packed_to_hash()
362 dst = ht->arData; in zend_hash_packed_to_hash()
363 for (i = 0; i < ht->nNumUsed; i++) { in zend_hash_packed_to_hash()
370 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_packed_to_hash()
371 zend_hash_rehash(ht); in zend_hash_packed_to_hash()
374 ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht) in zend_hash_to_packed() argument
376 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_to_packed()
377 Bucket *src = ht->arData; in zend_hash_to_packed()
381 HT_ASSERT_RC1(ht); in zend_hash_to_packed()
382 …new_data = pemalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSIS… in zend_hash_to_packed()
383 HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_to_packed()
384 ht->nTableMask = HT_MIN_MASK; in zend_hash_to_packed()
385 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_to_packed()
386 HT_HASH_RESET_PACKED(ht); in zend_hash_to_packed()
387 dst = ht->arPacked; in zend_hash_to_packed()
388 for (i = 0; i < ht->nNumUsed; i++) { in zend_hash_to_packed()
393 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_to_packed()
396 ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, bool packed) in zend_hash_extend() argument
398 HT_ASSERT_RC1(ht); in zend_hash_extend()
404 if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_extend()
405 if (nSize > ht->nTableSize) { in zend_hash_extend()
406 ht->nTableSize = zend_hash_check_size(nSize); in zend_hash_extend()
408 zend_hash_real_init(ht, packed); in zend_hash_extend()
411 ZEND_ASSERT(HT_IS_PACKED(ht)); in zend_hash_extend()
412 if (nSize > ht->nTableSize) { in zend_hash_extend()
414 …HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_PACKED_SIZE_EX(newTableSize, HT_MIN_MASK)… in zend_hash_extend()
415 ht->nTableSize = newTableSize; in zend_hash_extend()
418 ZEND_ASSERT(!HT_IS_PACKED(ht)); in zend_hash_extend()
419 if (nSize > ht->nTableSize) { in zend_hash_extend()
420 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_extend()
421 Bucket *old_buckets = ht->arData; in zend_hash_extend()
423 …new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_extend()
424 ht->nTableSize = nSize; in zend_hash_extend()
425 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_extend()
426 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_extend()
427 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_extend()
428 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_extend()
429 zend_hash_rehash(ht); in zend_hash_extend()
435 ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed) in zend_hash_discard() argument
440 ZEND_ASSERT(!HT_IS_PACKED(ht)); in zend_hash_discard()
441 arData = ht->arData; in zend_hash_discard()
442 p = arData + ht->nNumUsed; in zend_hash_discard()
444 ht->nNumUsed = nNumUsed; in zend_hash_discard()
448 ht->nNumOfElements--; in zend_hash_discard()
455 nIndex = p->h | ht->nTableMask; in zend_hash_discard()
460 static uint32_t zend_array_recalc_elements(HashTable *ht) in zend_array_recalc_elements() argument
463 uint32_t num = ht->nNumOfElements; in zend_array_recalc_elements()
465 ZEND_HASH_MAP_FOREACH_VAL(ht, val) { in zend_array_recalc_elements()
476 ZEND_API uint32_t zend_array_count(HashTable *ht) in zend_array_count() argument
479 if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_HAS_EMPTY_IND)) { in zend_array_count()
480 num = zend_array_recalc_elements(ht); in zend_array_count()
481 if (UNEXPECTED(ht->nNumOfElements == num)) { in zend_array_count()
482 HT_FLAGS(ht) &= ~HASH_FLAG_HAS_EMPTY_IND; in zend_array_count()
484 } else if (UNEXPECTED(ht == &EG(symbol_table))) { in zend_array_count()
485 num = zend_array_recalc_elements(ht); in zend_array_count()
487 num = zend_hash_num_elements(ht); in zend_array_count()
493 static zend_always_inline HashPosition _zend_hash_get_valid_pos(const HashTable *ht, HashPosition p… in _zend_hash_get_valid_pos() argument
495 if (HT_IS_PACKED(ht)) { in _zend_hash_get_valid_pos()
496 while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arPacked[pos])) { in _zend_hash_get_valid_pos()
500 while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arData[pos].val)) { in _zend_hash_get_valid_pos()
507 static zend_always_inline HashPosition _zend_hash_get_current_pos(const HashTable *ht) in _zend_hash_get_current_pos() argument
509 return _zend_hash_get_valid_pos(ht, ht->nInternalPointer); in _zend_hash_get_current_pos()
512 ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht) in zend_hash_get_current_pos() argument
514 return _zend_hash_get_current_pos(ht); in zend_hash_get_current_pos()
532 ZEND_API uint32_t ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPosition pos) in zend_hash_iterator_add() argument
538 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_add()
539 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_add()
542 if (iter->ht == NULL) { in zend_hash_iterator_add()
543 iter->ht = ht; in zend_hash_iterator_add()
562 iter->ht = ht; in zend_hash_iterator_add()
572 static zend_always_inline bool zend_hash_iterator_find_copy_pos(uint32_t idx, HashTable *ht) { in zend_hash_iterator_find_copy_pos() argument
580 if (copy_iter->ht == ht) { in zend_hash_iterator_find_copy_pos()
583 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_find_copy_pos()
584 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_find_copy_pos()
585 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_find_copy_pos()
587 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_find_copy_pos()
588 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_find_copy_pos()
590 iter->ht = copy_iter->ht; in zend_hash_iterator_find_copy_pos()
603 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos(uint32_t idx, HashTable *ht) in zend_hash_iterator_pos() argument
608 if (UNEXPECTED(iter->ht != ht) && !zend_hash_iterator_find_copy_pos(idx, ht)) { in zend_hash_iterator_pos()
609 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_pos()
610 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_pos()
611 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_pos()
613 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos()
614 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_pos()
616 iter->ht = ht; in zend_hash_iterator_pos()
617 iter->pos = _zend_hash_get_current_pos(ht); in zend_hash_iterator_pos()
624 HashTable *ht = Z_ARRVAL_P(array); in zend_hash_iterator_pos_ex() local
628 if (UNEXPECTED(iter->ht != ht) && !zend_hash_iterator_find_copy_pos(idx, ht)) { in zend_hash_iterator_pos_ex()
629 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_pos_ex()
630 && EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos_ex()
631 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_pos_ex()
634 ht = Z_ARRVAL_P(array); in zend_hash_iterator_pos_ex()
635 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos_ex()
636 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_pos_ex()
638 iter->ht = ht; in zend_hash_iterator_pos_ex()
639 iter->pos = _zend_hash_get_current_pos(ht); in zend_hash_iterator_pos_ex()
650 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_del()
651 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_del()
652 ZEND_ASSERT(HT_ITERATORS_COUNT(iter->ht) != 0); in zend_hash_iterator_del()
653 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_del()
655 iter->ht = NULL; in zend_hash_iterator_del()
662 while (idx > 0 && EG(ht_iterators)[idx - 1].ht == NULL) { in zend_hash_iterator_del()
669 static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(HashTable *ht) in _zend_hash_iterators_remove() argument
675 if (iter->ht == ht) { in _zend_hash_iterators_remove()
676 iter->ht = HT_POISONED_PTR; in _zend_hash_iterators_remove()
682 static zend_always_inline void zend_hash_iterators_remove(HashTable *ht) in zend_hash_iterators_remove() argument
684 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_iterators_remove()
685 _zend_hash_iterators_remove(ht); in zend_hash_iterators_remove()
689 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht, HashPosition start) in zend_hash_iterators_lower_pos() argument
693 HashPosition res = ht->nNumUsed; in zend_hash_iterators_lower_pos()
696 if (iter->ht == ht) { in zend_hash_iterators_lower_pos()
706 ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosit… in _zend_hash_iterators_update() argument
712 if (iter->ht == ht && iter->pos == from) { in _zend_hash_iterators_update()
719 ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step) in zend_hash_iterators_advance() argument
725 if (iter->ht == ht) { in zend_hash_iterators_advance()
733 static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, const zend_string *key) in zend_hash_find_bucket() argument
741 arData = ht->arData; in zend_hash_find_bucket()
742 nIndex = ZSTR_H(key) | ht->nTableMask; in zend_hash_find_bucket()
770 static zend_always_inline Bucket *zend_hash_str_find_bucket(const HashTable *ht, const char *str, s… in zend_hash_str_find_bucket() argument
776 arData = ht->arData; in zend_hash_str_find_bucket()
777 nIndex = h | ht->nTableMask; in zend_hash_str_find_bucket()
780 ZEND_ASSERT(idx < HT_IDX_TO_HASH(ht->nTableSize)); in zend_hash_str_find_bucket()
792 static zend_always_inline Bucket *zend_hash_index_find_bucket(const HashTable *ht, zend_ulong h) in zend_hash_index_find_bucket() argument
798 arData = ht->arData; in zend_hash_index_find_bucket()
799 nIndex = h | ht->nTableMask; in zend_hash_index_find_bucket()
802 ZEND_ASSERT(idx < HT_IDX_TO_HASH(ht->nTableSize)); in zend_hash_index_find_bucket()
812 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
819 IS_CONSISTENT(ht); in _zend_hash_add_or_update_i()
820 HT_ASSERT_RC1(ht); in _zend_hash_add_or_update_i()
823 if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) { in _zend_hash_add_or_update_i()
824 if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in _zend_hash_add_or_update_i()
825 zend_hash_real_init_mixed(ht); in _zend_hash_add_or_update_i()
828 zend_hash_packed_to_hash(ht); in _zend_hash_add_or_update_i()
831 p = zend_hash_find_bucket(ht, key); in _zend_hash_add_or_update_i()
860 if (ht->pDestructor) { in _zend_hash_add_or_update_i()
861 ht->pDestructor(data); in _zend_hash_add_or_update_i()
868 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_add_or_update_i()
873 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
875 idx = ht->nNumUsed++; in _zend_hash_add_or_update_i()
876 ht->nNumOfElements++; in _zend_hash_add_or_update_i()
877 arData = ht->arData; in _zend_hash_add_or_update_i()
881 nIndex = h | ht->nTableMask; in _zend_hash_add_or_update_i()
893 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
900 IS_CONSISTENT(ht); in _zend_hash_str_add_or_update_i()
901 HT_ASSERT_RC1(ht); in _zend_hash_str_add_or_update_i()
903 if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) { in _zend_hash_str_add_or_update_i()
904 if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in _zend_hash_str_add_or_update_i()
905 zend_hash_real_init_mixed(ht); in _zend_hash_str_add_or_update_i()
908 zend_hash_packed_to_hash(ht); in _zend_hash_str_add_or_update_i()
911 p = zend_hash_str_find_bucket(ht, str, len, h); in _zend_hash_str_add_or_update_i()
939 if (ht->pDestructor) { in _zend_hash_str_add_or_update_i()
940 ht->pDestructor(data); in _zend_hash_str_add_or_update_i()
947 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_str_add_or_update_i()
950 idx = ht->nNumUsed++; in _zend_hash_str_add_or_update_i()
951 ht->nNumOfElements++; in _zend_hash_str_add_or_update_i()
952 p = ht->arData + idx; in _zend_hash_str_add_or_update_i()
953 p->key = key = zend_string_init(str, len, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in _zend_hash_str_add_or_update_i()
955 if (GC_FLAGS(ht) & GC_PERSISTENT_LOCAL) { in _zend_hash_str_add_or_update_i()
960 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_str_add_or_update_i()
966 nIndex = h | ht->nTableMask; in _zend_hash_str_add_or_update_i()
967 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in _zend_hash_str_add_or_update_i()
968 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx); in _zend_hash_str_add_or_update_i()
973 ZEND_API zval* ZEND_FASTCALL zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, … in zend_hash_add_or_update() argument
976 return zend_hash_add(ht, key, pData); in zend_hash_add_or_update()
978 return zend_hash_add_new(ht, key, pData); in zend_hash_add_or_update()
980 return zend_hash_update(ht, key, pData); in zend_hash_add_or_update()
983 return zend_hash_update_ind(ht, key, pData); in zend_hash_add_or_update()
987 ZEND_API zval* ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData) in zend_hash_add() argument
989 return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD); in zend_hash_add()
992 ZEND_API zval* ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData) in zend_hash_update() argument
994 return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE); in zend_hash_update()
997 ZEND_API zval* ZEND_FASTCALL zend_hash_update_ind(HashTable *ht, zend_string *key, zval *pData) in zend_hash_update_ind() argument
999 return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT); in zend_hash_update_ind()
1002 ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData) in zend_hash_add_new() argument
1004 return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW); in zend_hash_add_new()
1007 ZEND_API zval* ZEND_FASTCALL zend_hash_lookup(HashTable *ht, zend_string *key) in zend_hash_lookup() argument
1009 return _zend_hash_add_or_update_i(ht, key, NULL, HASH_LOOKUP); in zend_hash_lookup()
1012 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
1015 return zend_hash_str_add(ht, str, len, pData); in zend_hash_str_add_or_update()
1017 return zend_hash_str_add_new(ht, str, len, pData); in zend_hash_str_add_or_update()
1019 return zend_hash_str_update(ht, str, len, pData); in zend_hash_str_add_or_update()
1022 return zend_hash_str_update_ind(ht, str, len, pData); in zend_hash_str_add_or_update()
1026 ZEND_API zval* ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval … in zend_hash_str_update() argument
1030 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE); in zend_hash_str_update()
1033 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
1037 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT); in zend_hash_str_update_ind()
1040 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
1044 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD); in zend_hash_str_add()
1047 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
1051 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD_NEW); in zend_hash_str_add_new()
1054 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_empty_element(HashTable *ht, zend_ulong h) in zend_hash_index_add_empty_element() argument
1059 return zend_hash_index_add(ht, h, &dummy); in zend_hash_index_add_empty_element()
1062 ZEND_API zval* ZEND_FASTCALL zend_hash_add_empty_element(HashTable *ht, zend_string *key) in zend_hash_add_empty_element() argument
1067 return zend_hash_add(ht, key, &dummy); in zend_hash_add_empty_element()
1070 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
1075 return zend_hash_str_add(ht, str, len, &dummy); in zend_hash_str_add_empty_element()
1078 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
1085 IS_CONSISTENT(ht); in _zend_hash_index_add_or_update_i()
1086 HT_ASSERT_RC1(ht); in _zend_hash_index_add_or_update_i()
1092 if (HT_IS_PACKED(ht)) { in _zend_hash_index_add_or_update_i()
1094 && h < ht->nNumUsed) { in _zend_hash_index_add_or_update_i()
1095 zv = ht->arPacked + h; in _zend_hash_index_add_or_update_i()
1104 if (ht->pDestructor) { in _zend_hash_index_add_or_update_i()
1105 ht->pDestructor(zv); in _zend_hash_index_add_or_update_i()
1112 } else if (EXPECTED(h < ht->nTableSize)) { in _zend_hash_index_add_or_update_i()
1114 zv = ht->arPacked + h; in _zend_hash_index_add_or_update_i()
1117 if (h > ht->nNumUsed) { in _zend_hash_index_add_or_update_i()
1118 zval *q = ht->arPacked + ht->nNumUsed; in _zend_hash_index_add_or_update_i()
1125 ht->nNextFreeElement = ht->nNumUsed = h + 1; in _zend_hash_index_add_or_update_i()
1126 ht->nNumOfElements++; in _zend_hash_index_add_or_update_i()
1134 } else if ((h >> 1) < ht->nTableSize && in _zend_hash_index_add_or_update_i()
1135 (ht->nTableSize >> 1) < ht->nNumOfElements) { in _zend_hash_index_add_or_update_i()
1136 zend_hash_packed_grow(ht); in _zend_hash_index_add_or_update_i()
1139 if (ht->nNumUsed >= ht->nTableSize) { in _zend_hash_index_add_or_update_i()
1140 ht->nTableSize += ht->nTableSize; in _zend_hash_index_add_or_update_i()
1143 zend_hash_packed_to_hash(ht); in _zend_hash_index_add_or_update_i()
1145 } else if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) { in _zend_hash_index_add_or_update_i()
1146 if (h < ht->nTableSize) { in _zend_hash_index_add_or_update_i()
1147 zend_hash_real_init_packed_ex(ht); in _zend_hash_index_add_or_update_i()
1150 zend_hash_real_init_mixed(ht); in _zend_hash_index_add_or_update_i()
1153 p = zend_hash_index_find_bucket(ht, h); in _zend_hash_index_add_or_update_i()
1163 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_index_add_or_update_i()
1166 idx = ht->nNumUsed++; in _zend_hash_index_add_or_update_i()
1167 nIndex = h | ht->nTableMask; in _zend_hash_index_add_or_update_i()
1168 p = ht->arData + idx; in _zend_hash_index_add_or_update_i()
1169 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in _zend_hash_index_add_or_update_i()
1170 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx); in _zend_hash_index_add_or_update_i()
1171 if ((zend_long)h >= ht->nNextFreeElement) { in _zend_hash_index_add_or_update_i()
1172 ht->nNextFreeElement = (zend_long)h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX; in _zend_hash_index_add_or_update_i()
1174 ht->nNumOfElements++; in _zend_hash_index_add_or_update_i()
1186 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
1189 return zend_hash_index_add(ht, h, pData); in zend_hash_index_add_or_update()
1191 return zend_hash_index_add_new(ht, h, pData); in zend_hash_index_add_or_update()
1193 ZEND_ASSERT(h == ht->nNextFreeElement); in zend_hash_index_add_or_update()
1194 return zend_hash_next_index_insert(ht, pData); in zend_hash_index_add_or_update()
1196 ZEND_ASSERT(h == ht->nNextFreeElement); in zend_hash_index_add_or_update()
1197 return zend_hash_next_index_insert_new(ht, pData); in zend_hash_index_add_or_update()
1200 return zend_hash_index_update(ht, h, pData); in zend_hash_index_add_or_update()
1204 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_add() argument
1206 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD); in zend_hash_index_add()
1209 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_add_new() argument
1211 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD | HASH_ADD_NEW); in zend_hash_index_add_new()
1214 ZEND_API zval* ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_update() argument
1216 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_UPDATE); in zend_hash_index_update()
1219 ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData) in zend_hash_next_index_insert() argument
1221 return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT); in zend_hash_next_index_insert()
1224 ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData) in zend_hash_next_index_insert_new() argument
1226 …return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW |… in zend_hash_next_index_insert_new()
1229 ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h) in zend_hash_index_lookup() argument
1231 return _zend_hash_index_add_or_update_i(ht, h, NULL, HASH_LOOKUP); in zend_hash_index_lookup()
1234 ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *b, zend_string *key) in zend_hash_set_bucket_key() argument
1240 IS_CONSISTENT(ht); in zend_hash_set_bucket_key()
1241 HT_ASSERT_RC1(ht); in zend_hash_set_bucket_key()
1242 ZEND_ASSERT(!HT_IS_PACKED(ht)); in zend_hash_set_bucket_key()
1245 p = zend_hash_find_bucket(ht, key); in zend_hash_set_bucket_key()
1252 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in zend_hash_set_bucket_key()
1255 arData = ht->arData; in zend_hash_set_bucket_key()
1259 nIndex = b->h | ht->nTableMask; in zend_hash_set_bucket_key()
1277 nIndex = b->h | ht->nTableMask; in zend_hash_set_bucket_key()
1295 static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) in zend_hash_do_resize() argument
1298 IS_CONSISTENT(ht); in zend_hash_do_resize()
1299 HT_ASSERT_RC1(ht); in zend_hash_do_resize()
1301 ZEND_ASSERT(!HT_IS_PACKED(ht)); in zend_hash_do_resize()
1302 …if (ht->nNumUsed > ht->nNumOfElements + (ht->nNumOfElements >> 5)) { /* additional term is there t… in zend_hash_do_resize()
1303 zend_hash_rehash(ht); in zend_hash_do_resize()
1304 } else if (ht->nTableSize < HT_MAX_SIZE) { /* Let's double the table size */ in zend_hash_do_resize()
1305 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_do_resize()
1306 uint32_t nSize = ht->nTableSize + ht->nTableSize; in zend_hash_do_resize()
1307 Bucket *old_buckets = ht->arData; in zend_hash_do_resize()
1311 …new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_do_resize()
1312 ht->nTableSize = nSize; in zend_hash_do_resize()
1313 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_do_resize()
1314 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_do_resize()
1315 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_do_resize()
1316 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_do_resize()
1317 zend_hash_rehash(ht); in zend_hash_do_resize()
1319 …_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, siz… in zend_hash_do_resize()
1323 ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht) in zend_hash_rehash() argument
1328 IS_CONSISTENT(ht); in zend_hash_rehash()
1330 if (UNEXPECTED(ht->nNumOfElements == 0)) { in zend_hash_rehash()
1331 if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_rehash()
1332 ht->nNumUsed = 0; in zend_hash_rehash()
1333 HT_HASH_RESET(ht); in zend_hash_rehash()
1335 ht->nInternalPointer = 0; in zend_hash_rehash()
1336 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1340 if (iter->ht == ht) { in zend_hash_rehash()
1350 HT_HASH_RESET(ht); in zend_hash_rehash()
1352 p = ht->arData; in zend_hash_rehash()
1353 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_rehash()
1355 nIndex = p->h | ht->nTableMask; in zend_hash_rehash()
1356 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1357 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i); in zend_hash_rehash()
1359 } while (++i < ht->nNumUsed); in zend_hash_rehash()
1361 uint32_t old_num_used = ht->nNumUsed; in zend_hash_rehash()
1367 if (EXPECTED(!HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1368 while (++i < ht->nNumUsed) { in zend_hash_rehash()
1373 nIndex = q->h | ht->nTableMask; in zend_hash_rehash()
1375 Z_NEXT(q->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1376 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); in zend_hash_rehash()
1377 if (UNEXPECTED(ht->nInternalPointer == i)) { in zend_hash_rehash()
1378 ht->nInternalPointer = j; in zend_hash_rehash()
1385 uint32_t iter_pos = zend_hash_iterators_lower_pos(ht, i + 1); in zend_hash_rehash()
1387 while (++i < ht->nNumUsed) { in zend_hash_rehash()
1392 nIndex = q->h | ht->nTableMask; in zend_hash_rehash()
1394 Z_NEXT(q->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1395 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); in zend_hash_rehash()
1396 if (UNEXPECTED(ht->nInternalPointer == i)) { in zend_hash_rehash()
1397 ht->nInternalPointer = j; in zend_hash_rehash()
1401 zend_hash_iterators_update(ht, iter_pos, j); in zend_hash_rehash()
1402 iter_pos = zend_hash_iterators_lower_pos(ht, iter_pos + 1); in zend_hash_rehash()
1410 ht->nNumUsed = j; in zend_hash_rehash()
1413 nIndex = p->h | ht->nTableMask; in zend_hash_rehash()
1414 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1415 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i); in zend_hash_rehash()
1417 } while (++i < ht->nNumUsed); in zend_hash_rehash()
1421 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1422 _zend_hash_iterators_update(ht, old_num_used, ht->nNumUsed); in zend_hash_rehash()
1427 static zend_always_inline void zend_hash_iterators_clamp_max(HashTable *ht, uint32_t max) in zend_hash_iterators_clamp_max() argument
1429 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_iterators_clamp_max()
1433 if (iter->ht == ht) { in zend_hash_iterators_clamp_max()
1441 static zend_always_inline void _zend_hash_packed_del_val(HashTable *ht, uint32_t idx, zval *zv) in _zend_hash_packed_del_val() argument
1444 ht->nNumOfElements--; in _zend_hash_packed_del_val()
1445 if (ht->nNumUsed - 1 == idx) { in _zend_hash_packed_del_val()
1447 ht->nNumUsed--; in _zend_hash_packed_del_val()
1448 } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arPacked[ht->nNumUsed-1]) == IS_UNDEF))); in _zend_hash_packed_del_val()
1449 ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed); in _zend_hash_packed_del_val()
1450 zend_hash_iterators_clamp_max(ht, ht->nNumUsed); in _zend_hash_packed_del_val()
1452 if (ht->pDestructor) { in _zend_hash_packed_del_val()
1456 ht->pDestructor(&tmp); in _zend_hash_packed_del_val()
1462 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
1467 HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val); in _zend_hash_del_el_ex()
1470 ht->nNumOfElements--; in _zend_hash_del_el_ex()
1471 if (ht->nNumUsed - 1 == idx) { in _zend_hash_del_el_ex()
1473 ht->nNumUsed--; in _zend_hash_del_el_ex()
1474 } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF))); in _zend_hash_del_el_ex()
1475 ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed); in _zend_hash_del_el_ex()
1476 zend_hash_iterators_clamp_max(ht, ht->nNumUsed); in _zend_hash_del_el_ex()
1478 if (ht->pDestructor) { in _zend_hash_del_el_ex()
1482 ht->pDestructor(&tmp); in _zend_hash_del_el_ex()
1488 static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bucket *p) in _zend_hash_del_el() argument
1494 nIndex = p->h | ht->nTableMask; in _zend_hash_del_el()
1495 i = HT_HASH(ht, nIndex); in _zend_hash_del_el()
1498 prev = HT_HASH_TO_BUCKET(ht, i); in _zend_hash_del_el()
1501 prev = HT_HASH_TO_BUCKET(ht, i); in _zend_hash_del_el()
1509 _zend_hash_del_el_ex(ht, idx, p, prev); in _zend_hash_del_el()
1512 ZEND_API void ZEND_FASTCALL zend_hash_packed_del_val(HashTable *ht, zval *zv) in zend_hash_packed_del_val() argument
1514 IS_CONSISTENT(ht); in zend_hash_packed_del_val()
1515 HT_ASSERT_RC1(ht); in zend_hash_packed_del_val()
1516 ZEND_ASSERT(HT_IS_PACKED(ht)); in zend_hash_packed_del_val()
1517 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(zv - ht->arPacked), zv); in zend_hash_packed_del_val()
1521 ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p) in zend_hash_del_bucket() argument
1523 IS_CONSISTENT(ht); in zend_hash_del_bucket()
1524 HT_ASSERT_RC1(ht); in zend_hash_del_bucket()
1525 ZEND_ASSERT(!HT_IS_PACKED(ht)); in zend_hash_del_bucket()
1526 _zend_hash_del_el(ht, HT_IDX_TO_HASH(p - ht->arData), p); in zend_hash_del_bucket()
1529 ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key) in zend_hash_del() argument
1537 IS_CONSISTENT(ht); in zend_hash_del()
1538 HT_ASSERT_RC1(ht); in zend_hash_del()
1541 nIndex = h | ht->nTableMask; in zend_hash_del()
1543 idx = HT_HASH(ht, nIndex); in zend_hash_del()
1545 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_del()
1552 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_del()
1561 ZEND_API zend_result ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key) in zend_hash_del_ind() argument
1569 IS_CONSISTENT(ht); in zend_hash_del_ind()
1570 HT_ASSERT_RC1(ht); in zend_hash_del_ind()
1573 nIndex = h | ht->nTableMask; in zend_hash_del_ind()
1575 idx = HT_HASH(ht, nIndex); in zend_hash_del_ind()
1577 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_del_ind()
1588 if (ht->pDestructor) { in zend_hash_del_ind()
1592 ht->pDestructor(&tmp); in zend_hash_del_ind()
1596 HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; in zend_hash_del_ind()
1601 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_del_ind()
1611 ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *str, size_t len) in zend_hash_str_del_ind() argument
1619 IS_CONSISTENT(ht); in zend_hash_str_del_ind()
1620 HT_ASSERT_RC1(ht); in zend_hash_str_del_ind()
1623 nIndex = h | ht->nTableMask; in zend_hash_str_del_ind()
1625 idx = HT_HASH(ht, nIndex); in zend_hash_str_del_ind()
1627 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_str_del_ind()
1637 if (ht->pDestructor) { in zend_hash_str_del_ind()
1638 ht->pDestructor(data); in zend_hash_str_del_ind()
1641 HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; in zend_hash_str_del_ind()
1646 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_str_del_ind()
1656 ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *str, size_t len) in zend_hash_str_del() argument
1664 IS_CONSISTENT(ht); in zend_hash_str_del()
1665 HT_ASSERT_RC1(ht); in zend_hash_str_del()
1668 nIndex = h | ht->nTableMask; in zend_hash_str_del()
1670 idx = HT_HASH(ht, nIndex); in zend_hash_str_del()
1672 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_str_del()
1678 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_str_del()
1687 ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h) in zend_hash_index_del() argument
1694 IS_CONSISTENT(ht); in zend_hash_index_del()
1695 HT_ASSERT_RC1(ht); in zend_hash_index_del()
1697 if (HT_IS_PACKED(ht)) { in zend_hash_index_del()
1698 if (h < ht->nNumUsed) { in zend_hash_index_del()
1699 zval *zv = ht->arPacked + h; in zend_hash_index_del()
1701 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(h), zv); in zend_hash_index_del()
1707 nIndex = h | ht->nTableMask; in zend_hash_index_del()
1709 idx = HT_HASH(ht, nIndex); in zend_hash_index_del()
1711 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_index_del()
1713 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_index_del()
1722 ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) in zend_hash_destroy() argument
1724 IS_CONSISTENT(ht); in zend_hash_destroy()
1725 HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); in zend_hash_destroy()
1727 if (ht->nNumUsed) { in zend_hash_destroy()
1728 if (HT_IS_PACKED(ht)) { in zend_hash_destroy()
1729 if (ht->pDestructor) { in zend_hash_destroy()
1730 zval *zv = ht->arPacked; in zend_hash_destroy()
1731 zval *end = zv + ht->nNumUsed; in zend_hash_destroy()
1734 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1736 ht->pDestructor(zv); in zend_hash_destroy()
1741 ht->pDestructor(zv); in zend_hash_destroy()
1747 zend_hash_iterators_remove(ht); in zend_hash_destroy()
1749 Bucket *p = ht->arData; in zend_hash_destroy()
1750 Bucket *end = p + ht->nNumUsed; in zend_hash_destroy()
1752 if (ht->pDestructor) { in zend_hash_destroy()
1755 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_destroy()
1756 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1758 ht->pDestructor(&p->val); in zend_hash_destroy()
1763 ht->pDestructor(&p->val); in zend_hash_destroy()
1767 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1769 ht->pDestructor(&p->val); in zend_hash_destroy()
1777 ht->pDestructor(&p->val); in zend_hash_destroy()
1787 if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_destroy()
1795 zend_hash_iterators_remove(ht); in zend_hash_destroy()
1797 } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_destroy()
1800 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_destroy()
1803 ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht) in zend_array_destroy() argument
1805 IS_CONSISTENT(ht); in zend_array_destroy()
1806 HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); in zend_array_destroy()
1809 GC_REMOVE_FROM_BUFFER(ht); in zend_array_destroy()
1810 GC_TYPE_INFO(ht) = GC_NULL /*???| (GC_WHITE << 16)*/; in zend_array_destroy()
1812 if (ht->nNumUsed) { in zend_array_destroy()
1814 if (UNEXPECTED(ht->pDestructor != ZVAL_PTR_DTOR)) { in zend_array_destroy()
1815 zend_hash_destroy(ht); in zend_array_destroy()
1821 if (HT_IS_PACKED(ht)) { in zend_array_destroy()
1822 zval *zv = ht->arPacked; in zend_array_destroy()
1823 zval *end = zv + ht->nNumUsed; in zend_array_destroy()
1829 Bucket *p = ht->arData; in zend_array_destroy()
1830 Bucket *end = p + ht->nNumUsed; in zend_array_destroy()
1832 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_array_destroy()
1836 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_array_destroy()
1854 } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_array_destroy()
1858 efree(HT_GET_DATA_ADDR(ht)); in zend_array_destroy()
1860 zend_hash_iterators_remove(ht); in zend_array_destroy()
1861 FREE_HASHTABLE(ht); in zend_array_destroy()
1864 ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht) in zend_hash_clean() argument
1866 IS_CONSISTENT(ht); in zend_hash_clean()
1867 HT_ASSERT_RC1(ht); in zend_hash_clean()
1869 if (ht->nNumUsed) { in zend_hash_clean()
1870 if (HT_IS_PACKED(ht)) { in zend_hash_clean()
1871 zval *zv = ht->arPacked; in zend_hash_clean()
1872 zval *end = zv + ht->nNumUsed; in zend_hash_clean()
1874 if (ht->pDestructor) { in zend_hash_clean()
1875 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1876 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1878 ht->pDestructor(zv); in zend_hash_clean()
1883 ht->pDestructor(zv); in zend_hash_clean()
1890 Bucket *p = ht->arData; in zend_hash_clean()
1891 Bucket *end = p + ht->nNumUsed; in zend_hash_clean()
1893 if (ht->pDestructor) { in zend_hash_clean()
1894 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1895 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1897 ht->pDestructor(&p->val); in zend_hash_clean()
1902 ht->pDestructor(&p->val); in zend_hash_clean()
1906 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1908 ht->pDestructor(&p->val); in zend_hash_clean()
1916 ht->pDestructor(&p->val); in zend_hash_clean()
1924 if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1932 HT_HASH_RESET(ht); in zend_hash_clean()
1935 ht->nNumUsed = 0; in zend_hash_clean()
1936 ht->nNumOfElements = 0; in zend_hash_clean()
1937 ht->nNextFreeElement = ZEND_LONG_MIN; in zend_hash_clean()
1938 ht->nInternalPointer = 0; in zend_hash_clean()
1941 ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht) in zend_symtable_clean() argument
1945 IS_CONSISTENT(ht); in zend_symtable_clean()
1946 HT_ASSERT_RC1(ht); in zend_symtable_clean()
1948 if (ht->nNumUsed) { in zend_symtable_clean()
1949 ZEND_ASSERT(!HT_IS_PACKED(ht)); in zend_symtable_clean()
1950 p = ht->arData; in zend_symtable_clean()
1951 end = p + ht->nNumUsed; in zend_symtable_clean()
1952 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_symtable_clean()
1956 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_symtable_clean()
1973 HT_HASH_RESET(ht); in zend_symtable_clean()
1975 ht->nNumUsed = 0; in zend_symtable_clean()
1976 ht->nNumOfElements = 0; in zend_symtable_clean()
1977 ht->nNextFreeElement = ZEND_LONG_MIN; in zend_symtable_clean()
1978 ht->nInternalPointer = 0; in zend_symtable_clean()
1981 ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht) in zend_hash_graceful_destroy() argument
1985 IS_CONSISTENT(ht); in zend_hash_graceful_destroy()
1986 HT_ASSERT_RC1(ht); in zend_hash_graceful_destroy()
1988 if (HT_IS_PACKED(ht)) { in zend_hash_graceful_destroy()
1989 zval *zv = ht->arPacked; in zend_hash_graceful_destroy()
1991 for (idx = 0; idx < ht->nNumUsed; idx++, zv++) { in zend_hash_graceful_destroy()
1993 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); in zend_hash_graceful_destroy()
1996 Bucket *p = ht->arData; in zend_hash_graceful_destroy()
1998 for (idx = 0; idx < ht->nNumUsed; idx++, p++) { in zend_hash_graceful_destroy()
2000 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_graceful_destroy()
2003 if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_graceful_destroy()
2004 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_graceful_destroy()
2010 ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht) in zend_hash_graceful_reverse_destroy() argument
2014 IS_CONSISTENT(ht); in zend_hash_graceful_reverse_destroy()
2015 HT_ASSERT_RC1(ht); in zend_hash_graceful_reverse_destroy()
2017 idx = ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
2018 if (HT_IS_PACKED(ht)) { in zend_hash_graceful_reverse_destroy()
2019 zval *zv = ht->arPacked + ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
2025 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); in zend_hash_graceful_reverse_destroy()
2028 Bucket *p = ht->arData + ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
2034 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_graceful_reverse_destroy()
2038 if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_graceful_reverse_destroy()
2039 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_graceful_reverse_destroy()
2054 ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func) in zend_hash_apply() argument
2059 IS_CONSISTENT(ht); in zend_hash_apply()
2060 if (HT_IS_PACKED(ht)) { in zend_hash_apply()
2061 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply()
2062 zval *zv = ht->arPacked + idx; in zend_hash_apply()
2068 HT_ASSERT_RC1(ht); in zend_hash_apply()
2069 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); in zend_hash_apply()
2076 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply()
2077 Bucket *p = ht->arData + idx; in zend_hash_apply()
2083 HT_ASSERT_RC1(ht); in zend_hash_apply()
2084 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply()
2094 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
2099 IS_CONSISTENT(ht); in zend_hash_apply_with_argument()
2100 if (HT_IS_PACKED(ht)) { in zend_hash_apply_with_argument()
2101 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_argument()
2102 zval *zv = ht->arPacked + idx; in zend_hash_apply_with_argument()
2107 HT_ASSERT_RC1(ht); in zend_hash_apply_with_argument()
2108 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); in zend_hash_apply_with_argument()
2115 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_argument()
2116 Bucket *p = ht->arData + idx; in zend_hash_apply_with_argument()
2121 HT_ASSERT_RC1(ht); in zend_hash_apply_with_argument()
2122 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply_with_argument()
2132 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
2139 IS_CONSISTENT(ht); in zend_hash_apply_with_arguments()
2141 if (HT_IS_PACKED(ht)) { in zend_hash_apply_with_arguments()
2142 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_arguments()
2143 zval *zv = ht->arPacked + idx; in zend_hash_apply_with_arguments()
2153 HT_ASSERT_RC1(ht); in zend_hash_apply_with_arguments()
2154 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); in zend_hash_apply_with_arguments()
2163 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_arguments()
2164 Bucket *p = ht->arData + idx; in zend_hash_apply_with_arguments()
2174 HT_ASSERT_RC1(ht); in zend_hash_apply_with_arguments()
2175 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply_with_arguments()
2187 ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func) in zend_hash_reverse_apply() argument
2192 IS_CONSISTENT(ht); in zend_hash_reverse_apply()
2194 idx = ht->nNumUsed; in zend_hash_reverse_apply()
2195 if (HT_IS_PACKED(ht)) { in zend_hash_reverse_apply()
2200 zv = ht->arPacked + idx; in zend_hash_reverse_apply()
2206 HT_ASSERT_RC1(ht); in zend_hash_reverse_apply()
2207 _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); in zend_hash_reverse_apply()
2218 p = ht->arData + idx; in zend_hash_reverse_apply()
2224 HT_ASSERT_RC1(ht); in zend_hash_reverse_apply()
2225 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_reverse_apply()
2347 if (iter->ht == source) { in zend_array_dup_ht_iterators()
2660 ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key) in zend_hash_find() argument
2664 IS_CONSISTENT(ht); in zend_hash_find()
2667 p = zend_hash_find_bucket(ht, key); in zend_hash_find()
2671 ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key) in zend_hash_find_known_hash() argument
2675 IS_CONSISTENT(ht); in zend_hash_find_known_hash()
2677 p = zend_hash_find_bucket(ht, key); in zend_hash_find_known_hash()
2681 ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len) in zend_hash_str_find() argument
2686 IS_CONSISTENT(ht); in zend_hash_str_find()
2689 p = zend_hash_str_find_bucket(ht, str, len, h); in zend_hash_str_find()
2693 ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h) in zend_hash_index_find() argument
2697 IS_CONSISTENT(ht); in zend_hash_index_find()
2699 if (HT_IS_PACKED(ht)) { in zend_hash_index_find()
2700 if (h < ht->nNumUsed) { in zend_hash_index_find()
2701 zval *zv = ht->arPacked + h; in zend_hash_index_find()
2710 p = zend_hash_index_find_bucket(ht, h); in zend_hash_index_find()
2714 ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h) in _zend_hash_index_find() argument
2718 IS_CONSISTENT(ht); in _zend_hash_index_find()
2719 ZEND_ASSERT(!HT_IS_PACKED(ht)); in _zend_hash_index_find()
2721 p = zend_hash_index_find_bucket(ht, h); in _zend_hash_index_find()
2725 ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos) in zend_hash_internal_pointer_reset_ex() argument
2727 IS_CONSISTENT(ht); in zend_hash_internal_pointer_reset_ex()
2728 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_internal_pointer_reset_ex()
2729 *pos = _zend_hash_get_valid_pos(ht, 0); in zend_hash_internal_pointer_reset_ex()
2736 ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos) in zend_hash_internal_pointer_end_ex() argument
2740 IS_CONSISTENT(ht); in zend_hash_internal_pointer_end_ex()
2741 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_internal_pointer_end_ex()
2743 idx = ht->nNumUsed; in zend_hash_internal_pointer_end_ex()
2744 if (HT_IS_PACKED(ht)) { in zend_hash_internal_pointer_end_ex()
2747 if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) { in zend_hash_internal_pointer_end_ex()
2755 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_internal_pointer_end_ex()
2761 *pos = ht->nNumUsed; in zend_hash_internal_pointer_end_ex()
2765 ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos) in zend_hash_move_forward_ex() argument
2769 IS_CONSISTENT(ht); in zend_hash_move_forward_ex()
2770 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_move_forward_ex()
2772 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_move_forward_ex()
2773 if (idx < ht->nNumUsed) { in zend_hash_move_forward_ex()
2774 if (HT_IS_PACKED(ht)) { in zend_hash_move_forward_ex()
2777 if (idx >= ht->nNumUsed) { in zend_hash_move_forward_ex()
2778 *pos = ht->nNumUsed; in zend_hash_move_forward_ex()
2781 if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) { in zend_hash_move_forward_ex()
2789 if (idx >= ht->nNumUsed) { in zend_hash_move_forward_ex()
2790 *pos = ht->nNumUsed; in zend_hash_move_forward_ex()
2793 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_move_forward_ex()
2804 ZEND_API zend_result ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos) in zend_hash_move_backwards_ex() argument
2808 IS_CONSISTENT(ht); in zend_hash_move_backwards_ex()
2809 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_move_backwards_ex()
2811 if (idx < ht->nNumUsed) { in zend_hash_move_backwards_ex()
2812 if (HT_IS_PACKED(ht)) { in zend_hash_move_backwards_ex()
2815 if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) { in zend_hash_move_backwards_ex()
2823 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_move_backwards_ex()
2829 *pos = ht->nNumUsed; in zend_hash_move_backwards_ex()
2838 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
2843 IS_CONSISTENT(ht); in zend_hash_get_current_key_ex()
2844 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_ex()
2845 if (idx < ht->nNumUsed) { in zend_hash_get_current_key_ex()
2846 if (HT_IS_PACKED(ht)) { in zend_hash_get_current_key_ex()
2850 p = ht->arData + idx; in zend_hash_get_current_key_ex()
2862 ZEND_API void ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, const… in zend_hash_get_current_key_zval_ex() argument
2867 IS_CONSISTENT(ht); in zend_hash_get_current_key_zval_ex()
2868 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_zval_ex()
2869 if (idx >= ht->nNumUsed) { in zend_hash_get_current_key_zval_ex()
2872 if (HT_IS_PACKED(ht)) { in zend_hash_get_current_key_zval_ex()
2876 p = ht->arData + idx; in zend_hash_get_current_key_zval_ex()
2885 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
2890 IS_CONSISTENT(ht); in zend_hash_get_current_key_type_ex()
2891 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_type_ex()
2892 if (idx < ht->nNumUsed) { in zend_hash_get_current_key_type_ex()
2893 if (HT_IS_PACKED(ht)) { in zend_hash_get_current_key_type_ex()
2896 p = ht->arData + idx; in zend_hash_get_current_key_type_ex()
2907 ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos) in zend_hash_get_current_data_ex() argument
2912 IS_CONSISTENT(ht); in zend_hash_get_current_data_ex()
2913 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_data_ex()
2914 if (idx < ht->nNumUsed) { in zend_hash_get_current_data_ex()
2915 if (HT_IS_PACKED(ht)) { in zend_hash_get_current_data_ex()
2916 return &ht->arPacked[idx]; in zend_hash_get_current_data_ex()
2918 p = ht->arData + idx; in zend_hash_get_current_data_ex()
2968 ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, bucket_compare_func_… in zend_hash_sort_ex() argument
2973 IS_CONSISTENT(ht); in zend_hash_sort_ex()
2974 HT_ASSERT_RC1(ht); in zend_hash_sort_ex()
2976 if (!(ht->nNumOfElements>1) && !(renumber && ht->nNumOfElements>0)) { in zend_hash_sort_ex()
2981 if (HT_IS_PACKED(ht)) { in zend_hash_sort_ex()
2982 zend_hash_packed_to_hash(ht); // TODO: ??? in zend_hash_sort_ex()
2985 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_sort_ex()
2987 for (i = 0; i < ht->nNumUsed; i++) { in zend_hash_sort_ex()
2988 Z_EXTRA(ht->arData[i].val) = i; in zend_hash_sort_ex()
2992 for (j = 0, i = 0; j < ht->nNumUsed; j++) { in zend_hash_sort_ex()
2993 p = ht->arData + j; in zend_hash_sort_ex()
2996 ht->arData[i] = *p; in zend_hash_sort_ex()
2998 Z_EXTRA(ht->arData[i].val) = i; in zend_hash_sort_ex()
3001 ht->nNumUsed = i; in zend_hash_sort_ex()
3004 if (!HT_IS_PACKED(ht)) { in zend_hash_sort_ex()
3011 HT_HASH_RESET(ht); in zend_hash_sort_ex()
3014 sort((void *)ht->arData, ht->nNumUsed, sizeof(Bucket), (compare_func_t) compar, in zend_hash_sort_ex()
3016 (HT_IS_PACKED(ht) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap))); in zend_hash_sort_ex()
3018 ht->nInternalPointer = 0; in zend_hash_sort_ex()
3022 p = ht->arData + j; in zend_hash_sort_ex()
3030 ht->nNextFreeElement = i; in zend_hash_sort_ex()
3032 if (HT_IS_PACKED(ht)) { in zend_hash_sort_ex()
3034 zend_hash_packed_to_hash(ht); in zend_hash_sort_ex()
3038 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_sort_ex()
3039 Bucket *old_buckets = ht->arData; in zend_hash_sort_ex()
3042 …new_data = pemalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (GC_FLAGS(ht) & IS_ARRAY_PERSI… in zend_hash_sort_ex()
3043 HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_sort_ex()
3044 ht->nTableMask = HT_MIN_MASK; in zend_hash_sort_ex()
3045 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_sort_ex()
3047 zv = ht->arPacked; in zend_hash_sort_ex()
3048 for (i = 0; i < ht->nTableSize; i++) { in zend_hash_sort_ex()
3053 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_sort_ex()
3054 HT_HASH_RESET_PACKED(ht); in zend_hash_sort_ex()
3056 zend_hash_rehash(ht); in zend_hash_sort_ex()
3189 ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t … in zend_hash_minmax() argument
3194 IS_CONSISTENT(ht); in zend_hash_minmax()
3196 if (ht->nNumOfElements == 0 ) { in zend_hash_minmax()
3200 if (HT_IS_PACKED(ht)) { in zend_hash_minmax()
3205 if (idx == ht->nNumUsed) { in zend_hash_minmax()
3208 if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) break; in zend_hash_minmax()
3211 res = ht->arPacked + idx; in zend_hash_minmax()
3212 for (; idx < ht->nNumUsed; idx++) { in zend_hash_minmax()
3213 zv = ht->arPacked + idx; in zend_hash_minmax()
3231 if (idx == ht->nNumUsed) { in zend_hash_minmax()
3234 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) break; in zend_hash_minmax()
3237 res = &ht->arData[idx].val; in zend_hash_minmax()
3238 for (; idx < ht->nNumUsed; idx++) { in zend_hash_minmax()
3239 p = ht->arData + idx; in zend_hash_minmax()
3299 ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht) in zend_symtable_to_proptable() argument
3305 if (UNEXPECTED(HT_IS_PACKED(ht))) { in zend_symtable_to_proptable()
3309 ZEND_HASH_MAP_FOREACH_STR_KEY(ht, str_key) { in zend_symtable_to_proptable()
3315 if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { in zend_symtable_to_proptable()
3316 GC_ADDREF(ht); in zend_symtable_to_proptable()
3319 return ht; in zend_symtable_to_proptable()
3323 HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); in zend_symtable_to_proptable()
3325 ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) { in zend_symtable_to_proptable()
3352 ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool always_duplicate) in zend_proptable_to_symtable() argument
3358 if (!HT_IS_PACKED(ht)) { in zend_proptable_to_symtable()
3359 ZEND_HASH_MAP_FOREACH_STR_KEY(ht, str_key) { in zend_proptable_to_symtable()
3372 return zend_array_dup(ht); in zend_proptable_to_symtable()
3375 if (EXPECTED(!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE))) { in zend_proptable_to_symtable()
3376 GC_ADDREF(ht); in zend_proptable_to_symtable()
3379 return ht; in zend_proptable_to_symtable()
3383 HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); in zend_proptable_to_symtable()
3385 ZEND_HASH_MAP_FOREACH_KEY_VAL_IND(ht, num_key, str_key, zv) { in zend_proptable_to_symtable()