@@ -993,106 +993,145 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
993
993
ZEND_HASH_FOREACH(ht, 0); \
994
994
_bucket = _p;
995
995
996
+ #define ZEND_HASH_REVERSE_FOREACH_BUCKET (ht , _bucket ) \
997
+ ZEND_HASH_REVERSE_FOREACH(ht, 0); \
998
+ _bucket = _p;
999
+
996
1000
#define ZEND_HASH_FOREACH_VAL (ht , _val ) \
997
1001
ZEND_HASH_FOREACH(ht, 0); \
998
1002
_val = _z;
999
1003
1004
+ #define ZEND_HASH_REVERSE_FOREACH_VAL (ht , _val ) \
1005
+ ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1006
+ _val = _z;
1007
+
1000
1008
#define ZEND_HASH_FOREACH_VAL_IND (ht , _val ) \
1001
1009
ZEND_HASH_FOREACH(ht, 1); \
1002
1010
_val = _z;
1003
1011
1012
+ #define ZEND_HASH_REVERSE_FOREACH_VAL_IND (ht , _val ) \
1013
+ ZEND_HASH_REVERSE_FOREACH(ht, 1); \
1014
+ _val = _z;
1015
+
1004
1016
#define ZEND_HASH_FOREACH_PTR (ht , _ptr ) \
1005
1017
ZEND_HASH_FOREACH(ht, 0); \
1006
1018
_ptr = Z_PTR_P(_z);
1007
1019
1020
+ #define ZEND_HASH_REVERSE_FOREACH_PTR (ht , _ptr ) \
1021
+ ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1022
+ _ptr = Z_PTR_P(_z);
1023
+
1008
1024
#define ZEND_HASH_FOREACH_NUM_KEY (ht , _h ) \
1009
1025
ZEND_HASH_FOREACH(ht, 0); \
1010
1026
_h = _p->h;
1011
1027
1028
+ #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY (ht , _h ) \
1029
+ ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1030
+ _h = _p->h;
1031
+
1012
1032
#define ZEND_HASH_FOREACH_STR_KEY (ht , _key ) \
1013
1033
ZEND_HASH_FOREACH(ht, 0); \
1014
1034
_key = _p->key;
1015
1035
1036
+ #define ZEND_HASH_REVERSE_FOREACH_STR_KEY (ht , _key ) \
1037
+ ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1038
+ _key = _p->key;
1039
+
1016
1040
#define ZEND_HASH_FOREACH_KEY (ht , _h , _key ) \
1017
1041
ZEND_HASH_FOREACH(ht, 0); \
1018
1042
_h = _p->h; \
1019
1043
_key = _p->key;
1020
1044
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
+
1021
1050
#define ZEND_HASH_FOREACH_NUM_KEY_VAL (ht , _h , _val ) \
1022
1051
ZEND_HASH_FOREACH(ht, 0); \
1023
1052
_h = _p->h; \
1024
1053
_val = _z;
1025
1054
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
+
1026
1060
#define ZEND_HASH_FOREACH_STR_KEY_VAL (ht , _key , _val ) \
1027
1061
ZEND_HASH_FOREACH(ht, 0); \
1028
1062
_key = _p->key; \
1029
1063
_val = _z;
1030
1064
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
+
1031
1070
#define ZEND_HASH_FOREACH_KEY_VAL (ht , _h , _key , _val ) \
1032
1071
ZEND_HASH_FOREACH(ht, 0); \
1033
1072
_h = _p->h; \
1034
1073
_key = _p->key; \
1035
1074
_val = _z;
1036
1075
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
+
1037
1082
#define ZEND_HASH_FOREACH_STR_KEY_VAL_IND (ht , _key , _val ) \
1038
1083
ZEND_HASH_FOREACH(ht, 1); \
1039
1084
_key = _p->key; \
1040
1085
_val = _z;
1041
1086
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
+
1042
1092
#define ZEND_HASH_FOREACH_KEY_VAL_IND (ht , _h , _key , _val ) \
1043
1093
ZEND_HASH_FOREACH(ht, 1); \
1044
1094
_h = _p->h; \
1045
1095
_key = _p->key; \
1046
1096
_val = _z;
1047
1097
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 ); \
1050
1100
_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); \
1055
1101
_key = _p->key; \
1056
- _ptr = Z_PTR_P(_z) ;
1102
+ _val = _z ;
1057
1103
1058
- #define ZEND_HASH_FOREACH_KEY_PTR (ht , _h , _key , _ptr ) \
1104
+ #define ZEND_HASH_FOREACH_NUM_KEY_PTR (ht , _h , _ptr ) \
1059
1105
ZEND_HASH_FOREACH(ht, 0); \
1060
1106
_h = _p->h; \
1061
- _key = _p->key; \
1062
1107
_ptr = Z_PTR_P(_z);
1063
1108
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 ) \
1073
1110
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1111
+ _h = _p->h; \
1074
1112
_ptr = Z_PTR_P(_z);
1075
1113
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);
1079
1118
1080
- #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL (ht , _key , _val ) \
1119
+ #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_PTR (ht , _key , _ptr ) \
1081
1120
ZEND_HASH_REVERSE_FOREACH(ht, 0); \
1082
1121
_key = _p->key; \
1083
- _val = _z ;
1122
+ _ptr = Z_PTR_P(_z) ;
1084
1123
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); \
1087
1126
_h = _p->h; \
1088
1127
_key = _p->key; \
1089
- _val = _z ;
1128
+ _ptr = Z_PTR_P(_z) ;
1090
1129
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 ); \
1093
1132
_h = _p->h; \
1094
1133
_key = _p->key; \
1095
- _val = _z ;
1134
+ _ptr = Z_PTR_P(_z) ;
1096
1135
1097
1136
/* The following macros are useful to insert a sequence of new elements
1098
1137
* of packed array. They may be used instead of series of
0 commit comments