Skip to content

Commit b62bd77

Browse files
committed
impl
1 parent 72ad63c commit b62bd77

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

ext/standard/string.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,11 +958,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return
958958

959959
ptr = strings = do_alloca((sizeof(*strings)) * numelems, use_heap);
960960

961+
uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(glue);
962+
961963
ZEND_HASH_FOREACH_VAL(pieces, tmp) {
962964
if (EXPECTED(Z_TYPE_P(tmp) == IS_STRING)) {
963965
ptr->str = Z_STR_P(tmp);
964966
len += ZSTR_LEN(ptr->str);
965967
ptr->lval = 0;
968+
flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(ptr->str);
966969
ptr++;
967970
} else if (UNEXPECTED(Z_TYPE_P(tmp) == IS_LONG)) {
968971
zend_long val = Z_LVAL_P(tmp);
@@ -981,12 +984,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return
981984
ptr->str = zval_get_string_func(tmp);
982985
len += ZSTR_LEN(ptr->str);
983986
ptr->lval = 1;
987+
flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(ptr->str);
984988
ptr++;
985989
}
986990
} ZEND_HASH_FOREACH_END();
987991

988992
/* numelems cannot be 0, we checked above */
989993
str = zend_string_safe_alloc(numelems - 1, ZSTR_LEN(glue), len, 0);
994+
GC_ADD_FLAGS(str, flags);
990995
cptr = ZSTR_VAL(str) + ZSTR_LEN(str);
991996
*cptr = 0;
992997

ext/zend_test/tests/strings_marked_as_utf8.phpt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ $string_concat = implode('', []);
133133
var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat));
134134
$string_concat = implode("\xff", []);
135135
var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat));
136+
$string_concat = implode('', ['a']);
137+
var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat));
138+
$string_concat = implode("\xff", ['a']);
139+
var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat));
136140

137141
?>
138142
--EXPECT--
@@ -187,3 +191,5 @@ bool(false)
187191
bool(false)
188192
bool(true)
189193
bool(true)
194+
bool(true)
195+
bool(false)

0 commit comments

Comments
 (0)