helly           Mon Jan 24 16:38:30 2005 EDT

  Added files:                 (Branch: PHP_5_0)
    /php-src/ext/spl/tests      bug31346.phpt 

  Modified files:              
    /php-src/ext/spl    spl_array.c 
    /php-src/ext/spl/tests      bug28822.phpt 
  Log:
  - MFH
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/spl_array.c?r1=1.49.2.1&r2=1.49.2.2&ty=u
Index: php-src/ext/spl/spl_array.c
diff -u php-src/ext/spl/spl_array.c:1.49.2.1 
php-src/ext/spl/spl_array.c:1.49.2.2
--- php-src/ext/spl/spl_array.c:1.49.2.1        Tue Aug 31 16:56:08 2004
+++ php-src/ext/spl/spl_array.c Mon Jan 24 16:38:29 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_array.c,v 1.49.2.1 2004/08/31 20:56:08 helly Exp $ */
+/* $Id: spl_array.c,v 1.49.2.2 2005/01/24 21:38:29 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -26,6 +26,7 @@
 #include "php_ini.h"
 #include "ext/standard/info.h"
 #include "zend_interfaces.h"
+#include "zend_exceptions.h"
 
 #include "php_spl.h"
 #include "spl_functions.h"
@@ -119,6 +120,7 @@
        zend_object       std;
        zval              *array;
        HashPosition      pos;
+       int               is_ref;
 } spl_array_object;
 
 /* {{{ spl_array_object_free_storage */
@@ -154,9 +156,11 @@
        if (orig) {
                intern->array = orig->array;
                ZVAL_ADDREF(intern->array);
+               intern->is_ref = 1;
        } else {
                MAKE_STD_ZVAL(intern->array);
                array_init(intern->array);
+               intern->is_ref = 0;
        }
        zend_hash_internal_pointer_reset_ex(HASH_OF(intern->array), 
&intern->pos);
 
@@ -365,20 +369,12 @@
        spl_array_write_dimension(getThis(), index, value TSRMLS_CC);
 } /* }}} */
 
-/* {{{ proto void ArrayObject::append(mixed $newval)
-       proto void ArrayIterator::append(mixed $newval)
- Appends the value (cannot be called for objects). */
-SPL_METHOD(Array, append)
+
+void spl_array_iterator_append(zval *object, zval *append_value TSRMLS_DC) /* 
{{{ */
 {
-       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;
-       }
-
        if (!aht) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified 
outside object and is no longer an array");
                return;
@@ -388,12 +384,25 @@
                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);
+       spl_array_write_dimension(object, NULL, append_value TSRMLS_CC);
        if (!intern->pos) {
                intern->pos = aht->pListTail;
        }
 } /* }}} */
 
+/* {{{ proto void ArrayObject::append(mixed $newval)
+       proto void ArrayIterator::append(mixed $newval)
+ Appends the value (cannot be called for objects). */
+SPL_METHOD(Array, append)
+{
+       zval *value;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == 
FAILURE) {
+               return;
+       }
+       spl_array_iterator_append(getThis(), value TSRMLS_CC);
+} /* }}} */
+
 /* {{{ proto void ArrayObject::offsetUnset(mixed $index)
        proto void ArrayIterator::offsetUnset(mixed $index)
  Unsets the value at the specified $index. */
@@ -478,11 +487,16 @@
 {
        HashTable *aht = HASH_OF(intern->array);
 
-       zend_hash_move_forward_ex(aht, &intern->pos);
-       if (Z_TYPE_P(intern->array) == IS_OBJECT) {
-               return spl_array_skip_protected(intern TSRMLS_CC);
+       if (intern->is_ref && spl_hash_verify_pos(intern TSRMLS_CC) == FAILURE) 
{
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified 
outside object and internal position is no longer valid");
+               return FAILURE;
        } else {
-               return zend_hash_has_more_elements_ex(aht, &intern->pos);
+               zend_hash_move_forward_ex(aht, &intern->pos);
+               if (Z_TYPE_P(intern->array) == IS_OBJECT) {
+                       return spl_array_skip_protected(intern TSRMLS_CC);
+               } else {
+                       return zend_hash_has_more_elements_ex(aht, 
&intern->pos);
+               }
        }
 } /* }}} */
 
@@ -513,7 +527,7 @@
                return FAILURE;
        }
 
-       if (object->pos && object->array->is_ref && spl_hash_verify_pos(object 
TSRMLS_CC) == FAILURE) {
+       if (object->pos && object->is_ref && spl_hash_verify_pos(object 
TSRMLS_CC) == FAILURE) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, 
"ArrayIterator::valid(): Array was modified outside object and internal 
position is no longer valid");
                return FAILURE;
        } else {
@@ -545,7 +559,7 @@
                return HASH_KEY_NON_EXISTANT;
        }
 
