@@ -7998,20 +7998,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
7998
7998
7999
7999
if (UNEXPECTED(!ret_info->class_name
8000
8000
&& ret_info->type_hint != IS_CALLABLE
8001
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
8002
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
8003
-
8004
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
8005
- /* Does not return by reference */
8006
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
8007
- ZVAL_UNREF(retval_ref);
8008
- } else {
8009
- SEPARATE_ZVAL(retval_ref);
8010
- }
8011
- retval_ptr = retval_ref;
8001
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
8002
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
8003
+ && retval_ref != retval_ptr)
8004
+ ) {
8005
+ /* A cast might happen - unwrap the reference if this is a by-value return */
8006
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
8007
+ ZVAL_UNREF(retval_ref);
8012
8008
} else {
8013
- SEPARATE_ZVAL_NOREF(retval_ptr);
8009
+ Z_DELREF_P(retval_ref);
8010
+ ZVAL_COPY(retval_ref, retval_ptr);
8014
8011
}
8012
+ retval_ptr = retval_ref;
8015
8013
}
8016
8014
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
8017
8015
@@ -13877,20 +13875,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN
13877
13875
13878
13876
if (UNEXPECTED(!ret_info->class_name
13879
13877
&& ret_info->type_hint != IS_CALLABLE
13880
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
13881
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
13882
-
13883
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
13884
- /* Does not return by reference */
13885
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
13886
- ZVAL_UNREF(retval_ref);
13887
- } else {
13888
- SEPARATE_ZVAL(retval_ref);
13889
- }
13890
- retval_ptr = retval_ref;
13878
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
13879
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
13880
+ && retval_ref != retval_ptr)
13881
+ ) {
13882
+ /* A cast might happen - unwrap the reference if this is a by-value return */
13883
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
13884
+ ZVAL_UNREF(retval_ref);
13891
13885
} else {
13892
- SEPARATE_ZVAL_NOREF(retval_ptr);
13886
+ Z_DELREF_P(retval_ref);
13887
+ ZVAL_COPY(retval_ref, retval_ptr);
13893
13888
}
13889
+ retval_ptr = retval_ref;
13894
13890
}
13895
13891
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
13896
13892
@@ -19626,20 +19622,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
19626
19622
19627
19623
if (UNEXPECTED(!ret_info->class_name
19628
19624
&& ret_info->type_hint != IS_CALLABLE
19629
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
19630
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
19631
-
19632
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
19633
- /* Does not return by reference */
19634
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
19635
- ZVAL_UNREF(retval_ref);
19636
- } else {
19637
- SEPARATE_ZVAL(retval_ref);
19638
- }
19639
- retval_ptr = retval_ref;
19625
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
19626
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
19627
+ && retval_ref != retval_ptr)
19628
+ ) {
19629
+ /* A cast might happen - unwrap the reference if this is a by-value return */
19630
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
19631
+ ZVAL_UNREF(retval_ref);
19640
19632
} else {
19641
- SEPARATE_ZVAL_NOREF(retval_ptr);
19633
+ Z_DELREF_P(retval_ref);
19634
+ ZVAL_COPY(retval_ref, retval_ptr);
19642
19635
}
19636
+ retval_ptr = retval_ref;
19643
19637
}
19644
19638
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
19645
19639
@@ -25398,20 +25392,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
25398
25392
25399
25393
if (UNEXPECTED(!ret_info->class_name
25400
25394
&& ret_info->type_hint != IS_CALLABLE
25401
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
25402
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
25403
-
25404
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
25405
- /* Does not return by reference */
25406
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
25407
- ZVAL_UNREF(retval_ref);
25408
- } else {
25409
- SEPARATE_ZVAL(retval_ref);
25410
- }
25411
- retval_ptr = retval_ref;
25395
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
25396
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
25397
+ && retval_ref != retval_ptr)
25398
+ ) {
25399
+ /* A cast might happen - unwrap the reference if this is a by-value return */
25400
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
25401
+ ZVAL_UNREF(retval_ref);
25412
25402
} else {
25413
- SEPARATE_ZVAL_NOREF(retval_ptr);
25403
+ Z_DELREF_P(retval_ref);
25404
+ ZVAL_COPY(retval_ref, retval_ptr);
25414
25405
}
25406
+ retval_ptr = retval_ref;
25415
25407
}
25416
25408
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
25417
25409
@@ -35030,20 +35022,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU
35030
35022
35031
35023
if (UNEXPECTED(!ret_info->class_name
35032
35024
&& ret_info->type_hint != IS_CALLABLE
35033
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
35034
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
35035
-
35036
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
35037
- /* Does not return by reference */
35038
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
35039
- ZVAL_UNREF(retval_ref);
35040
- } else {
35041
- SEPARATE_ZVAL(retval_ref);
35042
- }
35043
- retval_ptr = retval_ref;
35025
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
35026
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
35027
+ && retval_ref != retval_ptr)
35028
+ ) {
35029
+ /* A cast might happen - unwrap the reference if this is a by-value return */
35030
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
35031
+ ZVAL_UNREF(retval_ref);
35044
35032
} else {
35045
- SEPARATE_ZVAL_NOREF(retval_ptr);
35033
+ Z_DELREF_P(retval_ref);
35034
+ ZVAL_COPY(retval_ref, retval_ptr);
35046
35035
}
35036
+ retval_ptr = retval_ref;
35047
35037
}
35048
35038
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
35049
35039
0 commit comments