com php-src: Avoid unnecessary separations in VERIFY_RETURN _TYPE: Zend/zend_vm_def.h Zend/zend_vm_execut e.h

From: 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));

« previous php.cvs (#87401) next »