@@ -2453,15 +2453,15 @@ ZEND_API void zend_hash_bucket_swap(Bucket *p, Bucket *q)
2453
2453
zend_ulong h ;
2454
2454
zend_string * key ;
2455
2455
2456
- ZVAL_COPY_VALUE ( & val , & p -> val ) ;
2456
+ val = p -> val ;
2457
2457
h = p -> h ;
2458
2458
key = p -> key ;
2459
2459
2460
- ZVAL_COPY_VALUE ( & p -> val , & q -> val ) ;
2460
+ p -> val = q -> val ;
2461
2461
p -> h = q -> h ;
2462
2462
p -> key = q -> key ;
2463
2463
2464
- ZVAL_COPY_VALUE ( & q -> val , & val ) ;
2464
+ q -> val = val ;
2465
2465
q -> h = h ;
2466
2466
q -> key = key ;
2467
2467
}
@@ -2470,23 +2470,23 @@ ZEND_API void zend_hash_bucket_renum_swap(Bucket *p, Bucket *q)
2470
2470
{
2471
2471
zval val ;
2472
2472
2473
- ZVAL_COPY_VALUE ( & val , & p -> val ) ;
2474
- ZVAL_COPY_VALUE ( & p -> val , & q -> val ) ;
2475
- ZVAL_COPY_VALUE ( & q -> val , & val ) ;
2473
+ val = p -> val ;
2474
+ p -> val = q -> val ;
2475
+ q -> val = val ;
2476
2476
}
2477
2477
2478
2478
ZEND_API void zend_hash_bucket_packed_swap (Bucket * p , Bucket * q )
2479
2479
{
2480
2480
zval val ;
2481
2481
zend_ulong h ;
2482
2482
2483
- ZVAL_COPY_VALUE ( & val , & p -> val ) ;
2483
+ val = p -> val ;
2484
2484
h = p -> h ;
2485
2485
2486
- ZVAL_COPY_VALUE ( & p -> val , & q -> val ) ;
2486
+ p -> val = q -> val ;
2487
2487
p -> h = q -> h ;
2488
2488
2489
- ZVAL_COPY_VALUE ( & q -> val , & val ) ;
2489
+ q -> val = val ;
2490
2490
q -> h = h ;
2491
2491
}
2492
2492
@@ -2498,28 +2498,34 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b
2498
2498
IS_CONSISTENT (ht );
2499
2499
HT_ASSERT_RC1 (ht );
2500
2500
2501
- if (!(ht -> nNumOfElements > 1 ) && !(renumber && ht -> nNumOfElements > 0 )) { /* Doesn't require sorting */
2501
+ if (!(ht -> nNumOfElements > 1 ) && !(renumber && ht -> nNumOfElements > 0 )) {
2502
+ /* Doesn't require sorting */
2502
2503
return ;
2503
2504
}
2504
2505
2505
2506
if (HT_IS_WITHOUT_HOLES (ht )) {
2506
- i = ht -> nNumUsed ;
2507
+ /* Store original order of elements in extra space to allow stable sorting. */
2508
+ for (i = 0 ; i < ht -> nNumUsed ; i ++ ) {
2509
+ Z_EXTRA (ht -> arData [i ].val ) = i ;
2510
+ }
2507
2511
} else {
2512
+ /* Remove holes and store original order. */
2508
2513
for (j = 0 , i = 0 ; j < ht -> nNumUsed ; j ++ ) {
2509
2514
p = ht -> arData + j ;
2510
2515
if (UNEXPECTED (Z_TYPE (p -> val ) == IS_UNDEF )) continue ;
2511
2516
if (i != j ) {
2512
2517
ht -> arData [i ] = * p ;
2513
2518
}
2519
+ Z_EXTRA (ht -> arData [i ].val ) = i ;
2514
2520
i ++ ;
2515
2521
}
2522
+ ht -> nNumUsed = i ;
2516
2523
}
2517
2524
2518
- sort ((void * )ht -> arData , i , sizeof (Bucket ), (compare_func_t ) compar ,
2525
+ sort ((void * )ht -> arData , ht -> nNumUsed , sizeof (Bucket ), (compare_func_t ) compar ,
2519
2526
(swap_func_t )(renumber ? zend_hash_bucket_renum_swap :
2520
2527
((HT_FLAGS (ht ) & HASH_FLAG_PACKED ) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap )));
2521
2528
2522
- ht -> nNumUsed = i ;
2523
2529
ht -> nInternalPointer = 0 ;
2524
2530
2525
2531
if (renumber ) {
0 commit comments