mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Commiting r311138 into the 5.3 branch - fix to SimpleXML get properties hash
This commit is contained in:
parent
cfdd25d5c0
commit
1e3b32c777
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -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--
|
||||
|
@ -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) ""
|
||||
|
Loading…
Reference in New Issue
Block a user