From ddc5a8b86f88495aa2da1e9df2f6d187c420c3c1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 21 Jul 2021 14:10:49 +0200 Subject: [PATCH] Add return types to APCUIterator For compatibility with tentative types added in PHP 8.1. --- apc_iterator.c | 10 ++++------ apc_iterator.stub.php | 24 ++++++++--------------- apc_iterator_arginfo.h | 20 +++++++++++-------- apc_iterator_legacy_arginfo.h | 2 +- tests/iterator_011.phpt | 37 +++++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 tests/iterator_011.phpt diff --git a/apc_iterator.c b/apc_iterator.c index 712b59be..a2687183 100644 --- a/apc_iterator.c +++ b/apc_iterator.c @@ -429,7 +429,8 @@ PHP_METHOD(APCUIterator, current) { if (apc_stack_size(iterator->stack) == iterator->stack_idx) { if (iterator->fetch(iterator) == 0) { - RETURN_FALSE; + zend_throw_error(NULL, "Cannot call current() on invalid iterator"); + return; } } @@ -446,13 +447,10 @@ PHP_METHOD(APCUIterator, key) { } ENSURE_INITIALIZED(iterator); - if (apc_stack_size(iterator->stack) == 0) { - RETURN_FALSE; - } - if (apc_stack_size(iterator->stack) == iterator->stack_idx) { if (iterator->fetch(iterator) == 0) { - RETURN_FALSE; + zend_throw_error(NULL, "Cannot call key() on invalid iterator"); + return; } } diff --git a/apc_iterator.stub.php b/apc_iterator.stub.php index 95b8ce34..11b981c8 100644 --- a/apc_iterator.stub.php +++ b/apc_iterator.stub.php @@ -13,27 +13,19 @@ public function __construct( int $chunk_size = 0, int $list = APC_LIST_ACTIVE); - /** @return void */ - public function rewind(); + public function rewind(): void; - /** @return void */ - public function next(); + public function next(): void; - /** @return bool */ - public function valid(); + public function valid(): bool; - /** @return string|int|false */ - public function key(); + public function key(): string|int; - /** @return mixed */ - public function current(); + public function current(): mixed; - /** @return int */ - public function getTotalHits(); + public function getTotalHits(): int; - /** @return int */ - public function getTotalSize(); + public function getTotalSize(): int; - /** @return int */ - public function getTotalCount(); + public function getTotalCount(): int; } diff --git a/apc_iterator_arginfo.h b/apc_iterator_arginfo.h index 3c0ffb16..f1b8eb74 100644 --- a/apc_iterator_arginfo.h +++ b/apc_iterator_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: bb3222265846a53027ddd5c8da8106de9af8b0d5 */ + * Stub hash: e8a5a86d5bb9209117834ed0071130889e769c34 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_APCUIterator___construct, 0, 0, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, search, "null") @@ -8,22 +8,26 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_APCUIterator___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, list, IS_LONG, 0, "APC_LIST_ACTIVE") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_APCUIterator_rewind, 0, 0, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_APCUIterator_rewind, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() #define arginfo_class_APCUIterator_next arginfo_class_APCUIterator_rewind -#define arginfo_class_APCUIterator_valid arginfo_class_APCUIterator_rewind +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_APCUIterator_valid, 0, 0, _IS_BOOL, 0) +ZEND_END_ARG_INFO() -#define arginfo_class_APCUIterator_key arginfo_class_APCUIterator_rewind +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_APCUIterator_key, 0, 0, MAY_BE_STRING|MAY_BE_LONG) +ZEND_END_ARG_INFO() -#define arginfo_class_APCUIterator_current arginfo_class_APCUIterator_rewind +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_APCUIterator_current, 0, 0, IS_MIXED, 0) +ZEND_END_ARG_INFO() -#define arginfo_class_APCUIterator_getTotalHits arginfo_class_APCUIterator_rewind +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_APCUIterator_getTotalHits, 0, 0, IS_LONG, 0) +ZEND_END_ARG_INFO() -#define arginfo_class_APCUIterator_getTotalSize arginfo_class_APCUIterator_rewind +#define arginfo_class_APCUIterator_getTotalSize arginfo_class_APCUIterator_getTotalHits -#define arginfo_class_APCUIterator_getTotalCount arginfo_class_APCUIterator_rewind +#define arginfo_class_APCUIterator_getTotalCount arginfo_class_APCUIterator_getTotalHits ZEND_METHOD(APCUIterator, __construct); diff --git a/apc_iterator_legacy_arginfo.h b/apc_iterator_legacy_arginfo.h index 4ddb1567..4dc1fd79 100644 --- a/apc_iterator_legacy_arginfo.h +++ b/apc_iterator_legacy_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: bb3222265846a53027ddd5c8da8106de9af8b0d5 */ + * Stub hash: e8a5a86d5bb9209117834ed0071130889e769c34 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_APCUIterator___construct, 0, 0, 0) ZEND_ARG_INFO(0, search) diff --git a/tests/iterator_011.phpt b/tests/iterator_011.phpt new file mode 100644 index 00000000..3d2d3f24 --- /dev/null +++ b/tests/iterator_011.phpt @@ -0,0 +1,37 @@ +--TEST-- +APCUIterator key() and current() on invalid iterator +--SKIPIF-- + +--INI-- +apc.enabled=1 +apc.enable_cli=1 +--FILE-- +key()); +var_dump($it->current()); +$it->next(); + +try { + var_dump($it->key()); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump($it->current()); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +string(4) "key1" +array(1) { + ["value"]=> + string(6) "value1" +} +Cannot call key() on invalid iterator +Cannot call current() on invalid iterator