]> granicus.if.org Git - php/commitdiff
Use new hash iteration API and avoid old zend_hash_update_current_key() hack
authorDmitry Stogov <dmitry@zend.com>
Sun, 18 May 2014 20:50:00 +0000 (00:50 +0400)
committerDmitry Stogov <dmitry@zend.com>
Sun, 18 May 2014 20:50:00 +0000 (00:50 +0400)
Zend/zend_hash.c
Zend/zend_hash.h
ext/phar/stream.c

index 41805a2f921e9e65617e7057d9dfc373eeac595f..e374841978fdd7b06ad2b37ab171e8b8af50fd0b 100644 (file)
@@ -486,12 +486,12 @@ ZEND_API int zend_hash_rehash(HashTable *ht)
        uint nIndex, i, j;
 
        IS_CONSISTENT(ht);
-       memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(zend_uint));
 
        if (UNEXPECTED(ht->nNumOfElements == 0)) {
                return SUCCESS;
        }
 
+       memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(zend_uint));
        for (i = 0, j = 0; i < ht->nNumUsed; i++) {
                p = ht->arData + i;
                if (Z_TYPE(p->val) == IS_UNDEF) continue;
index 56c7b9ade2f3824445f102dc5d1229f14d1beb47..ed0dbbd627e81aad4be937a12238805b39d7e521 100644 (file)
@@ -558,6 +558,10 @@ static inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, HashPositio
                } \
        } while (0)
        
+#define ZEND_HASH_FOREACH_BUCKET(ht, _bucket) \
+       ZEND_HASH_FOREACH(ht, 0); \
+       _bucket = _p;
+
 #define ZEND_HASH_FOREACH_VAL(ht, _val) \
        ZEND_HASH_FOREACH(ht, 0); \
        _val = _z;
index 51726999e2f986f99fd3849e34e6b9e4c72e70a7..5aa6aa43ea067e2ee35b941b681f422ec4b7f348 100644 (file)
@@ -892,18 +892,15 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 
        /* Rename directory. Update all nested paths */
        if (is_dir) {
-               int key_type;
+               Bucket *b;
                zend_string *str_key;
                zend_string *new_str_key;
-               ulong unused;
                uint from_len = strlen(resource_from->path+1);
                uint to_len = strlen(resource_to->path+1);
 
-               for (zend_hash_internal_pointer_reset(&phar->manifest);
-                       HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->manifest, &str_key, &unused, 0, &phar->manifest.nInternalPointer)) &&
-                       NULL != (entry = zend_hash_get_current_data_ptr(&phar->manifest));
-                       zend_hash_move_forward(&phar->manifest)
-               ) {
+               ZEND_HASH_FOREACH_BUCKET(&phar->manifest, b) {
+                       str_key = b->key;
+                       entry = Z_PTR(b->val);
                        if (!entry->is_deleted &&
                                str_key->len > from_len &&
                                memcmp(str_key->val, resource_from->path+1, from_len) == 0 &&
@@ -921,15 +918,15 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
                                entry->filename = estrndup(new_str_key->val, new_str_key->len);
                                entry->filename_len = new_str_key->len;
 
-                               zend_hash_update_current_key_ex(&phar->manifest, key_type, new_str_key, 0, HASH_UPDATE_KEY_ANYWAY);
-                               STR_RELEASE(new_str_key);
+                               STR_RELEASE(str_key);
+                               b->h = STR_HASH_VAL(new_str_key);
+                               b->key = new_str_key;
                        }
-               }
+               } ZEND_HASH_FOREACH_END();
+               zend_hash_rehash(&phar->manifest);
 
-               for (zend_hash_internal_pointer_reset(&phar->virtual_dirs);
-                       HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->virtual_dirs, &str_key, &unused, 0, &phar->virtual_dirs.nInternalPointer));
-                       zend_hash_move_forward(&phar->virtual_dirs)
-               ) {
+               ZEND_HASH_FOREACH_BUCKET(&phar->virtual_dirs, b) {
+                       str_key = b->key;
                        if (str_key->len >= from_len &&
                                memcmp(str_key->val, resource_from->path+1, from_len) == 0 &&
                                (str_key->len == from_len || IS_SLASH(str_key->val[from_len]))) {
@@ -939,16 +936,15 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
                                memcpy(new_str_key->val + to_len, str_key->val + from_len, str_key->len - from_len);
                                new_str_key->val[new_str_key->len] = 0;
 
-                               zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_str_key, 0, HASH_UPDATE_KEY_ANYWAY);
-                               STR_RELEASE(new_str_key);
+                               STR_RELEASE(str_key);
+                               b->h = STR_HASH_VAL(new_str_key);
+                               b->key = new_str_key;
                        }
-               }
+               } ZEND_HASH_FOREACH_END();
+               zend_hash_rehash(&phar->virtual_dirs);
 
-               for (zend_hash_internal_pointer_reset(&phar->mounted_dirs);
-                       HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->mounted_dirs, &str_key, &unused, 0, &phar->mounted_dirs.nInternalPointer)) &&
-                       NULL != (entry = zend_hash_get_current_data_ptr(&phar->mounted_dirs));
-                       zend_hash_move_forward(&phar->mounted_dirs)
-               ) {
+               ZEND_HASH_FOREACH_BUCKET(&phar->mounted_dirs, b) {
+                       str_key = b->key;
                        if (str_key->len >= from_len &&
                                memcmp(str_key->val, resource_from->path+1, from_len) == 0 &&
                                (str_key->len == from_len || IS_SLASH(str_key->val[from_len]))) {
@@ -958,10 +954,12 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
                                memcpy(new_str_key->val + to_len, str_key->val + from_len, str_key->len - from_len);
                                new_str_key->val[new_str_key->len] = 0;
 
-                               zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_str_key, 0, HASH_UPDATE_KEY_ANYWAY);
-                               STR_RELEASE(new_str_key);
+                               STR_RELEASE(str_key);
+                               b->h = STR_HASH_VAL(new_str_key);
+                               b->key = new_str_key;
                        }
-               }
+               } ZEND_HASH_FOREACH_END();
+               zend_hash_rehash(&phar->mounted_dirs);
        }
 
        if (is_modified) {