{
USE_OPLINE
- SAVE_OPLINE();
if (OP1_TYPE == IS_UNUSED) {
+ SAVE_OPLINE();
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
+ HANDLE_EXCEPTION();
} else {
/* prevents "undefined variable opline" errors */
#if !ZEND_VM_SPEC || (OP1_TYPE != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
retval_ref = retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE == IS_CONST) {
ZVAL_DEREF(retval_ptr);
}
- if (UNEXPECTED((ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_ANY)
- && !ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ zend_reference *ref = NULL;
+ void *cache_slot = CACHE_ADDR(opline->op2.num);
+ if (UNEXPECTED(retval_ref != retval_ptr)) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ ref = Z_REF_P(retval_ref);
} else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
+ } else {
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
+ }
+ retval_ptr = retval_ref;
}
- retval_ptr = retval_ref;
}
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ zend_verify_return_error(EX(func), cache_slot, retval_ptr);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
#endif
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
- SAVE_OPLINE();
if (IS_CONST == IS_UNUSED) {
+ SAVE_OPLINE();
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
+ HANDLE_EXCEPTION();
} else {
/* prevents "undefined variable opline" errors */
#if 0 || (IS_CONST != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
retval_ref = retval_ptr = RT_CONSTANT(opline, opline->op1);
if (IS_CONST == IS_CONST) {
ZVAL_DEREF(retval_ptr);
}
- if (UNEXPECTED((ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_ANY)
- && !ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ zend_reference *ref = NULL;
+ void *cache_slot = CACHE_ADDR(opline->op2.num);
+ if (UNEXPECTED(retval_ref != retval_ptr)) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ ref = Z_REF_P(retval_ref);
} else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
+ } else {
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
+ }
+ retval_ptr = retval_ref;
}
- retval_ptr = retval_ref;
}
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ zend_verify_return_error(EX(func), cache_slot, retval_ptr);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
#endif
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- SAVE_OPLINE();
if (IS_TMP_VAR == IS_UNUSED) {
+ SAVE_OPLINE();
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
+ HANDLE_EXCEPTION();
} else {
/* prevents "undefined variable opline" errors */
#if 0 || (IS_TMP_VAR != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
retval_ref = retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_CONST) {
ZVAL_DEREF(retval_ptr);
}
- if (UNEXPECTED((ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_ANY)
- && !ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ zend_reference *ref = NULL;
+ void *cache_slot = CACHE_ADDR(opline->op2.num);
+ if (UNEXPECTED(retval_ref != retval_ptr)) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ ref = Z_REF_P(retval_ref);
} else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
+ } else {
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
+ }
+ retval_ptr = retval_ref;
}
- retval_ptr = retval_ref;
}
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ zend_verify_return_error(EX(func), cache_slot, retval_ptr);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
#endif
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- SAVE_OPLINE();
if (IS_VAR == IS_UNUSED) {
+ SAVE_OPLINE();
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
+ HANDLE_EXCEPTION();
} else {
/* prevents "undefined variable opline" errors */
#if 0 || (IS_VAR != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
retval_ref = retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
if (IS_VAR == IS_CONST) {
ZVAL_DEREF(retval_ptr);
}
- if (UNEXPECTED((ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_ANY)
- && !ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ zend_reference *ref = NULL;
+ void *cache_slot = CACHE_ADDR(opline->op2.num);
+ if (UNEXPECTED(retval_ref != retval_ptr)) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ ref = Z_REF_P(retval_ref);
} else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
+ } else {
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
+ }
+ retval_ptr = retval_ref;
}
- retval_ptr = retval_ref;
}
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ zend_verify_return_error(EX(func), cache_slot, retval_ptr);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
#endif
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- SAVE_OPLINE();
if (IS_UNUSED == IS_UNUSED) {
+ SAVE_OPLINE();
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
+ HANDLE_EXCEPTION();
} else {
/* prevents "undefined variable opline" errors */
#if 0 || (IS_UNUSED != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
retval_ref = retval_ptr = NULL;
if (IS_UNUSED == IS_CONST) {
ZVAL_DEREF(retval_ptr);
}
- if (UNEXPECTED((ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_ANY)
- && !ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ zend_reference *ref = NULL;
+ void *cache_slot = CACHE_ADDR(opline->op2.num);
+ if (UNEXPECTED(retval_ref != retval_ptr)) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ ref = Z_REF_P(retval_ref);
} else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
+ } else {
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
+ }
+ retval_ptr = retval_ref;
}
- retval_ptr = retval_ref;
}
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ zend_verify_return_error(EX(func), cache_slot, retval_ptr);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
#endif
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- SAVE_OPLINE();
if (IS_CV == IS_UNUSED) {
+ SAVE_OPLINE();
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
+ HANDLE_EXCEPTION();
} else {
/* prevents "undefined variable opline" errors */
#if 0 || (IS_CV != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
-
retval_ref = retval_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_CONST) {
ZVAL_DEREF(retval_ptr);
}
- if (UNEXPECTED((ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_ANY)
- && !ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr))
- && !(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && retval_ref != retval_ptr)
- ) {
- /* A cast might happen - unwrap the reference if this is a by-value return */
- if (Z_REFCOUNT_P(retval_ref) == 1) {
- ZVAL_UNREF(retval_ref);
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ zend_reference *ref = NULL;
+ void *cache_slot = CACHE_ADDR(opline->op2.num);
+ if (UNEXPECTED(retval_ref != retval_ptr)) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ ref = Z_REF_P(retval_ref);
} else {
- Z_DELREF_P(retval_ref);
- ZVAL_COPY(retval_ref, retval_ptr);
+ /* A cast might happen - unwrap the reference if this is a by-value return */
+ if (Z_REFCOUNT_P(retval_ref) == 1) {
+ ZVAL_UNREF(retval_ref);
+ } else {
+ Z_DELREF_P(retval_ref);
+ ZVAL_COPY(retval_ref, retval_ptr);
+ }
+ retval_ptr = retval_ref;
}
- retval_ptr = retval_ref;
}
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ zend_verify_return_error(EX(func), cache_slot, retval_ptr);
+ HANDLE_EXCEPTION();
+ }
+ ZEND_VM_NEXT_OPCODE();
#endif
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)