|
|
|
@ -3303,6 +3303,40 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_COALESCE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
|
|
|
|
zval *value; |
|
|
|
int is_ref = 0; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = opline->op1.zv; |
|
|
|
|
|
|
|
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(value)) { |
|
|
|
is_ref = 1; |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
} |
|
|
|
|
|
|
|
if (Z_TYPE_P(value) > IS_NULL) { |
|
|
|
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); |
|
|
|
if (IS_CONST == IS_CONST) { |
|
|
|
if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { |
|
|
|
zval_copy_ctor_func(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
} else if (IS_CONST == IS_CV) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
} else if (IS_CONST == IS_VAR && is_ref) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
|
|
|
|
} |
|
|
|
ZEND_VM_JMP(opline->op2.jmp_addr); |
|
|
|
} |
|
|
|
|
|
|
|
CHECK_EXCEPTION(); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
@ -10040,6 +10074,41 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_COALESCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
zend_free_op free_op1; |
|
|
|
zval *value; |
|
|
|
int is_ref = 0; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); |
|
|
|
|
|
|
|
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(value)) { |
|
|
|
is_ref = 1; |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
} |
|
|
|
|
|
|
|
if (Z_TYPE_P(value) > IS_NULL) { |
|
|
|
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); |
|
|
|
if (IS_TMP_VAR == IS_CONST) { |
|
|
|
if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { |
|
|
|
zval_copy_ctor_func(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
} else if (IS_TMP_VAR == IS_CV) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
} else if (IS_TMP_VAR == IS_VAR && is_ref) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
zval_dtor(free_op1.var); |
|
|
|
} |
|
|
|
ZEND_VM_JMP(opline->op2.jmp_addr); |
|
|
|
} |
|
|
|
|
|
|
|
zval_dtor(free_op1.var); |
|
|
|
CHECK_EXCEPTION(); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
@ -16910,6 +16979,41 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_COALESCE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
zend_free_op free_op1; |
|
|
|
zval *value; |
|
|
|
int is_ref = 0; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); |
|
|
|
|
|
|
|
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(value)) { |
|
|
|
is_ref = 1; |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
} |
|
|
|
|
|
|
|
if (Z_TYPE_P(value) > IS_NULL) { |
|
|
|
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); |
|
|
|
if (IS_VAR == IS_CONST) { |
|
|
|
if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { |
|
|
|
zval_copy_ctor_func(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
} else if (IS_VAR == IS_CV) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
} else if (IS_VAR == IS_VAR && is_ref) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
zval_ptr_dtor_nogc(free_op1.var); |
|
|
|
} |
|
|
|
ZEND_VM_JMP(opline->op2.jmp_addr); |
|
|
|
} |
|
|
|
|
|
|
|
zval_ptr_dtor_nogc(free_op1.var); |
|
|
|
CHECK_EXCEPTION(); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
@ -34099,6 +34203,40 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_COALESCE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
|
|
|
|
zval *value; |
|
|
|
int is_ref = 0; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); |
|
|
|
|
|
|
|
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) { |
|
|
|
is_ref = 1; |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
} |
|
|
|
|
|
|
|
if (Z_TYPE_P(value) > IS_NULL) { |
|
|
|
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); |
|
|
|
if (IS_CV == IS_CONST) { |
|
|
|
if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { |
|
|
|
zval_copy_ctor_func(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
} else if (IS_CV == IS_CV) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
} else if (IS_CV == IS_VAR && is_ref) { |
|
|
|
if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); |
|
|
|
|
|
|
|
} |
|
|
|
ZEND_VM_JMP(opline->op2.jmp_addr); |
|
|
|
} |
|
|
|
|
|
|
|
CHECK_EXCEPTION(); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
|
|
|
|
static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
@ -47722,6 +47860,31 @@ void zend_init_opcodes_handlers(void) |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CONST_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CONST_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CONST_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CONST_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CONST_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_TMP_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_TMP_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_TMP_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_TMP_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_TMP_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_VAR_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_VAR_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_VAR_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_VAR_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_VAR_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_NULL_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CV_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CV_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CV_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CV_HANDLER, |
|
|
|
ZEND_COALESCE_SPEC_CV_HANDLER, |
|
|
|
ZEND_NULL_HANDLER |
|
|
|
}; |
|
|
|
zend_opcode_handlers = (opcode_handler_t*)labels; |
|
|
|
|