-       if (object->array->is_ref && spl_hash_verify_pos(object TSRMLS_CC) == 
FAILURE) {
+       if (object->is_ref && spl_hash_verify_pos(object TSRMLS_CC) == FAILURE) 
{
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, 
"ArrayIterator::current(): Array was modified outside object and internal 
position is no longer valid");
                return HASH_KEY_NON_EXISTANT;
        }
@@ -566,7 +580,7 @@
                return;
        }
 
-       if (object->array->is_ref && spl_hash_verify_pos(object TSRMLS_CC) == 
FAILURE) {
+       if (object->is_ref && spl_hash_verify_pos(object TSRMLS_CC) == FAILURE) 
{
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, 
"ArrayIterator::next(): Array was modified outside object and internal position 
is no longer valid");
        } else {
                spl_array_next(object TSRMLS_CC);
@@ -626,8 +640,7 @@
        if (ZEND_NUM_ARGS() == 0) {
                return; /* nothing to do */
        }
-/* exceptions do not work yet
-       php_set_error_handling(EH_THROW, zend_exception_get_default() 
TSRMLS_CC);*/
+       php_set_error_handling(EH_THROW, zend_exception_get_default() 
TSRMLS_CC);
 
        intern = (spl_array_object*)zend_object_store_get_object(object 
TSRMLS_CC);
 
@@ -641,8 +654,8 @@
                intern->array = other->array;           
        } else {
                if (!HASH_OF(*array)) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passed 
variable is not an array or object, using empty array instead");
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+                       zend_throw_exception(zend_exception_get_default(), 
"Passed variable is not an array or object, using empty array instead", 0 
TSRMLS_CC);
                        return;
                }
                zval_dtor(intern->array);
@@ -773,7 +786,7 @@
                return;
        }
 
-       if (intern->array->is_ref && spl_hash_verify_pos(intern TSRMLS_CC) == 
FAILURE) {
+       if (intern->is_ref && spl_hash_verify_pos(intern TSRMLS_CC) == FAILURE) 
{
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified 
outside object and internal position is no longer valid");
                return;
        }
@@ -802,7 +815,7 @@
                return;
        }
 
-       if (intern->array->is_ref && spl_hash_verify_pos(intern TSRMLS_CC) == 
FAILURE) {
+       if (intern->is_ref && spl_hash_verify_pos(intern TSRMLS_CC) == FAILURE) 
{
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified 
outside object and internal position is no longer valid");
                return;
        }
@@ -833,11 +846,7 @@
                return;
        }
 
-       if (intern->array->is_ref && spl_hash_verify_pos(intern TSRMLS_CC) == 
FAILURE) {
-               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified 
outside object and internal position is no longer valid");
-       } else {
-               spl_array_next(intern TSRMLS_CC);
-       }
+       spl_array_next(intern TSRMLS_CC);
 }
 /* }}} */
 
@@ -854,7 +863,7 @@
                return;
        }
 
-       if (intern->pos && intern->array->is_ref && spl_hash_verify_pos(intern 
TSRMLS_CC) == FAILURE) {
+       if (intern->pos && intern->is_ref && spl_hash_verify_pos(intern 
TSRMLS_CC) == FAILURE) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified 
outside object and internal position is no longer valid");
                RETURN_FALSE;
        } else {
http://cvs.php.net/diff.php/php-src/ext/spl/tests/bug28822.phpt?r1=1.1.2.1&r2=1.1.2.2&ty=u
Index: php-src/ext/spl/tests/bug28822.phpt
diff -u php-src/ext/spl/tests/bug28822.phpt:1.1.2.1 
php-src/ext/spl/tests/bug28822.phpt:1.1.2.2
--- php-src/ext/spl/tests/bug28822.phpt:1.1.2.1 Wed Sep 29 16:16:03 2004
+++ php-src/ext/spl/tests/bug28822.phpt Mon Jan 24 16:38:29 2005
@@ -1,5 +1,5 @@
 --TEST--
-Bug #28822: ArrayObject::offsetExists() works inverted
+Bug #28822 (ArrayObject::offsetExists() works inverted)
 --SKIPIF--
 <?php if (!extension_loaded("spl")) print "skip"; ?>
 --FILE--

http://cvs.php.net/co.php/php-src/ext/spl/tests/bug31346.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/bug31346.phpt
+++ php-src/ext/spl/tests/bug31346.phpt
--TEST--
Bug #31486 (ArrayIterator::next segfaults)
--FILE--
<?php
$obj = new stdClass;
$obj->var1=1;

$ao = new ArrayObject($obj);

$i = $ao->getIterator();

$ao->offsetUnset($i->key());
$i->next();

?>
===DONE===
--EXPECTF--
Notice: ArrayIterator::next(): Array was modified outside object and internal 
position is no longer valid in %sbug31346.php on line %d
===DONE===

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to