Merge branch 'master' of git.php.net:php-src

This commit is contained in:
Kalle Sommer Nielsen 2016-08-03 10:02:54 +02:00
commit d9613a850f

View File

@ -3730,31 +3730,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);
ZEND_HASH_FOREACH_STR_KEY_VAL_IND(Z_ARRVAL_P(input), key, value) {
if (Z_REFCOUNTED_P(value)) {
Z_ADDREF_P(value);
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);
}
} 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_FILL_PACKED(Z_ARRVAL_P(return_value)) {
ZEND_HASH_FOREACH_VAL(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();
}
} 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_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);
}
}
}
}
@ -5153,19 +5178,25 @@ PHP_FUNCTION(array_rand)
i--;
}
}
/* i = 0; */
/* We can't use zend_hash_index_find() because the array may have string keys or gaps. */
i = 0;
ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(input), num_key, string_key) {
if (zend_bitset_in(bitset, i) ^ negative_bitset) {
if (string_key) {
add_next_index_str(return_value, zend_string_copy(string_key));
} else {
add_next_index_long(return_value, num_key);
zend_hash_real_init(Z_ARRVAL_P(return_value), 1);
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) {
zval zv;
/* We can't use zend_hash_index_find()
* because the array may have string keys or gaps. */
ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(input), num_key, string_key) {
if (zend_bitset_in(bitset, i) ^ negative_bitset) {
if (string_key) {
ZVAL_STR_COPY(&zv, string_key);
} else {
ZVAL_LONG(&zv, num_key);
}
ZEND_HASH_FILL_ADD(&zv);
}
}
i++;
} ZEND_HASH_FOREACH_END();
i++;
} ZEND_HASH_FOREACH_END();
} ZEND_HASH_FILL_END();
free_alloca(bitset, use_heap);
}