Skip to content

Commit f9a70c5

Browse files
committed
Simplify array_pad()
1 parent 16b904c commit f9a70c5

File tree

1 file changed

+29
-36
lines changed

1 file changed

+29
-36
lines changed

ext/standard/array.c

Lines changed: 29 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2989,15 +2989,13 @@ PHP_FUNCTION(array_pad)
29892989
{
29902990
zval *input; /* Input array */
29912991
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;
29952992
zend_long pad_size; /* Size to pad to */
29962993
zend_long pad_size_abs; /* Absolute value of pad_size */
29972994
zend_long input_size; /* Size of the input array */
29982995
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;
30012999

30023000
if (zend_parse_parameters(ZEND_NUM_ARGS(), "alz", &input, &pad_size, &pad_value) == FAILURE) {
30033001
return;
@@ -3006,48 +3004,43 @@ PHP_FUNCTION(array_pad)
30063004
/* Do some initial calculations */
30073005
input_size = zend_hash_num_elements(Z_ARRVAL_P(input));
30083006
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)) {
30103008
php_error_docref(NULL, E_WARNING, "You may only pad up to 1048576 elements at a time");
3011-
zval_dtor(return_value);
30123009
RETURN_FALSE;
30133010
}
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);
30213015
return;
30223016
}
30233017

3024-
/* Populate the pads array */
30253018
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;
30343022
}
30353023

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+
30373039
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+
}
30413043
}
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);
30513044
}
30523045
/* }}} */
30533046

0 commit comments

Comments
 (0)