@@ -310,29 +310,39 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
310
310
} else {
311
311
ZVAL_STR (EX_VAR (opline -> result .var ), op2_str );
312
312
}
313
- FREE_OP1 ();
313
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
314
+ zend_string_release_ex (op1_str , 0 );
315
+ }
314
316
} else if (OP2_TYPE != IS_CONST && UNEXPECTED (ZSTR_LEN (op2_str ) == 0 )) {
315
317
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV ) {
316
318
ZVAL_STR_COPY (EX_VAR (opline -> result .var ), op1_str );
317
319
} else {
318
320
ZVAL_STR (EX_VAR (opline -> result .var ), op1_str );
319
321
}
320
- FREE_OP2 ();
322
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
323
+ zend_string_release_ex (op2_str , 0 );
324
+ }
321
325
} else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
322
326
!ZSTR_IS_INTERNED (op1_str ) && GC_REFCOUNT (op1_str ) == 1 ) {
323
327
size_t len = ZSTR_LEN (op1_str );
324
328
325
329
str = zend_string_extend (op1_str , len + ZSTR_LEN (op2_str ), 0 );
326
330
memcpy (ZSTR_VAL (str ) + len , ZSTR_VAL (op2_str ), ZSTR_LEN (op2_str )+ 1 );
327
331
ZVAL_NEW_STR (EX_VAR (opline -> result .var ), str );
328
- FREE_OP2 ();
332
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
333
+ zend_string_release_ex (op2_str , 0 );
334
+ }
329
335
} else {
330
336
str = zend_string_alloc (ZSTR_LEN (op1_str ) + ZSTR_LEN (op2_str ), 0 );
331
337
memcpy (ZSTR_VAL (str ), ZSTR_VAL (op1_str ), ZSTR_LEN (op1_str ));
332
338
memcpy (ZSTR_VAL (str ) + ZSTR_LEN (op1_str ), ZSTR_VAL (op2_str ), ZSTR_LEN (op2_str )+ 1 );
333
339
ZVAL_NEW_STR (EX_VAR (opline -> result .var ), str );
334
- FREE_OP1 ();
335
- FREE_OP2 ();
340
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
341
+ zend_string_release_ex (op1_str , 0 );
342
+ }
343
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
344
+ zend_string_release_ex (op2_str , 0 );
345
+ }
336
346
}
337
347
ZEND_VM_NEXT_OPCODE ();
338
348
} else {
@@ -426,8 +436,12 @@ ZEND_VM_C_LABEL(is_equal_double):
426
436
} else if (EXPECTED (Z_TYPE_P (op1 ) == IS_STRING )) {
427
437
if (EXPECTED (Z_TYPE_P (op2 ) == IS_STRING )) {
428
438
int result = zend_fast_equal_strings (Z_STR_P (op1 ), Z_STR_P (op2 ));
429
- FREE_OP1 ();
430
- FREE_OP2 ();
439
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
440
+ zval_ptr_dtor_str (op1 );
441
+ }
442
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
443
+ zval_ptr_dtor_str (op2 );
444
+ }
431
445
if (result ) {
432
446
ZEND_VM_C_GOTO (is_equal_true );
433
447
} else {
@@ -500,8 +514,12 @@ ZEND_VM_C_LABEL(is_not_equal_double):
500
514
} else if (EXPECTED (Z_TYPE_P (op1 ) == IS_STRING )) {
501
515
if (EXPECTED (Z_TYPE_P (op2 ) == IS_STRING )) {
502
516
int result = zend_fast_equal_strings (Z_STR_P (op1 ), Z_STR_P (op2 ));
503
- FREE_OP1 ();
504
- FREE_OP2 ();
517
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
518
+ zval_ptr_dtor_str (op1 );
519
+ }
520
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
521
+ zval_ptr_dtor_str (op2 );
522
+ }
505
523
if (!result ) {
506
524
ZEND_VM_C_GOTO (is_not_equal_true );
507
525
} else {
@@ -3037,29 +3055,39 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
3037
3055
} else {
3038
3056
ZVAL_STR (EX_VAR (opline -> result .var ), op2_str );
3039
3057
}
3040
- FREE_OP1 ();
3058
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
3059
+ zend_string_release_ex (op1_str , 0 );
3060
+ }
3041
3061
} else if (OP2_TYPE != IS_CONST && UNEXPECTED (ZSTR_LEN (op2_str ) == 0 )) {
3042
3062
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV ) {
3043
3063
ZVAL_STR_COPY (EX_VAR (opline -> result .var ), op1_str );
3044
3064
} else {
3045
3065
ZVAL_STR (EX_VAR (opline -> result .var ), op1_str );
3046
3066
}
3047
- FREE_OP2 ();
3067
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
3068
+ zend_string_release_ex (op2_str , 0 );
3069
+ }
3048
3070
} else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
3049
3071
!ZSTR_IS_INTERNED (op1_str ) && GC_REFCOUNT (op1_str ) == 1 ) {
3050
3072
size_t len = ZSTR_LEN (op1_str );
3051
3073
3052
3074
str = zend_string_extend (op1_str , len + ZSTR_LEN (op2_str ), 0 );
3053
3075
memcpy (ZSTR_VAL (str ) + len , ZSTR_VAL (op2_str ), ZSTR_LEN (op2_str )+ 1 );
3054
3076
ZVAL_NEW_STR (EX_VAR (opline -> result .var ), str );
3055
- FREE_OP2 ();
3077
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
3078
+ zend_string_release_ex (op2_str , 0 );
3079
+ }
3056
3080
} else {
3057
3081
str = zend_string_alloc (ZSTR_LEN (op1_str ) + ZSTR_LEN (op2_str ), 0 );
3058
3082
memcpy (ZSTR_VAL (str ), ZSTR_VAL (op1_str ), ZSTR_LEN (op1_str ));
3059
3083
memcpy (ZSTR_VAL (str ) + ZSTR_LEN (op1_str ), ZSTR_VAL (op2_str ), ZSTR_LEN (op2_str )+ 1 );
3060
3084
ZVAL_NEW_STR (EX_VAR (opline -> result .var ), str );
3061
- FREE_OP1 ();
3062
- FREE_OP2 ();
3085
+ if (OP1_TYPE & (IS_TMP_VAR |IS_VAR )) {
3086
+ zend_string_release_ex (op1_str , 0 );
3087
+ }
3088
+ if (OP2_TYPE & (IS_TMP_VAR |IS_VAR )) {
3089
+ zend_string_release_ex (op2_str , 0 );
3090
+ }
3063
3091
}
3064
3092
ZEND_VM_NEXT_OPCODE ();
3065
3093
}
0 commit comments