|
|
|
@ -4055,26 +4055,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CONST_HANDLER( |
|
|
|
int result = 0; |
|
|
|
|
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = RT_CONSTANT(opline, opline->op1); |
|
|
|
if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) { |
|
|
|
if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) { |
|
|
|
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value)); |
|
|
|
|
|
|
|
if (EXPECTED(type_name != NULL)) { |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
type_check_resource: |
|
|
|
if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE) |
|
|
|
|| EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) { |
|
|
|
result = 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
result = 1; |
|
|
|
} else if ((IS_CONST & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) { |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
goto type_check_resource; |
|
|
|
} |
|
|
|
} else if (UNEXPECTED(opline->extended_value == _IS_BOOL) && |
|
|
|
EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) { |
|
|
|
result = 1; |
|
|
|
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { |
|
|
|
result = ((1 << IS_NULL) & opline->extended_value) != 0; |
|
|
|
SAVE_OPLINE(); |
|
|
|
GET_OP1_UNDEF_CV(value, BP_VAR_R); |
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} |
|
|
|
if (IS_CONST & (IS_TMP_VAR|IS_VAR)) { |
|
|
|
SAVE_OPLINE(); |
|
|
|
|
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} else { |
|
|
|
ZEND_VM_SMART_BRANCH(result, 0); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
@ -13594,26 +13605,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZE |
|
|
|
int result = 0; |
|
|
|
zend_free_op free_op1; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC); |
|
|
|
if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) { |
|
|
|
if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) { |
|
|
|
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value)); |
|
|
|
|
|
|
|
if (EXPECTED(type_name != NULL)) { |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
type_check_resource: |
|
|
|
if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE) |
|
|
|
|| EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) { |
|
|
|
result = 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
result = 1; |
|
|
|
} else if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) { |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
goto type_check_resource; |
|
|
|
} |
|
|
|
} else if (UNEXPECTED(opline->extended_value == _IS_BOOL) && |
|
|
|
EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) { |
|
|
|
result = 1; |
|
|
|
} else if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { |
|
|
|
result = ((1 << IS_NULL) & opline->extended_value) != 0; |
|
|
|
SAVE_OPLINE(); |
|
|
|
GET_OP1_UNDEF_CV(value, BP_VAR_R); |
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} |
|
|
|
if (IS_TMP_VAR & (IS_TMP_VAR|IS_VAR)) { |
|
|
|
SAVE_OPLINE(); |
|
|
|
zval_ptr_dtor_nogc(free_op1); |
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} else { |
|
|
|
ZEND_VM_SMART_BRANCH(result, 0); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
@ -17658,26 +17680,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZE |
|
|
|
int result = 0; |
|
|
|
zend_free_op free_op1; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC); |
|
|
|
if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) { |
|
|
|
if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) { |
|
|
|
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value)); |
|
|
|
|
|
|
|
if (EXPECTED(type_name != NULL)) { |
|
|
|
value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
type_check_resource: |
|
|
|
if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE) |
|
|
|
|| EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) { |
|
|
|
result = 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
result = 1; |
|
|
|
} else if ((IS_VAR & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) { |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
goto type_check_resource; |
|
|
|
} |
|
|
|
} else if (UNEXPECTED(opline->extended_value == _IS_BOOL) && |
|
|
|
EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) { |
|
|
|
result = 1; |
|
|
|
} else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { |
|
|
|
result = ((1 << IS_NULL) & opline->extended_value) != 0; |
|
|
|
SAVE_OPLINE(); |
|
|
|
GET_OP1_UNDEF_CV(value, BP_VAR_R); |
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} |
|
|
|
if (IS_VAR & (IS_TMP_VAR|IS_VAR)) { |
|
|
|
SAVE_OPLINE(); |
|
|
|
zval_ptr_dtor_nogc(free_op1); |
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} else { |
|
|
|
ZEND_VM_SMART_BRANCH(result, 0); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
@ -34812,26 +34845,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_CV_HANDLER(ZEN |
|
|
|
int result = 0; |
|
|
|
|
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
value = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC); |
|
|
|
if (EXPECTED(Z_TYPE_P(value) == opline->extended_value)) { |
|
|
|
if (UNEXPECTED(Z_TYPE_P(value) == IS_RESOURCE)) { |
|
|
|
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(value)); |
|
|
|
|
|
|
|
if (EXPECTED(type_name != NULL)) { |
|
|
|
value = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC); |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
type_check_resource: |
|
|
|
if (EXPECTED(Z_TYPE_P(value) != IS_RESOURCE) |
|
|
|
|| EXPECTED(NULL != zend_rsrc_list_get_rsrc_type(Z_RES_P(value)))) { |
|
|
|
result = 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
result = 1; |
|
|
|
} else if ((IS_CV & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) { |
|
|
|
value = Z_REFVAL_P(value); |
|
|
|
if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) { |
|
|
|
goto type_check_resource; |
|
|
|
} |
|
|
|
} else if (UNEXPECTED(opline->extended_value == _IS_BOOL) && |
|
|
|
EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) { |
|
|
|
result = 1; |
|
|
|
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { |
|
|
|
result = ((1 << IS_NULL) & opline->extended_value) != 0; |
|
|
|
SAVE_OPLINE(); |
|
|
|
GET_OP1_UNDEF_CV(value, BP_VAR_R); |
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} |
|
|
|
if (IS_CV & (IS_TMP_VAR|IS_VAR)) { |
|
|
|
SAVE_OPLINE(); |
|
|
|
|
|
|
|
ZEND_VM_SMART_BRANCH(result, 1); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); |
|
|
|
} else { |
|
|
|
ZEND_VM_SMART_BRANCH(result, 0); |
|
|
|
ZVAL_BOOL(EX_VAR(opline->result.var), result); |
|
|
|
ZEND_VM_NEXT_OPCODE(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) |
|
|
|
|