@@ -1663,8 +1663,47 @@ ZEND_API zval *zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos)
16631663 }
16641664}
16651665
1666- ZEND_API int zend_hash_sort (HashTable * ht , sort_func_t sort_func ,
1667- compare_func_t compar , zend_bool renumber )
1666+ ZEND_API void zend_hash_bucket_swap (Bucket * p , Bucket * q ) {
1667+ zval val ;
1668+ zend_ulong h ;
1669+ zend_string * key ;
1670+
1671+ ZVAL_COPY_VALUE (& val , & p -> val );
1672+ h = p -> h ;
1673+ key = p -> key ;
1674+
1675+ ZVAL_COPY_VALUE (& p -> val , & q -> val );
1676+ p -> h = q -> h ;
1677+ p -> key = q -> key ;
1678+
1679+ ZVAL_COPY_VALUE (& q -> val , & val );
1680+ q -> h = h ;
1681+ q -> key = key ;
1682+ }
1683+
1684+ ZEND_API void zend_hash_bucket_renum_swap (Bucket * p , Bucket * q ) {
1685+ zval val ;
1686+
1687+ ZVAL_COPY_VALUE (& val , & p -> val );
1688+ ZVAL_COPY_VALUE (& p -> val , & q -> val );
1689+ ZVAL_COPY_VALUE (& q -> val , & val );
1690+ }
1691+
1692+ ZEND_API void zend_hash_bucket_packed_swap (Bucket * p , Bucket * q ) {
1693+ zval val ;
1694+ zend_ulong h ;
1695+
1696+ ZVAL_COPY_VALUE (& val , & p -> val );
1697+ h = p -> h ;
1698+
1699+ ZVAL_COPY_VALUE (& p -> val , & q -> val );
1700+ p -> h = q -> h ;
1701+
1702+ ZVAL_COPY_VALUE (& q -> val , & val );
1703+ q -> h = h ;
1704+ }
1705+
1706+ ZEND_API int zend_hash_sort_ex (HashTable * ht , sort_func_t sort , compare_func_t compar , zend_bool renumber )
16681707{
16691708 Bucket * p ;
16701709 uint32_t i , j ;
@@ -1688,7 +1727,9 @@ ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func,
16881727 }
16891728 }
16901729
1691- (* sort_func )((void * ) ht -> arData , i , sizeof (Bucket ), compar );
1730+ sort ((void * )ht -> arData , i , sizeof (Bucket ), compar ,
1731+ (swap_func_t )(renumber ? zend_hash_bucket_renum_swap :
1732+ ((ht -> u .flags & HASH_FLAG_PACKED ) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap )));
16921733
16931734 HANDLE_BLOCK_INTERRUPTIONS ();
16941735 ht -> nNumUsed = i ;
0 commit comments