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