From 501d24f81bc94343e90fc8d0003aed45ebce52b9 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 3 Aug 2016 11:24:31 +0800 Subject: [PATCH] Optimized array_pad --- ext/standard/array.c | 57 +++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 9c9e44be14..e76eee3aaf 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -3729,31 +3729,56 @@ PHP_FUNCTION(array_pad) } num_pads = pad_size_abs - input_size; - array_init_size(return_value, pad_size_abs); if (Z_REFCOUNTED_P(pad_value)) { GC_REFCOUNT(Z_COUNTED_P(pad_value)) += num_pads; } - if (pad_size < 0) { - for (i = 0; i < num_pads; i++) { - zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), pad_value); + array_init_size(return_value, pad_size_abs); + if (Z_ARRVAL_P(input)->u.flags & HASH_FLAG_PACKED) { + zend_hash_real_init(Z_ARRVAL_P(return_value), 1); + + if (pad_size < 0) { + ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { + for (i = 0; i < num_pads; i++) { + ZEND_HASH_FILL_ADD(pad_value); + } + } ZEND_HASH_FILL_END(); } - } - ZEND_HASH_FOREACH_STR_KEY_VAL_IND(Z_ARRVAL_P(input), key, value) { - if (Z_REFCOUNTED_P(value)) { - Z_ADDREF_P(value); + ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { + ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(input), value) { + Z_TRY_ADDREF_P(value); + ZEND_HASH_FILL_ADD(value); + } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FILL_END(); + + if (pad_size > 0) { + ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { + for (i = 0; i < num_pads; i++) { + ZEND_HASH_FILL_ADD(pad_value); + } + } ZEND_HASH_FILL_END(); } - 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); + } else { + 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_END(); - 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) { + Z_TRY_ADDREF_P(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) { + for (i = 0; i < num_pads; i++) { + zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), pad_value); + } } } } -- 2.40.0