summaryrefslogtreecommitdiff
path: root/ext/simplexml/simplexml.c
diff options
context:
space:
mode:
authorAndrew Curioso <acurioso@php.net>2011-05-18 04:43:21 +0000
committerAndrew Curioso <acurioso@php.net>2011-05-18 04:43:21 +0000
commit1e3b32c777829f61fa9a18278e0647e9112d96ea (patch)
tree78a8fa053895a056a0b6f2db75e4740c01939488 /ext/simplexml/simplexml.c
parentcfdd25d5c00fc2b587497b664489e4125895a522 (diff)
downloadphp-git-1e3b32c777829f61fa9a18278e0647e9112d96ea.tar.gz
Commiting r311138 into the 5.3 branch - fix to SimpleXML get properties hash
Diffstat (limited to 'ext/simplexml/simplexml.c')
-rw-r--r--ext/simplexml/simplexml.c36
1 files changed, 33 insertions, 3 deletions
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;