From 1e3b32c777829f61fa9a18278e0647e9112d96ea Mon Sep 17 00:00:00 2001 From: Andrew Curioso Date: Wed, 18 May 2011 04:43:21 +0000 Subject: [PATCH] Commiting r311138 into the 5.3 branch - fix to SimpleXML get properties hash --- UPGRADING | 4 ++++ ext/simplexml/simplexml.c | 36 ++++++++++++++++++++++++++++--- ext/simplexml/tests/034.phpt | 6 +++--- ext/simplexml/tests/bug51615.phpt | 4 +++- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/UPGRADING b/UPGRADING index c08016d479..0d849a15e5 100755 --- a/UPGRADING +++ b/UPGRADING @@ -170,6 +170,10 @@ UPGRADE NOTES - PHP X.Y - 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 diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index f9504fe58d..98dbc0c13e 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1069,6 +1069,10 @@ static HashTable * sxe_get_prop_hash(zval *object, int is_debug TSRMLS_DC) /* {{ xmlAttrPtr attr; int namelen; int test; + char use_iter; + zval *iter_data; + + use_iter = 0; sxe = php_sxe_fetch_object(object TSRMLS_CC); @@ -1122,6 +1126,7 @@ static HashTable * sxe_get_prop_hash(zval *object, int is_debug TSRMLS_DC) /* {{ 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 @@ static HashTable * sxe_get_prop_hash(zval *object, int is_debug TSRMLS_DC) /* {{ 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,10 +1176,25 @@ static HashTable * sxe_get_prop_hash(zval *object, int is_debug TSRMLS_DC) /* {{ _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; diff --git a/ext/simplexml/tests/034.phpt b/ext/simplexml/tests/034.phpt index 1f3a854fde..8610f70367 100755 --- a/ext/simplexml/tests/034.phpt +++ b/ext/simplexml/tests/034.phpt @@ -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-- --FILE-- diff --git a/ext/simplexml/tests/bug51615.phpt b/ext/simplexml/tests/bug51615.phpt index 75f6769ff7..e022994313 100644 --- a/ext/simplexml/tests/bug51615.phpt +++ b/ext/simplexml/tests/bug51615.phpt @@ -20,7 +20,7 @@ foreach ($html->body->span as $obj) { 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 @@ object(SimpleXMLElement)#%d (2) { } [0]=> string(1) "x" + [1]=> + string(1) "x" } string(0) "" string(0) "" -- 2.40.0