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