From: Xinchen Hui Date: Thu, 13 Aug 2015 04:19:35 +0000 (+0800) Subject: zend_hash_resize seems useless, use zend_hash_extend X-Git-Tag: php-7.0.0RC1~7^2~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=adf0e499121df263c65aa84e1c75a61dd51f0cf3;p=php zend_hash_resize seems useless, use zend_hash_extend --- diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 7e06cf0e8c..89a5995683 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -250,13 +250,14 @@ ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend } else { ZEND_ASSERT(!(ht->u.flags & HASH_FLAG_PACKED)); if (nSize > ht->nTableSize) { - void *old_data = HT_GET_DATA_ADDR(ht); + void *new_data, *old_data = HT_GET_DATA_ADDR(ht); Bucket *old_buckets = ht->arData; - + nSize = zend_hash_check_size(nSize); HANDLE_BLOCK_INTERRUPTIONS(); - ht->nTableSize = zend_hash_check_size(nSize); + new_data = pemalloc(HT_DATA_SIZE_EX(nSize) + HT_HASH_SIZE_EX(-nSize), ht->u.flags & HASH_FLAG_PERSISTENT); + ht->nTableSize = nSize; ht->nTableMask = -ht->nTableSize; - HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), ht->u.flags & HASH_FLAG_PERSISTENT)); + HT_SET_DATA_ADDR(ht, new_data); memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT); zend_hash_rehash(ht); @@ -813,26 +814,6 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) } } -ZEND_API void ZEND_FASTCALL zend_hash_resize(HashTable *ht, uint32_t nSize) { - nSize = zend_hash_check_size(nSize); - if (ht->u.flags & HASH_FLAG_INITIALIZED) { - void *new_data, *old_data = HT_GET_DATA_ADDR(ht); - Bucket *old_buckets = ht->arData; - - HANDLE_BLOCK_INTERRUPTIONS(); - new_data = pemalloc(HT_DATA_SIZE_EX(nSize) + HT_HASH_SIZE_EX(-nSize), ht->u.flags & HASH_FLAG_PERSISTENT); - ht->nTableSize = nSize; - ht->nTableMask = -ht->nTableSize; - HT_SET_DATA_ADDR(ht, new_data); - memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); - pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT); - zend_hash_rehash(ht); - HANDLE_UNBLOCK_INTERRUPTIONS(); - } else { - ht->nTableSize = nSize; - } -} - ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) { Bucket *p; diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index ae7baa5cd0..4a33b959cb 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -212,7 +212,6 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_ #define zend_hash_next_free_element(ht) \ (ht)->nNextFreeElement -ZEND_API void ZEND_FASTCALL zend_hash_resize(HashTable *ht, uint32_t nSize); ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht); ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source); diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 3f7bf1cb04..046db564ac 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -477,7 +477,7 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) } ht = Z_OBJPROP_P(rval); - zend_hash_resize(ht, zend_hash_num_elements(ht) + elements); + zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, (ht->u.flags & HASH_FLAG_PACKED)); if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { return 0; } diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 25c519e832..be6a12f630 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -481,7 +481,7 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) } ht = Z_OBJPROP_P(rval); - zend_hash_resize(ht, zend_hash_num_elements(ht) + elements); + zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, (ht->u.flags & HASH_FLAG_PACKED)); if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { return 0; }