From: Dmitry Stogov Date: Sun, 18 May 2014 20:50:00 +0000 (+0400) Subject: Use new hash iteration API and avoid old zend_hash_update_current_key() hack X-Git-Tag: POST_PHPNG_MERGE~328^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d07c1941ec49758766c3482e41b5d559c0a866f6;p=php Use new hash iteration API and avoid old zend_hash_update_current_key() hack --- diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 41805a2f92..e374841978 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -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; diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 56c7b9ade2..ed0dbbd627 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -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; diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 51726999e2..5aa6aa43ea 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -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) {