From: Dmitry Stogov Date: Tue, 3 Jun 2014 05:45:09 +0000 (+0400) Subject: Optimized conditions order X-Git-Tag: POST_PHPNG_MERGE~228 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc2ba841f94515170c4c1311cdde5a1a366db037;p=php Optimized conditions order --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b3b7c0a001..a9b9c92b0e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1122,7 +1122,12 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * ZVAL_DEREF(container); if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { - SEPARATE_ZVAL(container); + if (Z_IMMUTABLE_P(container)) { + zval_copy_ctor_func(container); + } else if (Z_REFCOUNT_P(container) > 1) { + Z_DELREF_P(container); + zval_copy_ctor_func(container); + } fetch_from_array: if (dim == NULL) { retval = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval)); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f41803bfae..3329b14949 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -456,8 +456,11 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMP|VAR ZEND_VM_C_GOTO(assign_op_dim_exit); } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -508,8 +511,11 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU ZEND_VM_C_GOTO(assign_op_exit); } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -3660,7 +3666,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) value = CACHED_PTR(Z_CACHE_SLOT_P(opline->op2.zv)); ZVAL_DEREF(value); ZVAL_DUP(EX_VAR(opline->result.var), value); - goto constant_fetch_end; + ZEND_VM_C_GOTO(constant_fetch_end); } else if (CACHED_PTR(Z_CACHE_SLOT_P(opline->op1.zv))) { ce = CACHED_PTR(Z_CACHE_SLOT_P(opline->op1.zv)); } else { @@ -3678,7 +3684,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) if ((value = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(opline->op2.zv), ce)) != NULL) { ZVAL_DEREF(value); ZVAL_DUP(EX_VAR(opline->result.var), value); - goto constant_fetch_end; + ZEND_VM_C_GOTO(constant_fetch_end); } } @@ -3705,7 +3711,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST) zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv)); } } -constant_fetch_end: +ZEND_VM_C_LABEL(constant_fetch_end): CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c156748d27..316011fef8 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -14219,8 +14219,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(int (*b goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -14271,8 +14274,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -16582,8 +16588,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMP(int (*bin goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -16634,8 +16643,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_ goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -18563,8 +18575,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_VAR(int (*bin goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -18615,8 +18630,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_ goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -20631,8 +20649,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(int (* goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -20683,8 +20704,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -22084,8 +22108,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CV(int (*bina goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -22136,8 +22163,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -23921,8 +23951,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(int goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -23973,8 +24006,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -25278,8 +25314,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMP(int (* goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -25330,8 +25369,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -26556,8 +26598,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_VAR(int (* goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -26608,8 +26653,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -27833,8 +27881,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_UNUSED(int goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -27885,8 +27936,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -28349,8 +28403,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(int (*b goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -28401,8 +28458,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -31166,8 +31226,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(int (*bi goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -31218,8 +31281,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -33320,8 +33386,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMP(int (*bina goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -33372,8 +33441,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -35184,8 +35256,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_VAR(int (*bina goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -35236,8 +35311,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -37134,8 +37212,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(int (*b goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -37186,8 +37267,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -38453,8 +38537,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(int (*binar goto assign_op_dim_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) { @@ -38505,8 +38592,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op goto assign_op_exit; } - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - ZVAL_DEREF(var_ptr); + if (EXPECTED(!Z_ISREF_P(var_ptr))) { + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + } else { + ZVAL_DEREF(var_ptr); + } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) && UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {