acurioso                                 Tue, 17 May 2011 13:50:48 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=311138

Log:
Use iterator when necessary to get the full properties hash - consistent with 
count (see test: ext/simplexml/tests/034.phpt)

Changed paths:
    U   php/php-src/trunk/UPGRADING
    U   php/php-src/trunk/ext/simplexml/simplexml.c
    U   php/php-src/trunk/ext/simplexml/tests/034.phpt
    U   php/php-src/trunk/ext/simplexml/tests/bug51615.phpt

Modified: php/php-src/trunk/UPGRADING
===================================================================
--- php/php-src/trunk/UPGRADING 2011-05-17 13:20:28 UTC (rev 311137)
+++ php/php-src/trunk/UPGRADING 2011-05-17 13:50:48 UTC (rev 311138)
@@ -170,6 +170,10 @@
 - fclose() closes streams with resource refcount > 1; it doesn't merely
   decrement the resource refcount.
 - socket_set_options() and socket_get_options() now support multicast options.
+- Arrays cast from SimpleXMLElement now always contain all nodes instead of
+  just the first matching node.
+- All SimpleXMLElement children are now always printed when using var_dump(),
+  var_export(), and print_r().

 ===================================
 5. Changes made to existing methods

Modified: php/php-src/trunk/ext/simplexml/simplexml.c
===================================================================
--- php/php-src/trunk/ext/simplexml/simplexml.c 2011-05-17 13:20:28 UTC (rev 
311137)
+++ php/php-src/trunk/ext/simplexml/simplexml.c 2011-05-17 13:50:48 UTC (rev 
311138)
@@ -1069,7 +1069,11 @@
        xmlAttrPtr       attr;
        int              namelen;
        int              test;
+       char             use_iter;
+       zval            *iter_data;

+       use_iter = 0;
+
        sxe = php_sxe_fetch_object(object TSRMLS_CC);

        if (is_debug) {
@@ -1122,6 +1126,7 @@

        GET_NODE(sxe, node);
        node = php_sxe_get_first_node(sxe, node TSRMLS_CC);
+
        if (node && sxe->iter.type != SXE_ITER_ATTRLIST) {
                if (node->type == XML_ATTRIBUTE_NODE) {
                        MAKE_STD_ZVAL(value);
@@ -1129,7 +1134,17 @@
                        zend_hash_next_index_insert(rv, &value, sizeof(zval *), 
NULL);
                        node = NULL;
                } else if (sxe->iter.type != SXE_ITER_CHILD) {
-                       node = node->children;
+
+                       if ( !node->children || !node->parent || 
node->children->next || node->children->children || node->parent->children == 
node->parent->last ) {
+                               node = node->children;
+                       } else {
+                               iter_data = sxe->iter.data;
+                               sxe->iter.data = NULL;
+
+                               node = php_sxe_reset_iterator(sxe, 0 TSRMLS_CC);
+
+                               use_iter = 1;
+                       }
                }

                while (node) {
@@ -1161,12 +1176,27 @@

                        _get_base_node_value(sxe, node, &value, 
sxe->iter.nsprefix, sxe->iter.isprefix TSRMLS_CC);

-                       sxe_properties_add(rv, name, namelen, value TSRMLS_CC);
+                       if ( use_iter ) {
+                               zend_hash_next_index_insert(rv, &value, 
sizeof(zval *), NULL);
+                       } else {
+                               sxe_properties_add(rv, name, namelen, value 
TSRMLS_CC);
+                       }
 next_iter:
-                       node = node->next;
+                       if ( use_iter ) {
+                               node = php_sxe_iterator_fetch(sxe, node->next, 
0 TSRMLS_CC);
+                       } else {
+                               node = node->next;
+                       }
                }
        }

+       if ( use_iter ) {
+               if (sxe->iter.data) {
+                       zval_ptr_dtor(&sxe->iter.data);
+               }
+               sxe->iter.data = iter_data;
+       }
+
        return rv;
 }
 /* }}} */

Modified: php/php-src/trunk/ext/simplexml/tests/034.phpt
===================================================================
--- php/php-src/trunk/ext/simplexml/tests/034.phpt      2011-05-17 13:20:28 UTC 
(rev 311137)
+++ php/php-src/trunk/ext/simplexml/tests/034.phpt      2011-05-17 13:50:48 UTC 
(rev 311138)
@@ -1,7 +1,7 @@
 --TEST--
-SimpleXML: array casting bug
---XFAIL--
-Does anyone know why?
+SimpleXML: cast to array
+--FAIL--
+Length of cast array does not match expected length
 --SKIPIF--
 <?php if (!extension_loaded("simplexml")) print "skip"; ?>
 --FILE--

Modified: php/php-src/trunk/ext/simplexml/tests/bug51615.phpt
===================================================================
--- php/php-src/trunk/ext/simplexml/tests/bug51615.phpt 2011-05-17 13:20:28 UTC 
(rev 311137)
+++ php/php-src/trunk/ext/simplexml/tests/bug51615.phpt 2011-05-17 13:50:48 UTC 
(rev 311138)
@@ -20,7 +20,7 @@
 Warning: DOMDocument::loadHTML(): error parsing attribute name in Entity, 
line: 1 in %s on line %d

 Warning: DOMDocument::loadHTML(): error parsing attribute name in Entity, 
line: 1 in %s on line %d
-object(SimpleXMLElement)#%d (2) {
+object(SimpleXMLElement)#%d (3) {
   ["@attributes"]=>
   array(2) {
     ["title"]=>
@@ -30,6 +30,8 @@
   }
   [0]=>
   string(1) "x"
+  [1]=>
+  string(1) "x"
 }
 string(0) ""
 string(0) ""

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

Reply via email to