From c3554eb2c4f9a277f741869a43b3bd4f4cece792 Mon Sep 17 00:00:00 2001 From: =?utf8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 16 Mar 2020 10:27:48 +0100 Subject: [PATCH] Fix ZPP of MultipleIterator::detachIterator() and MultipleIterator::containsIterator() --- ext/spl/spl_observer.c | 40 +++++++++++++++++++++++++++------- ext/spl/spl_observer.stub.php | 8 +++---- ext/spl/spl_observer_arginfo.h | 2 +- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 51dc8a4297..03765fe7f7 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -719,12 +719,7 @@ SPL_METHOD(SplObjectStorage, serialize) /* done */ PHP_VAR_SERIALIZE_DESTROY(var_hash); - if (buf.s) { - RETURN_NEW_STR(buf.s); - } else { - RETURN_NULL(); - } - + RETURN_NEW_STR(buf.s); } /* }}} */ /* {{{ proto void SplObjectStorage::unserialize(string serialized) @@ -1046,6 +1041,35 @@ SPL_METHOD(MultipleIterator, attachIterator) } /* }}} */ +/* {{{ proto void MultipleIterator::detachIterator(Iterator iterator) + Detaches an iterator */ +SPL_METHOD(MultipleIterator, detachIterator) +{ + zval *iterator; + spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS); + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &iterator, zend_ce_iterator) == FAILURE) { + RETURN_THROWS(); + } + spl_object_storage_detach(intern, iterator); + + zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos); + intern->index = 0; +} /* }}} */ + +/* {{{ proto bool MultipleIterator::containsIterator(Iterator iterator) + Determine whether the iterator exists */ +SPL_METHOD(MultipleIterator, containsIterator) +{ + zval *iterator; + spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS); + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &iterator, zend_ce_iterator) == FAILURE) { + RETURN_THROWS(); + } + RETURN_BOOL(spl_object_storage_contains(intern, iterator)); +} /* }}} */ + /* {{{ proto void MultipleIterator::rewind() Rewind all attached iterator instances */ SPL_METHOD(MultipleIterator, rewind) @@ -1239,8 +1263,8 @@ static const zend_function_entry spl_funcs_MultipleIterator[] = { SPL_ME(MultipleIterator, getFlags, arginfo_class_MultipleIterator_getFlags, 0) SPL_ME(MultipleIterator, setFlags, arginfo_class_MultipleIterator_setFlags, 0) SPL_ME(MultipleIterator, attachIterator, arginfo_class_MultipleIterator_attachIterator, 0) - SPL_MA(MultipleIterator, detachIterator, SplObjectStorage, detach, arginfo_class_MultipleIterator_detachIterator, 0) - SPL_MA(MultipleIterator, containsIterator, SplObjectStorage, contains, arginfo_class_MultipleIterator_containsIterator, 0) + SPL_ME(MultipleIterator, detachIterator, arginfo_class_MultipleIterator_detachIterator, 0) + SPL_ME(MultipleIterator, containsIterator, arginfo_class_MultipleIterator_containsIterator, 0) SPL_MA(MultipleIterator, countIterators, SplObjectStorage, count, arginfo_class_MultipleIterator_countIterators, 0) /* Iterator */ SPL_ME(MultipleIterator, rewind, arginfo_class_MultipleIterator_rewind, 0) diff --git a/ext/spl/spl_observer.stub.php b/ext/spl/spl_observer.stub.php index 377ee7111a..bba3860d23 100644 --- a/ext/spl/spl_observer.stub.php +++ b/ext/spl/spl_observer.stub.php @@ -71,7 +71,7 @@ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess /** @return void */ public function unserialize(string $serialized) {} - /** @return string|null */ + /** @return string */ public function serialize() {} /** @@ -82,7 +82,7 @@ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess /** * @param object $object - * @return string + * @return mixed */ public function offsetGet($object) {} @@ -127,10 +127,10 @@ class MultipleIterator implements Iterator public function attachIterator(Iterator $iterator, $info = null) {} /** @return void */ - public function detachIterator(object $iterator) {} + public function detachIterator(Iterator $iterator) {} /** @return bool */ - public function containsIterator(object $iterator) {} + public function containsIterator(Iterator $iterator) {} /** @return int */ public function countIterators() {} diff --git a/ext/spl/spl_observer_arginfo.h b/ext/spl/spl_observer_arginfo.h index f470b0a960..4b35041b6f 100644 --- a/ext/spl/spl_observer_arginfo.h +++ b/ext/spl/spl_observer_arginfo.h @@ -95,7 +95,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MultipleIterator_attachIterator, 0, 0, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MultipleIterator_detachIterator, 0, 0, 1) - ZEND_ARG_TYPE_INFO(0, iterator, IS_OBJECT, 0) + ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0) ZEND_END_ARG_INFO() #define arginfo_class_MultipleIterator_containsIterator arginfo_class_MultipleIterator_detachIterator -- 2.40.0