Skip to content

Commit c7f4c5a

Browse files
committed
Avoid unnecessary separations in VERIFY_RETURN_TYPE
1 parent a684e6a commit c7f4c5a

File tree

2 files changed

+60
-72
lines changed

2 files changed

+60
-72
lines changed

Zend/zend_vm_def.h

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3942,20 +3942,18 @@ ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED)
39423942

39433943
if (UNEXPECTED(!ret_info->class_name
39443944
&& ret_info->type_hint != IS_CALLABLE
3945-
&& !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
3946-
/* A cast or an error will happen, so separate the zval to prevent overwriting it */
3947-
3948-
if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
3949-
/* Does not return by reference */
3950-
if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
3951-
ZVAL_UNREF(retval_ref);
3952-
} else {
3953-
SEPARATE_ZVAL(retval_ref);
3954-
}
3955-
retval_ptr = retval_ref;
3945+
&& !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
3946+
&& !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
3947+
&& retval_ref != retval_ptr)
3948+
) {
3949+
/* A cast might happen - unwrap the reference if this is a by-value return */
3950+
if (Z_REFCOUNT_P(retval_ref) == 1) {
3951+
ZVAL_UNREF(retval_ref);
39563952
} else {
3957-
SEPARATE_ZVAL_NOREF(retval_ptr);
3953+
Z_DELREF_P(retval_ref);
3954+
ZVAL_COPY(retval_ref, retval_ptr);
39583955
}
3956+
retval_ptr = retval_ref;
39593957
}
39603958
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
39613959

Zend/zend_vm_execute.h

Lines changed: 50 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -7998,20 +7998,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
79987998

79997999
if (UNEXPECTED(!ret_info->class_name
80008000
&& 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);
80128008
} else {
8013-
SEPARATE_ZVAL_NOREF(retval_ptr);
8009+
Z_DELREF_P(retval_ref);
8010+
ZVAL_COPY(retval_ref, retval_ptr);
80148011
}
8012+
retval_ptr = retval_ref;
80158013
}
80168014
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
80178015

@@ -13877,20 +13875,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN
1387713875

1387813876
if (UNEXPECTED(!ret_info->class_name
1387913877
&& 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);
1389113885
} else {
13892-
SEPARATE_ZVAL_NOREF(retval_ptr);
13886+
Z_DELREF_P(retval_ref);
13887+
ZVAL_COPY(retval_ref, retval_ptr);
1389313888
}
13889+
retval_ptr = retval_ref;
1389413890
}
1389513891
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
1389613892

@@ -19626,20 +19622,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
1962619622

1962719623
if (UNEXPECTED(!ret_info->class_name
1962819624
&& 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);
1964019632
} else {
19641-
SEPARATE_ZVAL_NOREF(retval_ptr);
19633+
Z_DELREF_P(retval_ref);
19634+
ZVAL_COPY(retval_ref, retval_ptr);
1964219635
}
19636+
retval_ptr = retval_ref;
1964319637
}
1964419638
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
1964519639

@@ -25398,20 +25392,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
2539825392

2539925393
if (UNEXPECTED(!ret_info->class_name
2540025394
&& 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);
2541225402
} else {
25413-
SEPARATE_ZVAL_NOREF(retval_ptr);
25403+
Z_DELREF_P(retval_ref);
25404+
ZVAL_COPY(retval_ref, retval_ptr);
2541425405
}
25406+
retval_ptr = retval_ref;
2541525407
}
2541625408
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
2541725409

@@ -35030,20 +35022,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU
3503035022

3503135023
if (UNEXPECTED(!ret_info->class_name
3503235024
&& 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);
3504435032
} else {
35045-
SEPARATE_ZVAL_NOREF(retval_ptr);
35033+
Z_DELREF_P(retval_ref);
35034+
ZVAL_COPY(retval_ref, retval_ptr);
3504635035
}
35036+
retval_ptr = retval_ref;
3504735037
}
3504835038
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
3504935039

0 commit comments

Comments
 (0)