helly Wed Jan 28 17:59:04 2004 EDT Modified files: /php-src/ext/spl spl_iterators.c /php-src/ext/spl/tests limititerator.phpt Log: - Fix second issue with #27042 - Little improvement - Update test http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.17&r2=1.18&ty=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.17 php-src/ext/spl/spl_iterators.c:1.18 --- php-src/ext/spl/spl_iterators.c:1.17 Mon Jan 26 18:59:50 2004 +++ php-src/ext/spl/spl_iterators.c Wed Jan 28 17:59:03 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.c,v 1.17 2004/01/26 23:59:50 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.18 2004/01/28 22:59:03 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -863,6 +863,16 @@ {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 @@ 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 @@ 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 @@ 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} http://cvs.php.net/diff.php/php-src/ext/spl/tests/limititerator.phpt?r1=1.2&r2=1.3&ty=u Index: php-src/ext/spl/tests/limititerator.phpt diff -u php-src/ext/spl/tests/limititerator.phpt:1.2 php-src/ext/spl/tests/limititerator.phpt:1.3 --- php-src/ext/spl/tests/limititerator.phpt:1.2 Mon Jan 26 18:20:00 2004 +++ php-src/ext/spl/tests/limititerator.phpt Wed Jan 28 17:59:03 2004 @@ -24,8 +24,9 @@ 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 @@ } $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 @@ 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 @@ ?> ===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===
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php