helly Thu Apr 29 18:25:45 2004 EDT Added files: /php-src/ext/spl/tests array_013.phpt
Modified files: /php-src/ext/spl spl_array.c /php-src/ext/spl/examples appenditerator.inc Log: - ArrayObject::append() must not be called when it refers to an object http://cvs.php.net/diff.php/php-src/ext/spl/spl_array.c?r1=1.43&r2=1.44&ty=u Index: php-src/ext/spl/spl_array.c diff -u php-src/ext/spl/spl_array.c:1.43 php-src/ext/spl/spl_array.c:1.44 --- php-src/ext/spl/spl_array.c:1.43 Thu Apr 29 03:22:02 2004 +++ php-src/ext/spl/spl_array.c Thu Apr 29 18:25:44 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_array.c,v 1.43 2004/04/29 07:22:02 helly Exp $ */ +/* $Id: spl_array.c,v 1.44 2004/04/29 22:25:44 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -361,14 +361,31 @@ } /* }}} */ /* {{{ proto bool ArrayObject::append(mixed $newval) - Appends the value. */ + Appends the value (cannot be called for objects). */ SPL_METHOD(Array, append) { + zval *object = getThis(); + spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); + HashTable *aht = HASH_OF(intern->array); + zval *value; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) { return; } - spl_array_write_dimension(getThis(), NULL, value TSRMLS_CC); + + if (!aht) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array"); + return; + } + + if (Z_TYPE_P(intern->array) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot append properties to objects, use %s::offsetSet() instead", Z_OBJCE_P(object)->name); + } + + spl_array_write_dimension(object, NULL, value TSRMLS_CC); + if (!intern->pos) { + intern->pos = aht->pListTail; + } } /* }}} */ /* {{{ proto bool ArrayObject::offsetUnset(mixed $index) http://cvs.php.net/diff.php/php-src/ext/spl/examples/appenditerator.inc?r1=1.4&r2=1.5&ty=u Index: php-src/ext/spl/examples/appenditerator.inc diff -u php-src/ext/spl/examples/appenditerator.inc:1.4 php-src/ext/spl/examples/appenditerator.inc:1.5 --- php-src/ext/spl/examples/appenditerator.inc:1.4 Wed Apr 28 17:52:51 2004 +++ php-src/ext/spl/examples/appenditerator.inc Thu Apr 29 18:25:44 2004 @@ -18,11 +18,6 @@ function append(Iterator $it) { $this->iterators->append($it); - if (!$this->valid()) - { - $this->iterators->seek($this->iterators->count() - 1); - $this->iterators->current()->rewind(); - } } function getInnerIterator() http://cvs.php.net/co.php/php-src/ext/spl/tests/array_013.phpt?r=1.1&p=1 Index: php-src/ext/spl/tests/array_013.phpt +++ php-src/ext/spl/tests/array_013.phpt --TEST-- SPL: ArrayIterator::append --SKIPIF-- <?php if (!extension_loaded("spl")) print "skip"; ?> --FILE-- <?php if (!class_exists('NoRewindIterator', false)) { require_once(dirname(__FILE__) . '/../examples/norewinditerator.inc'); } echo "===Array===\n"; $a = array(0 => 'zero', 1 => 'one', 2 => 'two'); $it = new ArrayIterator($a); foreach($it as $key => $val) { echo "$key=>$val\n"; } echo "===Append===\n"; $it->append('three'); $it->append('four'); foreach(new NoRewindIterator($it) as $key => $val) { echo "$key=>$val\n"; } echo "===Object===\n"; class test { public $zero = 0; protected $pro; public $one = 1; private $pri; public $two = 2; } $o = new test; $it = new ArrayIterator($o); foreach($it as $key => $val) { echo "$key=>$val\n"; } echo "===Append===\n"; $it->append('three'); $it->append('four'); foreach(new NoRewindIterator($it) as $key => $val) { echo "$key=>$val\n"; } var_dump($o->{0}); /* doesn't wotk anyway */ ?> ===DONE=== <?php exit(0); ?> --EXPECTF-- ===Array=== 0=>zero 1=>one 2=>two ===Append=== 3=>three 4=>four ===Object=== zero=>0 one=>1 two=>2 ===Append=== Fatal error: ArrayIterator::append(): Cannot append properties to objects, use ArrayIterator::offsetSet() instead in %sarray_013.php on line %d -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php