summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_hash.h')
-rw-r--r--Zend/zend_hash.h36
1 files changed, 32 insertions, 4 deletions
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 638fbe27fc..ef0d23bbbf 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -800,8 +800,9 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer)
#define ZEND_HASH_FOREACH(_ht, indirect) do { \
- Bucket *_p = (_ht)->arData; \
- Bucket *_end = _p + (_ht)->nNumUsed; \
+ HashTable *__ht = (_ht); \
+ Bucket *_p = __ht->arData; \
+ Bucket *_end = _p + __ht->nNumUsed; \
for (; _p != _end; _p++) { \
zval *_z = &_p->val; \
if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
@@ -810,9 +811,10 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
#define ZEND_HASH_REVERSE_FOREACH(_ht, indirect) do { \
+ HashTable *__ht = (_ht); \
uint32_t _idx; \
- for (_idx = (_ht)->nNumUsed; _idx > 0; _idx--) { \
- Bucket *_p = (_ht)->arData + _idx - 1; \
+ for (_idx = __ht->nNumUsed; _idx > 0; _idx--) { \
+ Bucket *_p = __ht->arData + (_idx - 1); \
zval *_z = &_p->val; \
if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
_z = Z_INDIRECT_P(_z); \
@@ -823,6 +825,27 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
} \
} while (0)
+#define ZEND_HASH_FOREACH_END_DEL() \
+ __ht->nNumOfElements--; \
+ do { \
+ uint32_t j = HT_IDX_TO_HASH(_idx - 1); \
+ uint32_t nIndex = _p->h | __ht->nTableMask; \
+ uint32_t i = HT_HASH(__ht, nIndex); \
+ if (j != i) { \
+ Bucket *prev = HT_HASH_TO_BUCKET(__ht, i); \
+ while (Z_NEXT(prev->val) != j) { \
+ i = Z_NEXT(prev->val); \
+ prev = HT_HASH_TO_BUCKET(__ht, i); \
+ } \
+ Z_NEXT(prev->val) = Z_NEXT(_p->val); \
+ } else { \
+ HT_HASH(__ht, _p->h | __ht->nTableMask) = Z_NEXT(_p->val); \
+ } \
+ } while (0); \
+ } \
+ __ht->nNumUsed = _idx; \
+ } while (0)
+
#define ZEND_HASH_FOREACH_BUCKET(ht, _bucket) \
ZEND_HASH_FOREACH(ht, 0); \
_bucket = _p;
@@ -911,6 +934,11 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
ZEND_HASH_REVERSE_FOREACH(ht, 1); \
_val = _z;
+#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \
+ ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+ _key = _p->key; \
+ _val = _z;
+
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
_h = _p->h; \