mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Avoid references in TMP var
Make sure we deref the OBJ_IS result, because we store it in a TMP
var, which is not allowed to contain references and will cause
assertion failures in the unspecialized VM.
This also partially reverts fd463a9a60
,
which merged the TMP and VAR specializations of COALESCE to work
around this bug.
An alternative would be to change the result type of OBJ_IS back
to VAR.
This commit is contained in:
parent
9e4603f772
commit
1eb706179f
4 changed files with 148 additions and 82 deletions
|
@ -2311,7 +2311,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);
|
ZEND_VM_C_GOTO(fetch_obj_is_copy);
|
||||||
} else {
|
} else {
|
||||||
ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2355,7 +2355,9 @@ ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
ZEND_VM_C_LABEL(fetch_obj_is_copy):
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -7126,7 +7128,7 @@ ZEND_VM_COLD_CONST_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
|
||||||
ZEND_VM_NEXT_OPCODE();
|
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
|
USE_OPLINE
|
||||||
zend_free_op free_op1;
|
zend_free_op free_op1;
|
||||||
|
@ -7136,7 +7138,6 @@ ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
|
||||||
SAVE_OPLINE();
|
SAVE_OPLINE();
|
||||||
value = GET_OP1_ZVAL_PTR(BP_VAR_IS);
|
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|IS_CV)) && Z_ISREF_P(value)) {
|
||||||
if (OP1_TYPE & IS_VAR) {
|
if (OP1_TYPE & IS_VAR) {
|
||||||
ref = value;
|
ref = value;
|
||||||
|
|
|
@ -4282,7 +4282,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CON
|
||||||
SAVE_OPLINE();
|
SAVE_OPLINE();
|
||||||
value = RT_CONSTANT(opline, opline->op1);
|
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|IS_CV)) && Z_ISREF_P(value)) {
|
||||||
if (IS_CONST & IS_VAR) {
|
if (IS_CONST & IS_VAR) {
|
||||||
ref = value;
|
ref = value;
|
||||||
|
@ -5443,7 +5442,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5487,7 +5486,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -7698,7 +7699,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7742,7 +7743,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -10120,7 +10123,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10164,7 +10167,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -13633,47 +13638,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
|
||||||
ZEND_VM_NEXT_OPCODE();
|
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)
|
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||||
{
|
{
|
||||||
USE_OPLINE
|
USE_OPLINE
|
||||||
|
@ -14491,7 +14455,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14535,7 +14499,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -15906,7 +15872,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15950,7 +15916,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -17094,7 +17062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17138,7 +17106,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -18217,6 +18187,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
|
||||||
ZEND_VM_NEXT_OPCODE();
|
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)
|
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||||
{
|
{
|
||||||
USE_OPLINE
|
USE_OPLINE
|
||||||
|
@ -21648,6 +21658,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
|
||||||
ZEND_VM_NEXT_OPCODE();
|
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)
|
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||||
{
|
{
|
||||||
USE_OPLINE
|
USE_OPLINE
|
||||||
|
@ -30756,7 +30806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30800,7 +30850,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -32565,7 +32617,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32609,7 +32661,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -35050,7 +35104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35094,7 +35148,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -37707,7 +37763,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_
|
||||||
SAVE_OPLINE();
|
SAVE_OPLINE();
|
||||||
value = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
|
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|IS_CV)) && Z_ISREF_P(value)) {
|
||||||
if (IS_CV & IS_VAR) {
|
if (IS_CV & IS_VAR) {
|
||||||
ref = value;
|
ref = value;
|
||||||
|
@ -39376,7 +39431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39420,7 +39475,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -42853,7 +42910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42897,7 +42954,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -47895,7 +47954,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
|
||||||
goto fetch_obj_is_copy;
|
goto fetch_obj_is_copy;
|
||||||
} else {
|
} else {
|
||||||
fetch_obj_is_fast_copy:
|
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();
|
ZEND_VM_NEXT_OPCODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47939,7 +47998,9 @@ fetch_obj_is_fast_copy:
|
||||||
|
|
||||||
if (retval != EX_VAR(opline->result.var)) {
|
if (retval != EX_VAR(opline->result.var)) {
|
||||||
fetch_obj_is_copy:
|
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);
|
} while (0);
|
||||||
|
|
||||||
|
@ -52199,8 +52260,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
|
||||||
(void*)&&ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_LABEL,
|
(void*)&&ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_LABEL,
|
||||||
(void*)&&ZEND_BIND_GLOBAL_SPEC_CV_CONST_LABEL,
|
(void*)&&ZEND_BIND_GLOBAL_SPEC_CV_CONST_LABEL,
|
||||||
(void*)&&ZEND_COALESCE_SPEC_CONST_LABEL,
|
(void*)&&ZEND_COALESCE_SPEC_CONST_LABEL,
|
||||||
(void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
|
(void*)&&ZEND_COALESCE_SPEC_TMP_LABEL,
|
||||||
(void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
|
(void*)&&ZEND_COALESCE_SPEC_VAR_LABEL,
|
||||||
(void*)&&ZEND_NULL_LABEL,
|
(void*)&&ZEND_NULL_LABEL,
|
||||||
(void*)&&ZEND_COALESCE_SPEC_CV_LABEL,
|
(void*)&&ZEND_COALESCE_SPEC_CV_LABEL,
|
||||||
(void*)&&ZEND_SPACESHIP_SPEC_CONST_CONST_LABEL,
|
(void*)&&ZEND_SPACESHIP_SPEC_CONST_CONST_LABEL,
|
||||||
|
@ -54773,10 +54834,6 @@ zend_leave_helper_SPEC_LABEL:
|
||||||
VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR)
|
VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR)
|
||||||
ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||||
HYBRID_BREAK();
|
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):
|
HYBRID_CASE(ZEND_STRLEN_SPEC_TMPVAR):
|
||||||
VM_TRACE(ZEND_STRLEN_SPEC_TMPVAR)
|
VM_TRACE(ZEND_STRLEN_SPEC_TMPVAR)
|
||||||
ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||||
|
@ -55179,6 +55236,10 @@ zend_leave_helper_SPEC_LABEL:
|
||||||
VM_TRACE(ZEND_JMP_SET_SPEC_TMP)
|
VM_TRACE(ZEND_JMP_SET_SPEC_TMP)
|
||||||
ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||||
HYBRID_BREAK();
|
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):
|
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_TMP):
|
||||||
VM_TRACE(ZEND_QM_ASSIGN_SPEC_TMP)
|
VM_TRACE(ZEND_QM_ASSIGN_SPEC_TMP)
|
||||||
ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||||
|
@ -55497,6 +55558,10 @@ zend_leave_helper_SPEC_LABEL:
|
||||||
VM_TRACE(ZEND_JMP_SET_SPEC_VAR)
|
VM_TRACE(ZEND_JMP_SET_SPEC_VAR)
|
||||||
ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||||
HYBRID_BREAK();
|
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):
|
HYBRID_CASE(ZEND_QM_ASSIGN_SPEC_VAR):
|
||||||
VM_TRACE(ZEND_QM_ASSIGN_SPEC_VAR)
|
VM_TRACE(ZEND_QM_ASSIGN_SPEC_VAR)
|
||||||
ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
|
||||||
|
@ -59719,8 +59784,8 @@ void zend_vm_init(void)
|
||||||
ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER,
|
ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER,
|
||||||
ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER,
|
ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER,
|
||||||
ZEND_COALESCE_SPEC_CONST_HANDLER,
|
ZEND_COALESCE_SPEC_CONST_HANDLER,
|
||||||
ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
|
ZEND_COALESCE_SPEC_TMP_HANDLER,
|
||||||
ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
|
ZEND_COALESCE_SPEC_VAR_HANDLER,
|
||||||
ZEND_NULL_HANDLER,
|
ZEND_NULL_HANDLER,
|
||||||
ZEND_COALESCE_SPEC_CV_HANDLER,
|
ZEND_COALESCE_SPEC_CV_HANDLER,
|
||||||
ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER,
|
ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER,
|
||||||
|
|
|
@ -1204,8 +1204,8 @@
|
||||||
_(2199, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
|
_(2199, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
|
||||||
_(2200, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
|
_(2200, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
|
||||||
_(2201, ZEND_COALESCE_SPEC_CONST) \
|
_(2201, ZEND_COALESCE_SPEC_CONST) \
|
||||||
_(2202, ZEND_COALESCE_SPEC_TMPVAR) \
|
_(2202, ZEND_COALESCE_SPEC_TMP) \
|
||||||
_(2203, ZEND_COALESCE_SPEC_TMPVAR) \
|
_(2203, ZEND_COALESCE_SPEC_VAR) \
|
||||||
_(2205, ZEND_COALESCE_SPEC_CV) \
|
_(2205, ZEND_COALESCE_SPEC_CV) \
|
||||||
_(2206, ZEND_SPACESHIP_SPEC_CONST_CONST) \
|
_(2206, ZEND_SPACESHIP_SPEC_CONST_CONST) \
|
||||||
_(2207, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
|
_(2207, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
|
||||||
|
|
|
@ -390,7 +390,7 @@ static uint32_t zend_vm_opcodes_flags[195] = {
|
||||||
0x00000003,
|
0x00000003,
|
||||||
0x00000105,
|
0x00000105,
|
||||||
0x00040301,
|
0x00040301,
|
||||||
0x00002007,
|
0x00002003,
|
||||||
0x00000707,
|
0x00000707,
|
||||||
0x00000101,
|
0x00000101,
|
||||||
0x00000103,
|
0x00000103,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue