Declare array|int and object-of-class|int types in stubs

Closes GH-6081

Co-Authored-By: Nikita Popov <nikic@php.net>
This commit is contained in:
Máté Kocsis 2020-09-14 11:59:32 +02:00
parent 1c81a34563
commit 46c0c82a0f
No known key found for this signature in database
GPG Key ID: FD055E41728BF310
29 changed files with 463 additions and 279 deletions

View File

@ -221,15 +221,21 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_error(int error_code,
case ZPP_ERROR_WRONG_CLASS_OR_NULL:
zend_wrong_parameter_class_or_null_error(num, name, arg);
break;
case ZPP_ERROR_WRONG_ARG:
zend_wrong_parameter_type_error(num, expected_type, arg);
break;
case ZPP_ERROR_WRONG_CLASS_OR_STRING:
zend_wrong_parameter_class_or_string_error(num, name, arg);
break;
case ZPP_ERROR_WRONG_CLASS_OR_STRING_OR_NULL:
zend_wrong_parameter_class_or_string_or_null_error(num, name, arg);
break;
case ZPP_ERROR_WRONG_CLASS_OR_LONG:
zend_wrong_parameter_class_or_long_error(num, name, arg);
break;
case ZPP_ERROR_WRONG_CLASS_OR_LONG_OR_NULL:
zend_wrong_parameter_class_or_long_or_null_error(num, name, arg);
break;
case ZPP_ERROR_WRONG_ARG:
zend_wrong_parameter_type_error(num, expected_type, arg);
break;
case ZPP_ERROR_UNEXPECTED_EXTRA_NAMED:
zend_unexpected_extra_named_error();
break;
@ -280,6 +286,26 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_null_error(u
}
/* }}} */
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_long_error(uint32_t num, const char *name, zval *arg) /* {{{ */
{
if (EG(exception)) {
return;
}
zend_argument_type_error(num, "must be of type %s|int, %s given", name, zend_zval_type_name(arg));
}
/* }}} */
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_long_or_null_error(uint32_t num, const char *name, zval *arg) /* {{{ */
{
if (EG(exception)) {
return;
}
zend_argument_type_error(num, "must be of type %s|int|null, %s given", name, zend_zval_type_name(arg));
}
/* }}} */
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_string_error(uint32_t num, const char *name, zval *arg) /* {{{ */
{
if (EG(exception)) {

View File

@ -1209,6 +1209,8 @@ static zend_always_inline zval *zend_try_array_init(zval *zv)
_(Z_EXPECTED_STRING_OR_NULL, "of type ?string") \
_(Z_EXPECTED_ARRAY, "of type array") \
_(Z_EXPECTED_ARRAY_OR_NULL, "of type ?array") \
_(Z_EXPECTED_ARRAY_OR_LONG, "of type array|int") \
_(Z_EXPECTED_ARRAY_OR_LONG_OR_NULL, "of type array|int|null") \
_(Z_EXPECTED_ITERABLE, "of type iterable") \
_(Z_EXPECTED_ITERABLE_OR_NULL, "of type ?iterable") \
_(Z_EXPECTED_FUNC, "a valid callback") \
@ -1248,6 +1250,8 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_error(int error_code,
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(uint32_t num, zend_expected_type expected_type, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_null_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_long_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_long_or_null_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_string_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_string_or_null_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(uint32_t num, char *error);
@ -1261,11 +1265,13 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define ZPP_ERROR_WRONG_CALLBACK 2
#define ZPP_ERROR_WRONG_CLASS 3
#define ZPP_ERROR_WRONG_CLASS_OR_NULL 4
#define ZPP_ERROR_WRONG_ARG 5
#define ZPP_ERROR_WRONG_COUNT 6
#define ZPP_ERROR_WRONG_CLASS_OR_STRING 7
#define ZPP_ERROR_WRONG_CLASS_OR_STRING_OR_NULL 8
#define ZPP_ERROR_UNEXPECTED_EXTRA_NAMED 9
#define ZPP_ERROR_WRONG_CLASS_OR_STRING 5
#define ZPP_ERROR_WRONG_CLASS_OR_STRING_OR_NULL 6
#define ZPP_ERROR_WRONG_CLASS_OR_LONG 7
#define ZPP_ERROR_WRONG_CLASS_OR_LONG_OR_NULL 8
#define ZPP_ERROR_WRONG_ARG 9
#define ZPP_ERROR_WRONG_COUNT 10
#define ZPP_ERROR_UNEXPECTED_EXTRA_NAMED 11
#define ZEND_PARSE_PARAMETERS_START_EX(flags, min_num_args, max_num_args) do { \
const int _flags = (flags); \
@ -1675,6 +1681,21 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_OBJ_OF_CLASS_OR_NULL(dest, _ce) \
Z_PARAM_OBJ_OF_CLASS_EX(dest, _ce, 1, 0)
#define Z_PARAM_OBJ_OF_CLASS_OR_LONG_EX(dest_obj, _ce, dest_long, is_null, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
if (UNEXPECTED(!zend_parse_arg_obj_or_long(_arg, &dest_obj, _ce, &dest_long, &is_null, allow_null))) { \
_error = ZSTR_VAL((_ce)->name); \
_error_code = allow_null ? ZPP_ERROR_WRONG_CLASS_OR_LONG_OR_NULL : ZPP_ERROR_WRONG_CLASS_OR_LONG; \
break; \
}
#define Z_PARAM_OBJ_OF_CLASS_OR_LONG(dest_obj, _ce, dest_long) \
Z_PARAM_OBJ_OF_CLASS_OR_LONG_EX(dest_obj, _ce, dest_long, _dummy, 0)
#define Z_PARAM_OBJ_OF_CLASS_OR_LONG_OR_NULL(dest_obj, _ce, dest_long, is_null) \
Z_PARAM_OBJ_OF_CLASS_OR_LONG_EX(dest_obj, _ce, dest_long, is_null, 1)
/* old "p" */
#define Z_PARAM_PATH_EX2(dest, dest_len, check_null, deref, separate) \
Z_PARAM_PROLOGUE(deref, separate); \
@ -2028,6 +2049,29 @@ static zend_always_inline bool zend_parse_arg_array_ht(zval *arg, HashTable **de
return 1;
}
static zend_always_inline bool zend_parse_arg_array_ht_or_long(
zval *arg, HashTable **dest_ht, zend_long *dest_long, zend_bool *is_null, bool allow_null
) {
if (allow_null) {
*is_null = 0;
}
if (EXPECTED(Z_TYPE_P(arg) == IS_ARRAY)) {
*dest_ht = Z_ARRVAL_P(arg);
} else if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
*dest_ht = NULL;
*dest_long = Z_LVAL_P(arg);
} else if (allow_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
*dest_ht = NULL;
*is_null = 1;
} else {
*dest_ht = NULL;
return zend_parse_arg_long_slow(arg, dest_long);
}
return 1;
}
static zend_always_inline bool zend_parse_arg_object(zval *arg, zval **dest, zend_class_entry *ce, bool check_null)
{
if (EXPECTED(Z_TYPE_P(arg) == IS_OBJECT) &&
@ -2054,6 +2098,29 @@ static zend_always_inline bool zend_parse_arg_obj(zval *arg, zend_object **dest,
return 1;
}
static zend_always_inline bool zend_parse_arg_obj_or_long(
zval *arg, zend_object **dest_obj, zend_class_entry *ce, zend_long *dest_long, zend_bool *is_null, bool allow_null
) {
if (allow_null) {
*is_null = 0;
}
if (EXPECTED(Z_TYPE_P(arg) == IS_OBJECT) && EXPECTED(instanceof_function(Z_OBJCE_P(arg), ce) != 0)) {
*dest_obj = Z_OBJ_P(arg);
} else if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
*dest_obj = NULL;
*dest_long = Z_LVAL_P(arg);
} else if (allow_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
*dest_obj = NULL;
*is_null = 1;
} else {
*dest_obj = NULL;
return zend_parse_arg_long_slow(arg, dest_long);
}
return 1;
}
static zend_always_inline bool zend_parse_arg_resource(zval *arg, zval **dest, bool check_null)
{
if (EXPECTED(Z_TYPE_P(arg) == IS_RESOURCE)) {

View File

@ -524,31 +524,31 @@ PHP_FUNCTION(filter_has_var)
}
/* }}} */
static void php_filter_call(zval *filtered, zend_long filter, zval *filter_args, const int copy, zend_long filter_flags) /* {{{ */
{
static void php_filter_call(
zval *filtered, zend_long filter, HashTable *filter_args_ht, zend_long filter_args_long,
const int copy, zend_long filter_flags
) /* {{{ */ {
zval *options = NULL;
zval *option;
char *charset = NULL;
if (filter_args && Z_TYPE_P(filter_args) != IS_ARRAY) {
zend_long lval = zval_get_long(filter_args);
if (!filter_args_ht) {
if (filter != -1) { /* handler for array apply */
/* filter_args is the filter_flags */
filter_flags = lval;
filter_flags = filter_args_long;
if (!(filter_flags & FILTER_REQUIRE_ARRAY || filter_flags & FILTER_FORCE_ARRAY)) {
filter_flags |= FILTER_REQUIRE_SCALAR;
}
} else {
filter = lval;
filter = filter_args_long;
}
} else if (filter_args) {
if ((option = zend_hash_str_find(Z_ARRVAL_P(filter_args), "filter", sizeof("filter") - 1)) != NULL) {
} else {
if ((option = zend_hash_str_find(filter_args_ht, "filter", sizeof("filter") - 1)) != NULL) {
filter = zval_get_long(option);
}
if ((option = zend_hash_str_find(Z_ARRVAL_P(filter_args), "flags", sizeof("flags") - 1)) != NULL) {
if ((option = zend_hash_str_find(filter_args_ht, "flags", sizeof("flags") - 1)) != NULL) {
filter_flags = zval_get_long(option);
if (!(filter_flags & FILTER_REQUIRE_ARRAY || filter_flags & FILTER_FORCE_ARRAY)) {
@ -556,7 +556,7 @@ static void php_filter_call(zval *filtered, zend_long filter, zval *filter_args,
}
}
if ((option = zend_hash_str_find_deref(Z_ARRVAL_P(filter_args), "options", sizeof("options") - 1)) != NULL) {
if ((option = zend_hash_str_find_deref(filter_args_ht, "options", sizeof("options") - 1)) != NULL) {
if (filter != FILTER_CALLBACK) {
if (Z_TYPE_P(option) == IS_ARRAY) {
options = option;
@ -601,21 +601,19 @@ static void php_filter_call(zval *filtered, zend_long filter, zval *filter_args,
}
/* }}} */
static void php_filter_array_handler(zval *input, zval *op, zval *return_value, zend_bool add_empty) /* {{{ */
{
static void php_filter_array_handler(zval *input, HashTable *op_ht, zend_long op_long,
zval *return_value, zend_bool add_empty
) /* {{{ */ {
zend_string *arg_key;
zval *tmp, *arg_elm;
if (!op) {
if (!op_ht) {
ZVAL_DUP(return_value, input);
php_filter_call(return_value, FILTER_DEFAULT, NULL, 0, FILTER_REQUIRE_ARRAY);
} else if (Z_TYPE_P(op) == IS_LONG) {
ZVAL_DUP(return_value, input);
php_filter_call(return_value, Z_LVAL_P(op), NULL, 0, FILTER_REQUIRE_ARRAY);
} else if (Z_TYPE_P(op) == IS_ARRAY) {
php_filter_call(return_value, -1, NULL, op_long, 0, FILTER_REQUIRE_ARRAY);
} else {
array_init(return_value);
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(op), arg_key, arg_elm) {
ZEND_HASH_FOREACH_STR_KEY_VAL(op_ht, arg_key, arg_elm) {
if (arg_key == NULL) {
zend_argument_type_error(2, "must contain only string keys");
RETURN_THROWS();
@ -632,12 +630,14 @@ static void php_filter_array_handler(zval *input, zval *op, zval *return_value,
zval nval;
ZVAL_DEREF(tmp);
ZVAL_DUP(&nval, tmp);
php_filter_call(&nval, -1, arg_elm, 0, FILTER_REQUIRE_SCALAR);
php_filter_call(&nval, -1,
Z_TYPE_P(arg_elm) == IS_ARRAY ? Z_ARRVAL_P(arg_elm) : NULL,
Z_TYPE_P(arg_elm) == IS_ARRAY ? 0 : zval_get_long(arg_elm),
0, FILTER_REQUIRE_SCALAR
);
zend_hash_update(Z_ARRVAL_P(return_value), arg_key, &nval);
}
} ZEND_HASH_FOREACH_END();
} else {
RETURN_FALSE;
}
}
/* }}} */
@ -646,15 +646,21 @@ static void php_filter_array_handler(zval *input, zval *op, zval *return_value,
PHP_FUNCTION(filter_input)
{
zend_long fetch_from, filter = FILTER_DEFAULT;
zval *filter_args = NULL, *tmp;
zval *input = NULL;
zval *input = NULL, *tmp;
zend_string *var;
HashTable *filter_args_ht = NULL;
zend_long filter_args_long = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lS|lz", &fetch_from, &var, &filter, &filter_args) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(2, 4)
Z_PARAM_LONG(fetch_from)
Z_PARAM_STR(var)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(filter)
Z_PARAM_ARRAY_HT_OR_LONG(filter_args_ht, filter_args_long)
ZEND_PARSE_PARAMETERS_END();
if (!PHP_FILTER_ID_EXISTS(filter)) {
php_error_docref(NULL, E_WARNING, "Unknown filter with ID " ZEND_LONG_FMT, filter);
RETURN_FALSE;
}
@ -666,16 +672,17 @@ PHP_FUNCTION(filter_input)
if (!input || (tmp = zend_hash_find(Z_ARRVAL_P(input), var)) == NULL) {
zend_long filter_flags = 0;
zval *option, *opt, *def;
if (filter_args) {
if (Z_TYPE_P(filter_args) == IS_LONG) {
filter_flags = Z_LVAL_P(filter_args);
} else if (Z_TYPE_P(filter_args) == IS_ARRAY && (option = zend_hash_str_find(Z_ARRVAL_P(filter_args), "flags", sizeof("flags") - 1)) != NULL) {
if (!filter_args_ht) {
filter_flags = filter_args_long;
} else {
if ((option = zend_hash_str_find(filter_args_ht, "flags", sizeof("flags") - 1)) != NULL) {
filter_flags = zval_get_long(option);
}
if (Z_TYPE_P(filter_args) == IS_ARRAY &&
(opt = zend_hash_str_find_deref(Z_ARRVAL_P(filter_args), "options", sizeof("options") - 1)) != NULL &&
if ((opt = zend_hash_str_find_deref(filter_args_ht, "options", sizeof("options") - 1)) != NULL &&
Z_TYPE_P(opt) == IS_ARRAY &&
(def = zend_hash_str_find_deref(Z_ARRVAL_P(opt), "default", sizeof("default") - 1)) != NULL) {
(def = zend_hash_str_find_deref(Z_ARRVAL_P(opt), "default", sizeof("default") - 1)) != NULL
) {
ZVAL_COPY(return_value, def);
return;
}
@ -695,7 +702,7 @@ PHP_FUNCTION(filter_input)
ZVAL_DUP(return_value, tmp);
php_filter_call(return_value, filter, filter_args, 1, FILTER_REQUIRE_SCALAR);
php_filter_call(return_value, filter, filter_args_ht, filter_args_long, 1, FILTER_REQUIRE_SCALAR);
}
/* }}} */
@ -703,19 +710,25 @@ PHP_FUNCTION(filter_input)
PHP_FUNCTION(filter_var)
{
zend_long filter = FILTER_DEFAULT;
zval *filter_args = NULL, *data;
zval *data;
HashTable *filter_args_ht = NULL;
zend_long filter_args_long = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|lz", &data, &filter, &filter_args) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 3)
Z_PARAM_ZVAL(data)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(filter)
Z_PARAM_ARRAY_HT_OR_LONG(filter_args_ht, filter_args_long)
ZEND_PARSE_PARAMETERS_END();
if (!PHP_FILTER_ID_EXISTS(filter)) {
php_error_docref(NULL, E_WARNING, "Unknown filter with ID " ZEND_LONG_FMT, filter);
RETURN_FALSE;
}
ZVAL_DUP(return_value, data);
php_filter_call(return_value, filter, filter_args, 1, FILTER_REQUIRE_SCALAR);
php_filter_call(return_value, filter, filter_args_ht, filter_args_long, 1, FILTER_REQUIRE_SCALAR);
}
/* }}} */
@ -723,14 +736,20 @@ PHP_FUNCTION(filter_var)
PHP_FUNCTION(filter_input_array)
{
zend_long fetch_from;
zval *array_input = NULL, *op = NULL;
zval *array_input = NULL;
zend_bool add_empty = 1;
HashTable *op_ht = NULL;
zend_long op_long = FILTER_DEFAULT;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|zb", &fetch_from, &op, &add_empty) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 3)
Z_PARAM_LONG(fetch_from)
Z_PARAM_OPTIONAL
Z_PARAM_ARRAY_HT_OR_LONG(op_ht, op_long)
Z_PARAM_BOOL(add_empty)
ZEND_PARSE_PARAMETERS_END();
if (op && (Z_TYPE_P(op) != IS_ARRAY) && !(Z_TYPE_P(op) == IS_LONG && PHP_FILTER_ID_EXISTS(Z_LVAL_P(op)))) {
if (!op_ht && !PHP_FILTER_ID_EXISTS(op_long)) {
php_error_docref(NULL, E_WARNING, "Unknown filter with ID " ZEND_LONG_FMT, op_long);
RETURN_FALSE;
}
@ -742,12 +761,10 @@ PHP_FUNCTION(filter_input_array)
if (!array_input) {
zend_long filter_flags = 0;
zval *option;
if (op) {
if (Z_TYPE_P(op) == IS_LONG) {
filter_flags = Z_LVAL_P(op);
} else if (Z_TYPE_P(op) == IS_ARRAY && (option = zend_hash_str_find(Z_ARRVAL_P(op), "flags", sizeof("flags") - 1)) != NULL) {
filter_flags = zval_get_long(option);
}
if (op_long) {
filter_flags = op_long;
} else if (op_ht && (option = zend_hash_str_find(op_ht, "flags", sizeof("flags") - 1)) != NULL) {
filter_flags = zval_get_long(option);
}
/* The FILTER_NULL_ON_FAILURE flag inverts the usual return values of
@ -762,25 +779,31 @@ PHP_FUNCTION(filter_input_array)
}
}
php_filter_array_handler(array_input, op, return_value, add_empty);
php_filter_array_handler(array_input, op_ht, op_long, return_value, add_empty);
}
/* }}} */
/* {{{ Returns an array with all arguments defined in 'definition'. */
PHP_FUNCTION(filter_var_array)
{
zval *array_input = NULL, *op = NULL;
zval *array_input = NULL;
zend_bool add_empty = 1;
HashTable *op_ht = NULL;
zend_long op_long = FILTER_DEFAULT;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|zb", &array_input, &op, &add_empty) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 3)
Z_PARAM_ARRAY(array_input)
Z_PARAM_OPTIONAL
Z_PARAM_ARRAY_HT_OR_LONG(op_ht, op_long)
Z_PARAM_BOOL(add_empty)
ZEND_PARSE_PARAMETERS_END();
if (op && (Z_TYPE_P(op) != IS_ARRAY) && !(Z_TYPE_P(op) == IS_LONG && PHP_FILTER_ID_EXISTS(Z_LVAL_P(op)))) {
if (!op_ht && !PHP_FILTER_ID_EXISTS(op_long)) {
php_error_docref(NULL, E_WARNING, "Unknown filter with ID " ZEND_LONG_FMT, op_long);
RETURN_FALSE;
}
php_filter_array_handler(array_input, op, return_value, add_empty);
php_filter_array_handler(array_input, op_ht, op_long, return_value, add_empty);
}
/* }}} */

View File

@ -4,17 +4,13 @@
function filter_has_var(int $type, string $variable_name): bool {}
/** @param array|int $options */
function filter_input(int $type, string $variable_name, int $filter = FILTER_DEFAULT, $options = null): mixed {}
function filter_input(int $type, string $variable_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed {}
/** @param array|int $options */
function filter_var(mixed $variable, int $filter = FILTER_DEFAULT, $options = null): mixed {}
function filter_var(mixed $variable, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed {}
/** @param array|int $options */
function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null {}
function filter_input_array(int $type, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null {}
/** @param array|int $options */
function filter_var_array(array $data, $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null {}
function filter_var_array(array $data, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null {}
function filter_list(): array {}

View File

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 54d4bb809e05c73a1a16174bce578377f7cd8f31 */
* Stub hash: dae0cf8beeb47a996123cffd3b429482047d42c1 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_has_var, 0, 2, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
@ -10,24 +10,24 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_input, 0, 2, IS_MIXED, 0)
ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, variable_name, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filter, IS_LONG, 0, "FILTER_DEFAULT")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, options, "null")
ZEND_ARG_TYPE_MASK(0, options, MAY_BE_ARRAY|MAY_BE_LONG, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_var, 0, 1, IS_MIXED, 0)
ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filter, IS_LONG, 0, "FILTER_DEFAULT")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, options, "null")
ZEND_ARG_TYPE_MASK(0, options, MAY_BE_ARRAY|MAY_BE_LONG, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_filter_input_array, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE|MAY_BE_NULL)
ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, options, "FILTER_DEFAULT")
ZEND_ARG_TYPE_MASK(0, options, MAY_BE_ARRAY|MAY_BE_LONG, "FILTER_DEFAULT")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, add_empty, _IS_BOOL, 0, "true")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_filter_var_array, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE|MAY_BE_NULL)
ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, options, "FILTER_DEFAULT")
ZEND_ARG_TYPE_MASK(0, options, MAY_BE_ARRAY|MAY_BE_LONG, "FILTER_DEFAULT")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, add_empty, _IS_BOOL, 0, "true")
ZEND_END_ARG_INFO()

View File

@ -17,7 +17,7 @@ var_dump(filter_var(1, 0, array()));
echo "Done\n";
?>
--EXPECT--
--EXPECTF--
array(7) {
[0]=>
int(1)
@ -55,6 +55,10 @@ array(7) {
string(1) "1"
string(1) "1"
string(1) "1"
Warning: filter_var(): Unknown filter with ID -1 in %s on line %d
bool(false)
Warning: filter_var(): Unknown filter with ID 0 in %s on line %d
bool(false)
Done

View File

@ -14,7 +14,11 @@ ini_set('html_errors', false);
var_dump(filter_input(INPUT_GET, "a", FILTER_SANITIZE_STRIPPED));
var_dump(filter_input(INPUT_GET, "b", FILTER_SANITIZE_URL));
var_dump(filter_input(INPUT_GET, "a", FILTER_SANITIZE_SPECIAL_CHARS, array(1,2,3,4,5)));
var_dump(filter_input(INPUT_GET, "b", FILTER_VALIDATE_FLOAT, new stdClass));
try {
filter_input(INPUT_GET, "b", FILTER_VALIDATE_FLOAT, new stdClass);
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump(filter_input(INPUT_POST, "c", FILTER_SANITIZE_STRIPPED, array(5,6,7,8)));
var_dump(filter_input(INPUT_POST, "d", FILTER_VALIDATE_FLOAT));
var_dump(filter_input(INPUT_POST, "c", FILTER_SANITIZE_SPECIAL_CHARS));
@ -22,13 +26,11 @@ var_dump(filter_input(INPUT_POST, "d", FILTER_VALIDATE_INT));
echo "Done\n";
?>
--EXPECTF--
--EXPECT--
string(4) "test"
string(18) "http://example.com"
string(27) "&#60;b&#62;test&#60;/b&#62;"
Notice: Object of class stdClass could not be converted to int in %s011.php on line %d
bool(false)
filter_input(): Argument #4 ($options) must be of type array|int, stdClass given
string(6) "string"
float(12345.7)
string(29) "&#60;p&#62;string&#60;/p&#62;"

View File

@ -10,20 +10,41 @@ var_dump(filter_var_array(array()));
var_dump(filter_var_array(array(1,"blah"=>"hoho")));
var_dump(filter_var_array(array(), -1));
var_dump(filter_var_array(array(), 1000000));
var_dump(filter_var_array(array(), ""));
try {
filter_var_array(array(), "");
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
echo "-- (2)\n";
var_dump(filter_var_array(array(""=>""), -1));
var_dump(filter_var_array(array(""=>""), 1000000));
var_dump(filter_var_array(array(""=>""), ""));
try {
filter_var_array(array(""=>""), "");
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
echo "-- (3)\n";
var_dump(filter_var_array(array("aaa"=>"bbb"), -1));
var_dump(filter_var_array(array("aaa"=>"bbb"), 1000000));
var_dump(filter_var_array(array("aaa"=>"bbb"), ""));
try {
filter_var_array(array("aaa"=>"bbb"), "");
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
echo "-- (4)\n";
var_dump(filter_var_array(array(), new stdclass));
try {
filter_var_array(array(), new stdclass);
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump(filter_var_array(array(), array()));
var_dump(filter_var_array(array(), array("var_name"=>1)));
var_dump(filter_var_array(array(), array("var_name"=>-1)));
@ -50,12 +71,16 @@ var_dump(filter_var_array($a, $b));
var_dump($a, $b);
$a = array(""=>""); $b = "";
var_dump(filter_var_array($a, $b));
try {
filter_var_array($a, $b);
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump($a, $b);
echo "Done\n";
?>
--EXPECT--
--EXPECTF--
-- (1)
array(0) {
}
@ -65,19 +90,31 @@ array(2) {
["blah"]=>
string(4) "hoho"
}
Warning: filter_var_array(): Unknown filter with ID -1 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 1000000 in %s on line %d
bool(false)
bool(false)
filter_var_array(): Argument #2 ($options) must be of type array|int, string given
-- (2)
Warning: filter_var_array(): Unknown filter with ID -1 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 1000000 in %s on line %d
bool(false)
bool(false)
filter_var_array(): Argument #2 ($options) must be of type array|int, string given
-- (3)
Warning: filter_var_array(): Unknown filter with ID -1 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 1000000 in %s on line %d
bool(false)
bool(false)
filter_var_array(): Argument #2 ($options) must be of type array|int, string given
-- (4)
bool(false)
filter_var_array(): Argument #2 ($options) must be of type array|int, stdClass given
array(0) {
}
array(1) {
@ -95,19 +132,23 @@ array(1) {
-- (5)
filter_var_array(): Argument #2 ($options) cannot contain empty keys
filter_var_array(): Argument #2 ($options) cannot contain empty keys
Warning: filter_var_array(): Unknown filter with ID -1 in %s on line %d
bool(false)
array(1) {
[""]=>
string(0) ""
}
int(-1)
Warning: filter_var_array(): Unknown filter with ID 100000 in %s on line %d
bool(false)
array(1) {
[""]=>
string(0) ""
}
int(100000)
bool(false)
filter_var_array(): Argument #2 ($options) must be of type array|int, string given
array(1) {
[""]=>
string(0) ""

View File

@ -5,20 +5,44 @@ filter_input_array() and filter_var_array() with invalid $definition arguments
--FILE--
<?php
foreach (array(null, true, false, 1, "", new stdClass) as $invalid) {
var_dump(filter_input_array(INPUT_POST, $invalid));
var_dump(filter_var_array(array(), $invalid));
try {
var_dump(filter_input_array(INPUT_POST, $invalid));
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
try {
var_dump(filter_var_array(array(), $invalid));
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
}
?>
--EXPECT--
bool(false)
bool(false)
bool(false)
bool(false)
--EXPECTF--
Warning: filter_input_array(): Unknown filter with ID 0 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 0 in %s on line %d
bool(false)
Warning: filter_input_array(): Unknown filter with ID 1 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 1 in %s on line %d
bool(false)
Warning: filter_input_array(): Unknown filter with ID 0 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 0 in %s on line %d
bool(false)
Warning: filter_input_array(): Unknown filter with ID 1 in %s on line %d
bool(false)
Warning: filter_var_array(): Unknown filter with ID 1 in %s on line %d
bool(false)
filter_input_array(): Argument #2 ($options) must be of type array|int, string given
filter_var_array(): Argument #2 ($options) must be of type array|int, string given
filter_input_array(): Argument #2 ($options) must be of type array|int, stdClass given
filter_var_array(): Argument #2 ($options) must be of type array|int, stdClass given

View File

@ -57,9 +57,9 @@ U_CFUNC void calendar_object_create(zval *object,
calendar_object_construct(object, calendar);
}
U_CFUNC Calendar *calendar_fetch_native_calendar(zval *object)
U_CFUNC Calendar *calendar_fetch_native_calendar(zend_object *object)
{
Calendar_object *co = Z_INTL_CALENDAR_P(object);
Calendar_object *co = php_intl_calendar_fetch_object(object);
return co->ucal;
}

View File

@ -61,14 +61,13 @@ static inline Calendar_object *php_intl_calendar_fetch_object(zend_object *obj)
void calendar_object_create(zval *object, Calendar *calendar);
Calendar *calendar_fetch_native_calendar(zval *object);
Calendar *calendar_fetch_native_calendar(zend_object *object);
void calendar_object_construct(zval *object, Calendar *calendar);
void calendar_register_IntlCalendar_class(void);
extern zend_class_entry *Calendar_ce_ptr,
*GregorianCalendar_ce_ptr;
extern zend_class_entry *Calendar_ce_ptr, *GregorianCalendar_ce_ptr;
extern zend_object_handlers Calendar_handlers;

View File

@ -12,11 +12,10 @@ class IntlDateFormatter
/**
* @param IntlTimeZone|DateTimeZone|string|null $timezone
* @param IntlCalendar|int|null $calendar
* @return IntlDateFormatter|null
* @alias datefmt_create
*/
public static function create(?string $locale, int $datetype, int $timetype, $timezone = null, $calendar = null, string $pattern = "") {}
public static function create(?string $locale, int $datetype, int $timetype, $timezone = null, IntlCalendar|int|null $calendar = null, string $pattern = "") {}
/**
* @return int|false
@ -37,11 +36,10 @@ class IntlDateFormatter
public function getCalendar() {}
/**
* @param IntlCalendar|int|null $which
* @return bool
* @alias datefmt_set_calendar
*/
public function setCalendar($which) {}
public function setCalendar(IntlCalendar|int|null $which) {}
/**
* @return string|false

View File

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 1b018a6b473db965a89c4ce9ebce3133d8d304db */
* Stub hash: 6e7935cd23cd9bba625cf65d08d8e3796f938d74 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter___construct, 0, 0, 3)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1)
@ -10,7 +10,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter___construct, 0, 0, 3)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pattern, IS_STRING, 0, "\"\"")
ZEND_END_ARG_INFO()
#define arginfo_class_IntlDateFormatter_create arginfo_class_IntlDateFormatter___construct
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter_create, 0, 0, 3)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1)
ZEND_ARG_TYPE_INFO(0, datetype, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, timetype, IS_LONG, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, timezone, "null")
ZEND_ARG_OBJ_TYPE_MASK(0, calendar, IntlCalendar, MAY_BE_LONG|MAY_BE_NULL, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pattern, IS_STRING, 0, "\"\"")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter_getDateType, 0, 0, 0)
ZEND_END_ARG_INFO()
@ -20,7 +27,7 @@ ZEND_END_ARG_INFO()
#define arginfo_class_IntlDateFormatter_getCalendar arginfo_class_IntlDateFormatter_getDateType
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter_setCalendar, 0, 0, 1)
ZEND_ARG_INFO(0, which)
ZEND_ARG_OBJ_TYPE_MASK(0, which, IntlCalendar, MAY_BE_LONG|MAY_BE_NULL, NULL)
ZEND_END_ARG_INFO()
#define arginfo_class_IntlDateFormatter_getTimeZoneId arginfo_class_IntlDateFormatter_getDateType

View File

@ -156,12 +156,22 @@ U_CFUNC PHP_FUNCTION(datefmt_get_calendar_object)
/* {{{ Set formatter's calendar. */
U_CFUNC PHP_FUNCTION(datefmt_set_calendar)
{
zval *calendar_zv;
zend_object *calendar_obj;
zend_long calendar_long;
zend_bool calendar_is_null;
DATE_FORMAT_METHOD_INIT_VARS;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oz",
&object, IntlDateFormatter_ce_ptr, &calendar_zv) == FAILURE) {
RETURN_THROWS();
object = getThis();
if (object) {
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_OBJ_OF_CLASS_OR_LONG_OR_NULL(calendar_obj, Calendar_ce_ptr, calendar_long, calendar_is_null)
ZEND_PARSE_PARAMETERS_END();
} else {
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_OBJECT_OF_CLASS(object, IntlDateFormatter_ce_ptr)
Z_PARAM_OBJ_OF_CLASS_OR_LONG_OR_NULL(calendar_obj, Calendar_ce_ptr, calendar_long, calendar_is_null)
ZEND_PARSE_PARAMETERS_END();
}
DATE_FORMAT_METHOD_FETCH_OBJECT;
@ -174,9 +184,9 @@ U_CFUNC PHP_FUNCTION(datefmt_set_calendar)
// because we would have lost modifiers such as @calendar. We
// must store the requested locale on object creation
if (datefmt_process_calendar_arg(calendar_zv, locale,
"datefmt_set_calendar", INTL_DATA_ERROR_P(dfo), cal, cal_type,
cal_owned) == FAILURE) {
if (datefmt_process_calendar_arg(calendar_obj, calendar_long, calendar_is_null, locale,
"datefmt_set_calendar", INTL_DATA_ERROR_P(dfo), cal, cal_type, cal_owned) == FAILURE
) {
RETURN_FALSE;
}

View File

@ -26,6 +26,8 @@ extern "C" {
#include "php_intl.h"
#include "dateformat_create.h"
#include "dateformat_class.h"
#define USE_CALENDAR_POINTER 1
#include "../calendar/calendar_class.h"
#define USE_TIMEZONE_POINTER 1
#include "../timezone/timezone_class.h"
#include "../intl_convert.h"
@ -43,16 +45,18 @@ extern "C" {
UDAT_PATTERN == (i))
/* {{{ */
static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
static zend_result datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
{
zval *object;
const char *locale_str;
char *locale_str;
size_t locale_len = 0;
Locale locale;
zend_long date_type = 0;
zend_long time_type = 0;
zval *calendar_zv = NULL;
Calendar *calendar = NULL;
zend_object *calendar_obj = NULL;
zend_long calendar_long;
zend_bool calendar_is_null = 1;
Calendar *cal = NULL;
zend_long calendar_type;
bool calendar_owned;
zval *timezone_zv = NULL;
@ -66,18 +70,21 @@ static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
intl_error_reset(NULL);
object = return_value;
/* Parse parameters. */
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!ll|zzs",
&locale_str, &locale_len, &date_type, &time_type, &timezone_zv,
&calendar_zv, &pattern_str, &pattern_str_len) == FAILURE) {
return FAILURE;
}
ZEND_PARSE_PARAMETERS_START(3, 6)
Z_PARAM_STRING_OR_NULL(locale_str, locale_len)
Z_PARAM_LONG(date_type)
Z_PARAM_LONG(time_type)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(timezone_zv)
Z_PARAM_OBJ_OF_CLASS_OR_LONG_OR_NULL(calendar_obj, Calendar_ce_ptr, calendar_long, calendar_is_null)
Z_PARAM_STRING_OR_NULL(pattern_str, pattern_str_len)
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
if (DATE_FORMAT_OBJECT(dfo) != NULL) {
intl_errors_set(INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR,
"datefmt_create: cannot call constructor twice", 0);
intl_errors_set(INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: cannot call constructor twice", 0);
return FAILURE;
}
@ -87,20 +94,19 @@ static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
}
if (!INTL_UDATE_FMT_OK(time_type)) {
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: invalid time format style", 0);
return FAILURE;
return FAILURE;
}
INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
if (locale_len == 0) {
locale_str = intl_locale_get_default();
locale_str = (char *) intl_locale_get_default();
}
locale = Locale::createFromName(locale_str);
/* process calendar */
if (datefmt_process_calendar_arg(calendar_zv, locale, "datefmt_create",
INTL_DATA_ERROR_P(dfo), calendar, calendar_type,
calendar_owned)
== FAILURE) {
if (datefmt_process_calendar_arg(calendar_obj, calendar_long, calendar_is_null, locale, "datefmt_create",
INTL_DATA_ERROR_P(dfo), cal, calendar_type, calendar_owned) == FAILURE
) {
goto error;
}
@ -143,10 +149,10 @@ static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
if (!U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
DateFormat *df = (DateFormat*)DATE_FORMAT_OBJECT(dfo);
if (calendar_owned) {
df->adoptCalendar(calendar);
df->adoptCalendar(cal);
calendar_owned = false;
} else {
df->setCalendar(*calendar);
df->setCalendar(*cal);
}
if (timezone != NULL) {
@ -171,8 +177,8 @@ error:
if (timezone != NULL && DATE_FORMAT_OBJECT(dfo) == NULL) {
delete timezone;
}
if (calendar != NULL && calendar_owned) {
delete calendar;
if (cal != NULL && calendar_owned) {
delete cal;
}
return U_FAILURE(intl_error_get_code(NULL)) ? FAILURE : SUCCESS;
@ -183,7 +189,7 @@ error:
U_CFUNC PHP_FUNCTION( datefmt_create )
{
object_init_ex( return_value, IntlDateFormatter_ce_ptr );
if (datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU) == FAILURE) {
if (datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU) == FAILURE) {
zval_ptr_dtor(return_value);
RETURN_NULL();
}

View File

@ -158,7 +158,7 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object)
zend_class_entry *instance_ce = Z_OBJCE_P(object);
if (instanceof_function(instance_ce, Calendar_ce_ptr)) {
Calendar *obj_cal = calendar_fetch_native_calendar(object);
Calendar *obj_cal = calendar_fetch_native_calendar(Z_OBJ_P(object));
if (obj_cal == NULL) {
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
"datefmt_format_object: bad IntlCalendar instance: "

View File

@ -28,28 +28,22 @@ extern "C" {
using icu::GregorianCalendar;
int datefmt_process_calendar_arg(zval* calendar_zv,
Locale const& locale,
const char *func_name,
intl_error *err,
Calendar*& cal,
zend_long& cal_int_type,
bool& calendar_owned)
{
int datefmt_process_calendar_arg(
zend_object *calendar_obj, zend_long calendar_long, zend_bool calendar_is_null, Locale const& locale,
const char *func_name, intl_error *err, Calendar*& cal, zend_long& cal_int_type, bool& calendar_owned
) {
char *msg;
UErrorCode status = UErrorCode();
if (calendar_zv == NULL || Z_TYPE_P(calendar_zv) == IS_NULL) {
if (calendar_is_null) {
// default requested
cal = new GregorianCalendar(locale, status);
calendar_owned = true;
cal_int_type = UCAL_GREGORIAN;
} else if (Z_TYPE_P(calendar_zv) == IS_LONG) {
zend_long v = Z_LVAL_P(calendar_zv);
} else if (!calendar_obj) {
zend_long v = calendar_long;
if (v != (zend_long)UCAL_TRADITIONAL && v != (zend_long)UCAL_GREGORIAN) {
spprintf(&msg, 0, "%s: Invalid value for calendar type; it must be "
"one of IntlDateFormatter::TRADITIONAL (locale's default "
@ -66,12 +60,10 @@ int datefmt_process_calendar_arg(zval* calendar_zv,
}
calendar_owned = true;
cal_int_type = Z_LVAL_P(calendar_zv);
cal_int_type = calendar_long;
} else if (Z_TYPE_P(calendar_zv) == IS_OBJECT &&
instanceof_function(Z_OBJCE_P(calendar_zv), Calendar_ce_ptr)) {
cal = calendar_fetch_native_calendar(calendar_zv);
} else if (calendar_obj) {
cal = calendar_fetch_native_calendar(calendar_obj);
if (cal == NULL) {
spprintf(&msg, 0, "%s: Found unconstructed IntlCalendar object",
func_name);

View File

@ -30,12 +30,9 @@ using icu::Locale;
using icu::Calendar;
using icu::DateFormat;
int datefmt_process_calendar_arg(zval* calendar_zv,
Locale const& locale,
const char *func_name,
intl_error *err,
Calendar*& cal,
zend_long& cal_int_type,
bool& calendar_owned);
int datefmt_process_calendar_arg(
zend_object *calendar_obj, zend_long calendar_long, zend_bool calendar_is_null, Locale const& locale,
const char *func_name, intl_error *err, Calendar*& cal, zend_long& cal_int_type, bool& calendar_owned
);
#endif /* DATEFORMAT_HELPERS_H */

View File

@ -153,11 +153,8 @@ function intl_error_name(int $error_code): string {}
/* dateformat */
/**
* @param IntlTimeZone|DateTimeZone|string|null $timezone
* @param IntlCalendar|int|null $calendar
*/
function datefmt_create(?string $locale, int $datetype, int $timetype, $timezone = null, $calendar = null, string $pattern = ""): ?IntlDateFormatter {}
/** @param IntlTimeZone|DateTimeZone|string|null $timezone */
function datefmt_create(?string $locale, int $datetype, int $timetype, $timezone = null, IntlCalendar|int|null $calendar = null, string $pattern = ""): ?IntlDateFormatter {}
function datefmt_get_datetype(IntlDateFormatter $df): int|false {}
@ -165,8 +162,7 @@ function datefmt_get_timetype(IntlDateFormatter $df): int|false {}
function datefmt_get_calendar(IntlDateFormatter $df): int|false {}
/** @param IntlCalendar|int|null $which */
function datefmt_set_calendar(IntlDateFormatter $df, $which): bool {}
function datefmt_set_calendar(IntlDateFormatter $df, IntlCalendar|int|null $which): bool {}
function datefmt_get_timezone_id(IntlDateFormatter $df): string|false {}

View File

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: fdc7c500ddc5bc560ec54b7ce12d5961a4697a63 */
* Stub hash: 324b7ae3eaab4777117c1c6963bc841088e6b998 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_intlcal_create_instance, 0, 0, IntlCalendar, 1)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, timeZone, "null")
@ -281,7 +281,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_datefmt_create, 0, 3, IntlDateFor
ZEND_ARG_TYPE_INFO(0, datetype, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, timetype, IS_LONG, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, timezone, "null")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, calendar, "null")
ZEND_ARG_OBJ_TYPE_MASK(0, calendar, IntlCalendar, MAY_BE_LONG|MAY_BE_NULL, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pattern, IS_STRING, 0, "\"\"")
ZEND_END_ARG_INFO()
@ -295,7 +295,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_datefmt_set_calendar, 0, 2, _IS_BOOL, 0)
ZEND_ARG_OBJ_INFO(0, df, IntlDateFormatter, 0)
ZEND_ARG_INFO(0, which)
ZEND_ARG_OBJ_TYPE_MASK(0, which, IntlCalendar, MAY_BE_LONG|MAY_BE_NULL, NULL)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_datefmt_get_timezone_id, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)

View File

@ -26,7 +26,7 @@ try {
}
try {
var_dump(new IntlDateFormatter(NULL, 0, 0, NULL, new stdclass));
} catch (IntlException $e) {
} catch (TypeError $e) {
print_exception($e);
}
?>
@ -35,4 +35,4 @@ Exception: IntlDateFormatter::__construct(): datefmt_create: No such time zone:
Exception: IntlDateFormatter::__construct(): datefmt_create: Invalid value for calendar type; it must be one of IntlDateFormatter::TRADITIONAL (locale's default calendar) or IntlDateFormatter::GREGORIAN. Alternatively, it can be an IntlCalendar object in %s on line %d
Exception: IntlDateFormatter::__construct(): datefmt_create: Invalid calendar argument; should be an integer or an IntlCalendar instance in %s on line %d
Exception: IntlDateFormatter::__construct(): Argument #5 ($calendar) must be of type IntlCalendar|int|null, stdClass given in %s on line %d

View File

@ -1674,7 +1674,8 @@ PHPAPI void session_adapt_url(const char *url, size_t url_len, char **new_url, s
Set session cookie parameters */
PHP_FUNCTION(session_set_cookie_params)
{
zval *lifetime_or_options = NULL;
HashTable *options_ht;
zend_long lifetime_long;
zend_string *lifetime = NULL, *path = NULL, *domain = NULL, *samesite = NULL;
zend_bool secure = 0, secure_null = 1;
zend_bool httponly = 0, httponly_null = 1;
@ -1687,12 +1688,12 @@ PHP_FUNCTION(session_set_cookie_params)
}
ZEND_PARSE_PARAMETERS_START(1, 5)
Z_PARAM_ZVAL(lifetime_or_options)
Z_PARAM_ARRAY_HT_OR_LONG(options_ht, lifetime_long)
Z_PARAM_OPTIONAL
Z_PARAM_STR(path)
Z_PARAM_STR(domain)
Z_PARAM_BOOL_EX(secure, secure_null, 1, 0)
Z_PARAM_BOOL_EX(httponly, httponly_null, 1, 0)
Z_PARAM_STR_OR_NULL(path)
Z_PARAM_STR_OR_NULL(domain)
Z_PARAM_BOOL_OR_NULL(secure, secure_null)
Z_PARAM_BOOL_OR_NULL(httponly, httponly_null)
ZEND_PARSE_PARAMETERS_END();
if (PS(session_status) == php_session_active) {
@ -1705,20 +1706,31 @@ PHP_FUNCTION(session_set_cookie_params)
RETURN_FALSE;
}
if (Z_TYPE_P(lifetime_or_options) == IS_ARRAY) {
if (options_ht) {
zend_string *key;
zval *value;
if (path) {
path = NULL;
domain = NULL;
secure_null = 1;
httponly_null = 1;
php_error_docref(NULL, E_WARNING, "Cannot pass arguments after the options array");
RETURN_FALSE;
zend_argument_value_error(2, "must be null when argument #1 ($lifetime_or_options) is an array");
RETURN_THROWS();
}
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(lifetime_or_options), key, value) {
if (domain) {
zend_argument_value_error(3, "must be null when argument #1 ($lifetime_or_options) is an array");
RETURN_THROWS();
}
if (!secure_null) {
zend_argument_value_error(4, "must be null when argument #1 ($lifetime_or_options) is an array");
RETURN_THROWS();
}
if (!httponly_null) {
zend_argument_value_error(5, "must be null when argument #1 ($lifetime_or_options) is an array");
RETURN_THROWS();
}
ZEND_HASH_FOREACH_STR_KEY_VAL(options_ht, key, value) {
if (key) {
ZVAL_DEREF(value);
if(!strcasecmp("lifetime", ZSTR_VAL(key))) {
@ -1754,7 +1766,7 @@ PHP_FUNCTION(session_set_cookie_params)
RETURN_THROWS();
}
} else {
lifetime = zval_get_string(lifetime_or_options);
lifetime = zend_long_to_str(lifetime_long);
}
/* Exception during string conversion */

View File

@ -49,8 +49,7 @@ function session_cache_limiter(?string $cache_limiter = null): string|false {}
function session_cache_expire(?int $new_cache_expire = null): int|false {}
/** @param int|array $lifetime_or_options */
function session_set_cookie_params($lifetime_or_options, string $path = UNKNOWN, string $domain = "", ?bool $secure = null, ?bool $httponly = null): bool {}
function session_set_cookie_params(array|int $lifetime_or_options, ?string $path = null, ?string $domain = null, ?bool $secure = null, ?bool $httponly = null): bool {}
function session_start(array $options = []): bool {}

View File

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 22b829d3cdd092c393c924f323cd19bea1517579 */
* Stub hash: 9bdf602c14822b13553a5214a415e312c21cd30c */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_session_name, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, name, IS_STRING, 1, "null")
@ -78,9 +78,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_session_cache_expire, 0, 0, MAY_
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_session_set_cookie_params, 0, 1, _IS_BOOL, 0)
ZEND_ARG_INFO(0, lifetime_or_options)
ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, domain, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_MASK(0, lifetime_or_options, MAY_BE_ARRAY|MAY_BE_LONG, NULL)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, path, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, domain, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, secure, _IS_BOOL, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, httponly, _IS_BOOL, 1, "null")
ZEND_END_ARG_INFO()

View File

@ -40,7 +40,13 @@ var_dump(session_set_cookie_params(["lifetime" => 42]));
var_dump(ini_get("session.cookie_lifetime"));
var_dump(ini_get("session.cookie_path"));
var_dump(session_set_cookie_params(["path" => "newpath/"], "arg after options array"));
try {
session_set_cookie_params(["path" => "newpath/"], "arg after options array");
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump(ini_get("session.cookie_path"));
echo "Done";
@ -63,8 +69,6 @@ string(1) "0"
bool(true)
string(2) "42"
string(1) "/"
Warning: session_set_cookie_params(): Cannot pass arguments after the options array in %s on line %d
bool(false)
session_set_cookie_params(): Argument #2 ($path) must be null when argument #1 ($lifetime_or_options) is an array
string(1) "/"
Done

View File

@ -502,11 +502,9 @@ function header(string $string, bool $replace = true, int $http_response_code =
function header_remove(?string $name = null): void {}
/** @param array|int $expires_or_options */
function setrawcookie(string $name, string $value = '', $expires_or_options = 0, string $path = '', string $domain = '', bool $secure = false, bool $httponly = false): bool {}
function setrawcookie(string $name, string $value = '', array|int $expires_or_options = 0, string $path = '', string $domain = '', bool $secure = false, bool $httponly = false): bool {}
/** @param array|int $expires_or_options */
function setcookie(string $name, string $value = '', $expires_or_options = 0, string $path = '', string $domain = '', bool $secure = false, bool $httponly = false): bool {}
function setcookie(string $name, string $value = '', array|int $expires_or_options = 0, string $path = '', string $domain = '', bool $secure = false, bool $httponly = false): bool {}
function http_response_code(int $response_code = 0): int|bool {}
@ -612,11 +610,7 @@ function chunk_split(string $str, int $chunklen = 76, string $ending = "\r\n"):
function substr(string $str, int $start, ?int $length = null): string|false {}
/**
* @param array|int $start
* @param array|int|null $length
*/
function substr_replace(array|string $str, string|array $replace, $start, $length = null): string|array|false {}
function substr_replace(array|string $str, array|string $replace, array|int $start, array|int|null $length = null): string|array|false {}
function quotemeta(string $str): string {}

View File

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 251fc9f272492ab76c4a1a1dabcd768269cf1bde */
* Stub hash: d1bcbdfe71bdc57680abe391d1ef2859538615c2 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@ -746,7 +746,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_setrawcookie, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, value, IS_STRING, 0, "\'\'")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, expires_or_options, "0")
ZEND_ARG_TYPE_MASK(0, expires_or_options, MAY_BE_ARRAY|MAY_BE_LONG, "0")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, path, IS_STRING, 0, "\'\'")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, domain, IS_STRING, 0, "\'\'")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, secure, _IS_BOOL, 0, "false")
@ -935,9 +935,9 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_substr_replace, 0, 3, MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_FALSE)
ZEND_ARG_TYPE_MASK(0, str, MAY_BE_ARRAY|MAY_BE_STRING, NULL)
ZEND_ARG_TYPE_MASK(0, replace, MAY_BE_STRING|MAY_BE_ARRAY, NULL)
ZEND_ARG_INFO(0, start)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, length, "null")
ZEND_ARG_TYPE_MASK(0, replace, MAY_BE_ARRAY|MAY_BE_STRING, NULL)
ZEND_ARG_TYPE_MASK(0, start, MAY_BE_ARRAY|MAY_BE_LONG, NULL)
ZEND_ARG_TYPE_MASK(0, length, MAY_BE_ARRAY|MAY_BE_LONG|MAY_BE_NULL, "null")
ZEND_END_ARG_INFO()
#define arginfo_quotemeta arginfo_base64_encode

View File

@ -192,13 +192,13 @@ PHPAPI zend_result php_setcookie(zend_string *name, zend_string *value, time_t e
return result;
}
static zend_result php_head_parse_cookie_options_array(zval *options, zend_long *expires, zend_string **path,
static zend_result php_head_parse_cookie_options_array(HashTable *options, zend_long *expires, zend_string **path,
zend_string **domain, zend_bool *secure, zend_bool *httponly, zend_string **samesite)
{
zend_string *key;
zval *value;
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(options), key, value) {
ZEND_HASH_FOREACH_STR_KEY_VAL(options, key, value) {
if (!key) {
zend_value_error("%s(): option array cannot have numeric keys", get_active_function_name());
return FAILURE;
@ -225,36 +225,33 @@ static zend_result php_head_parse_cookie_options_array(zval *options, zend_long
static void php_setcookie_common(INTERNAL_FUNCTION_PARAMETERS, bool is_raw)
{
/* to handle overloaded function array|int */
zval *expires_or_options = NULL;
zend_string *name, *value = NULL, *path = NULL, *domain = NULL, *samesite = NULL;
HashTable *options = NULL;
zend_long expires = 0;
zend_string *name, *value = NULL, *path = NULL, *domain = NULL, *samesite = NULL;
zend_bool secure = 0, httponly = 0;
ZEND_PARSE_PARAMETERS_START(1, 7)
Z_PARAM_STR(name)
Z_PARAM_OPTIONAL
Z_PARAM_STR(value)
Z_PARAM_ZVAL(expires_or_options)
Z_PARAM_ARRAY_HT_OR_LONG(options, expires)
Z_PARAM_STR(path)
Z_PARAM_STR(domain)
Z_PARAM_BOOL(secure)
Z_PARAM_BOOL(httponly)
ZEND_PARSE_PARAMETERS_END();
if (expires_or_options) {
if (Z_TYPE_P(expires_or_options) == IS_ARRAY) {
if (UNEXPECTED(ZEND_NUM_ARGS() > 3)) {
zend_argument_count_error("%s(): Expects exactly 3 arguments when argument #3 "
"($expires_or_options) is an array", get_active_function_name());
RETURN_THROWS();
}
if (FAILURE == php_head_parse_cookie_options_array(expires_or_options, &expires, &path,
&domain, &secure, &httponly, &samesite)) {
goto cleanup;
}
} else {
expires = zval_get_long(expires_or_options);
if (options) {
if (UNEXPECTED(ZEND_NUM_ARGS() > 3)) {
zend_argument_count_error("%s(): Expects exactly 3 arguments when argument #3 "
"($expires_or_options) is an array", get_active_function_name());
RETURN_THROWS();
}
if (FAILURE == php_head_parse_cookie_options_array(options, &expires, &path,
&domain, &secure, &httponly, &samesite)
) {
goto cleanup;
}
}
@ -264,7 +261,7 @@ static void php_setcookie_common(INTERNAL_FUNCTION_PARAMETERS, bool is_raw)
RETVAL_FALSE;
}
if (expires_or_options && Z_TYPE_P(expires_or_options) == IS_ARRAY) {
if (options) {
cleanup:
if (path) {
zend_string_release(path);

View File

@ -2237,8 +2237,11 @@ PHP_FUNCTION(substr_replace)
{
zend_string *str, *repl_str;
HashTable *str_ht, *repl_ht;
zval *from;
zval *len = NULL;
HashTable *from_ht;
zend_long from_long;
HashTable *len_ht = NULL;
zend_long len_long;
zend_bool len_is_null = 1;
zend_long l = 0;
zend_long f;
zend_string *result;
@ -2248,39 +2251,26 @@ PHP_FUNCTION(substr_replace)
ZEND_PARSE_PARAMETERS_START(3, 4)
Z_PARAM_ARRAY_HT_OR_STR(str_ht, str)
Z_PARAM_ARRAY_HT_OR_STR(repl_ht, repl_str)
Z_PARAM_ZVAL(from)
Z_PARAM_ARRAY_HT_OR_LONG(from_ht, from_long)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL_OR_NULL(len)
Z_PARAM_ARRAY_HT_OR_LONG_OR_NULL(len_ht, len_long, len_is_null)
ZEND_PARSE_PARAMETERS_END();
if (Z_TYPE_P(from) != IS_ARRAY) {
convert_to_long_ex(from);
if (EG(exception)) {
RETURN_THROWS();
}
}
if (len) {
if (Z_TYPE_P(len) != IS_ARRAY) {
convert_to_long_ex(len);
l = Z_LVAL_P(len);
}
} else {
if (len_is_null) {
if (str) {
l = ZSTR_LEN(str);
}
} else if (!len_ht) {
l = len_long;
}
if (str) {
if (
(!len && Z_TYPE_P(from) == IS_ARRAY) ||
(len && Z_TYPE_P(from) != Z_TYPE_P(len))
) {
if ((len_is_null && from_ht) || (!len_is_null && (from_ht == NULL) != (len_ht == NULL))) {
php_error_docref(NULL, E_WARNING, "'start' and 'length' should be of same type - numerical or array ");
RETURN_STR_COPY(str);
}
if (len && Z_TYPE_P(from) == IS_ARRAY) {
if (zend_hash_num_elements(Z_ARRVAL_P(from)) != zend_hash_num_elements(Z_ARRVAL_P(len))) {
if (!len_is_null && from_ht) {
if (zend_hash_num_elements(from_ht) != zend_hash_num_elements(len_ht)) {
php_error_docref(NULL, E_WARNING, "'start' and 'length' should have the same number of elements");
RETURN_STR_COPY(str);
}
@ -2288,8 +2278,8 @@ PHP_FUNCTION(substr_replace)
}
if (str) {
if (Z_TYPE_P(from) != IS_ARRAY) {
f = Z_LVAL_P(from);
if (!from_ht) {
f = from_long;
/* if "from" position is negative, count start position from the end
* of the string
@ -2364,15 +2354,15 @@ PHP_FUNCTION(substr_replace)
zend_string *tmp_orig_str;
zend_string *orig_str = zval_get_tmp_string(tmp_str, &tmp_orig_str);
if (Z_TYPE_P(from) == IS_ARRAY) {
while (from_idx < Z_ARRVAL_P(from)->nNumUsed) {
tmp_from = &Z_ARRVAL_P(from)->arData[from_idx].val;
if (from_ht) {
while (from_idx < from_ht->nNumUsed) {
tmp_from = &from_ht->arData[from_idx].val;
if (Z_TYPE_P(tmp_from) != IS_UNDEF) {
break;
}
from_idx++;
}
if (from_idx < Z_ARRVAL_P(from)->nNumUsed) {
if (from_idx < from_ht->nNumUsed) {
f = zval_get_long(tmp_from);
if (f < 0) {
@ -2388,7 +2378,7 @@ PHP_FUNCTION(substr_replace)
f = 0;
}
} else {
f = Z_LVAL_P(from);
f = from_long;
if (f < 0) {
f = (zend_long)ZSTR_LEN(orig_str) + f;
if (f < 0) {
@ -2399,22 +2389,22 @@ PHP_FUNCTION(substr_replace)
}
}
if (len && Z_TYPE_P(len) == IS_ARRAY) {
while (len_idx < Z_ARRVAL_P(len)->nNumUsed) {
tmp_len = &Z_ARRVAL_P(len)->arData[len_idx].val;
if (len_ht) {
while (len_idx < len_ht->nNumUsed) {
tmp_len = &len_ht->arData[len_idx].val;
if (Z_TYPE_P(tmp_len) != IS_UNDEF) {
break;
}
len_idx++;
}
if (len_idx < Z_ARRVAL_P(len)->nNumUsed) {
if (len_idx < len_ht->nNumUsed) {
l = zval_get_long(tmp_len);
len_idx++;
} else {
l = ZSTR_LEN(orig_str);
}
} else if (len) {
l = Z_LVAL_P(len);
} else if (!len_is_null) {
l = len_long;
} else {
l = ZSTR_LEN(orig_str);
}