Lines Matching refs:ht

35 # define HT_ASSERT(ht, expr) \  argument
36 ZEND_ASSERT((expr) || (HT_FLAGS(ht) & HASH_FLAG_ALLOW_COW_VIOLATION))
38 # define HT_ASSERT(ht, expr) argument
41 #define HT_ASSERT_RC1(ht) HT_ASSERT(ht, GC_REFCOUNT(ht) == 1) argument
52 static void _zend_is_inconsistent(const HashTable *ht, const char *file, int line) in _zend_is_inconsistent() argument
54 if ((HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) == HT_OK) { in _zend_is_inconsistent()
57 switch (HT_FLAGS(ht) & HASH_FLAG_CONSISTENCY) { in _zend_is_inconsistent()
59 zend_output_debug_string(1, "%s(%d) : ht=%p is being destroyed", file, line, ht); in _zend_is_inconsistent()
62 zend_output_debug_string(1, "%s(%d) : ht=%p is already destroyed", file, line, ht); in _zend_is_inconsistent()
65 zend_output_debug_string(1, "%s(%d) : ht=%p is being cleaned", file, line, ht); in _zend_is_inconsistent()
68 zend_output_debug_string(1, "%s(%d) : ht=%p is inconsistent", file, line, ht); in _zend_is_inconsistent()
75 HT_FLAGS(ht) = (HT_FLAGS(ht) & ~HASH_FLAG_CONSISTENCY) | (n); \
82 #define ZEND_HASH_IF_FULL_DO_RESIZE(ht) \ argument
83 if ((ht)->nNumUsed >= (ht)->nTableSize) { \
84 zend_hash_do_resize(ht); \
87 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
95 result = zend_hash_str_find_ptr(ht, lc_str, len); in zend_hash_str_find_ptr_lc()
101 ZEND_API void *zend_hash_find_ptr_lc(const HashTable *ht, zend_string *key) { in zend_hash_find_ptr_lc() argument
104 result = zend_hash_find_ptr(ht, lc_key); in zend_hash_find_ptr_lc()
109 static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht);
146 static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *ht) in zend_hash_real_init_packed_ex() argument
150 if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) { in zend_hash_real_init_packed_ex()
151 data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), 1); in zend_hash_real_init_packed_ex()
152 } else if (EXPECTED(ht->nTableSize == HT_MIN_SIZE)) { in zend_hash_real_init_packed_ex()
155 data = emalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK)); in zend_hash_real_init_packed_ex()
157 HT_SET_DATA_ADDR(ht, data); in zend_hash_real_init_packed_ex()
159 ht->u.v.flags = HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_real_init_packed_ex()
160 HT_HASH_RESET_PACKED(ht); in zend_hash_real_init_packed_ex()
163 static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht) in zend_hash_real_init_mixed_ex() argument
166 uint32_t nSize = ht->nTableSize; in zend_hash_real_init_mixed_ex()
168 if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) { in zend_hash_real_init_mixed_ex()
172 ht->nTableMask = HT_SIZE_TO_MASK(HT_MIN_SIZE); in zend_hash_real_init_mixed_ex()
173 HT_SET_DATA_ADDR(ht, data); in zend_hash_real_init_mixed_ex()
175 ht->u.v.flags = HASH_FLAG_STATIC_KEYS; in zend_hash_real_init_mixed_ex()
215 ht->nTableMask = HT_SIZE_TO_MASK(nSize); in zend_hash_real_init_mixed_ex()
216 HT_SET_DATA_ADDR(ht, data); in zend_hash_real_init_mixed_ex()
217 HT_FLAGS(ht) = HASH_FLAG_STATIC_KEYS; in zend_hash_real_init_mixed_ex()
218 HT_HASH_RESET(ht); in zend_hash_real_init_mixed_ex()
221 static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, bool packed) in zend_hash_real_init_ex() argument
223 HT_ASSERT_RC1(ht); in zend_hash_real_init_ex()
224 ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED); in zend_hash_real_init_ex()
226 zend_hash_real_init_packed_ex(ht); in zend_hash_real_init_ex()
228 zend_hash_real_init_mixed_ex(ht); in zend_hash_real_init_ex()
249 static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDest… in _zend_hash_init_int() argument
251 GC_SET_REFCOUNT(ht, 1); in _zend_hash_init_int()
252 …GC_TYPE_INFO(ht) = GC_ARRAY | (persistent ? ((GC_PERSISTENT|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT)… in _zend_hash_init_int()
253 HT_FLAGS(ht) = HASH_FLAG_UNINITIALIZED; in _zend_hash_init_int()
254 ht->nTableMask = HT_MIN_MASK; in _zend_hash_init_int()
255 HT_SET_DATA_ADDR(ht, &uninitialized_bucket); in _zend_hash_init_int()
256 ht->nNumUsed = 0; in _zend_hash_init_int()
257 ht->nNumOfElements = 0; in _zend_hash_init_int()
258 ht->nInternalPointer = 0; in _zend_hash_init_int()
259 ht->nNextFreeElement = ZEND_LONG_MIN; in _zend_hash_init_int()
260 ht->pDestructor = pDestructor; in _zend_hash_init_int()
261 ht->nTableSize = zend_hash_check_size(nSize); in _zend_hash_init_int()
264 ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor,… in _zend_hash_init() argument
266 _zend_hash_init_int(ht, nSize, pDestructor, persistent); in _zend_hash_init()
271 HashTable *ht = emalloc(sizeof(HashTable)); in _zend_new_array_0() local
272 _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0); in _zend_new_array_0()
273 return ht; in _zend_new_array_0()
278 HashTable *ht = emalloc(sizeof(HashTable)); in _zend_new_array() local
279 _zend_hash_init_int(ht, nSize, ZVAL_PTR_DTOR, 0); in _zend_new_array()
280 return ht; in _zend_new_array()
286 HashTable *ht = emalloc(sizeof(HashTable)); in zend_new_pair() local
287 _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0); in zend_new_pair()
288 ht->nNumUsed = ht->nNumOfElements = ht->nNextFreeElement = 2; in zend_new_pair()
289 zend_hash_real_init_packed_ex(ht); in zend_new_pair()
291 p = ht->arData; in zend_new_pair()
300 return ht; in zend_new_pair()
303 static void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht) in zend_hash_packed_grow() argument
305 HT_ASSERT_RC1(ht); in zend_hash_packed_grow()
306 if (ht->nTableSize >= HT_MAX_SIZE) { in zend_hash_packed_grow()
307 …_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, siz… in zend_hash_packed_grow()
309 ht->nTableSize += ht->nTableSize; in zend_hash_packed_grow()
310 …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()
313 ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed) in zend_hash_real_init() argument
315 IS_CONSISTENT(ht); in zend_hash_real_init()
317 HT_ASSERT_RC1(ht); in zend_hash_real_init()
318 zend_hash_real_init_ex(ht, packed); in zend_hash_real_init()
321 ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht) in zend_hash_real_init_packed() argument
323 IS_CONSISTENT(ht); in zend_hash_real_init_packed()
325 HT_ASSERT_RC1(ht); in zend_hash_real_init_packed()
326 zend_hash_real_init_packed_ex(ht); in zend_hash_real_init_packed()
329 ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht) in zend_hash_real_init_mixed() argument
331 IS_CONSISTENT(ht); in zend_hash_real_init_mixed()
333 HT_ASSERT_RC1(ht); in zend_hash_real_init_mixed()
334 zend_hash_real_init_mixed_ex(ht); in zend_hash_real_init_mixed()
337 ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht) in zend_hash_packed_to_hash() argument
339 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_packed_to_hash()
340 Bucket *old_buckets = ht->arData; in zend_hash_packed_to_hash()
341 uint32_t nSize = ht->nTableSize; in zend_hash_packed_to_hash()
343 HT_ASSERT_RC1(ht); in zend_hash_packed_to_hash()
344 HT_FLAGS(ht) &= ~HASH_FLAG_PACKED; in zend_hash_packed_to_hash()
345 new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_packed_to_hash()
346 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_packed_to_hash()
347 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_packed_to_hash()
348 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_packed_to_hash()
349 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_packed_to_hash()
350 zend_hash_rehash(ht); in zend_hash_packed_to_hash()
353 ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht) in zend_hash_to_packed() argument
355 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_to_packed()
356 Bucket *old_buckets = ht->arData; in zend_hash_to_packed()
358 HT_ASSERT_RC1(ht); in zend_hash_to_packed()
359 new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_to_packed()
360 HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_to_packed()
361 ht->nTableMask = HT_MIN_MASK; in zend_hash_to_packed()
362 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_to_packed()
363 HT_HASH_RESET_PACKED(ht); in zend_hash_to_packed()
364 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_to_packed()
365 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_to_packed()
368 ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed) in zend_hash_extend() argument
370 HT_ASSERT_RC1(ht); in zend_hash_extend()
372 if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_extend()
373 if (nSize > ht->nTableSize) { in zend_hash_extend()
374 ht->nTableSize = zend_hash_check_size(nSize); in zend_hash_extend()
376 zend_hash_real_init(ht, packed); in zend_hash_extend()
379 ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_PACKED); in zend_hash_extend()
380 if (nSize > ht->nTableSize) { in zend_hash_extend()
381 ht->nTableSize = zend_hash_check_size(nSize); in zend_hash_extend()
382 …HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_… in zend_hash_extend()
385 ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED)); in zend_hash_extend()
386 if (nSize > ht->nTableSize) { in zend_hash_extend()
387 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_extend()
388 Bucket *old_buckets = ht->arData; in zend_hash_extend()
390 ht->nTableSize = nSize; in zend_hash_extend()
391 …new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_extend()
392 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_extend()
393 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_extend()
394 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_extend()
395 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_extend()
396 zend_hash_rehash(ht); in zend_hash_extend()
402 ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed) in zend_hash_discard() argument
407 arData = ht->arData; in zend_hash_discard()
408 p = arData + ht->nNumUsed; in zend_hash_discard()
410 ht->nNumUsed = nNumUsed; in zend_hash_discard()
414 ht->nNumOfElements--; in zend_hash_discard()
421 nIndex = p->h | ht->nTableMask; in zend_hash_discard()
426 static uint32_t zend_array_recalc_elements(HashTable *ht) in zend_array_recalc_elements() argument
429 uint32_t num = ht->nNumOfElements; in zend_array_recalc_elements()
431 ZEND_HASH_FOREACH_VAL(ht, val) { in zend_array_recalc_elements()
442 ZEND_API uint32_t zend_array_count(HashTable *ht) in zend_array_count() argument
445 if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_HAS_EMPTY_IND)) { in zend_array_count()
446 num = zend_array_recalc_elements(ht); in zend_array_count()
447 if (UNEXPECTED(ht->nNumOfElements == num)) { in zend_array_count()
448 HT_FLAGS(ht) &= ~HASH_FLAG_HAS_EMPTY_IND; in zend_array_count()
450 } else if (UNEXPECTED(ht == &EG(symbol_table))) { in zend_array_count()
451 num = zend_array_recalc_elements(ht); in zend_array_count()
453 num = zend_hash_num_elements(ht); in zend_array_count()
459 static zend_always_inline HashPosition _zend_hash_get_valid_pos(const HashTable *ht, HashPosition p… in _zend_hash_get_valid_pos() argument
461 while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arData[pos].val)) { in _zend_hash_get_valid_pos()
467 static zend_always_inline HashPosition _zend_hash_get_current_pos(const HashTable *ht) in _zend_hash_get_current_pos() argument
469 return _zend_hash_get_valid_pos(ht, ht->nInternalPointer); in _zend_hash_get_current_pos()
472 ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht) in zend_hash_get_current_pos() argument
474 return _zend_hash_get_current_pos(ht); in zend_hash_get_current_pos()
477 ZEND_API uint32_t ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPosition pos) in zend_hash_iterator_add() argument
483 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_add()
484 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_add()
487 if (iter->ht == NULL) { in zend_hash_iterator_add()
488 iter->ht = ht; in zend_hash_iterator_add()
506 iter->ht = ht; in zend_hash_iterator_add()
514 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos(uint32_t idx, HashTable *ht) in zend_hash_iterator_pos() argument
519 if (UNEXPECTED(iter->ht != ht)) { in zend_hash_iterator_pos()
520 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_pos()
521 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_pos()
522 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_pos()
524 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos()
525 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_pos()
527 iter->ht = ht; in zend_hash_iterator_pos()
528 iter->pos = _zend_hash_get_current_pos(ht); in zend_hash_iterator_pos()
535 HashTable *ht = Z_ARRVAL_P(array); in zend_hash_iterator_pos_ex() local
539 if (UNEXPECTED(iter->ht != ht)) { in zend_hash_iterator_pos_ex()
540 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_pos_ex()
541 && EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos_ex()
542 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_pos_ex()
545 ht = Z_ARRVAL_P(array); in zend_hash_iterator_pos_ex()
546 if (EXPECTED(!HT_ITERATORS_OVERFLOW(ht))) { in zend_hash_iterator_pos_ex()
547 HT_INC_ITERATORS_COUNT(ht); in zend_hash_iterator_pos_ex()
549 iter->ht = ht; in zend_hash_iterator_pos_ex()
550 iter->pos = _zend_hash_get_current_pos(ht); in zend_hash_iterator_pos_ex()
561 if (EXPECTED(iter->ht) && EXPECTED(iter->ht != HT_POISONED_PTR) in zend_hash_iterator_del()
562 && EXPECTED(!HT_ITERATORS_OVERFLOW(iter->ht))) { in zend_hash_iterator_del()
563 ZEND_ASSERT(HT_ITERATORS_COUNT(iter->ht) != 0); in zend_hash_iterator_del()
564 HT_DEC_ITERATORS_COUNT(iter->ht); in zend_hash_iterator_del()
566 iter->ht = NULL; in zend_hash_iterator_del()
569 while (idx > 0 && EG(ht_iterators)[idx - 1].ht == NULL) { in zend_hash_iterator_del()
576 static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(HashTable *ht) in _zend_hash_iterators_remove() argument
582 if (iter->ht == ht) { in _zend_hash_iterators_remove()
583 iter->ht = HT_POISONED_PTR; in _zend_hash_iterators_remove()
589 static zend_always_inline void zend_hash_iterators_remove(HashTable *ht) in zend_hash_iterators_remove() argument
591 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_iterators_remove()
592 _zend_hash_iterators_remove(ht); in zend_hash_iterators_remove()
596 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht, HashPosition start) in zend_hash_iterators_lower_pos() argument
600 HashPosition res = ht->nNumUsed; in zend_hash_iterators_lower_pos()
603 if (iter->ht == ht) { in zend_hash_iterators_lower_pos()
613 ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosit… in _zend_hash_iterators_update() argument
619 if (iter->ht == ht && iter->pos == from) { in _zend_hash_iterators_update()
626 ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step) in zend_hash_iterators_advance() argument
632 if (iter->ht == ht) { in zend_hash_iterators_advance()
639 static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key, zend… in zend_hash_find_bucket() argument
651 arData = ht->arData; in zend_hash_find_bucket()
652 nIndex = h | ht->nTableMask; in zend_hash_find_bucket()
680 static zend_always_inline Bucket *zend_hash_str_find_bucket(const HashTable *ht, const char *str, s… in zend_hash_str_find_bucket() argument
686 arData = ht->arData; in zend_hash_str_find_bucket()
687 nIndex = h | ht->nTableMask; in zend_hash_str_find_bucket()
690 ZEND_ASSERT(idx < HT_IDX_TO_HASH(ht->nTableSize)); in zend_hash_str_find_bucket()
703 static zend_always_inline Bucket *zend_hash_index_find_bucket(const HashTable *ht, zend_ulong h) in zend_hash_index_find_bucket() argument
709 arData = ht->arData; in zend_hash_index_find_bucket()
710 nIndex = h | ht->nTableMask; in zend_hash_index_find_bucket()
713 ZEND_ASSERT(idx < HT_IDX_TO_HASH(ht->nTableSize)); in zend_hash_index_find_bucket()
723 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
730 IS_CONSISTENT(ht); in _zend_hash_add_or_update_i()
731 HT_ASSERT_RC1(ht); in _zend_hash_add_or_update_i()
733 if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) { in _zend_hash_add_or_update_i()
734 if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in _zend_hash_add_or_update_i()
735 zend_hash_real_init_mixed(ht); in _zend_hash_add_or_update_i()
738 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
743 zend_hash_packed_to_hash(ht); in _zend_hash_add_or_update_i()
746 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
751 p = zend_hash_find_bucket(ht, key, 0); in _zend_hash_add_or_update_i()
778 if (ht->pDestructor) { in _zend_hash_add_or_update_i()
779 ht->pDestructor(data); in _zend_hash_add_or_update_i()
786 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
790 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_add_or_update_i()
794 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_add_or_update_i()
797 idx = ht->nNumUsed++; in _zend_hash_add_or_update_i()
798 ht->nNumOfElements++; in _zend_hash_add_or_update_i()
799 arData = ht->arData; in _zend_hash_add_or_update_i()
803 nIndex = h | ht->nTableMask; in _zend_hash_add_or_update_i()
811 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
818 IS_CONSISTENT(ht); in _zend_hash_str_add_or_update_i()
819 HT_ASSERT_RC1(ht); in _zend_hash_str_add_or_update_i()
821 if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) { in _zend_hash_str_add_or_update_i()
822 if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in _zend_hash_str_add_or_update_i()
823 zend_hash_real_init_mixed(ht); in _zend_hash_str_add_or_update_i()
826 zend_hash_packed_to_hash(ht); in _zend_hash_str_add_or_update_i()
829 p = zend_hash_str_find_bucket(ht, str, len, h); in _zend_hash_str_add_or_update_i()
855 if (ht->pDestructor) { in _zend_hash_str_add_or_update_i()
856 ht->pDestructor(data); in _zend_hash_str_add_or_update_i()
863 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_str_add_or_update_i()
866 idx = ht->nNumUsed++; in _zend_hash_str_add_or_update_i()
867 ht->nNumOfElements++; in _zend_hash_str_add_or_update_i()
868 p = ht->arData + idx; in _zend_hash_str_add_or_update_i()
869 p->key = key = zend_string_init(str, len, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in _zend_hash_str_add_or_update_i()
871 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in _zend_hash_str_add_or_update_i()
873 nIndex = h | ht->nTableMask; in _zend_hash_str_add_or_update_i()
874 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in _zend_hash_str_add_or_update_i()
875 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx); in _zend_hash_str_add_or_update_i()
880 ZEND_API zval* ZEND_FASTCALL zend_hash_add_or_update(HashTable *ht, zend_string *key, zval *pData, … in zend_hash_add_or_update() argument
883 return zend_hash_add(ht, key, pData); in zend_hash_add_or_update()
885 return zend_hash_add_new(ht, key, pData); in zend_hash_add_or_update()
887 return zend_hash_update(ht, key, pData); in zend_hash_add_or_update()
890 return zend_hash_update_ind(ht, key, pData); in zend_hash_add_or_update()
894 ZEND_API zval* ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData) in zend_hash_add() argument
896 return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD); in zend_hash_add()
899 ZEND_API zval* ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData) in zend_hash_update() argument
901 return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE); in zend_hash_update()
904 ZEND_API zval* ZEND_FASTCALL zend_hash_update_ind(HashTable *ht, zend_string *key, zval *pData) in zend_hash_update_ind() argument
906 return _zend_hash_add_or_update_i(ht, key, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT); in zend_hash_update_ind()
909 ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData) in zend_hash_add_new() argument
911 return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW); in zend_hash_add_new()
914 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
917 return zend_hash_str_add(ht, str, len, pData); in zend_hash_str_add_or_update()
919 return zend_hash_str_add_new(ht, str, len, pData); in zend_hash_str_add_or_update()
921 return zend_hash_str_update(ht, str, len, pData); in zend_hash_str_add_or_update()
924 return zend_hash_str_update_ind(ht, str, len, pData); in zend_hash_str_add_or_update()
928 ZEND_API zval* ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval … in zend_hash_str_update() argument
932 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE); in zend_hash_str_update()
935 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
939 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_UPDATE | HASH_UPDATE_INDIRECT); in zend_hash_str_update_ind()
942 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
946 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD); in zend_hash_str_add()
949 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
953 return _zend_hash_str_add_or_update_i(ht, str, len, h, pData, HASH_ADD_NEW); in zend_hash_str_add_new()
956 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_empty_element(HashTable *ht, zend_ulong h) in zend_hash_index_add_empty_element() argument
961 return zend_hash_index_add(ht, h, &dummy); in zend_hash_index_add_empty_element()
964 ZEND_API zval* ZEND_FASTCALL zend_hash_add_empty_element(HashTable *ht, zend_string *key) in zend_hash_add_empty_element() argument
969 return zend_hash_add(ht, key, &dummy); in zend_hash_add_empty_element()
972 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
977 return zend_hash_str_add(ht, str, len, &dummy); in zend_hash_str_add_empty_element()
980 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
986 IS_CONSISTENT(ht); in _zend_hash_index_add_or_update_i()
987 HT_ASSERT_RC1(ht); in _zend_hash_index_add_or_update_i()
993 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in _zend_hash_index_add_or_update_i()
994 if (h < ht->nNumUsed) { in _zend_hash_index_add_or_update_i()
995 p = ht->arData + h; in _zend_hash_index_add_or_update_i()
1001 if (ht->pDestructor) { in _zend_hash_index_add_or_update_i()
1002 ht->pDestructor(&p->val); in _zend_hash_index_add_or_update_i()
1009 } else if (EXPECTED(h < ht->nTableSize)) { in _zend_hash_index_add_or_update_i()
1011 p = ht->arData + h; in _zend_hash_index_add_or_update_i()
1014 if (h > ht->nNumUsed) { in _zend_hash_index_add_or_update_i()
1015 Bucket *q = ht->arData + ht->nNumUsed; in _zend_hash_index_add_or_update_i()
1022 ht->nNextFreeElement = ht->nNumUsed = h + 1; in _zend_hash_index_add_or_update_i()
1024 } else if ((h >> 1) < ht->nTableSize && in _zend_hash_index_add_or_update_i()
1025 (ht->nTableSize >> 1) < ht->nNumOfElements) { in _zend_hash_index_add_or_update_i()
1026 zend_hash_packed_grow(ht); in _zend_hash_index_add_or_update_i()
1029 if (ht->nNumUsed >= ht->nTableSize) { in _zend_hash_index_add_or_update_i()
1030 ht->nTableSize += ht->nTableSize; in _zend_hash_index_add_or_update_i()
1033 zend_hash_packed_to_hash(ht); in _zend_hash_index_add_or_update_i()
1035 } else if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) { in _zend_hash_index_add_or_update_i()
1036 if (h < ht->nTableSize) { in _zend_hash_index_add_or_update_i()
1037 zend_hash_real_init_packed_ex(ht); in _zend_hash_index_add_or_update_i()
1040 zend_hash_real_init_mixed(ht); in _zend_hash_index_add_or_update_i()
1043 p = zend_hash_index_find_bucket(ht, h); in _zend_hash_index_add_or_update_i()
1049 ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ in _zend_hash_index_add_or_update_i()
1052 idx = ht->nNumUsed++; in _zend_hash_index_add_or_update_i()
1053 nIndex = h | ht->nTableMask; in _zend_hash_index_add_or_update_i()
1054 p = ht->arData + idx; in _zend_hash_index_add_or_update_i()
1055 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in _zend_hash_index_add_or_update_i()
1056 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx); in _zend_hash_index_add_or_update_i()
1057 if ((zend_long)h >= ht->nNextFreeElement) { in _zend_hash_index_add_or_update_i()
1058 ht->nNextFreeElement = (zend_long)h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX; in _zend_hash_index_add_or_update_i()
1061 ht->nNumOfElements++; in _zend_hash_index_add_or_update_i()
1069 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
1072 return zend_hash_index_add(ht, h, pData); in zend_hash_index_add_or_update()
1074 return zend_hash_index_add_new(ht, h, pData); in zend_hash_index_add_or_update()
1076 ZEND_ASSERT(h == ht->nNextFreeElement); in zend_hash_index_add_or_update()
1077 return zend_hash_next_index_insert(ht, pData); in zend_hash_index_add_or_update()
1079 ZEND_ASSERT(h == ht->nNextFreeElement); in zend_hash_index_add_or_update()
1080 return zend_hash_next_index_insert_new(ht, pData); in zend_hash_index_add_or_update()
1083 return zend_hash_index_update(ht, h, pData); in zend_hash_index_add_or_update()
1087 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_add() argument
1089 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD); in zend_hash_index_add()
1092 ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_add_new() argument
1094 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_ADD | HASH_ADD_NEW); in zend_hash_index_add_new()
1097 ZEND_API zval* ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData) in zend_hash_index_update() argument
1099 return _zend_hash_index_add_or_update_i(ht, h, pData, HASH_UPDATE); in zend_hash_index_update()
1102 ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData) in zend_hash_next_index_insert() argument
1104 return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT); in zend_hash_next_index_insert()
1107 ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData) in zend_hash_next_index_insert_new() argument
1109 …return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW |… in zend_hash_next_index_insert_new()
1112 ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *b, zend_string *key) in zend_hash_set_bucket_key() argument
1118 IS_CONSISTENT(ht); in zend_hash_set_bucket_key()
1119 HT_ASSERT_RC1(ht); in zend_hash_set_bucket_key()
1120 ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED)); in zend_hash_set_bucket_key()
1122 p = zend_hash_find_bucket(ht, key, 0); in zend_hash_set_bucket_key()
1129 HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS; in zend_hash_set_bucket_key()
1132 arData = ht->arData; in zend_hash_set_bucket_key()
1136 nIndex = b->h | ht->nTableMask; in zend_hash_set_bucket_key()
1154 nIndex = b->h | ht->nTableMask; in zend_hash_set_bucket_key()
1172 static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) in zend_hash_do_resize() argument
1175 IS_CONSISTENT(ht); in zend_hash_do_resize()
1176 HT_ASSERT_RC1(ht); in zend_hash_do_resize()
1178 …if (ht->nNumUsed > ht->nNumOfElements + (ht->nNumOfElements >> 5)) { /* additional term is there t… in zend_hash_do_resize()
1179 zend_hash_rehash(ht); in zend_hash_do_resize()
1180 } else if (ht->nTableSize < HT_MAX_SIZE) { /* Let's double the table size */ in zend_hash_do_resize()
1181 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_do_resize()
1182 uint32_t nSize = ht->nTableSize + ht->nTableSize; in zend_hash_do_resize()
1183 Bucket *old_buckets = ht->arData; in zend_hash_do_resize()
1185 ht->nTableSize = nSize; in zend_hash_do_resize()
1186 …new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_do_resize()
1187 ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); in zend_hash_do_resize()
1188 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_do_resize()
1189 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_do_resize()
1190 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_do_resize()
1191 zend_hash_rehash(ht); in zend_hash_do_resize()
1193 …_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, siz… in zend_hash_do_resize()
1197 ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht) in zend_hash_rehash() argument
1202 IS_CONSISTENT(ht); in zend_hash_rehash()
1204 if (UNEXPECTED(ht->nNumOfElements == 0)) { in zend_hash_rehash()
1205 if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_rehash()
1206 ht->nNumUsed = 0; in zend_hash_rehash()
1207 HT_HASH_RESET(ht); in zend_hash_rehash()
1212 HT_HASH_RESET(ht); in zend_hash_rehash()
1214 p = ht->arData; in zend_hash_rehash()
1215 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_rehash()
1217 nIndex = p->h | ht->nTableMask; in zend_hash_rehash()
1218 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1219 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i); in zend_hash_rehash()
1221 } while (++i < ht->nNumUsed); in zend_hash_rehash()
1223 uint32_t old_num_used = ht->nNumUsed; in zend_hash_rehash()
1229 if (EXPECTED(!HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1230 while (++i < ht->nNumUsed) { in zend_hash_rehash()
1235 nIndex = q->h | ht->nTableMask; in zend_hash_rehash()
1237 Z_NEXT(q->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1238 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); in zend_hash_rehash()
1239 if (UNEXPECTED(ht->nInternalPointer == i)) { in zend_hash_rehash()
1240 ht->nInternalPointer = j; in zend_hash_rehash()
1247 uint32_t iter_pos = zend_hash_iterators_lower_pos(ht, 0); in zend_hash_rehash()
1249 while (++i < ht->nNumUsed) { in zend_hash_rehash()
1254 nIndex = q->h | ht->nTableMask; in zend_hash_rehash()
1256 Z_NEXT(q->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1257 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); in zend_hash_rehash()
1258 if (UNEXPECTED(ht->nInternalPointer == i)) { in zend_hash_rehash()
1259 ht->nInternalPointer = j; in zend_hash_rehash()
1263 zend_hash_iterators_update(ht, iter_pos, j); in zend_hash_rehash()
1264 iter_pos = zend_hash_iterators_lower_pos(ht, iter_pos + 1); in zend_hash_rehash()
1272 ht->nNumUsed = j; in zend_hash_rehash()
1275 nIndex = p->h | ht->nTableMask; in zend_hash_rehash()
1276 Z_NEXT(p->val) = HT_HASH(ht, nIndex); in zend_hash_rehash()
1277 HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(i); in zend_hash_rehash()
1279 } while (++i < ht->nNumUsed); in zend_hash_rehash()
1283 if (UNEXPECTED(HT_HAS_ITERATORS(ht))) { in zend_hash_rehash()
1284 _zend_hash_iterators_update(ht, old_num_used, ht->nNumUsed); in zend_hash_rehash()
1289 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
1291 if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { in _zend_hash_del_el_ex()
1295 HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val); in _zend_hash_del_el_ex()
1299 ht->nNumOfElements--; in _zend_hash_del_el_ex()
1300 if (ht->nInternalPointer == idx || UNEXPECTED(HT_HAS_ITERATORS(ht))) { in _zend_hash_del_el_ex()
1306 if (new_idx >= ht->nNumUsed) { in _zend_hash_del_el_ex()
1308 } else if (Z_TYPE(ht->arData[new_idx].val) != IS_UNDEF) { in _zend_hash_del_el_ex()
1312 if (ht->nInternalPointer == idx) { in _zend_hash_del_el_ex()
1313 ht->nInternalPointer = new_idx; in _zend_hash_del_el_ex()
1315 zend_hash_iterators_update(ht, idx, new_idx); in _zend_hash_del_el_ex()
1317 if (ht->nNumUsed - 1 == idx) { in _zend_hash_del_el_ex()
1319 ht->nNumUsed--; in _zend_hash_del_el_ex()
1320 } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF))); in _zend_hash_del_el_ex()
1321 ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed); in _zend_hash_del_el_ex()
1326 if (ht->pDestructor) { in _zend_hash_del_el_ex()
1330 ht->pDestructor(&tmp); in _zend_hash_del_el_ex()
1336 static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bucket *p) in _zend_hash_del_el() argument
1340 if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { in _zend_hash_del_el()
1341 uint32_t nIndex = p->h | ht->nTableMask; in _zend_hash_del_el()
1342 uint32_t i = HT_HASH(ht, nIndex); in _zend_hash_del_el()
1345 prev = HT_HASH_TO_BUCKET(ht, i); in _zend_hash_del_el()
1348 prev = HT_HASH_TO_BUCKET(ht, i); in _zend_hash_del_el()
1353 _zend_hash_del_el_ex(ht, idx, p, prev); in _zend_hash_del_el()
1356 ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p) in zend_hash_del_bucket() argument
1358 IS_CONSISTENT(ht); in zend_hash_del_bucket()
1359 HT_ASSERT_RC1(ht); in zend_hash_del_bucket()
1360 _zend_hash_del_el(ht, HT_IDX_TO_HASH(p - ht->arData), p); in zend_hash_del_bucket()
1363 ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key) in zend_hash_del() argument
1371 IS_CONSISTENT(ht); in zend_hash_del()
1372 HT_ASSERT_RC1(ht); in zend_hash_del()
1375 nIndex = h | ht->nTableMask; in zend_hash_del()
1377 idx = HT_HASH(ht, nIndex); in zend_hash_del()
1379 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_del()
1384 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_del()
1393 ZEND_API zend_result ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key) in zend_hash_del_ind() argument
1401 IS_CONSISTENT(ht); in zend_hash_del_ind()
1402 HT_ASSERT_RC1(ht); in zend_hash_del_ind()
1405 nIndex = h | ht->nTableMask; in zend_hash_del_ind()
1407 idx = HT_HASH(ht, nIndex); in zend_hash_del_ind()
1409 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_del_ind()
1420 if (ht->pDestructor) { in zend_hash_del_ind()
1424 ht->pDestructor(&tmp); in zend_hash_del_ind()
1428 HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; in zend_hash_del_ind()
1431 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_del_ind()
1441 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
1449 IS_CONSISTENT(ht); in zend_hash_str_del_ind()
1450 HT_ASSERT_RC1(ht); in zend_hash_str_del_ind()
1453 nIndex = h | ht->nTableMask; in zend_hash_str_del_ind()
1455 idx = HT_HASH(ht, nIndex); in zend_hash_str_del_ind()
1457 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_str_del_ind()
1468 if (ht->pDestructor) { in zend_hash_str_del_ind()
1469 ht->pDestructor(data); in zend_hash_str_del_ind()
1472 HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; in zend_hash_str_del_ind()
1475 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_str_del_ind()
1485 ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *str, size_t len) in zend_hash_str_del() argument
1493 IS_CONSISTENT(ht); in zend_hash_str_del()
1494 HT_ASSERT_RC1(ht); in zend_hash_str_del()
1497 nIndex = h | ht->nTableMask; in zend_hash_str_del()
1499 idx = HT_HASH(ht, nIndex); in zend_hash_str_del()
1501 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_str_del()
1506 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_str_del()
1515 ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h) in zend_hash_index_del() argument
1522 IS_CONSISTENT(ht); in zend_hash_index_del()
1523 HT_ASSERT_RC1(ht); in zend_hash_index_del()
1525 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_index_del()
1526 if (h < ht->nNumUsed) { in zend_hash_index_del()
1527 p = ht->arData + h; in zend_hash_index_del()
1529 _zend_hash_del_el_ex(ht, HT_IDX_TO_HASH(h), p, NULL); in zend_hash_index_del()
1535 nIndex = h | ht->nTableMask; in zend_hash_index_del()
1537 idx = HT_HASH(ht, nIndex); in zend_hash_index_del()
1539 p = HT_HASH_TO_BUCKET(ht, idx); in zend_hash_index_del()
1541 _zend_hash_del_el_ex(ht, idx, p, prev); in zend_hash_index_del()
1550 ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) in zend_hash_destroy() argument
1554 IS_CONSISTENT(ht); in zend_hash_destroy()
1555 HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); in zend_hash_destroy()
1557 if (ht->nNumUsed) { in zend_hash_destroy()
1558 p = ht->arData; in zend_hash_destroy()
1559 end = p + ht->nNumUsed; in zend_hash_destroy()
1560 if (ht->pDestructor) { in zend_hash_destroy()
1563 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_destroy()
1564 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1566 ht->pDestructor(&p->val); in zend_hash_destroy()
1571 ht->pDestructor(&p->val); in zend_hash_destroy()
1575 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_destroy()
1577 ht->pDestructor(&p->val); in zend_hash_destroy()
1585 ht->pDestructor(&p->val); in zend_hash_destroy()
1595 if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_destroy()
1605 zend_hash_iterators_remove(ht); in zend_hash_destroy()
1606 } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_destroy()
1609 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_destroy()
1612 ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht) in zend_array_destroy() argument
1616 IS_CONSISTENT(ht); in zend_array_destroy()
1617 HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); in zend_array_destroy()
1620 GC_REMOVE_FROM_BUFFER(ht); in zend_array_destroy()
1621 GC_TYPE_INFO(ht) = GC_NULL /*???| (GC_WHITE << 16)*/; in zend_array_destroy()
1623 if (ht->nNumUsed) { in zend_array_destroy()
1625 if (UNEXPECTED(ht->pDestructor != ZVAL_PTR_DTOR)) { in zend_array_destroy()
1626 zend_hash_destroy(ht); in zend_array_destroy()
1630 p = ht->arData; in zend_array_destroy()
1631 end = p + ht->nNumUsed; in zend_array_destroy()
1634 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_array_destroy()
1638 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_array_destroy()
1655 } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_array_destroy()
1659 efree(HT_GET_DATA_ADDR(ht)); in zend_array_destroy()
1661 zend_hash_iterators_remove(ht); in zend_array_destroy()
1662 FREE_HASHTABLE(ht); in zend_array_destroy()
1665 ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht) in zend_hash_clean() argument
1669 IS_CONSISTENT(ht); in zend_hash_clean()
1670 HT_ASSERT_RC1(ht); in zend_hash_clean()
1672 if (ht->nNumUsed) { in zend_hash_clean()
1673 p = ht->arData; in zend_hash_clean()
1674 end = p + ht->nNumUsed; in zend_hash_clean()
1675 if (ht->pDestructor) { in zend_hash_clean()
1676 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1677 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1679 ht->pDestructor(&p->val); in zend_hash_clean()
1684 ht->pDestructor(&p->val); in zend_hash_clean()
1688 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1690 ht->pDestructor(&p->val); in zend_hash_clean()
1698 ht->pDestructor(&p->val); in zend_hash_clean()
1706 if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_hash_clean()
1707 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_clean()
1724 if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { in zend_hash_clean()
1725 HT_HASH_RESET(ht); in zend_hash_clean()
1728 ht->nNumUsed = 0; in zend_hash_clean()
1729 ht->nNumOfElements = 0; in zend_hash_clean()
1730 ht->nNextFreeElement = ZEND_LONG_MIN; in zend_hash_clean()
1731 ht->nInternalPointer = 0; in zend_hash_clean()
1734 ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht) in zend_symtable_clean() argument
1738 IS_CONSISTENT(ht); in zend_symtable_clean()
1739 HT_ASSERT_RC1(ht); in zend_symtable_clean()
1741 if (ht->nNumUsed) { in zend_symtable_clean()
1742 p = ht->arData; in zend_symtable_clean()
1743 end = p + ht->nNumUsed; in zend_symtable_clean()
1744 if (HT_HAS_STATIC_KEYS_ONLY(ht)) { in zend_symtable_clean()
1748 } else if (HT_IS_WITHOUT_HOLES(ht)) { in zend_symtable_clean()
1765 HT_HASH_RESET(ht); in zend_symtable_clean()
1767 ht->nNumUsed = 0; in zend_symtable_clean()
1768 ht->nNumOfElements = 0; in zend_symtable_clean()
1769 ht->nNextFreeElement = ZEND_LONG_MIN; in zend_symtable_clean()
1770 ht->nInternalPointer = 0; in zend_symtable_clean()
1773 ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht) in zend_hash_graceful_destroy() argument
1778 IS_CONSISTENT(ht); in zend_hash_graceful_destroy()
1779 HT_ASSERT_RC1(ht); in zend_hash_graceful_destroy()
1781 p = ht->arData; in zend_hash_graceful_destroy()
1782 for (idx = 0; idx < ht->nNumUsed; idx++, p++) { in zend_hash_graceful_destroy()
1784 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_graceful_destroy()
1786 if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_graceful_destroy()
1787 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_graceful_destroy()
1793 ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht) in zend_hash_graceful_reverse_destroy() argument
1798 IS_CONSISTENT(ht); in zend_hash_graceful_reverse_destroy()
1799 HT_ASSERT_RC1(ht); in zend_hash_graceful_reverse_destroy()
1801 idx = ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
1802 p = ht->arData + ht->nNumUsed; in zend_hash_graceful_reverse_destroy()
1807 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_graceful_reverse_destroy()
1810 if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { in zend_hash_graceful_reverse_destroy()
1811 pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_graceful_reverse_destroy()
1826 ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func) in zend_hash_apply() argument
1832 IS_CONSISTENT(ht); in zend_hash_apply()
1834 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply()
1835 p = ht->arData + idx; in zend_hash_apply()
1840 HT_ASSERT_RC1(ht); in zend_hash_apply()
1841 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply()
1850 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
1856 IS_CONSISTENT(ht); in zend_hash_apply_with_argument()
1858 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_argument()
1859 p = ht->arData + idx; in zend_hash_apply_with_argument()
1864 HT_ASSERT_RC1(ht); in zend_hash_apply_with_argument()
1865 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply_with_argument()
1874 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
1882 IS_CONSISTENT(ht); in zend_hash_apply_with_arguments()
1884 for (idx = 0; idx < ht->nNumUsed; idx++) { in zend_hash_apply_with_arguments()
1885 p = ht->arData + idx; in zend_hash_apply_with_arguments()
1894 HT_ASSERT_RC1(ht); in zend_hash_apply_with_arguments()
1895 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_apply_with_arguments()
1906 ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func) in zend_hash_reverse_apply() argument
1912 IS_CONSISTENT(ht); in zend_hash_reverse_apply()
1914 idx = ht->nNumUsed; in zend_hash_reverse_apply()
1917 p = ht->arData + idx; in zend_hash_reverse_apply()
1923 HT_ASSERT_RC1(ht); in zend_hash_reverse_apply()
1924 _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); in zend_hash_reverse_apply()
2240 ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key) in zend_hash_find() argument
2244 IS_CONSISTENT(ht); in zend_hash_find()
2246 p = zend_hash_find_bucket(ht, key, 0); in zend_hash_find()
2250 ZEND_API zval* ZEND_FASTCALL _zend_hash_find_known_hash(const HashTable *ht, zend_string *key) in _zend_hash_find_known_hash() argument
2254 IS_CONSISTENT(ht); in _zend_hash_find_known_hash()
2256 p = zend_hash_find_bucket(ht, key, 1); in _zend_hash_find_known_hash()
2260 ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len) in zend_hash_str_find() argument
2265 IS_CONSISTENT(ht); in zend_hash_str_find()
2268 p = zend_hash_str_find_bucket(ht, str, len, h); in zend_hash_str_find()
2272 ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h) in zend_hash_index_find() argument
2276 IS_CONSISTENT(ht); in zend_hash_index_find()
2278 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_index_find()
2279 if (h < ht->nNumUsed) { in zend_hash_index_find()
2280 p = ht->arData + h; in zend_hash_index_find()
2288 p = zend_hash_index_find_bucket(ht, h); in zend_hash_index_find()
2292 ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h) in _zend_hash_index_find() argument
2296 IS_CONSISTENT(ht); in _zend_hash_index_find()
2298 p = zend_hash_index_find_bucket(ht, h); in _zend_hash_index_find()
2302 ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos) in zend_hash_internal_pointer_reset_ex() argument
2304 IS_CONSISTENT(ht); in zend_hash_internal_pointer_reset_ex()
2305 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_internal_pointer_reset_ex()
2306 *pos = _zend_hash_get_valid_pos(ht, 0); in zend_hash_internal_pointer_reset_ex()
2313 ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos) in zend_hash_internal_pointer_end_ex() argument
2317 IS_CONSISTENT(ht); in zend_hash_internal_pointer_end_ex()
2318 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_internal_pointer_end_ex()
2320 idx = ht->nNumUsed; in zend_hash_internal_pointer_end_ex()
2323 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_internal_pointer_end_ex()
2328 *pos = ht->nNumUsed; in zend_hash_internal_pointer_end_ex()
2332 ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos) in zend_hash_move_forward_ex() argument
2336 IS_CONSISTENT(ht); in zend_hash_move_forward_ex()
2337 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_move_forward_ex()
2339 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_move_forward_ex()
2340 if (idx < ht->nNumUsed) { in zend_hash_move_forward_ex()
2343 if (idx >= ht->nNumUsed) { in zend_hash_move_forward_ex()
2344 *pos = ht->nNumUsed; in zend_hash_move_forward_ex()
2347 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_move_forward_ex()
2357 ZEND_API zend_result ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos) in zend_hash_move_backwards_ex() argument
2361 IS_CONSISTENT(ht); in zend_hash_move_backwards_ex()
2362 HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); in zend_hash_move_backwards_ex()
2364 if (idx < ht->nNumUsed) { in zend_hash_move_backwards_ex()
2367 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { in zend_hash_move_backwards_ex()
2372 *pos = ht->nNumUsed; in zend_hash_move_backwards_ex()
2381 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
2386 IS_CONSISTENT(ht); in zend_hash_get_current_key_ex()
2387 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_ex()
2388 if (idx < ht->nNumUsed) { in zend_hash_get_current_key_ex()
2389 p = ht->arData + idx; in zend_hash_get_current_key_ex()
2401 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
2406 IS_CONSISTENT(ht); in zend_hash_get_current_key_zval_ex()
2407 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_zval_ex()
2408 if (idx >= ht->nNumUsed) { in zend_hash_get_current_key_zval_ex()
2411 p = ht->arData + idx; in zend_hash_get_current_key_zval_ex()
2420 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
2425 IS_CONSISTENT(ht); in zend_hash_get_current_key_type_ex()
2426 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_key_type_ex()
2427 if (idx < ht->nNumUsed) { in zend_hash_get_current_key_type_ex()
2428 p = ht->arData + idx; in zend_hash_get_current_key_type_ex()
2439 ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos) in zend_hash_get_current_data_ex() argument
2444 IS_CONSISTENT(ht); in zend_hash_get_current_data_ex()
2445 idx = _zend_hash_get_valid_pos(ht, *pos); in zend_hash_get_current_data_ex()
2446 if (idx < ht->nNumUsed) { in zend_hash_get_current_data_ex()
2447 p = ht->arData + idx; in zend_hash_get_current_data_ex()
2497 ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, bucket_compare_func_… in zend_hash_sort_ex() argument
2502 IS_CONSISTENT(ht); in zend_hash_sort_ex()
2503 HT_ASSERT_RC1(ht); in zend_hash_sort_ex()
2505 if (!(ht->nNumOfElements>1) && !(renumber && ht->nNumOfElements>0)) { in zend_hash_sort_ex()
2510 if (HT_IS_WITHOUT_HOLES(ht)) { in zend_hash_sort_ex()
2512 for (i = 0; i < ht->nNumUsed; i++) { in zend_hash_sort_ex()
2513 Z_EXTRA(ht->arData[i].val) = i; in zend_hash_sort_ex()
2517 for (j = 0, i = 0; j < ht->nNumUsed; j++) { in zend_hash_sort_ex()
2518 p = ht->arData + j; in zend_hash_sort_ex()
2521 ht->arData[i] = *p; in zend_hash_sort_ex()
2523 Z_EXTRA(ht->arData[i].val) = i; in zend_hash_sort_ex()
2526 ht->nNumUsed = i; in zend_hash_sort_ex()
2529 sort((void *)ht->arData, ht->nNumUsed, sizeof(Bucket), (compare_func_t) compar, in zend_hash_sort_ex()
2531 ((HT_FLAGS(ht) & HASH_FLAG_PACKED) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap))); in zend_hash_sort_ex()
2533 ht->nInternalPointer = 0; in zend_hash_sort_ex()
2537 p = ht->arData + j; in zend_hash_sort_ex()
2545 ht->nNextFreeElement = i; in zend_hash_sort_ex()
2547 if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { in zend_hash_sort_ex()
2549 zend_hash_packed_to_hash(ht); in zend_hash_sort_ex()
2553 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); in zend_hash_sort_ex()
2554 Bucket *old_buckets = ht->arData; in zend_hash_sort_ex()
2556 …new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); in zend_hash_sort_ex()
2557 HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; in zend_hash_sort_ex()
2558 ht->nTableMask = HT_MIN_MASK; in zend_hash_sort_ex()
2559 HT_SET_DATA_ADDR(ht, new_data); in zend_hash_sort_ex()
2560 memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); in zend_hash_sort_ex()
2561 pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); in zend_hash_sort_ex()
2562 HT_HASH_RESET_PACKED(ht); in zend_hash_sort_ex()
2564 zend_hash_rehash(ht); in zend_hash_sort_ex()
2673 ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, bucket_compare_func_t compar, ui… in zend_hash_minmax() argument
2678 IS_CONSISTENT(ht); in zend_hash_minmax()
2680 if (ht->nNumOfElements == 0 ) { in zend_hash_minmax()
2686 if (idx == ht->nNumUsed) { in zend_hash_minmax()
2689 if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) break; in zend_hash_minmax()
2692 res = ht->arData + idx; in zend_hash_minmax()
2693 for (; idx < ht->nNumUsed; idx++) { in zend_hash_minmax()
2694 p = ht->arData + idx; in zend_hash_minmax()
2753 ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht) in zend_symtable_to_proptable() argument
2759 if (UNEXPECTED(HT_IS_PACKED(ht))) { in zend_symtable_to_proptable()
2763 ZEND_HASH_FOREACH_STR_KEY(ht, str_key) { in zend_symtable_to_proptable()
2769 if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { in zend_symtable_to_proptable()
2770 GC_ADDREF(ht); in zend_symtable_to_proptable()
2773 return ht; in zend_symtable_to_proptable()
2777 HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); in zend_symtable_to_proptable()
2779 ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) { in zend_symtable_to_proptable()
2806 ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, zend_bool always_duplic… in zend_proptable_to_symtable() argument
2812 ZEND_HASH_FOREACH_STR_KEY(ht, str_key) { in zend_proptable_to_symtable()
2824 return zend_array_dup(ht); in zend_proptable_to_symtable()
2827 if (EXPECTED(!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE))) { in zend_proptable_to_symtable()
2828 GC_ADDREF(ht); in zend_proptable_to_symtable()
2831 return ht; in zend_proptable_to_symtable()
2835 HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); in zend_proptable_to_symtable()
2837 ZEND_HASH_FOREACH_KEY_VAL_IND(ht, num_key, str_key, zv) { in zend_proptable_to_symtable()