Commiting r311138 into the 5.3 branch - fix to SimpleXML get properties hash

This commit is contained in:
Andrew Curioso 2011-05-18 04:43:21 +00:00
parent cfdd25d5c0
commit 1e3b32c777
4 changed files with 43 additions and 7 deletions

View File

@ -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

View File

@ -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,12 +1176,27 @@ 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;
}
/* }}} */

View File

@ -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--

View File

@ -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) ""