summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 00b8076b3d..68bee582c1 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -230,6 +230,16 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(int num,
}
/* }}} */
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_null_error(int num, const char *name, zval *arg) /* {{{ */
+{
+ if (EG(exception)) {
+ return;
+ }
+
+ zend_argument_type_error(num, "must be of type ?%s, %s given", name, zend_zval_type_name(arg));
+}
+/* }}} */
+
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int num, char *error) /* {{{ */
{
if (EG(exception)) {
@@ -530,7 +540,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (!zend_parse_arg_long(arg, p, is_null, check_null)) {
- return "int";
+ return check_null ? "?int" : "int";
}
}
break;
@@ -545,7 +555,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (!zend_parse_arg_double(arg, p, is_null, check_null)) {
- return "float";
+ return check_null ? "?float" : "float";
}
}
break;
@@ -555,7 +565,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
zval **p = va_arg(*va, zval **);
if (!zend_parse_arg_number(arg, p, check_null)) {
- return "number";
+ return check_null ? "int|float|null" : "int|float";
}
}
break;
@@ -565,7 +575,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
char **p = va_arg(*va, char **);
size_t *pl = va_arg(*va, size_t *);
if (!zend_parse_arg_string(arg, p, pl, check_null)) {
- return "string";
+ return check_null ? "?string" : "string";
}
}
break;
@@ -575,7 +585,9 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
char **p = va_arg(*va, char **);
size_t *pl = va_arg(*va, size_t *);
if (!zend_parse_arg_path(arg, p, pl, check_null)) {
- zend_spprintf(error, 0, "a valid path, %s given", zend_zval_type_name(arg));
+ zend_spprintf(error, 0, "a valid path%s, %s given",
+ check_null ? " or null" : "", zend_zval_type_name(arg)
+ );
return "";
}
}
@@ -585,7 +597,9 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
{
zend_string **str = va_arg(*va, zend_string **);
if (!zend_parse_arg_path_str(arg, str, check_null)) {
- zend_spprintf(error, 0, "a valid path, %s given", zend_zval_type_name(arg));
+ zend_spprintf(error, 0, "a valid path%s, %s given",
+ check_null ? " or null" : "", zend_zval_type_name(arg)
+ );
return "";
}
}
@@ -595,7 +609,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
{
zend_string **str = va_arg(*va, zend_string **);
if (!zend_parse_arg_str(arg, str, check_null)) {
- return "string";
+ return check_null ? "?string" : "string";
}
}
break;
@@ -610,7 +624,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (!zend_parse_arg_bool(arg, p, is_null, check_null)) {
- return "bool";
+ return check_null ? "?bool" : "bool";
}
}
break;
@@ -620,7 +634,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
zval **p = va_arg(*va, zval **);
if (!zend_parse_arg_resource(arg, p, check_null)) {
- return "resource";
+ return check_null ? "resource or null" : "resource";
}
}
break;
@@ -631,7 +645,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
zval **p = va_arg(*va, zval **);
if (!zend_parse_arg_array(arg, p, check_null, c == 'A')) {
- return "array";
+ return check_null ? "?array" : "array";
}
}
break;
@@ -642,7 +656,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
HashTable **p = va_arg(*va, HashTable **);
if (!zend_parse_arg_array_ht(arg, p, check_null, c == 'H', separate)) {
- return "array";
+ return check_null ? "?array" : "array";
}
}
break;
@@ -652,7 +666,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
zval **p = va_arg(*va, zval **);
if (!zend_parse_arg_object(arg, p, NULL, check_null)) {
- return "object";
+ return check_null ? "?object" : "object";
}
}
break;
@@ -664,9 +678,14 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
if (!zend_parse_arg_object(arg, p, ce, check_null)) {
if (ce) {
- return ZSTR_VAL(ce->name);
+ if (check_null) {
+ zend_spprintf(error, 0, "of type ?%s, %s given", ZSTR_VAL(ce->name), zend_zval_type_name(arg));
+ return "";
+ } else {
+ return ZSTR_VAL(ce->name);
+ }
} else {
- return "object";
+ return check_null ? "?object" : "object";
}
}
}
@@ -683,7 +702,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (!try_convert_to_string(arg)) {
*pce = NULL;
- return "a valid class name";
+ return ""; /* try_convert_to_string() throws an exception */
}
if ((lookup = zend_lookup_class(Z_STR_P(arg))) == NULL) {
@@ -693,15 +712,15 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (ce_base) {
if ((!*pce || !instanceof_function(*pce, ce_base))) {
- zend_spprintf(error, 0, "a class name derived from %s, '%s' given",
- ZSTR_VAL(ce_base->name), Z_STRVAL_P(arg));
+ zend_spprintf(error, 0, "a class name derived from %s%s, '%s' given",
+ ZSTR_VAL(ce_base->name), check_null ? " or null" : "", Z_STRVAL_P(arg));
*pce = NULL;
return "";
}
}
if (!*pce) {
- zend_spprintf(error, 0, "a valid class name, '%s' given",
- Z_STRVAL_P(arg));
+ zend_spprintf(error, 0, "a valid class name%s, '%s' given",
+ check_null ? " or null" : "", Z_STRVAL_P(arg));
return "";
}
break;
@@ -727,11 +746,11 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
}
if (is_callable_error) {
- zend_spprintf(error, 0, "a valid callback, %s", is_callable_error);
+ zend_spprintf(error, 0, "a valid callback%s, %s", check_null ? " or null" : "", is_callable_error);
efree(is_callable_error);
return "";
} else {
- return "a valid callback";
+ return check_null ? "a valid callback or null" : "a valid callback";
}
}