]> granicus.if.org Git - php/commitdiff
- Fix second issue with #27042
authorMarcus Boerger <helly@php.net>
Wed, 28 Jan 2004 22:59:03 +0000 (22:59 +0000)
committerMarcus Boerger <helly@php.net>
Wed, 28 Jan 2004 22:59:03 +0000 (22:59 +0000)
- Little improvement
- Update test

ext/spl/spl_iterators.c
ext/spl/tests/limititerator.phpt

index 4b64891a24401c2e02465ea9347f5636aeba180d..2fe08bc0cbbbe2952ea1aca38b9c04139101fb03 100755 (executable)
@@ -863,6 +863,16 @@ static zend_function_entry spl_funcs_ParentIterator[] = {
        {NULL, NULL, NULL}
 };
 
+static INLINE int spl_limit_it_has_more(spl_dual_it_object *intern TSRMLS_DC)
+{
+       /* FAILURE / SUCCESS */
+       if (intern->u.limit.count != -1 && intern->current.pos >= intern->u.limit.offset + intern->u.limit.count) {
+               return FAILURE;
+       } else {
+               return spl_dual_it_has_more(intern TSRMLS_CC);
+       }
+}
+
 static INLINE void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS_DC)
 {
        zval  *zpos;
@@ -883,8 +893,10 @@ static INLINE void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS
                zval_ptr_dtor(&zpos);
                spl_dual_it_free(intern TSRMLS_CC);
                zend_user_it_free_current(intern->inner.iterator TSRMLS_CC);
-               spl_dual_it_fetch(intern, 1 TSRMLS_CC);
                intern->current.pos = pos;
+               if (spl_limit_it_has_more(intern TSRMLS_CC) == SUCCESS) {
+                       spl_dual_it_fetch(intern, 0 TSRMLS_CC);
+               }
        } else {
                /* emulate the forward seek, by next() calls */
                /* a back ward seek is done by a previous rewind() */
@@ -920,9 +932,22 @@ SPL_METHOD(LimitIterator, hasMore)
 
        intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
+/*     RETURN_BOOL(spl_limit_it_has_more(intern TSRMLS_CC) == SUCCESS);*/
        RETURN_BOOL((intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) && intern->current.data);
 }
 
+SPL_METHOD(LimitIterator, next)
+{
+       spl_dual_it_object   *intern;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       spl_dual_it_next(intern, 1 TSRMLS_CC);
+       if (intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) {
+               spl_dual_it_fetch(intern, 1 TSRMLS_CC);
+       }
+}
+
 SPL_METHOD(LimitIterator, seek)
 {
        spl_dual_it_object   *intern;
@@ -972,7 +997,7 @@ static zend_function_entry spl_funcs_LimitIterator[] = {
        SPL_ME(LimitIterator, hasMore,       NULL, ZEND_ACC_PUBLIC)
        SPL_ME(dual_it,       key,           NULL, ZEND_ACC_PUBLIC)
        SPL_ME(dual_it,       current,       NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(dual_it,       next,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(LimitIterator, next,          NULL, ZEND_ACC_PUBLIC)
        SPL_ME(LimitIterator, seek,          arginfo_limit_it_seek, ZEND_ACC_PUBLIC)
        SPL_ME(LimitIterator, getPosition,   NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
index 13310470b8a181800d505e6ed7f2db6c5e9a01db..673a529cdeb9cba490cabdfdb9f4ea9e00d99580 100755 (executable)
@@ -24,8 +24,9 @@ class NumericArrayIterator implements Iterator
 
        public function hasMore()
        {
-               echo __METHOD__ . "\n";
-               return $this->i < count($this->a);
+               $ret = $this->i < count($this->a);
+               echo __METHOD__ . '(' . ($ret ? 'true' : 'false') . ")\n";
+               return $ret;
        }
 
        public function key()
@@ -59,14 +60,14 @@ class SeekableNumericArrayIterator extends NumericArrayIterator implements Seeka
 }
 
 $a = array(1, 2, 3, 4, 5);
-foreach (new LimitIterator(new NumericArrayIterator($a)) as $v)
+foreach (new LimitIterator(new NumericArrayIterator($a), 1, 3) as $v)
 {
        print "$v\n";
 }
 
 echo "===SEEKABLE===\n";
 $a = array(1, 2, 3, 4, 5);
-foreach(new LimitIterator(new SeekableNumericArrayIterator($a)) as $v)
+foreach(new LimitIterator(new SeekableNumericArrayIterator($a), 1, 3) as $v)
 {
        print "$v\n";
 }
@@ -74,7 +75,7 @@ foreach(new LimitIterator(new SeekableNumericArrayIterator($a)) as $v)
 echo "===SEEKING===\n";
 $a = array(1, 2, 3, 4, 5);
 $l = new LimitIterator(new SeekableNumericArrayIterator($a));
-for($i = 0; $i < 5; $i++)
+for($i = 1; $i < 4; $i++)
 {
        $l->seek($i);
        print $l->current() . "\n";
@@ -82,91 +83,62 @@ for($i = 0; $i < 5; $i++)
 
 ?>
 ===DONE===
+<?php exit(0); ?>
 --EXPECT--
 NumericArrayIterator::__construct
 NumericArrayIterator::rewind
-NumericArrayIterator::hasMore
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-1
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 2
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 3
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 4
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-5
-NumericArrayIterator::next
-NumericArrayIterator::hasMore
 ===SEEKABLE===
 NumericArrayIterator::__construct
 NumericArrayIterator::rewind
-SeekableNumericArrayIterator::seek(0)
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-1
-NumericArrayIterator::next
-NumericArrayIterator::hasMore
+SeekableNumericArrayIterator::seek(1)
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 2
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 3
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 4
 NumericArrayIterator::next
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-5
-NumericArrayIterator::next
-NumericArrayIterator::hasMore
 ===SEEKING===
 NumericArrayIterator::__construct
-SeekableNumericArrayIterator::seek(0)
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-1
 SeekableNumericArrayIterator::seek(1)
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 2
 SeekableNumericArrayIterator::seek(2)
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 3
 SeekableNumericArrayIterator::seek(3)
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
 4
-SeekableNumericArrayIterator::seek(4)
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-5
 ===DONE===