]> granicus.if.org Git - php/commitdiff
Flesh out ZEND_HASH_REVERSE_FOREACH_* macros
authortwosee <twose@qq.com>
Fri, 4 Sep 2020 14:43:02 +0000 (22:43 +0800)
committertwosee <twose@qq.com>
Wed, 9 Sep 2020 07:12:18 +0000 (15:12 +0800)
Closes GH-6080.

Zend/zend_hash.h

index fb11c4a9e321e2b5e0a0d4abc4f04cfb7c8be824..6d3398fd9033d56db3af6387157a50d52736e89c 100644 (file)
@@ -993,106 +993,145 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
        ZEND_HASH_FOREACH(ht, 0); \
        _bucket = _p;
 
+#define ZEND_HASH_REVERSE_FOREACH_BUCKET(ht, _bucket) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _bucket = _p;
+
 #define ZEND_HASH_FOREACH_VAL(ht, _val) \
        ZEND_HASH_FOREACH(ht, 0); \
        _val = _z;
 
+#define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _val = _z;
+
 #define ZEND_HASH_FOREACH_VAL_IND(ht, _val) \
        ZEND_HASH_FOREACH(ht, 1); \
        _val = _z;
 
+#define ZEND_HASH_REVERSE_FOREACH_VAL_IND(ht, _val) \
+       ZEND_HASH_REVERSE_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_REVERSE_FOREACH_PTR(ht, _ptr) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _ptr = Z_PTR_P(_z);
+
 #define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \
        ZEND_HASH_FOREACH(ht, 0); \
        _h = _p->h;
 
+#define ZEND_HASH_REVERSE_FOREACH_NUM_KEY(ht, _h) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _h = _p->h;
+
 #define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \
        ZEND_HASH_FOREACH(ht, 0); \
        _key = _p->key;
 
+#define ZEND_HASH_REVERSE_FOREACH_STR_KEY(ht, _key) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _key = _p->key;
+
 #define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \
        ZEND_HASH_FOREACH(ht, 0); \
        _h = _p->h; \
        _key = _p->key;
 
+#define ZEND_HASH_REVERSE_FOREACH_KEY(ht, _h, _key) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _h = _p->h; \
+       _key = _p->key;
+
 #define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
        ZEND_HASH_FOREACH(ht, 0); \
        _h = _p->h; \
        _val = _z;
 
+#define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _h = _p->h; \
+       _val = _z;
+
 #define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \
        ZEND_HASH_FOREACH(ht, 0); \
        _key = _p->key; \
        _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_FOREACH_KEY_VAL(ht, _h, _key, _val) \
        ZEND_HASH_FOREACH(ht, 0); \
        _h = _p->h; \
        _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; \
+       _key = _p->key; \
+       _val = _z;
+
 #define ZEND_HASH_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
        ZEND_HASH_FOREACH(ht, 1); \
        _key = _p->key; \
        _val = _z;
 
+#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 1); \
+       _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_NUM_KEY_PTR(ht, _h, _ptr) \
-       ZEND_HASH_FOREACH(ht, 0); \
+#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 1); \
        _h = _p->h; \
-       _ptr = Z_PTR_P(_z);
-
-#define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
-       ZEND_HASH_FOREACH(ht, 0); \
        _key = _p->key; \
-       _ptr = Z_PTR_P(_z);
+       _val = _z;
 
-#define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
+#define ZEND_HASH_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
        ZEND_HASH_FOREACH(ht, 0); \
        _h = _p->h; \
-       _key = _p->key; \
        _ptr = Z_PTR_P(_z);
 
-#define ZEND_HASH_REVERSE_FOREACH_BUCKET(ht, _bucket) \
-       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-       _bucket = _p;
-
-#define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \
-       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-       _val = _z;
-
-#define ZEND_HASH_REVERSE_FOREACH_PTR(ht, _ptr) \
+#define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
        ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+       _h = _p->h; \
        _ptr = Z_PTR_P(_z);
 
-#define ZEND_HASH_REVERSE_FOREACH_VAL_IND(ht, _val) \
-       ZEND_HASH_REVERSE_FOREACH(ht, 1); \
-       _val = _z;
+#define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
+       ZEND_HASH_FOREACH(ht, 0); \
+       _key = _p->key; \
+       _ptr = Z_PTR_P(_z);
 
-#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \
+#define ZEND_HASH_REVERSE_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
        ZEND_HASH_REVERSE_FOREACH(ht, 0); \
        _key = _p->key; \
-       _val = _z;
+       _ptr = Z_PTR_P(_z);
 
-#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \
-       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+#define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
+       ZEND_HASH_FOREACH(ht, 0); \
        _h = _p->h; \
        _key = _p->key; \
-       _val = _z;
+       _ptr = Z_PTR_P(_z);
 
-#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
-       ZEND_HASH_REVERSE_FOREACH(ht, 1); \
+#define ZEND_HASH_REVERSE_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
+       ZEND_HASH_REVERSE_FOREACH(ht, 0); \
        _h = _p->h; \
        _key = _p->key; \
-       _val = _z;
+       _ptr = Z_PTR_P(_z);
 
 /* The following macros are useful to insert a sequence of new elements
  * of packed array. They may be used instead of series of