ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMP|VAR|CV, ANY, TYPE)
+ZEND_VM_HANDLER(123, ZEND_TYPE_CHECK, CONST|TMP|VAR|CV, ANY, TYPE_MASK)
{
USE_OPLINE
zval *value;
int result = 0;
zend_free_op free_op1;
- SAVE_OPLINE();
- value = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- 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)) {
- result = 1;
- }
- } else {
+ value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) {
+ZEND_VM_C_LABEL(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 if (UNEXPECTED(opline->extended_value == _IS_BOOL) &&
- EXPECTED(Z_TYPE_P(value) == IS_TRUE || Z_TYPE_P(value) == IS_FALSE)) {
- result = 1;
+ } else if ((OP1_TYPE & (IS_CV|IS_VAR)) && Z_ISREF_P(value)) {
+ value = Z_REFVAL_P(value);
+ if ((1 << (uint32_t)Z_TYPE_P(value) & opline->extended_value)) {
+ ZEND_VM_C_GOTO(type_check_resource);
+ }
+ } else if (OP1_TYPE == 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 (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ SAVE_OPLINE();
+ 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();
}
- FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_HANDLER(122, ZEND_DEFINED, CONST, ANY)
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)) {
- result = 1;
- }
- } else {
+ 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 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|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 (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();
+ 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)
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)) {
- result = 1;
- }
- } else {
+ 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 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|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 (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();
}
- 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();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
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)) {
- result = 1;
- }
- } else {
+ 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 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|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 (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();
}
- 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();
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
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)) {
- result = 1;
- }
- } else {
+ 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 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|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 (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();
+ 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)