From 4a663413cb08e23e33bb8978bc9c52bc238c6240 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Wed, 4 Dec 2019 19:57:14 -0500 Subject: [PATCH 1/2] Add funcinfo for spl global functions This assumes that `iterator_*` will now always throw or abort on failure. Also, move #include _arginfo.h directive to the top of the file - virtually all other files put it there, and developers may base code on basic_functions.c. --- ext/opcache/Optimizer/zend_func_info.c | 9 ++-- ext/spl/php_spl.c | 73 +------------------------- ext/spl/php_spl.stub.php | 35 ++++++++++++ ext/spl/php_spl_arginfo.h | 65 +++++++++++++++++++++++ ext/standard/basic_functions.c | 3 +- 5 files changed, 106 insertions(+), 79 deletions(-) create mode 100755 ext/spl/php_spl.stub.php create mode 100644 ext/spl/php_spl_arginfo.h diff --git a/ext/opcache/Optimizer/zend_func_info.c b/ext/opcache/Optimizer/zend_func_info.c index 0f4bcb2570332..85dc3d466c61d 100644 --- a/ext/opcache/Optimizer/zend_func_info.c +++ b/ext/opcache/Optimizer/zend_func_info.c @@ -1049,12 +1049,9 @@ static const func_info_t func_infos[] = { F1("class_implements", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), F1("class_parents", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), F1("class_uses", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), - F0("iterator_apply", MAY_BE_NULL | MAY_BE_LONG), - F0("iterator_count", MAY_BE_FALSE | MAY_BE_LONG), - F1("iterator_to_array", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), - F1("spl_classes", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), - F1("spl_object_hash", MAY_BE_NULL | MAY_BE_STRING), - F0("spl_object_id", MAY_BE_NULL | MAY_BE_LONG), + F1("iterator_to_array", MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), + F1("spl_classes", MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), + F1("spl_object_hash", MAY_BE_STRING), }; diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index 341029a543c08..2e06ff6527c86 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -23,6 +23,7 @@ #include "php_main.h" #include "ext/standard/info.h" #include "php_spl.h" +#include "php_spl_arginfo.h" #include "spl_functions.h" #include "spl_engine.h" #include "spl_array.h" @@ -892,76 +893,6 @@ PHP_MINFO_FUNCTION(spl) } /* }}} */ -/* {{{ arginfo */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_iterator_to_array, 0, 0, 1) - ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0) - ZEND_ARG_INFO(0, use_keys) -ZEND_END_ARG_INFO(); - -ZEND_BEGIN_ARG_INFO(arginfo_iterator, 0) - ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0) -ZEND_END_ARG_INFO(); - -ZEND_BEGIN_ARG_INFO_EX(arginfo_iterator_apply, 0, 0, 2) - ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0) - ZEND_ARG_INFO(0, function) - ZEND_ARG_ARRAY_INFO(0, args, 1) -ZEND_END_ARG_INFO(); - -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_parents, 0, 0, 1) - ZEND_ARG_INFO(0, instance) - ZEND_ARG_INFO(0, autoload) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_implements, 0, 0, 1) - ZEND_ARG_INFO(0, what) - ZEND_ARG_INFO(0, autoload) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_uses, 0, 0, 1) - ZEND_ARG_INFO(0, what) - ZEND_ARG_INFO(0, autoload) -ZEND_END_ARG_INFO() - - -ZEND_BEGIN_ARG_INFO(arginfo_spl_classes, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_spl_autoload_functions, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_autoload, 0, 0, 1) - ZEND_ARG_INFO(0, class_name) - ZEND_ARG_INFO(0, file_extensions) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_autoload_extensions, 0, 0, 0) - ZEND_ARG_INFO(0, file_extensions) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_autoload_call, 0, 0, 1) - ZEND_ARG_INFO(0, class_name) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_autoload_register, 0, 0, 0) - ZEND_ARG_INFO(0, autoload_function) - ZEND_ARG_INFO(0, throw) - ZEND_ARG_INFO(0, prepend) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_autoload_unregister, 0, 0, 1) - ZEND_ARG_INFO(0, autoload_function) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_object_hash, 0, 0, 1) - ZEND_ARG_INFO(0, obj) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_object_id, 0, 0, 1) - ZEND_ARG_INFO(0, obj) -ZEND_END_ARG_INFO() -/* }}} */ - /* {{{ spl_functions */ static const zend_function_entry spl_functions[] = { @@ -978,7 +909,7 @@ static const zend_function_entry spl_functions[] = { PHP_FE(spl_object_hash, arginfo_spl_object_hash) PHP_FE(spl_object_id, arginfo_spl_object_id) PHP_FE(iterator_to_array, arginfo_iterator_to_array) - PHP_FE(iterator_count, arginfo_iterator) + PHP_FE(iterator_count, arginfo_iterator_count) PHP_FE(iterator_apply, arginfo_iterator_apply) PHP_FE_END }; diff --git a/ext/spl/php_spl.stub.php b/ext/spl/php_spl.stub.php new file mode 100755 index 0000000000000..fee11b39ea499 --- /dev/null +++ b/ext/spl/php_spl.stub.php @@ -0,0 +1,35 @@ + Date: Wed, 11 Dec 2019 09:21:51 -0500 Subject: [PATCH 2/2] Address review comments --- ext/spl/php_spl.stub.php | 30 +++++++++++++++--------------- ext/spl/php_spl_arginfo.h | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ext/spl/php_spl.stub.php b/ext/spl/php_spl.stub.php index fee11b39ea499..8bf6e79c743e7 100755 --- a/ext/spl/php_spl.stub.php +++ b/ext/spl/php_spl.stub.php @@ -2,34 +2,34 @@ /* ext/spl/php_spl.c */ -function class_implements($what, bool $autoload = true) : array|false { } +function class_implements($what, bool $autoload = true): array|false {} -function class_parents($instance, bool $autoload = true) : array|false {} +function class_parents($instance, bool $autoload = true): array|false {} -function class_uses($what, bool $autoload = true) : array|false {} +function class_uses($what, bool $autoload = true): array|false {} -function spl_autoload(string $class_name, string $file_extensions = '.inc,.php') : void {} +function spl_autoload(string $class_name, string $file_extensions = UNKNOWN): void {} // This silently ignores non-string class names -function spl_autoload_call($class_name) : void {} +function spl_autoload_call($class_name): void {} -function spl_autoload_extensions(string $file_extensions = '') : string {} +function spl_autoload_extensions(string $file_extensions = UNKNOWN): string {} -function spl_autoload_functions() : array|false {} +function spl_autoload_functions(): array|false {} -function spl_autoload_register($autoload_function = null, bool $throw = true, bool $prepend = false) : bool {} +function spl_autoload_register($autoload_function = null, bool $throw = true, bool $prepend = false): bool {} -function spl_autoload_unregister($autoload_function) : bool {} +function spl_autoload_unregister($autoload_function): bool {} -function spl_classes() : array {} +function spl_classes(): array {} -function spl_object_hash(object $obj) : string {} +function spl_object_hash(object $obj): string {} -function spl_object_id(object $obj) : int {} +function spl_object_id(object $obj): int {} /* ext/spl/spl_iterators.c */ -function iterator_apply(Traversable $iterator, $function, ?array $args = null) : int {} +function iterator_apply(Traversable $iterator, callable $function, ?array $args = null): int {} -function iterator_count(Traversable $iterator) : int {} +function iterator_count(Traversable $iterator): int {} -function iterator_to_array(Traversable $iterator, bool $use_keys = true) : array { } +function iterator_to_array(Traversable $iterator, bool $use_keys = true): array {} diff --git a/ext/spl/php_spl_arginfo.h b/ext/spl/php_spl_arginfo.h index 6a6ebdf2bd544..cc60ff97baebd 100644 --- a/ext/spl/php_spl_arginfo.h +++ b/ext/spl/php_spl_arginfo.h @@ -51,7 +51,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_iterator_apply, 0, 2, IS_LONG, 0) ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0) - ZEND_ARG_INFO(0, function) + ZEND_ARG_TYPE_INFO(0, function, IS_CALLABLE, 0) ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 1) ZEND_END_ARG_INFO()