@@ -384,6 +384,11 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
384
384
zend_string * op1_str = Z_STR_P (op1 );
385
385
zend_string * op2_str = Z_STR_P (op2 );
386
386
zend_string * str ;
387
+ uint32_t flags = 0 ;
388
+
389
+ if (ZSTR_IS_VALID_UTF8 (op1_str ) && ZSTR_IS_VALID_UTF8 (op2_str )) {
390
+ flags = IS_STR_VALID_UTF8 ;
391
+ }
387
392
388
393
if (OP1_TYPE != IS_CONST && UNEXPECTED (ZSTR_LEN (op1_str ) == 0 )) {
389
394
if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV ) {
@@ -428,6 +433,7 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
428
433
zend_string_release_ex (op2_str , 0 );
429
434
}
430
435
}
436
+ GC_ADD_FLAGS (Z_STR_P (EX_VAR (opline -> result .var )), flags );
431
437
ZEND_VM_NEXT_OPCODE ();
432
438
} else {
433
439
SAVE_OPLINE ();
@@ -3140,6 +3146,11 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
3140
3146
zend_string * op1_str = Z_STR_P (op1 );
3141
3147
zend_string * op2_str = Z_STR_P (op2 );
3142
3148
zend_string * str ;
3149
+ uint32_t flags = 0 ;
3150
+
3151
+ if (ZSTR_IS_VALID_UTF8 (op1_str ) && ZSTR_IS_VALID_UTF8 (op2_str )) {
3152
+ flags = IS_STR_VALID_UTF8 ;
3153
+ }
3143
3154
3144
3155
if (OP1_TYPE != IS_CONST && UNEXPECTED (ZSTR_LEN (op1_str ) == 0 )) {
3145
3156
if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV ) {
@@ -3181,6 +3192,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
3181
3192
zend_string_release_ex (op2_str , 0 );
3182
3193
}
3183
3194
}
3195
+ GC_ADD_FLAGS (Z_STR_P (EX_VAR (opline -> result .var )), flags );
3184
3196
ZEND_VM_NEXT_OPCODE ();
3185
3197
}
3186
3198
@@ -3233,6 +3245,10 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
3233
3245
str = zend_string_alloc (ZSTR_LEN (op1_str ) + ZSTR_LEN (op2_str ), 0 );
3234
3246
memcpy (ZSTR_VAL (str ), ZSTR_VAL (op1_str ), ZSTR_LEN (op1_str ));
3235
3247
memcpy (ZSTR_VAL (str ) + ZSTR_LEN (op1_str ), ZSTR_VAL (op2_str ), ZSTR_LEN (op2_str )+ 1 );
3248
+
3249
+ if (ZSTR_IS_VALID_UTF8 (op1_str ) && ZSTR_IS_VALID_UTF8 (op2_str )) {
3250
+ GC_ADD_FLAGS (str , IS_STR_VALID_UTF8 );
3251
+ }
3236
3252
ZVAL_NEW_STR (EX_VAR (opline -> result .var ), str );
3237
3253
if (OP1_TYPE != IS_CONST ) {
3238
3254
zend_string_release_ex (op1_str , 0 );
0 commit comments