From 3d96f1aaf6e1eae26dd637a4795f8fee95b79c02 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 10 Jun 2021 10:48:12 +0200 Subject: [PATCH] Fix tests for PHP 8.1 --- tests/apc_003b.phpt | 15 ++--- tests/apc_003b_legacy.phpt | 113 +++++++++++++++++++++++++++++++++++++ tests/apc_006_php73.phpt | 1 + tests/apc_006_php81.phpt | 83 +++++++++++++++++++++++++++ tests/bug76145.phpt | 1 + 5 files changed, 206 insertions(+), 7 deletions(-) create mode 100644 tests/apc_003b_legacy.phpt create mode 100644 tests/apc_006_php81.phpt diff --git a/tests/apc_003b.phpt b/tests/apc_003b.phpt index 18b0d20..d7a18cc 100644 --- a/tests/apc_003b.phpt +++ b/tests/apc_003b.phpt @@ -2,7 +2,8 @@ APC: apcu_store/fetch with objects --SKIPIF-- = 8.1"); ?> --INI-- apc.enabled=1 @@ -68,42 +69,42 @@ object(foo)#%d (1) { bool(true) } object(baz)#%d (6) { - ["pri":"baz":private]=> - string(3) "baz" ["pub"]=> string(3) "bar" ["pro":protected]=> string(3) "bar" ["pri":"bar":private]=> string(3) "bar" + ["pri":"baz":private]=> + string(3) "baz" ["bar"]=> bool(true) ["baz"]=> bool(true) } object(baz)#%d (6) { - ["pri":"baz":private]=> - string(3) "baz" ["pub"]=> string(3) "bar" ["pro":protected]=> string(3) "bar" ["pri":"bar":private]=> string(3) "mod" + ["pri":"baz":private]=> + string(3) "baz" ["bar"]=> bool(true) ["baz"]=> bool(true) } object(baz)#%d (6) { - ["pri":"baz":private]=> - string(3) "baz" ["pub"]=> string(3) "bar" ["pro":protected]=> string(3) "bar" ["pri":"bar":private]=> string(3) "mod" + ["pri":"baz":private]=> + string(3) "baz" ["bar"]=> bool(true) ["baz"]=> diff --git a/tests/apc_003b_legacy.phpt b/tests/apc_003b_legacy.phpt new file mode 100644 index 0000000..ca2fa08 --- /dev/null +++ b/tests/apc_003b_legacy.phpt @@ -0,0 +1,113 @@ +--TEST-- +APC: apcu_store/fetch with objects +--SKIPIF-- += 80100) die("skip For PHP < 8.1"); +?> +--INI-- +apc.enabled=1 +apc.enable_cli=1 +--FILE-- +a = true; +var_dump($bar); + +class bar extends foo +{ + public $pub = 'bar'; + protected $pro = 'bar'; + private $pri = 'bar'; // we don't see this, we'd need php 5.1 new serialization + + function __construct() + { + $this->bar = true; + } + + function change() + { + $this->pri = 'mod'; + } +} + +class baz extends bar +{ + private $pri = 'baz'; + + function __construct() + { + parent::__construct(); + $this->baz = true; + } +} + +$baz = new baz; +var_dump($baz); +$baz->change(); +var_dump($baz); +apcu_store('baz', $baz); +unset($baz); +var_dump(apcu_fetch('baz')); + +?> +===DONE=== +--EXPECTF-- +object(foo)#%d (0) { +} +object(foo)#%d (0) { +} +object(foo)#%d (1) { + ["a"]=> + bool(true) +} +object(baz)#%d (6) { + ["pri":"baz":private]=> + string(3) "baz" + ["pub"]=> + string(3) "bar" + ["pro":protected]=> + string(3) "bar" + ["pri":"bar":private]=> + string(3) "bar" + ["bar"]=> + bool(true) + ["baz"]=> + bool(true) +} +object(baz)#%d (6) { + ["pri":"baz":private]=> + string(3) "baz" + ["pub"]=> + string(3) "bar" + ["pro":protected]=> + string(3) "bar" + ["pri":"bar":private]=> + string(3) "mod" + ["bar"]=> + bool(true) + ["baz"]=> + bool(true) +} +object(baz)#%d (6) { + ["pri":"baz":private]=> + string(3) "baz" + ["pub"]=> + string(3) "bar" + ["pro":protected]=> + string(3) "bar" + ["pri":"bar":private]=> + string(3) "mod" + ["bar"]=> + bool(true) + ["baz"]=> + bool(true) +} +===DONE=== diff --git a/tests/apc_006_php73.phpt b/tests/apc_006_php73.phpt index 42bdfde..adc09b9 100644 --- a/tests/apc_006_php73.phpt +++ b/tests/apc_006_php73.phpt @@ -4,6 +4,7 @@ APC: apcu_store/fetch reference test = 7.3'); +if (PHP_VERSION_ID >= 80100) die('skip Only for PHP < 8.1'); ?> --INI-- apc.enabled=1 diff --git a/tests/apc_006_php81.phpt b/tests/apc_006_php81.phpt new file mode 100644 index 0000000..94219dc --- /dev/null +++ b/tests/apc_006_php81.phpt @@ -0,0 +1,83 @@ +--TEST-- +APC: apcu_store/fetch reference test +--SKIPIF-- += 8.1'); +?> +--INI-- +apc.enabled=1 +apc.enable_cli=1 +apc.serializer=php +report_memleaks=0 +--FILE-- + +===DONE=== +--EXPECTF-- +array(9) refcount(2){ + [0]=> + string(1) "a" interned + [1]=> + reference refcount(2) { + array(1) refcount(1){ + [0]=> + string(1) "c" interned + } + } + [2]=> + reference refcount(2) { + array(1) refcount(1){ + [0]=> + string(1) "c" interned + } + } + [3]=> + reference refcount(3) { + string(1) "d" interned + } + [4]=> + reference refcount(3) { + string(1) "d" interned + } + [5]=> + reference refcount(3) { + string(1) "d" interned + } + [6]=> + string(1) "e" interned + [7]=> + string(1) "e" interned + [8]=> + reference refcount(2) { + array(2) refcount(1){ + [0]=> + string(1) "f" interned + [1]=> + reference refcount(2) { + *RECURSION* + } + } + } +} +===DONE=== diff --git a/tests/bug76145.phpt b/tests/bug76145.phpt index 8959a44..56f7e10 100644 --- a/tests/bug76145.phpt +++ b/tests/bug76145.phpt @@ -3,6 +3,7 @@ Bug #76145: Data corruption reading from APCu while unserializing --INI-- apc.enabled=1 apc.enable_cli=1 +error_reporting=E_ALL&~E_DEPRECATED --FILE-- 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 712b59b..a268718 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 95b8ce3..11b981c 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 3c0ffb1..f1b8eb7 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 4ddb156..4dc1fd7 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 0000000..3d2d3f2 --- /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