Skip to content

Commit 40e5238

Browse files
committed
Flesh out ZEND_HASH_REVERSE_FOREACH_* macros
Closes GH-6080.
1 parent 311fa34 commit 40e5238

File tree

1 file changed

+68
-29
lines changed

1 file changed

+68
-29
lines changed

Zend/zend_hash.h

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -993,106 +993,145 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
993993
ZEND_HASH_FOREACH(ht, 0); \
994994
_bucket = _p;
995995

996+
#define ZEND_HASH_REVERSE_FOREACH_BUCKET(ht, _bucket) \
997+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
998+
_bucket = _p;
999+
9961000
#define ZEND_HASH_FOREACH_VAL(ht, _val) \
9971001
ZEND_HASH_FOREACH(ht, 0); \
9981002
_val = _z;
9991003

1004+
#define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \
1005+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1006+
_val = _z;
1007+
10001008
#define ZEND_HASH_FOREACH_VAL_IND(ht, _val) \
10011009
ZEND_HASH_FOREACH(ht, 1); \
10021010
_val = _z;
10031011

1012+
#define ZEND_HASH_REVERSE_FOREACH_VAL_IND(ht, _val) \
1013+
ZEND_HASH_REVERSE_FOREACH(ht, 1); \
1014+
_val = _z;
1015+
10041016
#define ZEND_HASH_FOREACH_PTR(ht, _ptr) \
10051017
ZEND_HASH_FOREACH(ht, 0); \
10061018
_ptr = Z_PTR_P(_z);
10071019

1020+
#define ZEND_HASH_REVERSE_FOREACH_PTR(ht, _ptr) \
1021+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1022+
_ptr = Z_PTR_P(_z);
1023+
10081024
#define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \
10091025
ZEND_HASH_FOREACH(ht, 0); \
10101026
_h = _p->h;
10111027

1028+
#define ZEND_HASH_REVERSE_FOREACH_NUM_KEY(ht, _h) \
1029+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1030+
_h = _p->h;
1031+
10121032
#define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \
10131033
ZEND_HASH_FOREACH(ht, 0); \
10141034
_key = _p->key;
10151035

1036+
#define ZEND_HASH_REVERSE_FOREACH_STR_KEY(ht, _key) \
1037+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1038+
_key = _p->key;
1039+
10161040
#define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \
10171041
ZEND_HASH_FOREACH(ht, 0); \
10181042
_h = _p->h; \
10191043
_key = _p->key;
10201044

1045+
#define ZEND_HASH_REVERSE_FOREACH_KEY(ht, _h, _key) \
1046+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1047+
_h = _p->h; \
1048+
_key = _p->key;
1049+
10211050
#define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
10221051
ZEND_HASH_FOREACH(ht, 0); \
10231052
_h = _p->h; \
10241053
_val = _z;
10251054

1055+
#define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
1056+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1057+
_h = _p->h; \
1058+
_val = _z;
1059+
10261060
#define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \
10271061
ZEND_HASH_FOREACH(ht, 0); \
10281062
_key = _p->key; \
10291063
_val = _z;
10301064

1065+
#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \
1066+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1067+
_key = _p->key; \
1068+
_val = _z;
1069+
10311070
#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \
10321071
ZEND_HASH_FOREACH(ht, 0); \
10331072
_h = _p->h; \
10341073
_key = _p->key; \
10351074
_val = _z;
10361075

1076+
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \
1077+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1078+
_h = _p->h; \
1079+
_key = _p->key; \
1080+
_val = _z;
1081+
10371082
#define ZEND_HASH_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
10381083
ZEND_HASH_FOREACH(ht, 1); \
10391084
_key = _p->key; \
10401085
_val = _z;
10411086

1087+
#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
1088+
ZEND_HASH_REVERSE_FOREACH(ht, 1); \
1089+
_key = _p->key; \
1090+
_val = _z;
1091+
10421092
#define ZEND_HASH_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
10431093
ZEND_HASH_FOREACH(ht, 1); \
10441094
_h = _p->h; \
10451095
_key = _p->key; \
10461096
_val = _z;
10471097

1048-
#define ZEND_HASH_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
1049-
ZEND_HASH_FOREACH(ht, 0); \
1098+
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
1099+
ZEND_HASH_REVERSE_FOREACH(ht, 1); \
10501100
_h = _p->h; \
1051-
_ptr = Z_PTR_P(_z);
1052-
1053-
#define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
1054-
ZEND_HASH_FOREACH(ht, 0); \
10551101
_key = _p->key; \
1056-
_ptr = Z_PTR_P(_z);
1102+
_val = _z;
10571103

1058-
#define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
1104+
#define ZEND_HASH_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
10591105
ZEND_HASH_FOREACH(ht, 0); \
10601106
_h = _p->h; \
1061-
_key = _p->key; \
10621107
_ptr = Z_PTR_P(_z);
10631108

1064-
#define ZEND_HASH_REVERSE_FOREACH_BUCKET(ht, _bucket) \
1065-
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1066-
_bucket = _p;
1067-
1068-
#define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \
1069-
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1070-
_val = _z;
1071-
1072-
#define ZEND_HASH_REVERSE_FOREACH_PTR(ht, _ptr) \
1109+
#define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
10731110
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1111+
_h = _p->h; \
10741112
_ptr = Z_PTR_P(_z);
10751113

1076-
#define ZEND_HASH_REVERSE_FOREACH_VAL_IND(ht, _val) \
1077-
ZEND_HASH_REVERSE_FOREACH(ht, 1); \
1078-
_val = _z;
1114+
#define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
1115+
ZEND_HASH_FOREACH(ht, 0); \
1116+
_key = _p->key; \
1117+
_ptr = Z_PTR_P(_z);
10791118

1080-
#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \
1119+
#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
10811120
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
10821121
_key = _p->key; \
1083-
_val = _z;
1122+
_ptr = Z_PTR_P(_z);
10841123

1085-
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \
1086-
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1124+
#define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
1125+
ZEND_HASH_FOREACH(ht, 0); \
10871126
_h = _p->h; \
10881127
_key = _p->key; \
1089-
_val = _z;
1128+
_ptr = Z_PTR_P(_z);
10901129

1091-
#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
1092-
ZEND_HASH_REVERSE_FOREACH(ht, 1); \
1130+
#define ZEND_HASH_REVERSE_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
1131+
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
10931132
_h = _p->h; \
10941133
_key = _p->key; \
1095-
_val = _z;
1134+
_ptr = Z_PTR_P(_z);
10961135

10971136
/* The following macros are useful to insert a sequence of new elements
10981137
* of packed array. They may be used instead of series of

0 commit comments

Comments
 (0)