com php-src: Avoid unnecessary separations in VERIFY_RETURN _TYPE: Zend/zend_vm_def.h Zend/zend_vm_execut e.h
| From: | Nikita Popov | Date: | Sat, 20 Jun 2015 12:12:59 +0000 |
| Subject: | com php-src: Avoid unnecessary separations in VERIFY_RETURN _TYPE: Zend/zend_vm_def.h Zend/zend_vm_execut e.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-87401@lists.php.net to get a copy of this message | ||
Commit: c7f4c5a2feecd165a1fe06b7ff99308921d60a71
Author: Nikita Popov <nikic@php.net> Sat, 20 Jun 2015 13:57:37 +0200
Parents: a684e6adb284a09d01f97cfabe140e1ce36324a5
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=c7f4c5a2feecd165a1fe06b7ff99308921d60a71
Log:
Avoid unnecessary separations in VERIFY_RETURN_TYPE
Changed paths:
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
Diff:
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 686eb2a..7aea3da 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3942,20 +3942,18 @@ ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV,
UNUSED)
if (UNEXPECTED(!ret_info->class_name
&& ret_info->type_hint != IS_CALLABLE
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
-
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
- /* Does not return by reference */
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- SEPARATE_ZVAL(retval_ref);
- }
- retval_ptr = retval_ref;
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- SEPARATE_ZVAL_NOREF(retval_ptr);
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
+ retval_ptr = retval_ref;
}
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute..h
index 9d7fac4..8010458 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -7998,20 +7998,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_
if (UNEXPECTED(!ret_info->class_name
&& ret_info->type_hint != IS_CALLABLE
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
-
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
- /* Does not return by reference */
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- SEPARATE_ZVAL(retval_ref);
- }
- retval_ptr = retval_ref;
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- SEPARATE_ZVAL_NOREF(retval_ptr);
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
+ retval_ptr = retval_ref;
}
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
@@ -13877,20 +13875,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN
if (UNEXPECTED(!ret_info->class_name
&& ret_info->type_hint != IS_CALLABLE
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
-
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
- /* Does not return by reference */
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- SEPARATE_ZVAL(retval_ref);
- }
- retval_ptr = retval_ref;
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- SEPARATE_ZVAL_NOREF(retval_ptr);
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
+ retval_ptr = retval_ref;
}
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
@@ -19626,20 +19622,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
if (UNEXPECTED(!ret_info->class_name
&& ret_info->type_hint != IS_CALLABLE
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
-
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
- /* Does not return by reference */
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- SEPARATE_ZVAL(retval_ref);
- }
- retval_ptr = retval_ref;
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- SEPARATE_ZVAL_NOREF(retval_ptr);
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
+ retval_ptr = retval_ref;
}
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
@@ -25398,20 +25392,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
if (UNEXPECTED(!ret_info->class_name
&& ret_info->type_hint != IS_CALLABLE
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
-
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
- /* Does not return by reference */
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- SEPARATE_ZVAL(retval_ref);
- }
- retval_ptr = retval_ref;
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- SEPARATE_ZVAL_NOREF(retval_ptr);
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
+ retval_ptr = retval_ref;
}
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
@@ -35030,20 +35022,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU
if (UNEXPECTED(!ret_info->class_name
&& ret_info->type_hint != IS_CALLABLE
- && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr)))) {
- /* A cast or an error will happen, so separate the zval to prevent overwriting it */
-
- if (EXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) == 0)) {
- /* Does not return by reference */
- if (retval_ref != retval_ptr && Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
- } else {
- SEPARATE_ZVAL(retval_ref);
- }
- retval_ptr = retval_ref;
+ && !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(retval_ptr))
+ && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && retval_ref != retval_ptr)
+ ) {
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
} else {
- SEPARATE_ZVAL_NOREF(retval_ptr);
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
}
+ retval_ptr = retval_ref;
}
zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));