summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-12-30 17:03:38 +0300
committerDmitry Stogov <dmitry@zend.com>2014-12-30 17:03:38 +0300
commitf9a70c50a477f7ef72ae37cad6cc8c16a2401c4c (patch)
tree1a1375d135fa5947bb9937efe4f66109f5cd8797 /ext/standard/array.c
parent16b904cc1cf4c3c645b56512036ef4eb377aeebc (diff)
downloadphp-git-f9a70c50a477f7ef72ae37cad6cc8c16a2401c4c.tar.gz
Simplify array_pad()
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c65
1 files changed, 29 insertions, 36 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 2ae3119549..aeac685c10 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -2989,15 +2989,13 @@ PHP_FUNCTION(array_pad)
{
zval *input; /* Input array */
zval *pad_value; /* Padding value obviously */
- zval *pads; /* Array to pass to splice */
- HashTable *new_hash;/* Return value from splice */
- HashTable old_hash;
zend_long pad_size; /* Size to pad to */
zend_long pad_size_abs; /* Absolute value of pad_size */
zend_long input_size; /* Size of the input array */
zend_long num_pads; /* How many pads do we need */
- int do_pad; /* Whether we should do padding at all */
- int i;
+ zend_long i;
+ zend_string *key;
+ zval *value;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "alz", &input, &pad_size, &pad_value) == FAILURE) {
return;
@@ -3006,48 +3004,43 @@ PHP_FUNCTION(array_pad)
/* Do some initial calculations */
input_size = zend_hash_num_elements(Z_ARRVAL_P(input));
pad_size_abs = ZEND_ABS(pad_size);
- if (pad_size_abs < 0) {
+ if (pad_size_abs < 0 || pad_size_abs - input_size > Z_L(1048576)) {
php_error_docref(NULL, E_WARNING, "You may only pad up to 1048576 elements at a time");
- zval_dtor(return_value);
RETURN_FALSE;
}
- do_pad = (input_size >= pad_size_abs) ? 0 : 1;
-
- /* Copy the original array */
- RETVAL_ZVAL(input, 1, 0);
-
- /* If no need to pad, no need to continue */
- if (!do_pad) {
+
+ if (input_size >= pad_size_abs) {
+ /* Copy the original array */
+ ZVAL_COPY(return_value, input);
return;
}
- /* Populate the pads array */
num_pads = pad_size_abs - input_size;
- if (num_pads > Z_L(1048576)) {
- php_error_docref(NULL, E_WARNING, "You may only pad up to 1048576 elements at a time");
- zval_dtor(return_value);
- RETURN_FALSE;
- }
- pads = (zval *)safe_emalloc(num_pads, sizeof(zval), 0);
- for (i = 0; i < num_pads; i++) {
- ZVAL_COPY_VALUE(&pads[i], pad_value);
+ array_init_size(return_value, pad_size_abs);
+ if (Z_REFCOUNTED_P(pad_value)) {
+ GC_REFCOUNT(Z_COUNTED_P(pad_value)) += num_pads;
}
- /* Pad on the right or on the left */
+ if (pad_size < 0) {
+ for (i = 0; i < num_pads; i++) {
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), pad_value);
+ }
+ }
+
+ ZEND_HASH_FOREACH_STR_KEY_VAL_IND(Z_ARRVAL_P(input), key, value) {
+ zval_add_ref(value);
+ if (key) {
+ zend_hash_add_new(Z_ARRVAL_P(return_value), key, value);
+ } else {
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), value);
+ }
+ } ZEND_HASH_FOREACH_END();
+
if (pad_size > 0) {
- new_hash = php_splice(Z_ARRVAL_P(return_value), (int)input_size, 0, pads, (int)num_pads, NULL);
- } else {
- new_hash = php_splice(Z_ARRVAL_P(return_value), 0, 0, pads, (int)num_pads, NULL);
+ for (i = 0; i < num_pads; i++) {
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), pad_value);
+ }
}
-
- /* Copy the result hash into return value */
- old_hash = *Z_ARRVAL_P(return_value);
- *Z_ARRVAL_P(return_value) = *new_hash;
- FREE_HASHTABLE(new_hash);
- zend_hash_destroy(&old_hash);
-
- /* Clean up */
- efree(pads);
}
/* }}} */