From 6817df8f9c513c2de2edd106a13f19ebe7b5af57 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Tue, 27 Jun 2023 22:10:34 +0200 Subject: [PATCH 1/7] hax --- Zend/zend_execute.h | 28 ++ Zend/zend_vm_def.h | 29 +- Zend/zend_vm_execute.h | 780 ++++++++++++++++------------------------- 3 files changed, 343 insertions(+), 494 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f2cb6764788b..bcceb6b69ca6 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -179,6 +179,34 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval return variable_ptr; } +static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr, zval *second_variable_ptr, zval *value, uint8_t value_type, bool strict) +{ + do { + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) { + zend_refcounted *garbage; + + if (Z_ISREF_P(variable_ptr)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { + return zend_assign_to_typed_ref(variable_ptr, value, value_type, strict); + } + + variable_ptr = Z_REFVAL_P(variable_ptr); + if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) { + break; + } + } + garbage = Z_COUNTED_P(variable_ptr); + zend_copy_to_variable(variable_ptr, value, value_type); + ZVAL_COPY(second_variable_ptr, variable_ptr); + GC_DTOR_NO_REF(garbage); + return variable_ptr; + } + } while (0); + + zend_copy_to_variable(variable_ptr, value, value_type); + return variable_ptr; +} + static zend_always_inline zval* zend_assign_to_variable_ex(zval *variable_ptr, zval *value, zend_uchar value_type, bool strict, zend_refcounted **garbage_ptr) { do { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b7d98e55a001..057d294c678d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2499,9 +2499,6 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj): } FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): - if (garbage) { - GC_DTOR_NO_REF(garbage); - } FREE_OP2(); FREE_OP1(); /* assign_obj has two opcodes! */ @@ -2552,7 +2549,6 @@ ZEND_VM_HANDLER(23, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(O zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); @@ -2597,6 +2593,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array): Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R); if (OP2_TYPE == IS_CONST) { @@ -2608,13 +2607,11 @@ ZEND_VM_C_LABEL(try_assign_dim_array): ZEND_VM_C_GOTO(assign_dim_error); } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - value = zend_assign_to_variable_ex(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -2709,14 +2706,10 @@ ZEND_VM_HANDLER(22, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL)) variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (!ZEND_VM_SPEC || UNEXPECTED(RETURN_VALUE_USED(opline))) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, OP2_TYPE, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES()); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 56fdc55ea740..e7759c482e28 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23421,9 +23421,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23555,9 +23552,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23689,9 +23683,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23823,9 +23814,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23840,7 +23828,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -23885,6 +23872,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -23896,13 +23886,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -23992,7 +23980,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -24037,6 +24024,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -24048,13 +24038,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -24145,7 +24133,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -24190,6 +24177,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -24201,13 +24191,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -24298,7 +24286,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -24343,6 +24330,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -24354,13 +24344,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -24454,14 +24442,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); @@ -24483,14 +24467,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); @@ -26325,9 +26305,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26459,9 +26436,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26593,9 +26567,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26727,9 +26698,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26744,7 +26712,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -26789,6 +26756,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -26800,13 +26770,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -26896,7 +26864,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -26941,6 +26908,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -26952,13 +26922,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -27049,7 +27017,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -27094,6 +27061,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -27105,13 +27075,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -27202,7 +27170,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -27247,6 +27214,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -27258,13 +27228,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -27988,14 +27956,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNU variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); @@ -28017,14 +27981,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USE variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); @@ -28090,14 +28050,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNU variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); @@ -28119,14 +28075,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USE variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); @@ -28332,7 +28284,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -28377,6 +28328,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -28388,13 +28342,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -28484,7 +28436,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -28529,6 +28480,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -28540,13 +28494,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -28637,7 +28589,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -28682,6 +28633,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -28693,13 +28647,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -28790,7 +28742,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -28835,6 +28786,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -28846,13 +28800,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -30617,9 +30569,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30751,9 +30700,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30885,9 +30831,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -31019,9 +30962,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -31036,7 +30976,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -31081,6 +31020,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -31092,13 +31034,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -31188,7 +31128,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -31233,6 +31172,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -31244,13 +31186,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -31341,7 +31281,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -31386,6 +31325,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -31397,13 +31339,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -31494,7 +31434,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -31539,6 +31478,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -31550,13 +31492,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -31650,14 +31590,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUS variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); @@ -31679,14 +31615,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); @@ -33250,9 +33182,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -33384,9 +33313,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -33518,9 +33444,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -33652,9 +33575,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -35282,9 +35202,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35416,9 +35333,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35550,9 +35464,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35684,9 +35595,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -37772,9 +37680,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -37906,9 +37811,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -38040,9 +37942,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -38174,9 +38073,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42046,9 +41942,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42180,9 +42073,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42314,9 +42204,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42448,9 +42335,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42465,7 +42349,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -42510,6 +42393,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -42521,13 +42407,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -42617,7 +42501,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -42662,6 +42545,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -42673,13 +42559,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -42770,7 +42654,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -42815,6 +42698,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -42826,13 +42712,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -42923,7 +42807,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -42968,6 +42851,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST) { @@ -42979,13 +42865,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -43079,14 +42963,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UN variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); @@ -43108,14 +42988,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); @@ -45885,9 +45761,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46019,9 +45892,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46153,9 +46023,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46287,9 +46154,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46304,7 +46168,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -46349,6 +46212,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -46360,13 +46226,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -46456,7 +46320,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -46501,6 +46364,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -46512,13 +46378,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -46609,7 +46473,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -46654,6 +46517,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -46665,13 +46531,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -46762,7 +46626,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -46807,6 +46670,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -46818,13 +46684,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -47841,14 +47705,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUS variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); @@ -47870,14 +47730,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); @@ -47929,14 +47785,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUS variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); @@ -47958,14 +47810,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); @@ -48344,7 +48192,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -48389,6 +48236,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -48400,13 +48250,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -48496,7 +48344,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -48541,6 +48388,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -48552,13 +48402,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -48649,7 +48497,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -48694,6 +48541,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -48705,13 +48555,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -48802,7 +48650,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -48847,6 +48694,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = NULL; if (IS_UNUSED == IS_CONST) { @@ -48858,13 +48708,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -51250,9 +51098,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51384,9 +51229,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51518,9 +51360,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51652,9 +51491,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51669,7 +51505,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -51714,6 +51549,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -51725,13 +51563,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ goto assign_dim_error; } value = RT_CONSTANT((opline+1), (opline+1)->op1); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -51821,7 +51657,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -51866,6 +51701,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -51877,13 +51715,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ goto assign_dim_error; } value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -51974,7 +51810,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -52019,6 +51854,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -52030,13 +51868,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ goto assign_dim_error; } value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -52127,7 +51963,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval *value; zval *variable_ptr; zval *dim; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); orig_object_ptr = object_ptr = EX_VAR(opline->op1.var); @@ -52172,6 +52007,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ Z_ADDREF_P(value); } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } } else { dim = EX_VAR(opline->op2.var); if (IS_CV == IS_CONST) { @@ -52183,13 +52021,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ goto assign_dim_error; } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); + } } } else { if (EXPECTED(Z_ISREF_P(object_ptr))) { @@ -52283,14 +52119,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSE variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(0)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(0)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); @@ -52312,14 +52144,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_ variable_ptr = EX_VAR(opline->op1.var); if (0 || UNEXPECTED(1)) { - zend_refcounted *garbage = NULL; - - value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(1)) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - if (garbage) { - GC_DTOR_NO_REF(garbage); + value = zend_assign_to_variable_twice(variable_ptr, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } } else { value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); From d3dcdd59497638e93af1af7f823d3fc18622876c Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Tue, 27 Jun 2023 22:28:24 +0200 Subject: [PATCH 2/7] Fix mistake --- Zend/zend_execute.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index bcceb6b69ca6..3c2dbeef3b7c 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -204,6 +204,7 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr } while (0); zend_copy_to_variable(variable_ptr, value, value_type); + ZVAL_COPY(second_variable_ptr, variable_ptr); // TODO: can this be COPY_VALUE ? return variable_ptr; } From 14eefe0d0d650117007407f83530a8beead9cafc Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Tue, 27 Jun 2023 23:00:25 +0200 Subject: [PATCH 3/7] undo oopsie --- Zend/zend_vm_def.h | 3 ++ Zend/zend_vm_execute.h | 108 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 057d294c678d..0f2bab73f589 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2499,6 +2499,9 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj): } FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): + if (garbage) { + GC_DTOR_NO_REF(garbage); + } FREE_OP2(); FREE_OP1(); /* assign_obj has two opcodes! */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e7759c482e28..564454e3a653 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23421,6 +23421,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23552,6 +23555,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23683,6 +23689,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23814,6 +23823,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26305,6 +26317,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26436,6 +26451,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26567,6 +26585,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26698,6 +26719,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30569,6 +30593,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30700,6 +30727,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30831,6 +30861,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30962,6 +30995,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -33182,6 +33218,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -33313,6 +33352,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -33444,6 +33486,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -33575,6 +33620,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -35202,6 +35250,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35333,6 +35384,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35464,6 +35518,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35595,6 +35652,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -37680,6 +37740,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -37811,6 +37874,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -37942,6 +38008,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -38073,6 +38142,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -41942,6 +42014,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -42073,6 +42148,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -42204,6 +42282,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -42335,6 +42416,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -45761,6 +45845,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -45892,6 +45979,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46023,6 +46113,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46154,6 +46247,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -51098,6 +51194,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -51229,6 +51328,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -51360,6 +51462,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ @@ -51491,6 +51596,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } exit_assign_obj: + if (garbage) { + GC_DTOR_NO_REF(garbage); + } /* assign_obj has two opcodes! */ From 69cd3b92acfb717f0dec0b497b3a5cd6f24041a8 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Tue, 27 Jun 2023 23:35:58 +0200 Subject: [PATCH 4/7] more fixing --- Zend/zend_execute.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 3c2dbeef3b7c..cee6447c7db8 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -187,7 +187,9 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr if (Z_ISREF_P(variable_ptr)) { if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { - return zend_assign_to_typed_ref(variable_ptr, value, value_type, strict); + value = zend_assign_to_typed_ref(variable_ptr, value, value_type, strict); + ZVAL_COPY(second_variable_ptr, value); + return value; } variable_ptr = Z_REFVAL_P(variable_ptr); @@ -197,8 +199,8 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr } garbage = Z_COUNTED_P(variable_ptr); zend_copy_to_variable(variable_ptr, value, value_type); - ZVAL_COPY(second_variable_ptr, variable_ptr); GC_DTOR_NO_REF(garbage); + ZVAL_COPY(second_variable_ptr, variable_ptr); return variable_ptr; } } while (0); From 0c675bfa266e0cdc402ade82bee39351e6719e3e Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Wed, 28 Jun 2023 19:23:44 +0200 Subject: [PATCH 5/7] fix --- Zend/zend_execute.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index cee6447c7db8..1a9170aa4c80 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -187,8 +187,12 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr if (Z_ISREF_P(variable_ptr)) { if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { - value = zend_assign_to_typed_ref(variable_ptr, value, value_type, strict); + garbage = NULL; + value = zend_assign_to_typed_ref_ex(variable_ptr, value, value_type, strict, &garbage); ZVAL_COPY(second_variable_ptr, value); + if (garbage) { + GC_DTOR_NO_REF(garbage); + } return value; } @@ -199,14 +203,14 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr } garbage = Z_COUNTED_P(variable_ptr); zend_copy_to_variable(variable_ptr, value, value_type); - GC_DTOR_NO_REF(garbage); ZVAL_COPY(second_variable_ptr, variable_ptr); + GC_DTOR_NO_REF(garbage); return variable_ptr; } } while (0); zend_copy_to_variable(variable_ptr, value, value_type); - ZVAL_COPY(second_variable_ptr, variable_ptr); // TODO: can this be COPY_VALUE ? + ZVAL_COPY(second_variable_ptr, variable_ptr); return variable_ptr; } From ade9b5c24d6cf42058d1a4f051ab801e38c7a253 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Wed, 28 Jun 2023 20:21:49 +0200 Subject: [PATCH 6/7] Start trying to move everything to a _twice variant instead of _ex --- Zend/zend_execute.c | 46 +++++++++++++++++++++++++++++++++++++++------ Zend/zend_execute.h | 13 +++---------- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 29631504d5f9..7c9ec5f4a3ae 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3624,6 +3624,7 @@ static zend_always_inline void i_zval_ptr_dtor_noref(zval *zval_ptr) { } } +// TODO: try to get rid of this copy by trying to merge everything to the _twice variant ZEND_API zval* zend_assign_to_typed_ref_ex(zval *variable_ptr, zval *orig_value, uint8_t value_type, bool strict, zend_refcounted **garbage_ptr) { bool ret; @@ -3659,14 +3660,47 @@ ZEND_API zval* zend_assign_to_typed_ref_ex(zval *variable_ptr, zval *orig_value, return variable_ptr; } -ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, uint8_t value_type, bool strict) +ZEND_API zval* zend_assign_to_typed_ref_twice(zval *variable_ptr, zval *orig_value, uint8_t value_type, bool strict, zval *extra_copy) { - zend_refcounted *garbage = NULL; - zval *result = zend_assign_to_typed_ref_ex(variable_ptr, orig_value, value_type, strict, &garbage); - if (garbage) { - GC_DTOR_NO_REF(garbage); + bool ret; + zval value; + zend_refcounted *ref = NULL; + + if (Z_ISREF_P(orig_value)) { + ref = Z_COUNTED_P(orig_value); + orig_value = Z_REFVAL_P(orig_value); } - return result; + + ZVAL_COPY(&value, orig_value); + ret = zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), &value, strict); + variable_ptr = Z_REFVAL_P(variable_ptr); + if (EXPECTED(ret)) { + if (UNEXPECTED(extra_copy)) { + ZVAL_COPY(extra_copy, &value); + } + if (Z_REFCOUNTED_P(variable_ptr)) { + GC_DTOR(Z_COUNTED_P(variable_ptr)); + } + ZVAL_COPY_VALUE(variable_ptr, &value); + } else { + zval_ptr_dtor_nogc(&value); + } + if (value_type & (IS_VAR|IS_TMP_VAR)) { + if (UNEXPECTED(ref)) { + if (UNEXPECTED(GC_DELREF(ref) == 0)) { + zval_ptr_dtor(orig_value); + efree_size(ref, sizeof(zend_reference)); + } + } else { + i_zval_ptr_dtor_noref(orig_value); + } + } + return variable_ptr; +} + +ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, uint8_t value_type, bool strict) +{ + return zend_assign_to_typed_ref_twice(variable_ptr, orig_value, value_type, strict, NULL); } ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref_ex(const zend_property_info *prop_info, zval *orig_val, bool strict, zend_verify_prop_assignable_by_ref_context context) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 1a9170aa4c80..1ee79da2b1e9 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -124,6 +124,7 @@ ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_l ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, uint8_t value_type, bool strict); ZEND_API zval* zend_assign_to_typed_ref_ex(zval *variable_ptr, zval *value, uint8_t value_type, bool strict, zend_refcounted **garbage_ptr); +ZEND_API zval* zend_assign_to_typed_ref_twice(zval *variable_ptr, zval *value, uint8_t value_type, bool strict, zval *extra_copy); static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *value, uint8_t value_type) { @@ -183,17 +184,9 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr { do { if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) { - zend_refcounted *garbage; - if (Z_ISREF_P(variable_ptr)) { if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { - garbage = NULL; - value = zend_assign_to_typed_ref_ex(variable_ptr, value, value_type, strict, &garbage); - ZVAL_COPY(second_variable_ptr, value); - if (garbage) { - GC_DTOR_NO_REF(garbage); - } - return value; + return zend_assign_to_typed_ref_twice(variable_ptr, value, value_type, strict, second_variable_ptr); } variable_ptr = Z_REFVAL_P(variable_ptr); @@ -201,7 +194,7 @@ static zend_always_inline zval* zend_assign_to_variable_twice(zval *variable_ptr break; } } - garbage = Z_COUNTED_P(variable_ptr); + zend_refcounted *garbage = Z_COUNTED_P(variable_ptr); zend_copy_to_variable(variable_ptr, value, value_type); ZVAL_COPY(second_variable_ptr, variable_ptr); GC_DTOR_NO_REF(garbage); From a00f5aeca5493ad5769a19e5336a8f83ff808d06 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Wed, 28 Jun 2023 20:54:06 +0200 Subject: [PATCH 7/7] Move more to _twice, maybe a bit extreme but let's see what the performance is --- Zend/zend_vm_def.h | 41 ++- Zend/zend_vm_execute.h | 772 +++++++++++++++++++++++++---------------- 2 files changed, 504 insertions(+), 309 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0f2bab73f589..6320e3036ede 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2381,7 +2381,6 @@ ZEND_VM_HANDLER(24, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); @@ -2411,13 +2410,21 @@ ZEND_VM_C_LABEL(assign_object): zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - ZEND_VM_C_GOTO(free_and_exit_assign_obj); + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + ZEND_VM_C_GOTO(free_op_data_and_exit_assign_obj); } else { ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable_ex(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); } ZEND_VM_C_GOTO(exit_assign_obj); } @@ -2497,11 +2504,9 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj): if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +ZEND_VM_C_LABEL(free_op_data_and_exit_assign_obj): FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): - if (garbage) { - GC_DTOR_NO_REF(garbage); - } FREE_OP2(); FREE_OP1(); /* assign_obj has two opcodes! */ @@ -2514,7 +2519,6 @@ ZEND_VM_HANDLER(25, ZEND_ASSIGN_STATIC_PROP, ANY, ANY, CACHE_SLOT, SPEC(OP_DATA= USE_OPLINE zval *prop, *value; zend_property_info *prop_info; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); @@ -2527,18 +2531,21 @@ ZEND_VM_HANDLER(25, ZEND_ASSIGN_STATIC_PROP, ANY, ANY, CACHE_SLOT, SPEC(OP_DATA= value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC); FREE_OP_DATA(); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } } else { - value = zend_assign_to_variable_ex(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(prop, EX_VAR(opline->result.var), value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } } /* assign_static_prop has two opcodes! */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 564454e3a653..1f50ca14cbbe 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -927,7 +927,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT USE_OPLINE zval *prop, *value; zend_property_info *prop_info; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); @@ -940,18 +939,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } } else { - value = zend_assign_to_variable_ex(prop, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(prop, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } } /* assign_static_prop has two opcodes! */ @@ -963,7 +965,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT USE_OPLINE zval *prop, *value; zend_property_info *prop_info; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); @@ -976,18 +977,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } } else { - value = zend_assign_to_variable_ex(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(prop, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } } /* assign_static_prop has two opcodes! */ @@ -999,7 +1003,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT USE_OPLINE zval *prop, *value; zend_property_info *prop_info; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); @@ -1012,18 +1015,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } } else { - value = zend_assign_to_variable_ex(prop, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(prop, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } } /* assign_static_prop has two opcodes! */ @@ -1035,7 +1041,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT USE_OPLINE zval *prop, *value; zend_property_info *prop_info; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); @@ -1048,18 +1053,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } } else { - value = zend_assign_to_variable_ex(prop, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - - if (garbage) { - GC_DTOR_NO_REF(garbage); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + value = zend_assign_to_variable_twice(prop, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } } /* assign_static_prop has two opcodes! */ @@ -23303,7 +23311,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -23333,13 +23340,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -23419,11 +23434,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23437,7 +23450,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -23467,13 +23479,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -23553,11 +23573,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23571,7 +23589,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -23601,13 +23618,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -23687,11 +23712,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -23705,7 +23728,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -23735,13 +23757,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -23821,11 +23851,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26199,7 +26227,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -26229,13 +26256,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -26315,11 +26350,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26333,7 +26366,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -26363,13 +26395,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -26449,11 +26489,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26467,7 +26505,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -26497,13 +26534,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -26583,11 +26628,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -26601,7 +26644,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -26631,13 +26673,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -26717,11 +26767,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30475,7 +30523,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -30505,13 +30552,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -30591,11 +30646,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30609,7 +30662,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -30639,13 +30691,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -30725,11 +30785,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30743,7 +30801,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -30773,13 +30830,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -30859,11 +30924,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -30877,7 +30940,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC); @@ -30907,13 +30969,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -30993,11 +31063,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); /* assign_obj has two opcodes! */ @@ -33100,7 +33168,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -33130,13 +33197,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -33216,11 +33291,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -33234,7 +33307,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -33264,13 +33336,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -33350,11 +33430,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -33368,7 +33446,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -33398,13 +33475,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -33484,11 +33569,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -33502,7 +33585,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -33532,13 +33614,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -33618,11 +33708,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -35132,7 +35220,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -35162,13 +35249,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -35248,11 +35343,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35266,7 +35359,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -35296,13 +35388,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -35382,11 +35482,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35400,7 +35498,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -35430,13 +35527,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -35516,11 +35621,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -35534,7 +35637,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -35564,13 +35666,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -35650,11 +35760,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -37622,7 +37730,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -37652,13 +37759,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -37738,11 +37853,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -37756,7 +37869,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -37786,13 +37898,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -37872,11 +37992,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -37890,7 +38008,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -37920,13 +38037,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -38006,11 +38131,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -38024,7 +38147,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = &EX(This); @@ -38054,13 +38176,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -38140,11 +38270,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -41896,7 +42024,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -41926,13 +42053,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -42012,11 +42147,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42030,7 +42163,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -42060,13 +42192,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -42146,11 +42286,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42164,7 +42302,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -42194,13 +42331,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -42280,11 +42425,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -42298,7 +42441,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -42328,13 +42470,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -42414,11 +42564,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -45727,7 +45875,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -45757,13 +45904,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -45843,11 +45998,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -45861,7 +46014,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -45891,13 +46043,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -45977,11 +46137,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -45995,7 +46153,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -46025,13 +46182,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -46111,11 +46276,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -46129,7 +46292,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -46159,13 +46321,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -46245,11 +46415,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); /* assign_obj has two opcodes! */ @@ -51076,7 +51244,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -51106,13 +51273,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CONST, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -51192,11 +51367,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51210,7 +51383,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -51240,13 +51412,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -51326,11 +51506,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51344,7 +51522,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -51374,13 +51551,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -51460,11 +51645,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */ @@ -51478,7 +51661,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval *object, *value, tmp; zend_object *zobj; zend_string *name, *tmp_name; - zend_refcounted *garbage = NULL; SAVE_OPLINE(); object = EX_VAR(opline->op1.var); @@ -51508,13 +51690,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zend_refcounted *garbage = NULL; value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC); - goto free_and_exit_assign_obj; + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { + ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); + } + if (garbage) { + GC_DTOR_NO_REF(garbage); + } + goto free_op_data_and_exit_assign_obj; } else { fast_assign_obj: - value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + value = zend_assign_to_variable_twice(property_val, EX_VAR(opline->result.var), value, IS_CV, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); } goto exit_assign_obj; } @@ -51594,11 +51784,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) { ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value); } +free_op_data_and_exit_assign_obj: exit_assign_obj: - if (garbage) { - GC_DTOR_NO_REF(garbage); - } /* assign_obj has two opcodes! */