helly Wed Mar 17 14:58:33 2004 EDT
Added files:
/php-src/ext/spl/tests caching_iterator_str.phpt
Modified files:
/php-src/ext/spl spl_iterators.c
Log:
Fix CachingIterator's ability to cache string conversion results.
Add a test for that.
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.27&r2=1.28&ty=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.27 php-src/ext/spl/spl_iterators.c:1.28
--- php-src/ext/spl/spl_iterators.c:1.27 Tue Mar 16 05:17:59 2004
+++ php-src/ext/spl/spl_iterators.c Wed Mar 17 14:58:32 2004
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_iterators.c,v 1.27 2004/03/16 10:17:59 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.28 2004/03/17 19:58:32 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -1054,6 +1054,10 @@
zval_ptr_dtor(&retval);
}
if (intern->u.caching.flags & CIT_CALL_TOSTRING) {
+#if MBO_0
+ /* This version requires zend_make_printable_zval() being able
to
+ * call __toString().
+ */
int use_copy;
zval expr_copy;
ALLOC_ZVAL(intern->u.caching.zstr);
@@ -1067,6 +1071,29 @@
} else {
zval_copy_ctor(intern->u.caching.zstr);
}
+#else
+ zval expr_copy;
+ if (intern->current.data->value.obj.handlers->cast_object &&
+
intern->current.data->value.obj.handlers->cast_object(intern->current.data,
&expr_copy, IS_STRING, 0 TSRMLS_CC) == SUCCESS)
+ {
+ ALLOC_ZVAL(intern->u.caching.zstr);
+ *intern->u.caching.zstr = expr_copy;
+ INIT_PZVAL(intern->u.caching.zstr);
+ zval_copy_ctor(intern->u.caching.zstr);
+ zval_dtor(&expr_copy);
+ } else {
+ zend_class_entry *ce_data =
spl_get_class_entry(intern->current.data TSRMLS_CC);
+ if (ce_data &&
zend_hash_exists(&ce_data->function_table, "__tostring", sizeof("__tostring"))) {
+
zend_call_method_with_0_params(&intern->current.data, ce_data, NULL, "__tostring",
&intern->u.caching.zstr);
+ } else {
+ ALLOC_ZVAL(intern->u.caching.zstr);
+ *intern->u.caching.zstr =
*intern->current.data;
+ zval_copy_ctor(intern->u.caching.zstr);
+ INIT_PZVAL(intern->u.caching.zstr);
+ convert_to_string(intern->u.caching.zstr);
+ }
+ }
+#endif
}
spl_dual_it_next(intern, 0 TSRMLS_CC);
} else {
http://cvs.php.net/co.php/php-src/ext/spl/tests/caching_iterator_str.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/caching_iterator_str.phpt
+++ php-src/ext/spl/tests/caching_iterator_str.phpt
--TEST--
SPL: CachingIterator and __toString()
--SKIPIF--
<?php if (!extension_loaded("spl")) print "skip"; ?>
--FILE--
<?php
class Student
{
private $id;
private $name;
public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
}
public function __toString()
{
return $this->id . ', ' . $this->name;
}
public function getId()
{
return $this->id;
}
}
class StudentIdFilter extends FilterIterator
{
private $id;
public function __construct(ArrayObject $students, Student $other)
{
FilterIterator::__construct($students->getIterator());
$this->id = $other->getId();
}
public function accept()
{
echo "ACCEPT ".$this->current()->getId()." == ".$this->id."\n";
return $this->current()->getId() == $this->id;
}
}
class StudentList implements IteratorAggregate
{
private $students;
public function __construct()
{
$this->students = new ArrayObject(array());
}
public function add(Student $student)
{
if (!$this->contains($student)) {
$this->students[] = $student;
}
}
public function contains(Student $student)
{
foreach ($this->students as $s)
{
if ($s->getId() == $student->getId()) {
return true;
}
}
return false;
}
public function getIterator() {
return new CachingIterator($this->students->getIterator(), true);
}
}
$students = new StudentList();
$students->add(new Student('01234123', 'Joe'));
$students->add(new Student('00000014', 'Bob'));
$students->add(new Student('00000014', 'Foo'));
// The goal is to verify we can access the cached string value even if it was
// generated by a call to __toString(). To check this we need to access the
// iterator's __toString() method.
$it = $students->getIterator();
foreach ($it as $student) {
echo $it->__toString(), "\n";
}
?>
===DONE===
<?php exit(0); ?>
--EXPECT--
01234123, Joe
00000014, Bob
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php