summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 4a69cabded..7c8621fe64 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -758,6 +758,11 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv
zend_verify_arg_error(zf, arg_num, "be callable", "", zend_zval_type_name(arg), "");
return 0;
}
+ } else if (cur_arg_info->type_hint == IS_ITERABLE) {
+ if (!zend_is_iterable(arg)) {
+ zend_verify_arg_error(zf, arg_num, "be iterable", "", zend_zval_type_name(arg), "");
+ return 0;
+ }
} else if (cur_arg_info->type_hint == _IS_BOOL &&
EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) {
/* pass */
@@ -849,6 +854,11 @@ static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t a
zend_verify_arg_error(zf, arg_num, "be callable", "", zend_zval_type_name(arg), "");
return 0;
}
+ } else if (cur_arg_info->type_hint == IS_ITERABLE) {
+ if (!zend_is_iterable(arg)) {
+ zend_verify_arg_error(zf, arg_num, "be iterable", "", zend_zval_type_name(arg), "");
+ return 0;
+ }
} else if (cur_arg_info->type_hint == _IS_BOOL &&
EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) {
/* pass */
@@ -966,6 +976,11 @@ static int zend_verify_internal_return_type(zend_function *zf, zval *ret)
zend_verify_internal_return_error(zf, "be callable", "", zend_zval_type_name(ret), "");
return 0;
}
+ } else if (ret_info->type_hint == IS_ITERABLE) {
+ if (!zend_is_iterable(ret) && (Z_TYPE_P(ret) != IS_NULL || !ret_info->allow_null)) {
+ zend_verify_internal_return_error(zf, "be iterable", "", zend_zval_type_name(ret), "");
+ return 0;
+ }
} else if (ret_info->type_hint == _IS_BOOL &&
EXPECTED(Z_TYPE_P(ret) == IS_FALSE || Z_TYPE_P(ret) == IS_TRUE)) {
/* pass */
@@ -1028,6 +1043,10 @@ static zend_always_inline void zend_verify_return_type(zend_function *zf, zval *
if (!zend_is_callable(ret, IS_CALLABLE_CHECK_SILENT, NULL)) {
zend_verify_return_error(zf, "be callable", "", zend_zval_type_name(ret), "");
}
+ } else if (ret_info->type_hint == IS_ITERABLE) {
+ if (!zend_is_iterable(ret)) {
+ zend_verify_return_error(zf, "be iterable", "", zend_zval_type_name(ret), "");
+ }
} else if (ret_info->type_hint == _IS_BOOL &&
EXPECTED(Z_TYPE_P(ret) == IS_FALSE || Z_TYPE_P(ret) == IS_TRUE)) {
/* pass */
@@ -1069,6 +1088,8 @@ static ZEND_COLD int zend_verify_missing_return_type(zend_function *zf, void **c
return 0;
} else if (ret_info->type_hint == IS_CALLABLE) {
zend_verify_return_error(zf, "be callable", "", "none", "");
+ } else if (ret_info->type_hint == IS_ITERABLE) {
+ zend_verify_return_error(zf, "be iterable", "", "none", "");
} else {
zend_verify_return_error(zf, "be of the type ", zend_get_type_by_const(ret_info->type_hint), "none", "");
}