|
|
@ -533,105 +533,84 @@ static inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, HashPositio |
|
|
#define zend_hash_get_current_data_ptr(ht) \ |
|
|
#define zend_hash_get_current_data_ptr(ht) \ |
|
|
zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer) |
|
|
zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer) |
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_VAL(_ht, _val) do { \ |
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH(_ht, indirect) do { \ |
|
|
uint _idx; \ |
|
|
uint _idx; \ |
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_val = &_p->val; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_VAL_IND(_ht, _val) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
zval *_z; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
_z = &_p->val; \ |
|
|
|
|
|
if (Z_TYPE_P(_z) == IS_INDIRECT) { \ |
|
|
|
|
|
|
|
|
Bucket *_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
zval *_z = &_p->val; \ |
|
|
|
|
|
if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ |
|
|
_z = Z_INDIRECT_P(_z); \ |
|
|
_z = Z_INDIRECT_P(_z); \ |
|
|
} \ |
|
|
} \ |
|
|
if (Z_TYPE_P(_z) == IS_UNDEF) continue; \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_PTR(_ht, _ptr) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_ptr = Z_PTR(_p->val); |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY(_ht, _h, _key) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_VAL(_ht, _h, _key, _val) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = &_p->val; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_VAL(_ht, _h, _key, _val) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = &_p->val; |
|
|
|
|
|
|
|
|
if (Z_TYPE_P(_z) == IS_UNDEF) continue; |
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_VAL_IND(_ht, _h, _key, _val) do { \ |
|
|
|
|
|
|
|
|
#define ZEND_HASH_REVERSE_FOREACH(_ht, indirect) do { \ |
|
|
uint _idx; \ |
|
|
uint _idx; \ |
|
|
Bucket *_p; \ |
|
|
|
|
|
zval *_z; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
_z = &_p->val; \ |
|
|
|
|
|
if (Z_TYPE_P(_z) == IS_INDIRECT) { \ |
|
|
|
|
|
|
|
|
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); \ |
|
|
_z = Z_INDIRECT_P(_z); \ |
|
|
} \ |
|
|
} \ |
|
|
if (Z_TYPE_P(_z) == IS_UNDEF) continue; \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_PTR(_ht, _h, _key, _ptr) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_ptr = Z_PTR(_p->val); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(_ht, _h, _key, _val) do { \ |
|
|
|
|
|
uint _idx; \ |
|
|
|
|
|
Bucket *_p; \ |
|
|
|
|
|
for (_idx = (_ht)->nNumUsed; _idx > 0; _idx--) { \ |
|
|
|
|
|
_p = (_ht)->arData + _idx - 1; \ |
|
|
|
|
|
if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = &_p->val; |
|
|
|
|
|
|
|
|
if (Z_TYPE_P(_z) == IS_UNDEF) continue; |
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_END() \ |
|
|
#define ZEND_HASH_FOREACH_END() \ |
|
|
} \ |
|
|
} \ |
|
|
} while (0) |
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_VAL(ht, _val) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 0); \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_VAL_IND(ht, _val) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 1); \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_PTR(ht, _ptr) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 0); \ |
|
|
|
|
|
_ptr = Z_PTR_P(_z); |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 0); \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 0); \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 1); \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \ |
|
|
|
|
|
ZEND_HASH_FOREACH(ht, 0); \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_ptr = Z_PTR_P(_z); |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \ |
|
|
|
|
|
ZEND_HASH_REVERSE_FOREACH(ht, 0); \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_REVERSE_FOREACH_VAL_IND(ht, _val) \ |
|
|
|
|
|
ZEND_HASH_REVERSE_FOREACH(ht, 1); \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \ |
|
|
|
|
|
ZEND_HASH_REVERSE_FOREACH(ht, 0); \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ |
|
|
|
|
|
ZEND_HASH_REVERSE_FOREACH(ht, 1); \ |
|
|
|
|
|
_h = _p->h; \ |
|
|
|
|
|
_key = _p->key; \ |
|
|
|
|
|
_val = _z; |
|
|
|
|
|
|
|
|
#endif /* ZEND_HASH_H */ |
|
|
#endif /* ZEND_HASH_H */ |
|
|
|
|
|
|
|
|
|