@@ -2431,15 +2431,15 @@ ZEND_API void zend_hash_bucket_swap(Bucket *p, Bucket *q)
2431
2431
zend_ulong h ;
2432
2432
zend_string * key ;
2433
2433
2434
- ZVAL_COPY_VALUE ( & val , & p -> val ) ;
2434
+ val = p -> val ;
2435
2435
h = p -> h ;
2436
2436
key = p -> key ;
2437
2437
2438
- ZVAL_COPY_VALUE ( & p -> val , & q -> val ) ;
2438
+ p -> val = q -> val ;
2439
2439
p -> h = q -> h ;
2440
2440
p -> key = q -> key ;
2441
2441
2442
- ZVAL_COPY_VALUE ( & q -> val , & val ) ;
2442
+ q -> val = val ;
2443
2443
q -> h = h ;
2444
2444
q -> key = key ;
2445
2445
}
@@ -2448,23 +2448,23 @@ ZEND_API void zend_hash_bucket_renum_swap(Bucket *p, Bucket *q)
2448
2448
{
2449
2449
zval val ;
2450
2450
2451
- ZVAL_COPY_VALUE ( & val , & p -> val ) ;
2452
- ZVAL_COPY_VALUE ( & p -> val , & q -> val ) ;
2453
- ZVAL_COPY_VALUE ( & q -> val , & val ) ;
2451
+ val = p -> val ;
2452
+ p -> val = q -> val ;
2453
+ q -> val = val ;
2454
2454
}
2455
2455
2456
2456
ZEND_API void zend_hash_bucket_packed_swap (Bucket * p , Bucket * q )
2457
2457
{
2458
2458
zval val ;
2459
2459
zend_ulong h ;
2460
2460
2461
- ZVAL_COPY_VALUE ( & val , & p -> val ) ;
2461
+ val = p -> val ;
2462
2462
h = p -> h ;
2463
2463
2464
- ZVAL_COPY_VALUE ( & p -> val , & q -> val ) ;
2464
+ p -> val = q -> val ;
2465
2465
p -> h = q -> h ;
2466
2466
2467
- ZVAL_COPY_VALUE ( & q -> val , & val ) ;
2467
+ q -> val = val ;
2468
2468
q -> h = h ;
2469
2469
}
2470
2470
@@ -2476,28 +2476,34 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b
2476
2476
IS_CONSISTENT (ht );
2477
2477
HT_ASSERT_RC1 (ht );
2478
2478
2479
- if (!(ht -> nNumOfElements > 1 ) && !(renumber && ht -> nNumOfElements > 0 )) { /* Doesn't require sorting */
2479
+ if (!(ht -> nNumOfElements > 1 ) && !(renumber && ht -> nNumOfElements > 0 )) {
2480
+ /* Doesn't require sorting */
2480
2481
return ;
2481
2482
}
2482
2483
2483
2484
if (HT_IS_WITHOUT_HOLES (ht )) {
2484
- i = ht -> nNumUsed ;
2485
+ /* Store original order of elements in extra space to allow stable sorting. */
2486
+ for (i = 0 ; i < ht -> nNumUsed ; i ++ ) {
2487
+ Z_EXTRA (ht -> arData [i ].val ) = i ;
2488
+ }
2485
2489
} else {
2490
+ /* Remove holes and store original order. */
2486
2491
for (j = 0 , i = 0 ; j < ht -> nNumUsed ; j ++ ) {
2487
2492
p = ht -> arData + j ;
2488
2493
if (UNEXPECTED (Z_TYPE (p -> val ) == IS_UNDEF )) continue ;
2489
2494
if (i != j ) {
2490
2495
ht -> arData [i ] = * p ;
2491
2496
}
2497
+ Z_EXTRA (ht -> arData [i ].val ) = i ;
2492
2498
i ++ ;
2493
2499
}
2500
+ ht -> nNumUsed = i ;
2494
2501
}
2495
2502
2496
- sort ((void * )ht -> arData , i , sizeof (Bucket ), (compare_func_t ) compar ,
2503
+ sort ((void * )ht -> arData , ht -> nNumUsed , sizeof (Bucket ), (compare_func_t ) compar ,
2497
2504
(swap_func_t )(renumber ? zend_hash_bucket_renum_swap :
2498
2505
((HT_FLAGS (ht ) & HASH_FLAG_PACKED ) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap )));
2499
2506
2500
- ht -> nNumUsed = i ;
2501
2507
ht -> nInternalPointer = 0 ;
2502
2508
2503
2509
if (renumber ) {
0 commit comments