@@ -3459,26 +3459,26 @@ PHP_FUNCTION(array_splice)
3459
3459
Finds the bucket at the given valid offset */
3460
3460
static inline Bucket * find_bucket_at_offset (HashTable * ht , zend_long offset )
3461
3461
{
3462
- zend_long pos ;
3463
- Bucket * bucket ;
3464
- ZEND_ASSERT (offset >= 0 && offset < ht -> nNumOfElements );
3465
- if (HT_IS_WITHOUT_HOLES (ht )) {
3466
- /** There's no need to iterate over the array to filter out holes if there are no holes */
3467
- /** This properly handles both packed and unpacked arrays. */
3468
- return ht -> arData + offset ;
3469
- }
3470
- /* Otherwise, this code has to iterate over the HashTable and skip holes in the array. */
3471
- pos = 0 ;
3472
- ZEND_HASH_FOREACH_BUCKET (ht , bucket ) {
3473
- if (pos >= offset ) {
3474
- /** This is the bucket of the array element at the requested offset */
3475
- return bucket ;
3476
- }
3477
- ++ pos ;
3478
- } ZEND_HASH_FOREACH_END ();
3479
-
3480
- /** Return a pointer to the end of the bucket array. */
3481
- return ht -> arData + ht -> nNumUsed ;
3462
+ zend_long pos ;
3463
+ Bucket * bucket ;
3464
+ ZEND_ASSERT (offset >= 0 && offset <= ht -> nNumOfElements );
3465
+ if (HT_IS_WITHOUT_HOLES (ht )) {
3466
+ /** There's no need to iterate over the array to filter out holes if there are no holes */
3467
+ /** This properly handles both packed and unpacked arrays. */
3468
+ return ht -> arData + offset ;
3469
+ }
3470
+ /* Otherwise, this code has to iterate over the HashTable and skip holes in the array. */
3471
+ pos = 0 ;
3472
+ ZEND_HASH_FOREACH_BUCKET (ht , bucket ) {
3473
+ if (pos >= offset ) {
3474
+ /** This is the bucket of the array element at the requested offset */
3475
+ return bucket ;
3476
+ }
3477
+ ++ pos ;
3478
+ } ZEND_HASH_FOREACH_END ();
3479
+
3480
+ /** Return a pointer to the end of the bucket array. */
3481
+ return ht -> arData + ht -> nNumUsed ;
3482
3482
}
3483
3483
3484
3484
/* {{{ proto array array_slice(array input, int offset [, int length [, bool preserve_keys]])
@@ -3532,55 +3532,62 @@ PHP_FUNCTION(array_slice)
3532
3532
/* Initialize returned array */
3533
3533
array_init_size (return_value , (uint32_t )length );
3534
3534
3535
- // Contains modified variants of ZEND_HASH_FOREACH_VAL
3536
- {
3537
- HashTable * ht = Z_ARRVAL_P (input );
3538
- Bucket * p = find_bucket_at_offset (ht , offset );
3539
- Bucket * end = ht -> arData + ht -> nNumUsed ;
3540
-
3541
- /* Start at the beginning and go until we hit offset */
3542
- if (HT_IS_PACKED (Z_ARRVAL_P (input )) &&
3543
- (!preserve_keys ||
3544
- (offset == 0 && HT_IS_WITHOUT_HOLES (Z_ARRVAL_P (input ))))) {
3545
-
3546
- zend_hash_real_init_packed (Z_ARRVAL_P (return_value ));
3547
- ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
3548
- for (; p != end ; p ++ ) {
3549
- if (__fill_idx >= length ) {
3550
- break ;
3551
- }
3552
- entry = & p -> val ;
3553
- if (UNEXPECTED (Z_ISREF_P (entry )) &&
3554
- UNEXPECTED (Z_REFCOUNT_P (entry ) == 1 )) {
3555
- entry = Z_REFVAL_P (entry );
3556
- }
3557
- Z_TRY_ADDREF_P (entry );
3558
- ZEND_HASH_FILL_ADD (entry );
3559
- }
3560
- } ZEND_HASH_FILL_END ();
3561
- } else {
3562
- zend_long n = 0 ; /* Current number of elements */
3563
- for (; p != end ; p ++ , n ++ ) {
3564
- if (n >= length ) {
3565
- break ;
3566
- }
3567
- num_key = p -> h ;
3568
- string_key = p -> key ;
3569
- entry = & p -> val ;
3570
-
3571
- if (string_key ) {
3572
- entry = zend_hash_add_new (Z_ARRVAL_P (return_value ), string_key , entry );
3573
- } else {
3574
- if (preserve_keys ) {
3575
- entry = zend_hash_index_add_new (Z_ARRVAL_P (return_value ), num_key , entry );
3576
- } else {
3577
- entry = zend_hash_next_index_insert_new (Z_ARRVAL_P (return_value ), entry );
3578
- }
3579
- }
3580
- zval_add_ref (entry );
3581
- }
3582
- }
3583
- }
3535
+ // Contains modified variants of ZEND_HASH_FOREACH_VAL
3536
+ {
3537
+ HashTable * ht = Z_ARRVAL_P (input );
3538
+ Bucket * p = find_bucket_at_offset (ht , offset );
3539
+ Bucket * end = ht -> arData + ht -> nNumUsed ;
3540
+
3541
+ /* Start at the beginning and go until we hit offset */
3542
+ if (HT_IS_PACKED (Z_ARRVAL_P (input )) &&
3543
+ (!preserve_keys ||
3544
+ (offset == 0 && HT_IS_WITHOUT_HOLES (Z_ARRVAL_P (input ))))) {
3545
+
3546
+ zend_hash_real_init_packed (Z_ARRVAL_P (return_value ));
3547
+ ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
3548
+ for (; p != end ; p ++ ) {
3549
+ if (__fill_idx >= length ) {
3550
+ break ;
3551
+ }
3552
+ entry = & p -> val ;
3553
+ if (UNEXPECTED (Z_TYPE_P (entry ) == IS_UNDEF )) {
3554
+ continue ;
3555
+ }
3556
+ if (UNEXPECTED (Z_ISREF_P (entry )) &&
3557
+ UNEXPECTED (Z_REFCOUNT_P (entry ) == 1 )) {
3558
+ entry = Z_REFVAL_P (entry );
3559
+ }
3560
+ Z_TRY_ADDREF_P (entry );
3561
+ ZEND_HASH_FILL_ADD (entry );
3562
+ }
3563
+ } ZEND_HASH_FILL_END ();
3564
+ } else {
3565
+ zend_long n = 0 ; /* Current number of elements */
3566
+ for (; p != end ; p ++ ) {
3567
+ entry = & p -> val ;
3568
+ if (UNEXPECTED (Z_TYPE_P (entry ) == IS_UNDEF )) {
3569
+ continue ;
3570
+ }
3571
+ if (n >= length ) {
3572
+ break ;
3573
+ }
3574
+ n ++ ;
3575
+ num_key = p -> h ;
3576
+ string_key = p -> key ;
3577
+
3578
+ if (string_key ) {
3579
+ entry = zend_hash_add_new (Z_ARRVAL_P (return_value ), string_key , entry );
3580
+ } else {
3581
+ if (preserve_keys ) {
3582
+ entry = zend_hash_index_add_new (Z_ARRVAL_P (return_value ), num_key , entry );
3583
+ } else {
3584
+ entry = zend_hash_next_index_insert_new (Z_ARRVAL_P (return_value ), entry );
3585
+ }
3586
+ }
3587
+ zval_add_ref (entry );
3588
+ }
3589
+ }
3590
+ }
3584
3591
}
3585
3592
/* }}} */
3586
3593
0 commit comments