]> granicus.if.org Git - php/commitdiff
Fix ZPP of MultipleIterator::detachIterator() and MultipleIterator::containsIterator()
authorMáté Kocsis <kocsismate@woohoolabs.com>
Mon, 16 Mar 2020 09:27:48 +0000 (10:27 +0100)
committerMáté Kocsis <kocsismate@woohoolabs.com>
Mon, 16 Mar 2020 11:05:40 +0000 (12:05 +0100)
ext/spl/spl_observer.c
ext/spl/spl_observer.stub.php
ext/spl/spl_observer_arginfo.h

index 51dc8a4297724c1826891d6756dadf1f89672d0e..03765fe7f780dd3ab880d7a4d3f580120bbf6181 100644 (file)
@@ -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)
index 377ee7111ad251e5386731e56b735c8cce99bef9..bba3860d2360ee734f1ad9bc9e971cb721fa11ac 100644 (file)
@@ -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() {}
index f470b0a960370f59e244f3c616f0679c26c40a56..4b35041b6f8347283720ac4c8489df6d478fd8c9 100644 (file)
@@ -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