diff --git a/ext/standard/string.c b/ext/standard/string.c index d9715678a234b..335e6fd897128 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -928,9 +928,6 @@ PHP_FUNCTION(explode) } /* }}} */ -/* {{{ An alias for implode */ -/* }}} */ - /* {{{ php_implode */ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return_value) { @@ -958,11 +955,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return ptr = strings = do_alloca((sizeof(*strings)) * numelems, use_heap); + uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(glue); + ZEND_HASH_FOREACH_VAL(pieces, tmp) { if (EXPECTED(Z_TYPE_P(tmp) == IS_STRING)) { ptr->str = Z_STR_P(tmp); len += ZSTR_LEN(ptr->str); ptr->lval = 0; + flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(ptr->str); ptr++; } else if (UNEXPECTED(Z_TYPE_P(tmp) == IS_LONG)) { zend_long val = Z_LVAL_P(tmp); @@ -981,12 +981,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return ptr->str = zval_get_string_func(tmp); len += ZSTR_LEN(ptr->str); ptr->lval = 1; + flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(ptr->str); ptr++; } } ZEND_HASH_FOREACH_END(); /* numelems cannot be 0, we checked above */ str = zend_string_safe_alloc(numelems - 1, ZSTR_LEN(glue), len, 0); + GC_ADD_FLAGS(str, flags); cptr = ZSTR_VAL(str) + ZSTR_LEN(str); *cptr = 0; @@ -1622,9 +1624,6 @@ PHP_FUNCTION(str_ends_with) } /* }}} */ -/* {{{ An alias for strstr */ -/* }}} */ - /* {{{ Finds position of first occurrence of a string within another */ PHP_FUNCTION(strpos) { diff --git a/ext/zend_test/tests/strings_marked_as_utf8.phpt b/ext/zend_test/tests/strings_marked_as_utf8.phpt index 1519459f1dad1..9eaa43e63902c 100644 --- a/ext/zend_test/tests/strings_marked_as_utf8.phpt +++ b/ext/zend_test/tests/strings_marked_as_utf8.phpt @@ -115,6 +115,33 @@ $string = "\xff"; $string_concat = str_repeat($string, 100); var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +echo "implode:\n"; +$arr = ['a', 'b']; +$string_concat = implode('', $arr); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('|', $arr); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', ['c', ...$arr]); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', [...$arr, 'c']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', ["\xff", ...$arr]); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', [...$arr, "\xff"]); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode("\xff", $arr); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', []); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode("\xff", []); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', ['a']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode("\xff", ['a']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', [1, 1.0, 'a']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); + ?> --EXPECT-- Empty strings: @@ -159,3 +186,16 @@ bool(true) str_repeat: bool(true) bool(false) +implode: +bool(true) +bool(true) +bool(true) +bool(true) +bool(false) +bool(false) +bool(false) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true)