]> granicus.if.org Git - php/commitdiff
Use new hash iteration API.
authorDmitry Stogov <dmitry@zend.com>
Mon, 27 Apr 2015 13:50:47 +0000 (16:50 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 27 Apr 2015 13:50:47 +0000 (16:50 +0300)
Zend/zend_hash.h
ext/opcache/zend_accelerator_util_funcs.c

index 2687ce2e874b5baf8580d6bad9d0332954c91400..dcac9c355c328f8f111e0309ae1b4d9a0a39dccf 100644 (file)
@@ -814,6 +814,10 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
        _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;
index 9aefa517783e494be4b0f0411b1ae3d732c9e2e5..92ada0b17fa3367a630b3a4463d59583a08bd23b 100644 (file)
@@ -118,26 +118,22 @@ void zend_accel_free_user_functions(HashTable *ht)
        ht->pDestructor = orig_dtor;
 }
 
-static int move_user_function(zval *zv, int num_args, va_list args, zend_hash_key *hash_key)
-{
-       zend_function *function = Z_PTR_P(zv);
-       HashTable *function_table = va_arg(args, HashTable *);
-       (void)num_args; /* keep the compiler happy */
-
-       if (function->type == ZEND_USER_FUNCTION) {
-               zend_hash_update_ptr(function_table, hash_key->key, function);
-               return 1;
-       } else {
-               return 0;
-       }
-}
-
 void zend_accel_move_user_functions(HashTable *src, HashTable *dst)
 {
+       Bucket *p;
        dtor_func_t orig_dtor = src->pDestructor;
 
        src->pDestructor = NULL;
-       zend_hash_apply_with_arguments(src, (apply_func_args_t)move_user_function, 1, dst);
+       ZEND_HASH_REVERSE_FOREACH_BUCKET(src, p) {
+               zend_function *function = Z_PTR(p->val);
+
+               if (EXPECTED(function->type == ZEND_USER_FUNCTION)) {
+                       zend_hash_add_new_ptr(dst, p->key, function);
+                       zend_hash_del_bucket(src, p);
+               } else {
+                       break;
+               }
+       } ZEND_HASH_FOREACH_END();
        src->pDestructor = orig_dtor;
 }