Skip to content

Commit c76a25d

Browse files
committed
Add function in zend_test to check UTF8 flag is added
Create test and fix some concatenation cases Concatenation during an assignment still doesn't work
1 parent dbe4abf commit c76a25d

File tree

6 files changed

+275
-1
lines changed

6 files changed

+275
-1
lines changed

Zend/zend_vm_def.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,11 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
384384
zend_string *op1_str = Z_STR_P(op1);
385385
zend_string *op2_str = Z_STR_P(op2);
386386
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+
}
387392

388393
if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
389394
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_
428433
zend_string_release_ex(op2_str, 0);
429434
}
430435
}
436+
GC_ADD_FLAGS(Z_STR_P(EX_VAR(opline->result.var)), flags);
431437
ZEND_VM_NEXT_OPCODE();
432438
} else {
433439
SAVE_OPLINE();
@@ -3140,6 +3146,11 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
31403146
zend_string *op1_str = Z_STR_P(op1);
31413147
zend_string *op2_str = Z_STR_P(op2);
31423148
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+
}
31433154

31443155
if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
31453156
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
31813192
zend_string_release_ex(op2_str, 0);
31823193
}
31833194
}
3195+
GC_ADD_FLAGS(Z_STR_P(EX_VAR(opline->result.var)), flags);
31843196
ZEND_VM_NEXT_OPCODE();
31853197
}
31863198

@@ -3233,6 +3245,10 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
32333245
str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
32343246
memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
32353247
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+
}
32363252
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
32373253
if (OP1_TYPE != IS_CONST) {
32383254
zend_string_release_ex(op1_str, 0);

0 commit comments

Comments
 (0)