summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_vm_def.h9
-rw-r--r--Zend/zend_vm_execute.h215
-rw-r--r--Zend/zend_vm_handlers.h4
-rw-r--r--Zend/zend_vm_opcodes.c2
4 files changed, 148 insertions, 82 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index baf4d7dc49..5b3990db41 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2371,7 +2371,7 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
ZEND_VM_C_GOTO(fetch_obj_is_copy);
} else {
ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -2425,7 +2425,9 @@ ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
if (retval != EX_VAR(opline->result.var)) {
ZEND_VM_C_LABEL(fetch_obj_is_copy):
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -7228,7 +7230,7 @@ ZEND_VM_COLD_CONST_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -7238,7 +7240,6 @@ ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- /* FETCH_OBJ_IS may return IS_REFERENCE in TMP_VAR */
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
if (OP1_TYPE & IS_VAR) {
ref = value;
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index b375ecfd0f..cb91266251 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4277,7 +4277,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CON
SAVE_OPLINE();
value = RT_CONSTANT(opline, opline->op1);
- /* FETCH_OBJ_IS may return IS_REFERENCE in TMP_VAR */
if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
if (IS_CONST & IS_VAR) {
ref = value;
@@ -5453,7 +5452,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -5507,7 +5506,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -7730,7 +7731,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -7784,7 +7785,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -10171,7 +10174,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -10225,7 +10228,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -13693,47 +13698,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *value;
- zval *ref = NULL;
-
- SAVE_OPLINE();
- value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-
- /* FETCH_OBJ_IS may return IS_REFERENCE in TMP_VAR */
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
- if ((IS_TMP_VAR|IS_VAR) & IS_VAR) {
- ref = value;
- }
- value = Z_REFVAL_P(value);
- }
-
- if (Z_TYPE_P(value) > IS_NULL) {
- zval *result = EX_VAR(opline->result.var);
- ZVAL_COPY_VALUE(result, value);
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
- } else if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
- if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
- } else if (((IS_TMP_VAR|IS_VAR) & IS_VAR) && ref) {
- zend_reference *r = Z_REF_P(ref);
-
- if (UNEXPECTED(GC_DELREF(r) == 0)) {
- efree_size(r, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(result)) {
- Z_ADDREF_P(result);
- }
- }
- ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
- }
-
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -14566,7 +14530,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -14620,7 +14584,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -16020,7 +15986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -16074,7 +16040,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -17247,7 +17215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -17301,7 +17269,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -18402,6 +18372,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value;
+ zval *ref = NULL;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ if (IS_TMP_VAR & IS_VAR) {
+ ref = value;
+ }
+ value = Z_REFVAL_P(value);
+ }
+
+ if (Z_TYPE_P(value) > IS_NULL) {
+ zval *result = EX_VAR(opline->result.var);
+ ZVAL_COPY_VALUE(result, value);
+ if (IS_TMP_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
+ } else if (IS_TMP_VAR == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
+ } else if ((IS_TMP_VAR & IS_VAR) && ref) {
+ zend_reference *r = Z_REF_P(ref);
+
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
+ efree_size(r, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(result)) {
+ Z_ADDREF_P(result);
+ }
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -21842,6 +21852,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value;
+ zval *ref = NULL;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ if (IS_VAR & IS_VAR) {
+ ref = value;
+ }
+ value = Z_REFVAL_P(value);
+ }
+
+ if (Z_TYPE_P(value) > IS_NULL) {
+ zval *result = EX_VAR(opline->result.var);
+ ZVAL_COPY_VALUE(result, value);
+ if (IS_VAR == IS_CONST) {
+ if (UNEXPECTED(Z_OPT_REFCOUNTED_P(result))) Z_ADDREF_P(result);
+ } else if (IS_VAR == IS_CV) {
+ if (Z_OPT_REFCOUNTED_P(result)) Z_ADDREF_P(result);
+ } else if ((IS_VAR & IS_VAR) && ref) {
+ zend_reference *r = Z_REF_P(ref);
+
+ if (UNEXPECTED(GC_DELREF(r) == 0)) {
+ efree_size(r, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(result)) {
+ Z_ADDREF_P(result);
+ }
+ }
+ ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31381,7 +31431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -31435,7 +31485,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -33353,7 +33405,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -33407,7 +33459,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -35996,7 +36050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -36050,7 +36104,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -38765,7 +38821,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_
SAVE_OPLINE();
value = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- /* FETCH_OBJ_IS may return IS_REFERENCE in TMP_VAR */
if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
if (IS_CV & IS_VAR) {
ref = value;
@@ -40494,7 +40549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -40548,7 +40603,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -44139,7 +44196,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -44193,7 +44250,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -49351,7 +49410,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
goto fetch_obj_is_copy;
} else {
fetch_obj_is_fast_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
ZEND_VM_NEXT_OPCODE();
}
}
@@ -49405,7 +49464,9 @@ fetch_obj_is_fast_copy:
if (retval != EX_VAR(opline->result.var)) {
fetch_obj_is_copy:
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
@@ -53763,8 +53824,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_LABEL,
(void*)&&ZEND_BIND_GLOBAL_SPEC_CV_CONST_LABEL,
(void*)&&ZEND_COALESCE_SPEC_CONST_LABEL,
- (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
+ (void*)&&ZEND_COALESCE_SPEC_TMP_LABEL,
+ (void*)&&ZEND_COALESCE_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COALESCE_SPEC_CV_LABEL,
(void*)&&ZEND_SPACESHIP_SPEC_CONST_CONST_LABEL,
@@ -56337,10 +56398,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR)
ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_COALESCE_SPEC_TMPVAR):
- VM_TRACE(ZEND_COALESCE_SPEC_TMPVAR)
- ZEND_COALESCE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_STRLEN_SPEC_TMPVAR):
VM_TRACE(ZEND_STRLEN_SPEC_TMPVAR)
ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -56743,6 +56800,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_JMP_SET_SPEC_TMP)
ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_COALESCE_SPEC_TMP):
+ VM_TRACE(ZEND_COALESCE_SPEC_TMP)
+ ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_TMP):
VM_TRACE(ZEND_QM_ASSIGN_SPEC_TMP)
ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -57061,6 +57122,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_JMP_SET_SPEC_VAR)
ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_COALESCE_SPEC_VAR):
+ VM_TRACE(ZEND_COALESCE_SPEC_VAR)
+ ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_VAR):
VM_TRACE(ZEND_QM_ASSIGN_SPEC_VAR)
ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -61283,8 +61348,8 @@ void zend_vm_init(void)
ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER,
ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER,
ZEND_COALESCE_SPEC_CONST_HANDLER,
- ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
- ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
+ ZEND_COALESCE_SPEC_TMP_HANDLER,
+ ZEND_COALESCE_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_COALESCE_SPEC_CV_HANDLER,
ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER,
diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h
index 985b5a30bb..903d2044dc 100644
--- a/Zend/zend_vm_handlers.h
+++ b/Zend/zend_vm_handlers.h
@@ -1204,8 +1204,8 @@
_(2199, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
_(2200, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
_(2201, ZEND_COALESCE_SPEC_CONST) \
- _(2202, ZEND_COALESCE_SPEC_TMPVAR) \
- _(2203, ZEND_COALESCE_SPEC_TMPVAR) \
+ _(2202, ZEND_COALESCE_SPEC_TMP) \
+ _(2203, ZEND_COALESCE_SPEC_VAR) \
_(2205, ZEND_COALESCE_SPEC_CV) \
_(2206, ZEND_SPACESHIP_SPEC_CONST_CONST) \
_(2207, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index 7ae64a3224..8929554453 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -390,7 +390,7 @@ static uint32_t zend_vm_opcodes_flags[195] = {
0x00000003,
0x00000105,
0x00040301,
- 0x00002007,
+ 0x00002003,
0x00000707,
0x00000101,
0x00000103,