From ecf14b546306de1494532cb43215714e49e57467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Sun, 24 May 2020 21:37:54 +0200 Subject: [PATCH 1/4] Annotate internal functions with mixed type --- Zend/zend_builtin_functions.stub.php | 9 +- Zend/zend_builtin_functions_arginfo.h | 6 +- Zend/zend_closures.stub.php | 3 +- Zend/zend_closures_arginfo.h | 4 +- Zend/zend_generators.stub.php | 15 +- Zend/zend_generators_arginfo.h | 8 +- build/gen_stub.php | 8 + ext/filter/filter.stub.php | 35 ++-- ext/filter/filter_arginfo.h | 10 +- ext/json/json.stub.php | 5 +- ext/json/json_arginfo.h | 4 +- ext/mysqli/mysqli.stub.php | 3 +- ext/mysqli/mysqli_arginfo.h | 2 +- ext/pdo/pdo_dbh.stub.php | 2 +- ext/reflection/php_reflection.stub.php | 4 +- ext/reflection/php_reflection_arginfo.h | 8 +- ext/standard/basic_functions.stub.php | 233 ++++++++---------------- ext/standard/basic_functions_arginfo.h | 75 ++++---- ext/xmlrpc/xmlrpc.stub.php | 15 +- ext/xmlrpc/xmlrpc_arginfo.h | 10 +- ext/zend_test/test.stub.php | 3 +- ext/zend_test/test_arginfo.h | 2 +- 22 files changed, 183 insertions(+), 281 deletions(-) diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php index 9dfaf64ca5afd..f1b9dbfc5b217 100644 --- a/Zend/zend_builtin_functions.stub.php +++ b/Zend/zend_builtin_functions.stub.php @@ -6,8 +6,7 @@ function zend_version(): string {} function func_num_args(): int {} -/** @return mixed */ -function func_get_arg(int $arg_num) {} +function func_get_arg(int $arg_num): mixed {} function func_get_args(): array {} @@ -69,13 +68,11 @@ function trigger_error(string $message, int $error_type = E_USER_NOTICE): bool { /** @alias trigger_error */ function user_error(string $message, int $error_type = E_USER_NOTICE): bool {} -/** @return mixed */ -function set_error_handler($error_handler, int $error_types = E_ALL) {} +function set_error_handler($error_handler, int $error_types = E_ALL): ?callable {} function restore_error_handler(): bool {} -/** @return mixed */ -function set_exception_handler($exception_handler) {} +function set_exception_handler($exception_handler): ?callable {} function restore_exception_handler(): bool {} diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index 728a76cdee19e..b7ec76a3238ad 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -6,7 +6,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_num_args, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_get_arg, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_get_arg, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, arg_num, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -125,7 +125,7 @@ ZEND_END_ARG_INFO() #define arginfo_user_error arginfo_trigger_error -ZEND_BEGIN_ARG_INFO_EX(arginfo_set_error_handler, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_error_handler, 0, 1, IS_CALLABLE, 1) ZEND_ARG_INFO(0, error_handler) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, error_types, IS_LONG, 0, "E_ALL") ZEND_END_ARG_INFO() @@ -133,7 +133,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_restore_error_handler, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_set_exception_handler, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_exception_handler, 0, 1, IS_CALLABLE, 1) ZEND_ARG_INFO(0, exception_handler) ZEND_END_ARG_INFO() diff --git a/Zend/zend_closures.stub.php b/Zend/zend_closures.stub.php index 75202c5df7795..9cc298eee072a 100644 --- a/Zend/zend_closures.stub.php +++ b/Zend/zend_closures.stub.php @@ -11,8 +11,7 @@ public static function bind(Closure $closure, ?object $newthis, $newscope = UNKN /** @alias Closure::bind */ public function bindTo(?object $newthis, $newscope = UNKNOWN): ?Closure {} - /** @return mixed */ - public function call(object $newthis, ...$parameters) {} + public function call(object $newthis, mixed ...$parameters): mixed {} /** @param callable $callable Not a proper type annotation due to bug #78770 */ public static function fromCallable($callable): Closure {} diff --git a/Zend/zend_closures_arginfo.h b/Zend/zend_closures_arginfo.h index a1eddd7bc1381..85802bbfb4cd7 100644 --- a/Zend/zend_closures_arginfo.h +++ b/Zend/zend_closures_arginfo.h @@ -14,9 +14,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Closure_bindTo, 0, 1, Closu ZEND_ARG_INFO(0, newscope) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure_call, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Closure_call, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, newthis, IS_OBJECT, 0) - ZEND_ARG_VARIADIC_INFO(0, parameters) + ZEND_ARG_VARIADIC_TYPE_INFO(0, parameters, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Closure_fromCallable, 0, 1, Closure, 0) diff --git a/Zend/zend_generators.stub.php b/Zend/zend_generators.stub.php index 5fb485895c596..f2e47616bad1d 100644 --- a/Zend/zend_generators.stub.php +++ b/Zend/zend_generators.stub.php @@ -8,20 +8,15 @@ public function rewind(): void {} public function valid(): bool {} - /** @return mixed */ - public function current() {} + public function current(): mixed {} - /** @return mixed */ - public function key() {} + public function key(): mixed {} public function next(): void {} - /** @return mixed */ - public function send($value) {} + public function send(mixed $value): mixed {} - /** @return mixed */ - public function throw(Throwable $exception) {} + public function throw(Throwable $exception): mixed {} - /** @return mixed */ - public function getReturn() {} + public function getReturn(): mixed {} } diff --git a/Zend/zend_generators_arginfo.h b/Zend/zend_generators_arginfo.h index 214595e580adf..c87ef2c93702a 100644 --- a/Zend/zend_generators_arginfo.h +++ b/Zend/zend_generators_arginfo.h @@ -6,18 +6,18 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_valid, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Generator_current, 0, 0, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_current, 0, 0, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_class_Generator_key arginfo_class_Generator_current #define arginfo_class_Generator_next arginfo_class_Generator_rewind -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Generator_send, 0, 0, 1) - ZEND_ARG_INFO(0, value) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_send, 0, 1, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Generator_throw, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_throw, 0, 1, IS_MIXED, 0) ZEND_ARG_OBJ_INFO(0, exception, Throwable, 0) ZEND_END_ARG_INFO() diff --git a/build/gen_stub.php b/build/gen_stub.php index 484645221915c..806f1db8500dd 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -65,6 +65,10 @@ public function __construct(string $name, bool $isBuiltin) { public static function fromNode(Node $node) { if ($node instanceof Node\Name) { + if ($node->toString() === "mixed") { + return new SimpleType($node->toString(), true); + } + assert($node->isFullyQualified()); return new SimpleType($node->toString(), false); } @@ -97,6 +101,8 @@ public function toTypeCode() { return "IS_VOID"; case "callable": return "IS_CALLABLE"; + case "mixed": + return "IS_MIXED"; default: throw new Exception("Not implemented: $this->name"); } @@ -123,6 +129,8 @@ public function toTypeMask() { return "MAY_BE_OBJECT"; case "callable": return "MAY_BE_CALLABLE"; + case "mixed": + return "MAY_BE_ANY"; default: throw new Exception("Not implemented: $this->name"); } diff --git a/ext/filter/filter.stub.php b/ext/filter/filter.stub.php index 0923b9ba16434..e8e6b0fbdd097 100644 --- a/ext/filter/filter.stub.php +++ b/ext/filter/filter.stub.php @@ -4,30 +4,17 @@ function filter_has_var(int $type, string $variable_name): bool {} -/** - * @param mixed $options - * @return mixed - */ -function filter_input(int $type, string $variable_name, int $filter = FILTER_DEFAULT, $options = null) {} - -/** - * @param mixed $variable - * @param mixed $options - * @return mixed - */ -function filter_var($variable, int $filter = FILTER_DEFAULT, $options = null) {} - -/** - * @param mixed $options - * @return mixed - */ -function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true) {} - -/** - * @param mixed $options - * @return mixed - */ -function filter_var_array(array $data, $options = FILTER_DEFAULT, bool $add_empty = true) {} +/** @param array|int $options */ +function filter_input(int $type, string $variable_name, int $filter = FILTER_DEFAULT, $options = null): mixed {} + +/** @param array|int $options */ +function filter_var(mixed $variable, int $filter = FILTER_DEFAULT, $options = null): mixed {} + +/** @param array|int $options */ +function filter_input_array(int $type, $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_list(): array {} diff --git a/ext/filter/filter_arginfo.h b/ext/filter/filter_arginfo.h index 8e2e2763cd34e..bf615fc847dea 100644 --- a/ext/filter/filter_arginfo.h +++ b/ext/filter/filter_arginfo.h @@ -5,26 +5,26 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_has_var, 0, 2, _IS_BOOL, ZEND_ARG_TYPE_INFO(0, variable_name, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_filter_input, 0, 0, 2) +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_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_filter_var, 0, 0, 1) - ZEND_ARG_INFO(0, variable) +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_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_filter_input_array, 0, 0, 1) +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_INFO_WITH_DEFAULT_VALUE(0, add_empty, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_filter_var_array, 0, 0, 1) +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_INFO_WITH_DEFAULT_VALUE(0, add_empty, _IS_BOOL, 0, "true") diff --git a/ext/json/json.stub.php b/ext/json/json.stub.php index 406bd8a87c869..fc7d2c1569c0f 100644 --- a/ext/json/json.stub.php +++ b/ext/json/json.stub.php @@ -2,10 +2,9 @@ /** @generate-function-entries */ -function json_encode($value, int $options = 0, int $depth = 512): string|false {} +function json_encode(mixed $value, int $options = 0, int $depth = 512): string|false {} -/** @return mixed */ -function json_decode(string $json, ?bool $assoc = null, int $depth = 512, int $options = 0) {} +function json_decode(string $json, ?bool $assoc = null, int $depth = 512, int $options = 0): mixed {} function json_last_error(): int {} diff --git a/ext/json/json_arginfo.h b/ext/json/json_arginfo.h index 3cc3bbbba8f3a..9514abf19f5f6 100644 --- a/ext/json/json_arginfo.h +++ b/ext/json/json_arginfo.h @@ -1,12 +1,12 @@ /* This is a generated file, edit the .stub.php file instead. */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_json_encode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, depth, IS_LONG, 0, "512") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_json_decode, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_json_decode, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, json, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, assoc, _IS_BOOL, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, depth, IS_LONG, 0, "512") diff --git a/ext/mysqli/mysqli.stub.php b/ext/mysqli/mysqli.stub.php index fe581a3723665..9073b6a26da53 100644 --- a/ext/mysqli/mysqli.stub.php +++ b/ext/mysqli/mysqli.stub.php @@ -681,8 +681,7 @@ function mysqli_stmt_attr_get(mysqli_stmt $mysql_stmt, int $attr): int|false {} function mysqli_stmt_attr_set(mysqli_stmt $mysql_stmt, int $attr, int $mode_in): bool {} -/** @param mixed &...$vars */ -function mysqli_stmt_bind_param(mysqli_stmt $mysql_stmt, string $types, &...$vars): bool {} +function mysqli_stmt_bind_param(mysqli_stmt $mysql_stmt, string $types, mixed &...$vars): bool {} /** @param mixed &...$vars */ function mysqli_stmt_bind_result(mysqli_stmt $mysql_stmt, &...$vars): bool {} diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h index f42ce8611f0b6..5f021c798d6b8 100644 --- a/ext/mysqli/mysqli_arginfo.h +++ b/ext/mysqli/mysqli_arginfo.h @@ -298,7 +298,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_bind_param, 0, 2, _IS_BOOL, 0) ZEND_ARG_OBJ_INFO(0, mysql_stmt, mysqli_stmt, 0) ZEND_ARG_TYPE_INFO(0, types, IS_STRING, 0) - ZEND_ARG_VARIADIC_INFO(1, vars) + ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_bind_result, 0, 1, _IS_BOOL, 0) diff --git a/ext/pdo/pdo_dbh.stub.php b/ext/pdo/pdo_dbh.stub.php index e0ecf122ffc55..dec3cea0ea54f 100644 --- a/ext/pdo/pdo_dbh.stub.php +++ b/ext/pdo/pdo_dbh.stub.php @@ -21,7 +21,7 @@ public function errorInfo() {} /** @return int|false */ public function exec(string $statement) {} - /** @return mixed */ + /** @return bool|int|string|array|null */ public function getAttribute(int $attribute) {} /** @return array */ diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php index e629b8d845b25..30627475073b4 100644 --- a/ext/reflection/php_reflection.stub.php +++ b/ext/reflection/php_reflection.stub.php @@ -111,7 +111,7 @@ public function __toString(): string {} public function isDisabled() {} /** @return mixed */ - public function invoke(...$args) {} + public function invoke(mixed ...$args) {} /** @return mixed */ public function invokeArgs(array $args) {} @@ -181,7 +181,7 @@ public function getClosure($object = UNKNOWN) {} public function getModifiers() {} /** @return mixed */ - public function invoke(?object $object = null, ...$args) {} + public function invoke(?object $object = null, mixed ...$args) {} /** @return mixed */ public function invokeArgs(?object $object, array $args) {} diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index 91e9c4cada36d..1e3e9988deee0 100644 --- a/ext/reflection/php_reflection_arginfo.h +++ b/ext/reflection/php_reflection_arginfo.h @@ -67,7 +67,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_ReflectionFunction_isDisabled arginfo_class_ReflectionFunctionAbstract___clone ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction_invoke, 0, 0, 0) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction_invokeArgs, 0, 0, 1) @@ -125,7 +125,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_invoke, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, object, IS_OBJECT, 1, "null") - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_invokeArgs, 0, 0, 2) @@ -221,7 +221,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClass_isInstance, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0) ZEND_END_ARG_INFO() -#define arginfo_class_ReflectionClass_newInstance arginfo_class_ReflectionFunction_invoke +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClass_newInstance, 0, 0, 0) + ZEND_ARG_VARIADIC_INFO(0, args) +ZEND_END_ARG_INFO() #define arginfo_class_ReflectionClass_newInstanceWithoutConstructor arginfo_class_ReflectionFunctionAbstract___clone diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 71b922d7b2e27..30e49cddbab49 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -64,11 +64,11 @@ function krsort(array &$arg, int $sort_flags = SORT_REGULAR): bool {} function ksort(array &$arg, int $sort_flags = SORT_REGULAR): bool {} -/** @param mixed $var */ +/** @param array|object|null $var */ function count($var, int $mode = COUNT_NORMAL): int {} /** - * @param mixed $var + * @param array|object|null $var * @alias count */ function sizeof($var, int $mode = COUNT_NORMAL): int {} @@ -91,34 +91,24 @@ function uasort(array &$arg, callable $cmp_function): bool {} function uksort(array &$arg, callable $cmp_function): bool {} -/** @return mixed */ -function end(array|object &$arg) {} +function end(array|object &$arg): mixed {} -/** @return mixed */ -function prev(array|object &$arg) {} +function prev(array|object &$arg): mixed {} -/** @return mixed */ -function next(array|object &$arg) {} +function next(array|object &$arg): mixed {} -/** @return mixed */ -function reset(array|object &$arg) {} +function reset(array|object &$arg): mixed {} -/** @return mixed */ -function current(array|object $arg) {} +function current(array|object $arg): mixed {} -/** - * @return mixed - * @alias current - */ -function pos(array|object $arg) {} +/** @alias current */ +function pos(array|object $arg): mixed {} function key(array|object $arg): int|string|null {} -/** @return mixed */ -function min($arg, ...$args) {} +function min($arg, mixed ...$args): mixed {} -/** @return mixed */ -function max($arg, ...$args) {} +function max($arg, mixed ...$args): mixed {} function array_walk(array|object &$input, callable $funcname, $userdata = UNKNOWN): bool {} @@ -133,9 +123,9 @@ function extract(array &$arg, int $extract_type = EXTR_OVERWRITE, string $prefix function compact($var_name, ...$var_names): array {} -function array_fill(int $start_key, int $num, $val): array {} +function array_fill(int $start_key, int $num, mixed $val): array {} -function array_fill_keys(array $keys, $val): array {} +function array_fill_keys(array $keys, mixed $val): array {} /** * @param int|float|string $low @@ -146,13 +136,11 @@ function range($low, $high, $step = 1): array {} function shuffle(array &$arg): bool {} -/** @return mixed */ -function array_pop(array &$stack) {} +function array_pop(array &$stack): mixed {} -/** @return mixed */ -function array_shift(array &$stack) {} +function array_shift(array &$stack): mixed {} -function array_unshift(array &$stack, ...$vars): int {} +function array_unshift(array &$stack, mixed ...$vars): int {} function array_splice(array &$arg, int $offset, ?int $length = null, $replacement = []): array {} @@ -180,7 +168,7 @@ function array_column(array $arg, int|string|null $column_key, int|string|null $ function array_reverse(array $input, bool $preserve_keys = false): array {} -function array_pad(array $arg, int $pad_size, $pad_value): array {} +function array_pad(array $arg, int $pad_size, mixed $pad_value): array {} function array_flip(array $arg): array {} @@ -234,21 +222,16 @@ function array_sum(array $arg): int|float {} function array_product(array $arg): int|float {} -/** @return mixed */ -function array_reduce(array $arg, callable $callback, $initial = null) {} +function array_reduce(array $arg, callable $callback, $initial = null): mixed {} function array_filter(array $arg, ?callable $callback = null, int $use_keys = 0): array {} function array_map(?callable $callback, array $arr1, array ...$arrays): array {} -/** @param mixed $key */ -function array_key_exists($key, array $search): bool {} +function array_key_exists(mixed $key, array $search): bool {} -/** - * @param mixed $key - * @alias array_key_exists - */ -function key_exists($key, array $search): bool {} +/** @alias array_key_exists */ +function key_exists(mixed $key, array $search): bool {} function array_chunk(array $arg, int $size, bool $preserve_keys = false): array {} @@ -262,8 +245,7 @@ function base64_decode(string $str, bool $strict = false): string|false {} /* basic_functions.c */ -/** @return mixed */ -function constant(string $name) {} +function constant(string $name): mixed {} function ip2long(string $ip_address): int|false {} @@ -299,29 +281,16 @@ function error_get_last(): ?array {} function error_clear_last(): void {} -/** - * @param mixed ...$args - * @return mixed - */ -function call_user_func(callable $function, ...$args) {} +function call_user_func(callable $function, mixed ...$args): mixed {} -/** @return mixed */ -function call_user_func_array(callable $function, array $args) {} +function call_user_func_array(callable $function, array $args): mixed {} -/** - * @param mixed ...$args - * @return mixed - */ -function forward_static_call(callable $function, ...$args) {} +function forward_static_call(callable $function, mixed ...$args): mixed {} -/** @return mixed */ -function forward_static_call_array(callable $function, array $args) {} +function forward_static_call_array(callable $function, array $args): mixed {} -/** - * @param callable $function - * @param mixed ...$args - */ -function register_shutdown_function($function, ...$args): ?bool {} +/** @param callable $function */ +function register_shutdown_function($function, mixed ...$args): ?bool {} function highlight_file(string $filename, bool $return = false): string|bool|null {} @@ -347,8 +316,7 @@ function set_include_path(string $include_path): string|false {} function get_include_path(): string|false {} -/** @param mixed $var */ -function print_r($var, bool $return = false): string|bool {} +function print_r(mixed $var, bool $return = false): string|bool {} function connection_aborted(): int {} @@ -372,8 +340,7 @@ function getprotobyname(string $name): int|false {} function getprotobynumber(int $protocol): string|false {} #endif -/** @param mixed $args */ -function register_tick_function(callable $function, ...$args): bool {} +function register_tick_function(callable $function, mixed ...$args): bool {} function unregister_tick_function($function): void {} @@ -666,7 +633,7 @@ function hebrev(string $str, int $max_chars_per_line = 0): string {} function nl2br(string $str, bool $is_xhtml = true): string {} -/** @param mixed $allowable_tags */ +/** @param array|string|null $allowable_tags */ function strip_tags(string $str, $allowable_tags = UNKNOWN): string {} /** @@ -812,11 +779,8 @@ function fread($handle, int $length): string|false {} */ function fopen(string $filename, string $mode, bool $use_include_path = false, $context = null) {} -/** - * @param resource $stream - * @param mixed ...$args - */ -function fscanf($stream, string $format, &...$args): array|int|false|null {} +/** @param resource $stream */ +function fscanf($stream, string $format, mixed &...$args): array|int|false|null {} /** @param resource $handle */ function fpassthru($handle): int {} @@ -868,11 +832,8 @@ function file_get_contents(string $filename, bool $use_include_path = false, $co /** @param resource|null $context */ function unlink(string $filename, $context = null): bool {} -/** - * @param mixed $content - * @param resource|null $context - */ -function file_put_contents(string $filename, $content, int $flags = 0, $context = null): int|false {} +/** @param resource|null $context */ +function file_put_contents(string $filename, mixed $content, int $flags = 0, $context = null): int|false {} /** @param resource $handle */ function fputcsv($handle, array $fields, string $delimiter = ",", string $enclosure = "\"", string $escape = "\\"): int|false {} @@ -960,27 +921,22 @@ function realpath_cache_size(): int {} /* formatted_print.c */ -/** @param mixed ...$args */ -function sprintf(string $format, ...$args): string {} +function sprintf(string $format, mixed ...$args): string {} -/** @param mixed ...$args */ -function printf(string $format, ...$args): int {} +function printf(string $format, mixed ...$args): int {} -/** @param mixed $args */ +/** @param array $args */ function vprintf(string $format, $args): int {} -/** @param mixed $args */ +/** @param array $args */ function vsprintf(string $format, $args): string {} -/** - * @param resource $handle - * @param mixed ...$args - */ -function fprintf($handle, string $format, ...$args): int {} +/** @param resource $handle */ +function fprintf($handle, string $format, mixed ...$args): int {} /** * @param resource $handle - * @param mixed $args + * @param array $args */ function vfprintf($handle, string $format, $args): int {} @@ -1098,8 +1054,7 @@ function intdiv(int $dividend, int $divisor): int {} function is_infinite(float $number): bool {} -/** @return mixed */ -function pow($base, $exp) {} +function pow($base, $exp): int|float {} function exp(float $number): float {} @@ -1231,7 +1186,7 @@ function stream_context_get_params($context): array {} * @param array|string $param2 * @param mixed $value */ -function stream_context_set_option($context, $param2, string $option_name = UNKNOWN, $value = UNKNOWN): bool {} +function stream_context_set_option($context, $param2, string $option_name = UNKNOWN, mixed $value = UNKNOWN): bool {} /** @param resource $stream_or_context */ function stream_context_get_options($stream_or_context): array {} @@ -1379,88 +1334,57 @@ function socket_set_timeout($socket, int $seconds, int $microseconds = 0): bool /* type.c */ -/** @param mixed $var */ -function gettype($var): string {} +function gettype(mixed $var): string {} -/** @param mixed $var */ -function get_debug_type($var): string {} +function get_debug_type(mixed $var): string {} function settype(&$var, string $type): bool {} -/** @param mixed $value */ -function intval($value, int $base = 10): int {} +function intval(mixed $value, int $base = 10): int {} -/** @param mixed $value */ -function floatval($value): float {} +function floatval(mixed $value): float {} -/** - * @param mixed $value - * @alias floatval - */ -function doubleval($value): float {} +/** @alias floatval */ +function doubleval(mixed $value): float {} -/** @param mixed $value */ -function boolval($value): bool {} +function boolval(mixed $value): bool {} -/** @param mixed $value */ -function strval($value): string {} +function strval(mixed $value): string {} -/** @param mixed $value */ -function is_null($value): bool {} +function is_null(mixed $value): bool {} -/** @param mixed $value */ -function is_resource($value): bool {} +function is_resource(mixed $value): bool {} -/** @param mixed $value */ -function is_bool($value): bool {} +function is_bool(mixed $value): bool {} -/** @param mixed $value */ -function is_int($value): bool {} +function is_int(mixed $value): bool {} -/** - * @param mixed $value - * @alias is_int - */ -function is_integer($value): bool {} +/** @alias is_int */ +function is_integer(mixed $value): bool {} -/** - * @param mixed $value - * @alias is_int - */ -function is_long($value): bool {} +/** @alias is_int */ +function is_long(mixed $value): bool {} -/** @param mixed $value */ -function is_float($value): bool {} +function is_float(mixed $value): bool {} -/** - * @param mixed $value - * @alias is_float - */ -function is_double($value): bool {} +/** @alias is_float */ +function is_double(mixed $value): bool {} -/** @param mixed $value */ -function is_numeric($value): bool {} +function is_numeric(mixed $value): bool {} -/** @param mixed $value */ -function is_string($value): bool {} +function is_string(mixed $value): bool {} -/** @param mixed $value */ -function is_array($value): bool {} +function is_array(mixed $value): bool {} -/** @param mixed $value */ -function is_object($value): bool {} +function is_object(mixed $value): bool {} -/** @param mixed $value */ -function is_scalar($value): bool {} +function is_scalar(mixed $value): bool {} -/** @param mixed $value */ -function is_callable($value, bool $syntax_only = false, &$callable_name = null): bool {} +function is_callable(mixed $value, bool $syntax_only = false, &$callable_name = null): bool {} -/** @param mixed $value */ -function is_iterable($value): bool {} +function is_iterable(mixed $value): bool {} -/** @param mixed $value */ -function is_countable($value): bool {} +function is_countable(mixed $value): bool {} /* uniqid.c */ @@ -1508,20 +1432,15 @@ function convert_uudecode(string $data): string|false {} /* var.c */ -/** @param mixed $value */ -function var_dump($value, ...$value): void {} +function var_dump(mixed $value, mixed ...$value): void {} -/** @param mixed $value */ -function var_export($value, bool $return = false): ?string {} +function var_export(mixed $value, bool $return = false): ?string {} -/** @param mixed $value */ -function debug_zval_dump($value, ...$value): void {} +function debug_zval_dump(mixed $value, ...$value): void {} -/** @param mixed $value */ -function serialize($value): string {} +function serialize(mixed $value): string {} -/** @return mixed */ -function unserialize(string $value, array $options = []) {} +function unserialize(string $value, array $options = []): mixed {} function memory_get_usage(bool $real_usage = false): int {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 23152bc22eac9..8b985120309be 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -110,7 +110,7 @@ ZEND_END_ARG_INFO() #define arginfo_uksort arginfo_usort -ZEND_BEGIN_ARG_INFO_EX(arginfo_end, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_end, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_MASK(1, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() @@ -120,7 +120,7 @@ ZEND_END_ARG_INFO() #define arginfo_reset arginfo_end -ZEND_BEGIN_ARG_INFO_EX(arginfo_current, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_current, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() @@ -130,9 +130,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_key, 0, 1, MAY_BE_LONG|MAY_BE_ST ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_min, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_min, 0, 1, IS_MIXED, 0) ZEND_ARG_INFO(0, arg) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_max arginfo_min @@ -171,12 +171,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_fill, 0, 3, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, start_key, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num, IS_LONG, 0) - ZEND_ARG_INFO(0, val) + ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_fill_keys, 0, 2, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, keys, IS_ARRAY, 0) - ZEND_ARG_INFO(0, val) + ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_range, 0, 2, IS_ARRAY, 0) @@ -187,7 +187,7 @@ ZEND_END_ARG_INFO() #define arginfo_shuffle arginfo_natsort -ZEND_BEGIN_ARG_INFO_EX(arginfo_array_pop, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pop, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(1, stack, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -195,7 +195,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_unshift, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(1, stack, IS_ARRAY, 0) - ZEND_ARG_VARIADIC_INFO(0, vars) + ZEND_ARG_VARIADIC_TYPE_INFO(0, vars, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_splice, 0, 2, IS_ARRAY, 0) @@ -257,7 +257,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pad, 0, 3, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, arg, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, pad_size, IS_LONG, 0) - ZEND_ARG_INFO(0, pad_value) + ZEND_ARG_TYPE_INFO(0, pad_value, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_array_flip arginfo_array_values @@ -330,7 +330,7 @@ ZEND_END_ARG_INFO() #define arginfo_array_product arginfo_array_sum -ZEND_BEGIN_ARG_INFO_EX(arginfo_array_reduce, 0, 0, 2) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_reduce, 0, 2, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, arg, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, initial, "null") @@ -349,7 +349,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_map, 0, 2, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_key_exists, 0, 2, _IS_BOOL, 0) - ZEND_ARG_INFO(0, key) + ZEND_ARG_TYPE_INFO(0, key, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, search, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -375,7 +375,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_base64_decode, 0, 1, MAY_BE_STRI ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, strict, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_constant, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_constant, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -447,12 +447,12 @@ ZEND_END_ARG_INFO() #define arginfo_error_clear_last arginfo_flush -ZEND_BEGIN_ARG_INFO_EX(arginfo_call_user_func, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_call_user_func_array, 0, 0, 2) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func_array, 0, 2, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -463,7 +463,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, _IS_BOOL, 1) ZEND_ARG_INFO(0, function) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_highlight_file, 0, 1, MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL) @@ -509,7 +509,7 @@ ZEND_END_ARG_INFO() #define arginfo_get_include_path arginfo_ob_get_flush ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_print_r, 0, 1, MAY_BE_STRING|MAY_BE_BOOL) - ZEND_ARG_INFO(0, var) + ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() @@ -549,7 +549,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_tick_function, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unregister_tick_function, 0, 1, IS_VOID, 0) @@ -1251,7 +1251,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_fscanf, 0, 2, MAY_BE_ARRAY|MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_NULL) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_INFO(1, args) + ZEND_ARG_VARIADIC_TYPE_INFO(1, args, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_fpassthru arginfo_pclose @@ -1333,7 +1333,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_file_put_contents, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) - ZEND_ARG_INFO(0, content) + ZEND_ARG_TYPE_INFO(0, content, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() @@ -1470,12 +1470,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sprintf, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_printf, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vprintf, 0, 2, IS_LONG, 0) @@ -1491,7 +1491,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fprintf, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, handle) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_INFO(0, args) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vfprintf, 0, 3, IS_LONG, 0) @@ -1672,7 +1672,7 @@ ZEND_END_ARG_INFO() #define arginfo_is_infinite arginfo_is_finite -ZEND_BEGIN_ARG_INFO_EX(arginfo_pow, 0, 0, 2) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pow, 0, 2, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_INFO(0, base) ZEND_ARG_INFO(0, exp) ZEND_END_ARG_INFO() @@ -1880,7 +1880,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_option, 0, 2, ZEND_ARG_INFO(0, context) ZEND_ARG_INFO(0, param2) ZEND_ARG_TYPE_INFO(0, option_name, IS_STRING, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0) @@ -2052,7 +2052,7 @@ ZEND_END_ARG_INFO() #endif ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettype, 0, 1, IS_STRING, 0) - ZEND_ARG_INFO(0, var) + ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_get_debug_type arginfo_gettype @@ -2063,22 +2063,22 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_settype, 0, 2, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intval, 0, 1, IS_LONG, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "10") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_floatval, 0, 1, IS_DOUBLE, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_doubleval arginfo_floatval ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_boolval, 0, 1, _IS_BOOL, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_strval, 0, 1, IS_STRING, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_is_null arginfo_boolval @@ -2108,7 +2108,7 @@ ZEND_END_ARG_INFO() #define arginfo_is_scalar arginfo_boolval ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_callable, 0, 1, _IS_BOOL, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, syntax_only, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, callable_name, "null") ZEND_END_ARG_INFO() @@ -2173,20 +2173,23 @@ ZEND_END_ARG_INFO() #define arginfo_convert_uudecode arginfo_hex2bin ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_dump, 0, 1, IS_VOID, 0) - ZEND_ARG_INFO(0, value) - ZEND_ARG_VARIADIC_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_export, 0, 1, IS_STRING, 1) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -#define arginfo_debug_zval_dump arginfo_var_dump +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_debug_zval_dump, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_VARIADIC_INFO(0, value) +ZEND_END_ARG_INFO() #define arginfo_serialize arginfo_strval -ZEND_BEGIN_ARG_INFO_EX(arginfo_unserialize, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() diff --git a/ext/xmlrpc/xmlrpc.stub.php b/ext/xmlrpc/xmlrpc.stub.php index 21193aeb48ca3..e97a3d08baa63 100644 --- a/ext/xmlrpc/xmlrpc.stub.php +++ b/ext/xmlrpc/xmlrpc.stub.php @@ -8,16 +8,13 @@ final class XmlRpcServer function xmlrpc_encode($value): ?string {} -/** @return mixed */ -function xmlrpc_decode(string $xml, string $encoding = "iso-8859-1") {} +function xmlrpc_decode(string $xml, string $encoding = "iso-8859-1"): mixed {} -/** @return mixed */ -function xmlrpc_decode_request(string $xml, &$method, string $encoding = "iso-8859-1") {} +function xmlrpc_decode_request(string $xml, &$method, string $encoding = "iso-8859-1"): mixed {} function xmlrpc_encode_request(?string $method, $params, array $output_options = UNKNOWN): ?string {} -/** @param mixed $value */ -function xmlrpc_get_type($value): string {} +function xmlrpc_get_type(mixed $value): string {} function xmlrpc_set_type(&$value, string $type): bool {} @@ -29,11 +26,9 @@ function xmlrpc_server_destroy(XmlRpcServer $server): bool {} function xmlrpc_server_register_method(XmlRpcServer $server, string $method_name, $function): bool {} -/** @return mixed */ -function xmlrpc_server_call_method(XmlRpcServer $server, string $xml, $user_data, array $output_options = UNKNOWN) {} +function xmlrpc_server_call_method(XmlRpcServer $server, string $xml, $user_data, array $output_options = UNKNOWN): mixed {} -/** @return mixed */ -function xmlrpc_parse_method_descriptions(string $xml) {} +function xmlrpc_parse_method_descriptions(string $xml): mixed {} function xmlrpc_server_add_introspection_data(XmlRpcServer $server, array $desc): int {} diff --git a/ext/xmlrpc/xmlrpc_arginfo.h b/ext/xmlrpc/xmlrpc_arginfo.h index b3ee59fd46a25..0a5d1198f8214 100644 --- a/ext/xmlrpc/xmlrpc_arginfo.h +++ b/ext/xmlrpc/xmlrpc_arginfo.h @@ -4,12 +4,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_encode, 0, 1, IS_STRING, ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlrpc_decode, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"iso-8859-1\"") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlrpc_decode_request, 0, 0, 2) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode_request, 0, 2, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_INFO(1, method) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"iso-8859-1\"") @@ -22,7 +22,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_encode_request, 0, 2, IS_ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_get_type, 0, 1, IS_STRING, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_set_type, 0, 2, _IS_BOOL, 0) @@ -47,14 +47,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_register_method, 0 ZEND_ARG_INFO(0, function) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlrpc_server_call_method, 0, 0, 3) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_call_method, 0, 3, IS_MIXED, 0) ZEND_ARG_OBJ_INFO(0, server, XmlRpcServer, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_INFO(0, user_data) ZEND_ARG_TYPE_INFO(0, output_options, IS_ARRAY, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlrpc_parse_method_descriptions, 0, 0, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_parse_method_descriptions, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_END_ARG_INFO() diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index f3360fa7f304b..232c268168b92 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -26,7 +26,6 @@ function zend_create_unterminated_string(string $str): string {} function zend_terminate_string(string &$str): void {} -/** @param mixed $variable */ -function zend_leak_variable($variable): void {} +function zend_leak_variable(mixed $variable): void {} function zend_leak_bytes(int $bytes = 3): void {} diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 659d4eba66119..495539bfbff46 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -20,7 +20,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_terminate_string, 0, 1, IS_ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_leak_variable, 0, 1, IS_VOID, 0) - ZEND_ARG_INFO(0, variable) + ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_leak_bytes, 0, 0, IS_VOID, 0) From 0a877ad1128a0b587e92ac50bb3035f128246c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 25 May 2020 09:49:21 +0200 Subject: [PATCH 2/4] Address code review comments --- Zend/zend_builtin_functions.stub.php | 6 +- Zend/zend_builtin_functions_arginfo.h | 6 +- Zend/zend_closures_arginfo.h | 4 +- Zend/zend_generators_arginfo.h | 8 +- build/gen_stub.php | 2 +- ext/filter/filter_arginfo.h | 6 +- ext/gmp/gmp.c | 24 +++--- ext/gmp/gmp.stub.php | 4 + ext/gmp/gmp_arginfo.h | 5 ++ ext/gmp/tests/gmp_pow.phpt | 20 +++-- ext/gmp/tests/gmp_pow2.phpt | 35 ++++++++ ext/gmp/tests/overloading.phpt | 21 +++-- ext/json/json_arginfo.h | 4 +- ext/mysqli/mysqli.stub.php | 2 +- ext/mysqli/mysqli_arginfo.h | 4 +- ext/opcache/Optimizer/zend_func_info.c | 2 +- ext/reflection/php_reflection_arginfo.h | 4 +- ext/standard/basic_functions.stub.php | 27 +++---- ext/standard/basic_functions_arginfo.h | 80 +++++++++---------- ext/standard/formatted_print.c | 26 +++--- .../tests/strings/vfprintf_error3.phpt | 9 ++- .../tests/strings/vfprintf_variation1.phpt | 19 +++-- .../tests/strings/vprintf_variation2.phpt | 68 ++++++---------- ext/xmlrpc/xmlrpc_arginfo.h | 10 +-- ext/zend_test/test_arginfo.h | 2 +- 25 files changed, 225 insertions(+), 173 deletions(-) create mode 100644 ext/gmp/tests/gmp_pow2.phpt diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php index f1b9dbfc5b217..9e5078f14a9c9 100644 --- a/Zend/zend_builtin_functions.stub.php +++ b/Zend/zend_builtin_functions.stub.php @@ -68,11 +68,13 @@ function trigger_error(string $message, int $error_type = E_USER_NOTICE): bool { /** @alias trigger_error */ function user_error(string $message, int $error_type = E_USER_NOTICE): bool {} -function set_error_handler($error_handler, int $error_types = E_ALL): ?callable {} +/** @return string|array|object|null */ +function set_error_handler($error_handler, int $error_types = E_ALL) {} function restore_error_handler(): bool {} -function set_exception_handler($exception_handler): ?callable {} +/** @return string|array|object|null */ +function set_exception_handler($exception_handler) {} function restore_exception_handler(): bool {} diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index b7ec76a3238ad..d9041633b8e89 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -6,7 +6,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_num_args, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_get_arg, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_get_arg, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, arg_num, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -125,7 +125,7 @@ ZEND_END_ARG_INFO() #define arginfo_user_error arginfo_trigger_error -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_error_handler, 0, 1, IS_CALLABLE, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_set_error_handler, 0, 0, 1) ZEND_ARG_INFO(0, error_handler) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, error_types, IS_LONG, 0, "E_ALL") ZEND_END_ARG_INFO() @@ -133,7 +133,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_restore_error_handler, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_exception_handler, 0, 1, IS_CALLABLE, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_set_exception_handler, 0, 0, 1) ZEND_ARG_INFO(0, exception_handler) ZEND_END_ARG_INFO() diff --git a/Zend/zend_closures_arginfo.h b/Zend/zend_closures_arginfo.h index 85802bbfb4cd7..085a83fb79e76 100644 --- a/Zend/zend_closures_arginfo.h +++ b/Zend/zend_closures_arginfo.h @@ -14,9 +14,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Closure_bindTo, 0, 1, Closu ZEND_ARG_INFO(0, newscope) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Closure_call, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Closure_call, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, newthis, IS_OBJECT, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, parameters, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, parameters, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Closure_fromCallable, 0, 1, Closure, 0) diff --git a/Zend/zend_generators_arginfo.h b/Zend/zend_generators_arginfo.h index c87ef2c93702a..59675286d26d5 100644 --- a/Zend/zend_generators_arginfo.h +++ b/Zend/zend_generators_arginfo.h @@ -6,18 +6,18 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_valid, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_current, 0, 0, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_current, 0, 0, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_class_Generator_key arginfo_class_Generator_current #define arginfo_class_Generator_next arginfo_class_Generator_rewind -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_send, 0, 1, IS_MIXED, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_send, 0, 1, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_throw, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_throw, 0, 1, IS_MIXED, 1) ZEND_ARG_OBJ_INFO(0, exception, Throwable, 0) ZEND_END_ARG_INFO() diff --git a/build/gen_stub.php b/build/gen_stub.php index 806f1db8500dd..4820692d304c5 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -169,7 +169,7 @@ public static function fromNode(Node $node) { public function isNullable(): bool { foreach ($this->types as $type) { - if ($type->isNull()) { + if ($type->isNull() || $type->name === "mixed") { return true; } } diff --git a/ext/filter/filter_arginfo.h b/ext/filter/filter_arginfo.h index bf615fc847dea..7a15fab72f0e0 100644 --- a/ext/filter/filter_arginfo.h +++ b/ext/filter/filter_arginfo.h @@ -5,15 +5,15 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_has_var, 0, 2, _IS_BOOL, ZEND_ARG_TYPE_INFO(0, variable_name, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_input, 0, 2, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_input, 0, 2, IS_MIXED, 1) 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_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_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_var, 0, 1, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filter, IS_LONG, 0, "FILTER_DEFAULT") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, options, "null") ZEND_END_ARG_INFO() diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index a14c65f2978df..84c1126d1c5dd 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -332,12 +332,18 @@ static zend_object *gmp_clone_obj(zend_object *obj) /* {{{ */ } /* }}} */ -static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zval *op1, zval *op2) { +static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zval *op1, zval *op2, zend_uchar opcode) { zend_long shift = zval_get_long(op2); if (shift < 0) { - php_error_docref(NULL, E_WARNING, "Shift cannot be negative"); - RETVAL_FALSE; + if (strcmp(get_active_function_name(), "main")) { + zend_argument_value_error(2, "must be greater than or equal to 0"); + } else { + zend_throw_error(zend_ce_value_error, "%s must be greater than or equal to 0", + opcode == ZEND_POW ? "Exponent" : "Shift" + ); + } + return; } else { mpz_ptr gmpnum_op, gmpnum_result; gmp_temp_t temp; @@ -372,17 +378,17 @@ static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval case ZEND_MUL: DO_BINARY_UI_OP(mpz_mul); case ZEND_POW: - shift_operator_helper(mpz_pow_ui, result, op1, op2); + shift_operator_helper(mpz_pow_ui, result, op1, op2, opcode); return SUCCESS; case ZEND_DIV: DO_BINARY_UI_OP_EX(mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1); case ZEND_MOD: DO_BINARY_UI_OP_EX(mpz_mod, gmp_mpz_mod_ui, 1); case ZEND_SL: - shift_operator_helper(mpz_mul_2exp, result, op1, op2); + shift_operator_helper(mpz_mul_2exp, result, op1, op2, opcode); return SUCCESS; case ZEND_SR: - shift_operator_helper(mpz_fdiv_q_2exp, result, op1, op2); + shift_operator_helper(mpz_fdiv_q_2exp, result, op1, op2, opcode); return SUCCESS; case ZEND_BW_OR: DO_BINARY_OP(mpz_ior); @@ -520,7 +526,7 @@ static ZEND_GINIT_FUNCTION(gmp) ZEND_MINIT_FUNCTION(gmp) { zend_class_entry tmp_ce; - INIT_CLASS_ENTRY(tmp_ce, "GMP", NULL); + INIT_CLASS_ENTRY(tmp_ce, "GMP", class_GMP_methods); gmp_ce = zend_register_internal_class(&tmp_ce); gmp_ce->create_object = gmp_create_object; gmp_ce->serialize = gmp_serialize; @@ -1261,8 +1267,8 @@ ZEND_FUNCTION(gmp_pow) } if (exp < 0) { - php_error_docref(NULL, E_WARNING, "Negative exponent not supported"); - RETURN_FALSE; + zend_argument_value_error(2, "must be greater than or equal to 0"); + RETURN_THROWS(); } if (Z_TYPE_P(base_arg) == IS_LONG && Z_LVAL_P(base_arg) >= 0) { diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php index a95616aa4eaf8..bfa4ba93ee155 100644 --- a/ext/gmp/gmp.stub.php +++ b/ext/gmp/gmp.stub.php @@ -2,6 +2,10 @@ /** @generate-function-entries */ +class GMP +{ +} + /** @param int|bool|string $number */ function gmp_init($number, int $base = 0): GMP|false {} diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h index b0309824d4ae0..4cb06da28ef42 100644 --- a/ext/gmp/gmp_arginfo.h +++ b/ext/gmp/gmp_arginfo.h @@ -289,3 +289,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(gmp_binomial, arginfo_gmp_binomial) ZEND_FE_END }; + + +static const zend_function_entry class_GMP_methods[] = { + ZEND_FE_END +}; diff --git a/ext/gmp/tests/gmp_pow.phpt b/ext/gmp/tests/gmp_pow.phpt index 449f668667156..523150765dc9f 100644 --- a/ext/gmp/tests/gmp_pow.phpt +++ b/ext/gmp/tests/gmp_pow.phpt @@ -10,11 +10,19 @@ var_dump(gmp_strval(gmp_pow(-2,10))); var_dump(gmp_strval(gmp_pow(-2,11))); var_dump(gmp_strval(gmp_pow("2",10))); var_dump(gmp_strval(gmp_pow("2",0))); -var_dump(gmp_strval(gmp_pow("2",-1))); +try { + gmp_pow("2", -1); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} var_dump(gmp_strval(gmp_pow("-2",10))); var_dump(gmp_strval(gmp_pow(20,10))); var_dump(gmp_strval(gmp_pow(50,10))); -var_dump(gmp_strval(gmp_pow(50,-5))); +try { + gmp_pow(50,-5); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} $n = gmp_init("20"); var_dump(gmp_strval(gmp_pow($n,10))); @@ -36,15 +44,11 @@ string(4) "1024" string(5) "-2048" string(4) "1024" string(1) "1" - -Warning: gmp_pow(): Negative exponent not supported in %s on line %d -string(1) "0" +gmp_pow(): Argument #2 ($exp) must be greater than or equal to 0 string(4) "1024" string(14) "10240000000000" string(17) "97656250000000000" - -Warning: gmp_pow(): Negative exponent not supported in %s on line %d -string(1) "0" +gmp_pow(): Argument #2 ($exp) must be greater than or equal to 0 string(14) "10240000000000" string(14) "10240000000000" gmp_pow(): Argument #2 ($exp) must be of type int, array given diff --git a/ext/gmp/tests/gmp_pow2.phpt b/ext/gmp/tests/gmp_pow2.phpt new file mode 100644 index 0000000000000..77ab19213941e --- /dev/null +++ b/ext/gmp/tests/gmp_pow2.phpt @@ -0,0 +1,35 @@ +--TEST-- +Test pow() with gmp object +--SKIPIF-- + +--FILE-- +getMessage() . "\n"; +} + +try { + $n ** -10; +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + +?> +--EXPECTF-- +object(GMP)#%d (1) { + ["num"]=> + string(4) "1024" +} +object(GMP)#%d (1) { + ["num"]=> + string(4) "1024" +} +pow(): Argument #2 ($exp) must be greater than or equal to 0 +Exponent must be greater than or equal to 0 diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt index 3520f58bdce47..c38b1eaf821a9 100644 --- a/ext/gmp/tests/overloading.phpt +++ b/ext/gmp/tests/overloading.phpt @@ -53,8 +53,17 @@ var_dump(42 << $b); var_dump($a >> 2); var_dump(-$a >> 2); -var_dump($a << -1); -var_dump($a >> -1); +try { + $a << -1; +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + +try { + $a >> -1; +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} var_dump(~$a); var_dump(-$a); @@ -237,12 +246,8 @@ object(GMP)#%d (1) { ["num"]=> string(3) "-11" } - -Warning: main(): Shift cannot be negative in %s on line %d -bool(false) - -Warning: main(): Shift cannot be negative in %s on line %d -bool(false) +Shift must be greater than or equal to 0 +Shift must be greater than or equal to 0 object(GMP)#%d (1) { ["num"]=> string(3) "-43" diff --git a/ext/json/json_arginfo.h b/ext/json/json_arginfo.h index 9514abf19f5f6..42256e6054d69 100644 --- a/ext/json/json_arginfo.h +++ b/ext/json/json_arginfo.h @@ -1,12 +1,12 @@ /* This is a generated file, edit the .stub.php file instead. */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_json_encode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, depth, IS_LONG, 0, "512") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_json_decode, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_json_decode, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, json, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, assoc, _IS_BOOL, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, depth, IS_LONG, 0, "512") diff --git a/ext/mysqli/mysqli.stub.php b/ext/mysqli/mysqli.stub.php index 9073b6a26da53..786796b89246b 100644 --- a/ext/mysqli/mysqli.stub.php +++ b/ext/mysqli/mysqli.stub.php @@ -407,7 +407,7 @@ public function attr_set(int $attr, int $mode_in) {} * @return bool * @alias mysqli_stmt_bind_param */ - public function bind_param(string $types, &...$vars) {} + public function bind_param(string $types, mixed &...$vars) {} /** * @return bool diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h index 5f021c798d6b8..4544aca638622 100644 --- a/ext/mysqli/mysqli_arginfo.h +++ b/ext/mysqli/mysqli_arginfo.h @@ -298,7 +298,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_bind_param, 0, 2, _IS_BOOL, 0) ZEND_ARG_OBJ_INFO(0, mysql_stmt, mysqli_stmt, 0) ZEND_ARG_TYPE_INFO(0, types, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_bind_result, 0, 1, _IS_BOOL, 0) @@ -633,7 +633,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_stmt_bind_param, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, types, IS_STRING, 0) - ZEND_ARG_VARIADIC_INFO(1, vars) + ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_stmt_bind_result, 0, 0, 0) diff --git a/ext/opcache/Optimizer/zend_func_info.c b/ext/opcache/Optimizer/zend_func_info.c index ff29cce9896a8..6d77938025bf3 100644 --- a/ext/opcache/Optimizer/zend_func_info.c +++ b/ext/opcache/Optimizer/zend_func_info.c @@ -214,7 +214,7 @@ static const func_info_t func_infos[] = { F1("password_get_info", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), F1("convert_uuencode", MAY_BE_FALSE | MAY_BE_STRING), F1("convert_uudecode", MAY_BE_FALSE | MAY_BE_STRING), - F1("pow", MAY_BE_NULL | MAY_BE_LONG | MAY_BE_DOUBLE | MAY_BE_OBJECT), + F1("pow", MAY_BE_LONG | MAY_BE_DOUBLE | MAY_BE_OBJECT), F1("decbin", MAY_BE_STRING), F1("decoct", MAY_BE_STRING), F1("dechex", MAY_BE_STRING), diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index 1e3e9988deee0..d282eb5a28fba 100644 --- a/ext/reflection/php_reflection_arginfo.h +++ b/ext/reflection/php_reflection_arginfo.h @@ -67,7 +67,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_ReflectionFunction_isDisabled arginfo_class_ReflectionFunctionAbstract___clone ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction_invoke, 0, 0, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction_invokeArgs, 0, 0, 1) @@ -125,7 +125,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_invoke, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, object, IS_OBJECT, 1, "null") - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_invokeArgs, 0, 0, 2) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 30e49cddbab49..62565b312e4c5 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -222,16 +222,20 @@ function array_sum(array $arg): int|float {} function array_product(array $arg): int|float {} -function array_reduce(array $arg, callable $callback, $initial = null): mixed {} +function array_reduce(array $arg, callable $callback, mixed $initial = null): mixed {} function array_filter(array $arg, ?callable $callback = null, int $use_keys = 0): array {} function array_map(?callable $callback, array $arr1, array ...$arrays): array {} -function array_key_exists(mixed $key, array $search): bool {} +/** @param int|string $key */ +function array_key_exists($key, array $search): bool {} -/** @alias array_key_exists */ -function key_exists(mixed $key, array $search): bool {} +/** + * @param int|string $key + * @alias array_key_exists + */ +function key_exists($key, array $search): bool {} function array_chunk(array $arg, int $size, bool $preserve_keys = false): array {} @@ -925,20 +929,15 @@ function sprintf(string $format, mixed ...$args): string {} function printf(string $format, mixed ...$args): int {} -/** @param array $args */ -function vprintf(string $format, $args): int {} +function vprintf(string $format, array $args): int {} -/** @param array $args */ -function vsprintf(string $format, $args): string {} +function vsprintf(string $format, array $args): string {} /** @param resource $handle */ function fprintf($handle, string $format, mixed ...$args): int {} -/** - * @param resource $handle - * @param array $args - */ -function vfprintf($handle, string $format, $args): int {} +/** @param resource $handle */ +function vfprintf($handle, string $format, array $args): int {} /* fsock.c */ @@ -1054,7 +1053,7 @@ function intdiv(int $dividend, int $divisor): int {} function is_infinite(float $number): bool {} -function pow($base, $exp): int|float {} +function pow($base, $exp): int|float|object {} function exp(float $number): float {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 8b985120309be..f6d5999ecb628 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -110,7 +110,7 @@ ZEND_END_ARG_INFO() #define arginfo_uksort arginfo_usort -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_end, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_end, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_MASK(1, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() @@ -120,7 +120,7 @@ ZEND_END_ARG_INFO() #define arginfo_reset arginfo_end -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_current, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_current, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() @@ -130,9 +130,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_key, 0, 1, MAY_BE_LONG|MAY_BE_ST ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_min, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_min, 0, 1, IS_MIXED, 1) ZEND_ARG_INFO(0, arg) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_max arginfo_min @@ -171,12 +171,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_fill, 0, 3, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, start_key, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_fill_keys, 0, 2, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, keys, IS_ARRAY, 0) - ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_range, 0, 2, IS_ARRAY, 0) @@ -187,7 +187,7 @@ ZEND_END_ARG_INFO() #define arginfo_shuffle arginfo_natsort -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pop, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pop, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(1, stack, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -195,7 +195,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_unshift, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(1, stack, IS_ARRAY, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, vars, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, vars, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_splice, 0, 2, IS_ARRAY, 0) @@ -257,7 +257,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pad, 0, 3, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, arg, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, pad_size, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, pad_value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, pad_value, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_array_flip arginfo_array_values @@ -330,10 +330,10 @@ ZEND_END_ARG_INFO() #define arginfo_array_product arginfo_array_sum -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_reduce, 0, 2, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_reduce, 0, 2, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, arg, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) - ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, initial, "null") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, initial, IS_MIXED, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_filter, 0, 1, IS_ARRAY, 0) @@ -349,7 +349,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_map, 0, 2, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_key_exists, 0, 2, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, key, IS_MIXED, 0) + ZEND_ARG_INFO(0, key) ZEND_ARG_TYPE_INFO(0, search, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -375,7 +375,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_base64_decode, 0, 1, MAY_BE_STRI ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, strict, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_constant, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_constant, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -447,12 +447,12 @@ ZEND_END_ARG_INFO() #define arginfo_error_clear_last arginfo_flush -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func_array, 0, 2, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func_array, 0, 2, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -463,7 +463,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, _IS_BOOL, 1) ZEND_ARG_INFO(0, function) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_highlight_file, 0, 1, MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL) @@ -509,7 +509,7 @@ ZEND_END_ARG_INFO() #define arginfo_get_include_path arginfo_ob_get_flush ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_print_r, 0, 1, MAY_BE_STRING|MAY_BE_BOOL) - ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() @@ -549,7 +549,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_tick_function, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unregister_tick_function, 0, 1, IS_VOID, 0) @@ -1251,7 +1251,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_fscanf, 0, 2, MAY_BE_ARRAY|MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_NULL) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(1, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(1, args, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_fpassthru arginfo_pclose @@ -1333,7 +1333,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_file_put_contents, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, content, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, content, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() @@ -1470,34 +1470,34 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sprintf, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_printf, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vprintf, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_INFO(0, args) + ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vsprintf, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_INFO(0, args) + ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fprintf, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, handle) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vfprintf, 0, 3, IS_LONG, 0) ZEND_ARG_INFO(0, handle) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_INFO(0, args) + ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_fsockopen, 0, 0, 1) @@ -1672,7 +1672,7 @@ ZEND_END_ARG_INFO() #define arginfo_is_infinite arginfo_is_finite -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pow, 0, 2, MAY_BE_LONG|MAY_BE_DOUBLE) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pow, 0, 2, MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_OBJECT) ZEND_ARG_INFO(0, base) ZEND_ARG_INFO(0, exp) ZEND_END_ARG_INFO() @@ -1880,7 +1880,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_option, 0, 2, ZEND_ARG_INFO(0, context) ZEND_ARG_INFO(0, param2) ZEND_ARG_TYPE_INFO(0, option_name, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0) @@ -2052,7 +2052,7 @@ ZEND_END_ARG_INFO() #endif ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettype, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_get_debug_type arginfo_gettype @@ -2063,22 +2063,22 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_settype, 0, 2, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intval, 0, 1, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "10") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_floatval, 0, 1, IS_DOUBLE, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_doubleval arginfo_floatval ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_boolval, 0, 1, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_strval, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() #define arginfo_is_null arginfo_boolval @@ -2108,7 +2108,7 @@ ZEND_END_ARG_INFO() #define arginfo_is_scalar arginfo_boolval ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_callable, 0, 1, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, syntax_only, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, callable_name, "null") ZEND_END_ARG_INFO() @@ -2173,23 +2173,23 @@ ZEND_END_ARG_INFO() #define arginfo_convert_uudecode arginfo_hex2bin ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_dump, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_export, 0, 1, IS_STRING, 1) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_debug_zval_dump, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_ARG_VARIADIC_INFO(0, value) ZEND_END_ARG_INFO() #define arginfo_serialize arginfo_strval -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c index 3448b86bc208a..d982de74201d5 100644 --- a/ext/standard/formatted_print.c +++ b/ext/standard/formatted_print.c @@ -651,20 +651,15 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n /* }}} */ /* php_formatted_print_get_array() {{{ */ -static zval* -php_formatted_print_get_array(zval *array, int *argc) +static zval *php_formatted_print_get_array(zend_array *array, int *argc) { zval *args, *zv; int n; - if (Z_TYPE_P(array) != IS_ARRAY) { - convert_to_array(array); - } - - n = zend_hash_num_elements(Z_ARRVAL_P(array)); + n = zend_hash_num_elements(array); args = (zval *)safe_emalloc(n, sizeof(zval), 0); n = 0; - ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(array), zv) { + ZEND_HASH_FOREACH_VAL(array, zv) { ZVAL_COPY_VALUE(&args[n], zv); n++; } ZEND_HASH_FOREACH_END(); @@ -704,12 +699,13 @@ PHP_FUNCTION(vsprintf) zend_string *result; char *format; size_t format_len; - zval *array, *args; + zval *args; + zend_array *array; int argc; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STRING(format, format_len) - Z_PARAM_ZVAL(array) + Z_PARAM_ARRAY_HT(array) ZEND_PARSE_PARAMETERS_END(); args = php_formatted_print_get_array(array, &argc); @@ -757,12 +753,13 @@ PHP_FUNCTION(vprintf) size_t rlen; char *format; size_t format_len; - zval *array, *args; + zval *args; + zend_array *array; int argc; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STRING(format, format_len) - Z_PARAM_ZVAL(array) + Z_PARAM_ARRAY_HT(array) ZEND_PARSE_PARAMETERS_END(); args = php_formatted_print_get_array(array, &argc); @@ -820,7 +817,8 @@ PHP_FUNCTION(vfprintf) php_stream *stream; char *format; size_t format_len; - zval *arg1, *array, *args; + zval *arg1, *args; + zend_array *array; int argc; zend_string *result; @@ -831,7 +829,7 @@ PHP_FUNCTION(vfprintf) ZEND_PARSE_PARAMETERS_START(3, 3) Z_PARAM_RESOURCE(arg1) Z_PARAM_STRING(format, format_len) - Z_PARAM_ZVAL(array) + Z_PARAM_ARRAY_HT(array) ZEND_PARSE_PARAMETERS_END(); php_stream_from_zval(stream, arg1); diff --git a/ext/standard/tests/strings/vfprintf_error3.phpt b/ext/standard/tests/strings/vfprintf_error3.phpt index e409f8741b635..d7ebdce3e2ebb 100644 --- a/ext/standard/tests/strings/vfprintf_error3.phpt +++ b/ext/standard/tests/strings/vfprintf_error3.phpt @@ -24,7 +24,13 @@ try { } try { - var_dump( vfprintf( $fp, "Foo %y fake", "not available" ) ); + vfprintf($fp, "Foo: %s", "not available"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} + +try { + vfprintf($fp, "Foo %y fake", ["not available"]); } catch (ValueError $e) { echo $e->getMessage(), "\n"; } @@ -48,5 +54,6 @@ unlink( $file ); --EXPECT-- -- Testing vfprintf() function with wrong variable types as argument -- vfprintf(): Argument #2 ($format) must be of type string, array given +vfprintf(): Argument #3 ($args) must be of type array, string given Unknown format specifier 'y' string(0) "" diff --git a/ext/standard/tests/strings/vfprintf_variation1.phpt b/ext/standard/tests/strings/vfprintf_variation1.phpt index d7120e41c09ea..bd8ba985cbc66 100644 --- a/ext/standard/tests/strings/vfprintf_variation1.phpt +++ b/ext/standard/tests/strings/vfprintf_variation1.phpt @@ -32,12 +32,16 @@ class FooClass // Output facilitating function function writeAndDump($fp, $format, $args) { - ftruncate( $fp, 0 ); - $length = vfprintf( $fp, $format, $args ); - rewind( $fp ); - $content = stream_get_contents( $fp ); - var_dump( $content ); - var_dump( $length ); + try { + ftruncate( $fp, 0 ); + $length = vfprintf( $fp, $format, $args ); + rewind( $fp ); + $content = stream_get_contents( $fp ); + var_dump( $content ); + var_dump( $length ); + } catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; + } } // Test vfprintf() @@ -62,8 +66,7 @@ unlink( $file ); ?> --EXPECT-- *** Testing vfprintf() : variation functionality *** -string(6) "format" -int(6) +vfprintf(): Argument #3 ($args) must be of type array, null given string(17) "Foo is 30 and bar" int(17) string(14) "Foobar testing" diff --git a/ext/standard/tests/strings/vprintf_variation2.phpt b/ext/standard/tests/strings/vprintf_variation2.phpt index 12ffb6dd1f764..30892395fed2c 100644 --- a/ext/standard/tests/strings/vprintf_variation2.phpt +++ b/ext/standard/tests/strings/vprintf_variation2.phpt @@ -88,6 +88,8 @@ foreach($values as $value) { $result = vprintf($format,$value); echo "\n"; var_dump($result); + } catch (\TypeError $e) { + echo $e->getMessage(), "\n"; } catch (\ValueError $e) { echo $e->getMessage(), "\n"; } @@ -98,92 +100,74 @@ foreach($values as $value) { fclose($file_handle); ?> ---EXPECTF-- +--EXPECT-- *** Testing vprintf() : with unexpected values for args argument *** -- Iteration 1 -- -0 -int(1) +vprintf(): Argument #2 ($args) must be of type array, int given -- Iteration 2 -- -1 -int(1) +vprintf(): Argument #2 ($args) must be of type array, int given -- Iteration 3 -- -12345 -int(5) +vprintf(): Argument #2 ($args) must be of type array, int given -- Iteration 4 -- --2345 -int(5) +vprintf(): Argument #2 ($args) must be of type array, int given -- Iteration 5 -- -10.5 -int(4) +vprintf(): Argument #2 ($args) must be of type array, float given -- Iteration 6 -- --10.5 -int(5) +vprintf(): Argument #2 ($args) must be of type array, float given -- Iteration 7 -- -101234567000 -int(12) +vprintf(): Argument #2 ($args) must be of type array, float given -- Iteration 8 -- -1.07654321E-9 -int(13) +vprintf(): Argument #2 ($args) must be of type array, float given -- Iteration 9 -- -0.5 -int(3) +vprintf(): Argument #2 ($args) must be of type array, float given -- Iteration 10 -- -The arguments array must contain 1 items, 0 given +vprintf(): Argument #2 ($args) must be of type array, null given -- Iteration 11 -- -The arguments array must contain 1 items, 0 given +vprintf(): Argument #2 ($args) must be of type array, null given -- Iteration 12 -- -1 -int(1) +vprintf(): Argument #2 ($args) must be of type array, bool given -- Iteration 13 -- - -int(0) +vprintf(): Argument #2 ($args) must be of type array, bool given -- Iteration 14 -- -1 -int(1) +vprintf(): Argument #2 ($args) must be of type array, bool given -- Iteration 15 -- - -int(0) +vprintf(): Argument #2 ($args) must be of type array, bool given -- Iteration 16 -- - -int(0) +vprintf(): Argument #2 ($args) must be of type array, string given -- Iteration 17 -- - -int(0) +vprintf(): Argument #2 ($args) must be of type array, string given -- Iteration 18 -- -string -int(6) +vprintf(): Argument #2 ($args) must be of type array, string given -- Iteration 19 -- -string -int(6) +vprintf(): Argument #2 ($args) must be of type array, string given -- Iteration 20 -- -The arguments array must contain 1 items, 0 given +vprintf(): Argument #2 ($args) must be of type array, object given -- Iteration 21 -- -The arguments array must contain 1 items, 0 given +vprintf(): Argument #2 ($args) must be of type array, null given -- Iteration 22 -- -The arguments array must contain 1 items, 0 given +vprintf(): Argument #2 ($args) must be of type array, null given -- Iteration 23 -- -Resource id #%d -int(%d) +vprintf(): Argument #2 ($args) must be of type array, resource given diff --git a/ext/xmlrpc/xmlrpc_arginfo.h b/ext/xmlrpc/xmlrpc_arginfo.h index 0a5d1198f8214..474d51e1d0e97 100644 --- a/ext/xmlrpc/xmlrpc_arginfo.h +++ b/ext/xmlrpc/xmlrpc_arginfo.h @@ -4,12 +4,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_encode, 0, 1, IS_STRING, ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"iso-8859-1\"") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode_request, 0, 2, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode_request, 0, 2, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_INFO(1, method) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"iso-8859-1\"") @@ -22,7 +22,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_encode_request, 0, 2, IS_ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_get_type, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_set_type, 0, 2, _IS_BOOL, 0) @@ -47,14 +47,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_register_method, 0 ZEND_ARG_INFO(0, function) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_call_method, 0, 3, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_call_method, 0, 3, IS_MIXED, 1) ZEND_ARG_OBJ_INFO(0, server, XmlRpcServer, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_INFO(0, user_data) ZEND_ARG_TYPE_INFO(0, output_options, IS_ARRAY, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_parse_method_descriptions, 0, 1, IS_MIXED, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_parse_method_descriptions, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_END_ARG_INFO() diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 495539bfbff46..656589fb47f5f 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -20,7 +20,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_terminate_string, 0, 1, IS_ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_leak_variable, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_leak_bytes, 0, 0, IS_VOID, 0) From d907c6d11a68a25cbc277780bd3d94ee7c948dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 25 May 2020 13:08:10 +0200 Subject: [PATCH 3/4] Fix exception message and nullability of mixed --- Zend/zend_builtin_functions_arginfo.h | 2 +- Zend/zend_closures_arginfo.h | 4 +- Zend/zend_generators_arginfo.h | 8 +-- build/gen_stub.php | 9 ++-- ext/filter/filter_arginfo.h | 6 +-- ext/gmp/gmp.c | 11 ++-- ext/gmp/tests/gmp_pow2.phpt | 2 +- ext/json/json_arginfo.h | 4 +- ext/mysqli/mysqli_arginfo.h | 4 +- ext/reflection/php_reflection_arginfo.h | 4 +- ext/standard/basic_functions_arginfo.h | 70 ++++++++++++------------- ext/xmlrpc/xmlrpc_arginfo.h | 10 ++-- ext/zend_test/test_arginfo.h | 2 +- 13 files changed, 68 insertions(+), 68 deletions(-) diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index d9041633b8e89..0fa4ba7f45854 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -6,7 +6,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_num_args, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_get_arg, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_func_get_arg, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, arg_num, IS_LONG, 0) ZEND_END_ARG_INFO() diff --git a/Zend/zend_closures_arginfo.h b/Zend/zend_closures_arginfo.h index 085a83fb79e76..85802bbfb4cd7 100644 --- a/Zend/zend_closures_arginfo.h +++ b/Zend/zend_closures_arginfo.h @@ -14,9 +14,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Closure_bindTo, 0, 1, Closu ZEND_ARG_INFO(0, newscope) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Closure_call, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Closure_call, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, newthis, IS_OBJECT, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, parameters, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, parameters, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Closure_fromCallable, 0, 1, Closure, 0) diff --git a/Zend/zend_generators_arginfo.h b/Zend/zend_generators_arginfo.h index 59675286d26d5..c87ef2c93702a 100644 --- a/Zend/zend_generators_arginfo.h +++ b/Zend/zend_generators_arginfo.h @@ -6,18 +6,18 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_valid, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_current, 0, 0, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_current, 0, 0, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_class_Generator_key arginfo_class_Generator_current #define arginfo_class_Generator_next arginfo_class_Generator_rewind -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_send, 0, 1, IS_MIXED, 1) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_send, 0, 1, IS_MIXED, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_throw, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_throw, 0, 1, IS_MIXED, 0) ZEND_ARG_OBJ_INFO(0, exception, Throwable, 0) ZEND_END_ARG_INFO() diff --git a/build/gen_stub.php b/build/gen_stub.php index 4820692d304c5..eb00b34136459 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -169,7 +169,7 @@ public static function fromNode(Node $node) { public function isNullable(): bool { foreach ($this->types as $type) { - if ($type->isNull() || $type->name === "mixed") { + if ($type->isNull()) { return true; } } @@ -645,8 +645,11 @@ function parseFunctionLike( $param->default->name->toLowerString() === "null" && $type && !$type->isNullable() ) { - throw new Exception( - "Parameter $varName of function $name has null default, but is not nullable"); + $simpleType = $type->tryToSimpleType(); + if ($simpleType === null || $simpleType->name !== "mixed") { + throw new Exception( + "Parameter $varName of function $name has null default, but is not nullable"); + } } $foundVariadic = $param->variadic; diff --git a/ext/filter/filter_arginfo.h b/ext/filter/filter_arginfo.h index 7a15fab72f0e0..bf615fc847dea 100644 --- a/ext/filter/filter_arginfo.h +++ b/ext/filter/filter_arginfo.h @@ -5,15 +5,15 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_has_var, 0, 2, _IS_BOOL, ZEND_ARG_TYPE_INFO(0, variable_name, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_input, 0, 2, IS_MIXED, 1) +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_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_var, 0, 1, IS_MIXED, 1) - ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 1) +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_END_ARG_INFO() diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 84c1126d1c5dd..fae30b084013d 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -336,13 +336,10 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva zend_long shift = zval_get_long(op2); if (shift < 0) { - if (strcmp(get_active_function_name(), "main")) { - zend_argument_value_error(2, "must be greater than or equal to 0"); - } else { - zend_throw_error(zend_ce_value_error, "%s must be greater than or equal to 0", - opcode == ZEND_POW ? "Exponent" : "Shift" - ); - } + zend_throw_error( + zend_ce_value_error, "%s must be greater than or equal to 0", + opcode == ZEND_POW ? "Exponent" : "Shift" + ); return; } else { mpz_ptr gmpnum_op, gmpnum_result; diff --git a/ext/gmp/tests/gmp_pow2.phpt b/ext/gmp/tests/gmp_pow2.phpt index 77ab19213941e..e1007e8d4d619 100644 --- a/ext/gmp/tests/gmp_pow2.phpt +++ b/ext/gmp/tests/gmp_pow2.phpt @@ -31,5 +31,5 @@ object(GMP)#%d (1) { ["num"]=> string(4) "1024" } -pow(): Argument #2 ($exp) must be greater than or equal to 0 +Exponent must be greater than or equal to 0 Exponent must be greater than or equal to 0 diff --git a/ext/json/json_arginfo.h b/ext/json/json_arginfo.h index 42256e6054d69..9514abf19f5f6 100644 --- a/ext/json/json_arginfo.h +++ b/ext/json/json_arginfo.h @@ -1,12 +1,12 @@ /* This is a generated file, edit the .stub.php file instead. */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_json_encode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, depth, IS_LONG, 0, "512") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_json_decode, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_json_decode, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, json, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, assoc, _IS_BOOL, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, depth, IS_LONG, 0, "512") diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h index 4544aca638622..7145ed562444f 100644 --- a/ext/mysqli/mysqli_arginfo.h +++ b/ext/mysqli/mysqli_arginfo.h @@ -298,7 +298,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_bind_param, 0, 2, _IS_BOOL, 0) ZEND_ARG_OBJ_INFO(0, mysql_stmt, mysqli_stmt, 0) ZEND_ARG_TYPE_INFO(0, types, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_bind_result, 0, 1, _IS_BOOL, 0) @@ -633,7 +633,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_stmt_bind_param, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, types, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(1, vars, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_stmt_bind_result, 0, 0, 0) diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index d282eb5a28fba..1e3e9988deee0 100644 --- a/ext/reflection/php_reflection_arginfo.h +++ b/ext/reflection/php_reflection_arginfo.h @@ -67,7 +67,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_ReflectionFunction_isDisabled arginfo_class_ReflectionFunctionAbstract___clone ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction_invoke, 0, 0, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction_invokeArgs, 0, 0, 1) @@ -125,7 +125,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_invoke, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, object, IS_OBJECT, 1, "null") - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_invokeArgs, 0, 0, 2) diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index f6d5999ecb628..ead188487d293 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -110,7 +110,7 @@ ZEND_END_ARG_INFO() #define arginfo_uksort arginfo_usort -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_end, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_end, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_MASK(1, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() @@ -120,7 +120,7 @@ ZEND_END_ARG_INFO() #define arginfo_reset arginfo_end -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_current, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_current, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() @@ -130,9 +130,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_key, 0, 1, MAY_BE_LONG|MAY_BE_ST ZEND_ARG_TYPE_MASK(0, arg, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_min, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_min, 0, 1, IS_MIXED, 0) ZEND_ARG_INFO(0, arg) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_max arginfo_min @@ -171,12 +171,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_fill, 0, 3, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, start_key, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_fill_keys, 0, 2, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, keys, IS_ARRAY, 0) - ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, val, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_range, 0, 2, IS_ARRAY, 0) @@ -187,7 +187,7 @@ ZEND_END_ARG_INFO() #define arginfo_shuffle arginfo_natsort -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pop, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pop, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(1, stack, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -195,7 +195,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_unshift, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(1, stack, IS_ARRAY, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, vars, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, vars, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_splice, 0, 2, IS_ARRAY, 0) @@ -257,7 +257,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_pad, 0, 3, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, arg, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, pad_size, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, pad_value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, pad_value, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_array_flip arginfo_array_values @@ -330,10 +330,10 @@ ZEND_END_ARG_INFO() #define arginfo_array_product arginfo_array_sum -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_reduce, 0, 2, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_reduce, 0, 2, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, arg, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, initial, IS_MIXED, 1, "null") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, initial, IS_MIXED, 0, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_filter, 0, 1, IS_ARRAY, 0) @@ -375,7 +375,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_base64_decode, 0, 1, MAY_BE_STRI ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, strict, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_constant, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_constant, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -447,12 +447,12 @@ ZEND_END_ARG_INFO() #define arginfo_error_clear_last arginfo_flush -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func_array, 0, 2, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_call_user_func_array, 0, 2, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -463,7 +463,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, _IS_BOOL, 1) ZEND_ARG_INFO(0, function) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_highlight_file, 0, 1, MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL) @@ -509,7 +509,7 @@ ZEND_END_ARG_INFO() #define arginfo_get_include_path arginfo_ob_get_flush ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_print_r, 0, 1, MAY_BE_STRING|MAY_BE_BOOL) - ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() @@ -549,7 +549,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_tick_function, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unregister_tick_function, 0, 1, IS_VOID, 0) @@ -1251,7 +1251,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_fscanf, 0, 2, MAY_BE_ARRAY|MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_NULL) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(1, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(1, args, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_fpassthru arginfo_pclose @@ -1333,7 +1333,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_file_put_contents, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, content, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, content, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() @@ -1470,12 +1470,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sprintf, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_printf, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vprintf, 0, 2, IS_LONG, 0) @@ -1491,7 +1491,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fprintf, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, handle) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) - ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 1) + ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vfprintf, 0, 3, IS_LONG, 0) @@ -1880,7 +1880,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_option, 0, 2, ZEND_ARG_INFO(0, context) ZEND_ARG_INFO(0, param2) ZEND_ARG_TYPE_INFO(0, option_name, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0) @@ -2052,7 +2052,7 @@ ZEND_END_ARG_INFO() #endif ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettype, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, var, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_get_debug_type arginfo_gettype @@ -2063,22 +2063,22 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_settype, 0, 2, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intval, 0, 1, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "10") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_floatval, 0, 1, IS_DOUBLE, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_doubleval arginfo_floatval ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_boolval, 0, 1, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_strval, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() #define arginfo_is_null arginfo_boolval @@ -2108,7 +2108,7 @@ ZEND_END_ARG_INFO() #define arginfo_is_scalar arginfo_boolval ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_callable, 0, 1, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, syntax_only, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, callable_name, "null") ZEND_END_ARG_INFO() @@ -2173,23 +2173,23 @@ ZEND_END_ARG_INFO() #define arginfo_convert_uudecode arginfo_hex2bin ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_dump, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) - ZEND_ARG_VARIADIC_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) + ZEND_ARG_VARIADIC_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_export, 0, 1, IS_STRING, 1) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_debug_zval_dump, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_VARIADIC_INFO(0, value) ZEND_END_ARG_INFO() #define arginfo_serialize arginfo_strval -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() diff --git a/ext/xmlrpc/xmlrpc_arginfo.h b/ext/xmlrpc/xmlrpc_arginfo.h index 474d51e1d0e97..0a5d1198f8214 100644 --- a/ext/xmlrpc/xmlrpc_arginfo.h +++ b/ext/xmlrpc/xmlrpc_arginfo.h @@ -4,12 +4,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_encode, 0, 1, IS_STRING, ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"iso-8859-1\"") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode_request, 0, 2, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_decode_request, 0, 2, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_INFO(1, method) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"iso-8859-1\"") @@ -22,7 +22,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_encode_request, 0, 2, IS_ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_get_type, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_set_type, 0, 2, _IS_BOOL, 0) @@ -47,14 +47,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_register_method, 0 ZEND_ARG_INFO(0, function) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_call_method, 0, 3, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_server_call_method, 0, 3, IS_MIXED, 0) ZEND_ARG_OBJ_INFO(0, server, XmlRpcServer, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_ARG_INFO(0, user_data) ZEND_ARG_TYPE_INFO(0, output_options, IS_ARRAY, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_parse_method_descriptions, 0, 1, IS_MIXED, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xmlrpc_parse_method_descriptions, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, xml, IS_STRING, 0) ZEND_END_ARG_INFO() diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 656589fb47f5f..495539bfbff46 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -20,7 +20,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_terminate_string, 0, 1, IS_ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_leak_variable, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 1) + ZEND_ARG_TYPE_INFO(0, variable, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_leak_bytes, 0, 0, IS_VOID, 0) From cb4368502bba3dd0d013f8f6b9c792bd931b5a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 25 May 2020 15:24:49 +0200 Subject: [PATCH 4/4] Another turn --- ext/gmp/gmp.c | 1 + ext/standard/basic_functions.stub.php | 4 ++-- ext/standard/basic_functions_arginfo.h | 5 +---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index fae30b084013d..b6b3811a68a9e 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -340,6 +340,7 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva zend_ce_value_error, "%s must be greater than or equal to 0", opcode == ZEND_POW ? "Exponent" : "Shift" ); + ZVAL_UNDEF(return_value); return; } else { mpz_ptr gmpnum_op, gmpnum_result; diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 62565b312e4c5..85f12984aa4f8 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -64,7 +64,7 @@ function krsort(array &$arg, int $sort_flags = SORT_REGULAR): bool {} function ksort(array &$arg, int $sort_flags = SORT_REGULAR): bool {} -/** @param array|object|null $var */ +/** @param array|Countable|null $var */ function count($var, int $mode = COUNT_NORMAL): int {} /** @@ -1435,7 +1435,7 @@ function var_dump(mixed $value, mixed ...$value): void {} function var_export(mixed $value, bool $return = false): ?string {} -function debug_zval_dump(mixed $value, ...$value): void {} +function debug_zval_dump(mixed $value, mixed ...$value): void {} function serialize(mixed $value): string {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index ead188487d293..20b1ed6835df1 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -2182,10 +2182,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_export, 0, 1, IS_STRING, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_debug_zval_dump, 0, 1, IS_VOID, 0) - ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) - ZEND_ARG_VARIADIC_INFO(0, value) -ZEND_END_ARG_INFO() +#define arginfo_debug_zval_dump arginfo_var_dump #define arginfo_serialize arginfo_strval