]> granicus.if.org Git - php/commitdiff
Fix #49723 (Skip seek when unnecessary)
authorEtienne Kneuss <colder@php.net>
Tue, 27 Apr 2010 04:57:48 +0000 (04:57 +0000)
committerEtienne Kneuss <colder@php.net>
Tue, 27 Apr 2010 04:57:48 +0000 (04:57 +0000)
ext/spl/spl_iterators.c
ext/spl/tests/bug49723.phpt [new file with mode: 0644]

index 07f47680de3553089882181b1d56eaccfb0f857f..b6e2900e808aae8335f6656a3cd1d4839b8bc7b6 100755 (executable)
@@ -1738,7 +1738,7 @@ static inline void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS
                zend_throw_exception_ex(spl_ce_OutOfBoundsException, 0 TSRMLS_CC, "Cannot seek to %ld which is behind offset %ld plus count %ld", pos, intern->u.limit.offset, intern->u.limit.count);
                return;
        }
-       if (instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) {
+       if (pos != intern->current.pos && instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) {
                MAKE_STD_ZVAL(zpos);
                ZVAL_LONG(zpos, pos);
                spl_dual_it_free(intern TSRMLS_CC);
diff --git a/ext/spl/tests/bug49723.phpt b/ext/spl/tests/bug49723.phpt
new file mode 100644 (file)
index 0000000..221e806
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+LimitIterator: do not seek if not needed 
+--FILE--
+<?php
+
+$it = new ArrayIterator(array());
+
+$lit = new LimitIterator($it, 0, 5);
+
+foreach ($lit as $v) {
+    echo $v;
+}
+?>
+===DONE===
+--EXPECT--
+===DONE===