@@ -197,7 +197,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht)
197
197
HT_ASSERT (GC_REFCOUNT (ht ) == 1 );
198
198
HANDLE_BLOCK_INTERRUPTIONS ();
199
199
ht -> u .flags &= ~HASH_FLAG_PACKED ;
200
- new_data = pemalloc (HT_SIZE (ht ), (ht )-> u .flags & HASH_FLAG_PERSISTENT );
200
+ new_data = pemalloc (HT_DATA_SIZE_EX (ht -> nTableSize ) + HT_HASH_SIZE_EX ( - ht -> nTableSize ), (ht )-> u .flags & HASH_FLAG_PERSISTENT );
201
201
ht -> nTableMask = - ht -> nTableSize ;
202
202
HT_SET_DATA_ADDR (ht , new_data );
203
203
memcpy (ht -> arData , old_buckets , sizeof (Bucket ) * ht -> nNumUsed );
@@ -208,14 +208,15 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht)
208
208
209
209
ZEND_API void ZEND_FASTCALL zend_hash_to_packed (HashTable * ht )
210
210
{
211
- void * old_data = HT_GET_DATA_ADDR (ht );
211
+ void * new_data , * old_data = HT_GET_DATA_ADDR (ht );
212
212
Bucket * old_buckets = ht -> arData ;
213
213
214
214
HT_ASSERT (GC_REFCOUNT (ht ) == 1 );
215
215
HANDLE_BLOCK_INTERRUPTIONS ();
216
+ new_data = pemalloc (HT_DATA_SIZE_EX (ht -> nTableSize ) + HT_HASH_SIZE_EX (HT_MIN_MASK ), (ht )-> u .flags & HASH_FLAG_PERSISTENT );
216
217
ht -> u .flags |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS ;
217
218
ht -> nTableMask = HT_MIN_MASK ;
218
- HT_SET_DATA_ADDR (ht , pemalloc ( HT_SIZE ( ht ), ( ht ) -> u . flags & HASH_FLAG_PERSISTENT ) );
219
+ HT_SET_DATA_ADDR (ht , new_data );
219
220
HT_HASH_RESET_PACKED (ht );
220
221
memcpy (ht -> arData , old_buckets , sizeof (Bucket ) * ht -> nNumUsed );
221
222
pefree (old_data , (ht )-> u .flags & HASH_FLAG_PERSISTENT );
@@ -2198,12 +2199,13 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
2198
2199
}
2199
2200
} else {
2200
2201
if (renumber ) {
2201
- void * old_data = HT_GET_DATA_ADDR (ht );
2202
+ void * new_data , * old_data = HT_GET_DATA_ADDR (ht );
2202
2203
Bucket * old_buckets = ht -> arData ;
2203
2204
2205
+ new_data = pemalloc (HT_DATA_SIZE_EX (ht -> nTableSize ) + HT_HASH_SIZE_EX (HT_MIN_MASK ), ht -> u .flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT );
2204
2206
ht -> u .flags |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS ;
2205
2207
ht -> nTableMask = HT_MIN_MASK ;
2206
- HT_SET_DATA_ADDR (ht , pemalloc ( HT_SIZE ( ht ), ht -> u . flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT ) );
2208
+ HT_SET_DATA_ADDR (ht , new_data );
2207
2209
memcpy (ht -> arData , old_buckets , sizeof (Bucket ) * ht -> nNumUsed );
2208
2210
pefree (old_data , ht -> u .flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT );
2209
2211
HT_HASH_RESET_PACKED (ht );
0 commit comments