@@ -2989,15 +2989,13 @@ PHP_FUNCTION(array_pad)
2989
2989
{
2990
2990
zval * input ; /* Input array */
2991
2991
zval * pad_value ; /* Padding value obviously */
2992
- zval * pads ; /* Array to pass to splice */
2993
- HashTable * new_hash ;/* Return value from splice */
2994
- HashTable old_hash ;
2995
2992
zend_long pad_size ; /* Size to pad to */
2996
2993
zend_long pad_size_abs ; /* Absolute value of pad_size */
2997
2994
zend_long input_size ; /* Size of the input array */
2998
2995
zend_long num_pads ; /* How many pads do we need */
2999
- int do_pad ; /* Whether we should do padding at all */
3000
- int i ;
2996
+ zend_long i ;
2997
+ zend_string * key ;
2998
+ zval * value ;
3001
2999
3002
3000
if (zend_parse_parameters (ZEND_NUM_ARGS (), "alz" , & input , & pad_size , & pad_value ) == FAILURE ) {
3003
3001
return ;
@@ -3006,48 +3004,43 @@ PHP_FUNCTION(array_pad)
3006
3004
/* Do some initial calculations */
3007
3005
input_size = zend_hash_num_elements (Z_ARRVAL_P (input ));
3008
3006
pad_size_abs = ZEND_ABS (pad_size );
3009
- if (pad_size_abs < 0 ) {
3007
+ if (pad_size_abs < 0 || pad_size_abs - input_size > Z_L ( 1048576 ) ) {
3010
3008
php_error_docref (NULL , E_WARNING , "You may only pad up to 1048576 elements at a time" );
3011
- zval_dtor (return_value );
3012
3009
RETURN_FALSE ;
3013
3010
}
3014
- do_pad = (input_size >= pad_size_abs ) ? 0 : 1 ;
3015
-
3016
- /* Copy the original array */
3017
- RETVAL_ZVAL (input , 1 , 0 );
3018
-
3019
- /* If no need to pad, no need to continue */
3020
- if (!do_pad ) {
3011
+
3012
+ if (input_size >= pad_size_abs ) {
3013
+ /* Copy the original array */
3014
+ ZVAL_COPY (return_value , input );
3021
3015
return ;
3022
3016
}
3023
3017
3024
- /* Populate the pads array */
3025
3018
num_pads = pad_size_abs - input_size ;
3026
- if (num_pads > Z_L (1048576 )) {
3027
- php_error_docref (NULL , E_WARNING , "You may only pad up to 1048576 elements at a time" );
3028
- zval_dtor (return_value );
3029
- RETURN_FALSE ;
3030
- }
3031
- pads = (zval * )safe_emalloc (num_pads , sizeof (zval ), 0 );
3032
- for (i = 0 ; i < num_pads ; i ++ ) {
3033
- ZVAL_COPY_VALUE (& pads [i ], pad_value );
3019
+ array_init_size (return_value , pad_size_abs );
3020
+ if (Z_REFCOUNTED_P (pad_value )) {
3021
+ GC_REFCOUNT (Z_COUNTED_P (pad_value )) += num_pads ;
3034
3022
}
3035
3023
3036
- /* Pad on the right or on the left */
3024
+ if (pad_size < 0 ) {
3025
+ for (i = 0 ; i < num_pads ; i ++ ) {
3026
+ zend_hash_next_index_insert_new (Z_ARRVAL_P (return_value ), pad_value );
3027
+ }
3028
+ }
3029
+
3030
+ ZEND_HASH_FOREACH_STR_KEY_VAL_IND (Z_ARRVAL_P (input ), key , value ) {
3031
+ zval_add_ref (value );
3032
+ if (key ) {
3033
+ zend_hash_add_new (Z_ARRVAL_P (return_value ), key , value );
3034
+ } else {
3035
+ zend_hash_next_index_insert_new (Z_ARRVAL_P (return_value ), value );
3036
+ }
3037
+ } ZEND_HASH_FOREACH_END ();
3038
+
3037
3039
if (pad_size > 0 ) {
3038
- new_hash = php_splice ( Z_ARRVAL_P ( return_value ), ( int ) input_size , 0 , pads , ( int ) num_pads , NULL );
3039
- } else {
3040
- new_hash = php_splice ( Z_ARRVAL_P ( return_value ), 0 , 0 , pads , ( int ) num_pads , NULL );
3040
+ for ( i = 0 ; i < num_pads ; i ++ ) {
3041
+ zend_hash_next_index_insert_new ( Z_ARRVAL_P ( return_value ), pad_value );
3042
+ }
3041
3043
}
3042
-
3043
- /* Copy the result hash into return value */
3044
- old_hash = * Z_ARRVAL_P (return_value );
3045
- * Z_ARRVAL_P (return_value ) = * new_hash ;
3046
- FREE_HASHTABLE (new_hash );
3047
- zend_hash_destroy (& old_hash );
3048
-
3049
- /* Clean up */
3050
- efree (pads );
3051
3044
}
3052
3045
/* }}} */
3053
3046
0 commit comments