From: Rob Richards Date: Mon, 26 Mar 2007 20:14:58 +0000 (+0000) Subject: fix bug #37386 (autocreating element doesn't assign value to first node) X-Git-Tag: php-5.2.2RC1~93 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b7c2eb3228ca3eaed09b3c1647ccf5623c9c11b3;p=php fix bug #37386 (autocreating element doesn't assign value to first node) all single SimpleXMLElements are addressable using offset 0 use correct node for xpath context node add test --- diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 8787e542a1..2c919ea24f 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -138,7 +138,14 @@ static xmlNodePtr sxe_get_element_by_offset(php_sxe_object *sxe, long offset, xm long nodendx = 0; if (sxe->iter.type == SXE_ITER_NONE) { - return NULL; + if (offset == 0) { + if (cnt) { + *cnt = 0; + } + return node; + } else { + return NULL; + } } while (node && nodendx <= offset) { SKIP_TEXT(node) @@ -429,7 +436,7 @@ static void sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_boo int nodendx = 0; int test = 0; int new_value = 0; - long cnt; + long cnt = 0; zval tmp_zv, trim_zv, value_copy; if (!member) { @@ -1122,9 +1129,11 @@ SXE_METHOD(xpath) php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, xmlDocGetRootElement((xmlDocPtr) sxe->document->ptr), NULL TSRMLS_CC); } - sxe->xpath->node = sxe->node->node; + nodeptr = php_sxe_get_first_node(sxe, sxe->node->node TSRMLS_CC); + + sxe->xpath->node = nodeptr; - ns = xmlGetNsList((xmlDocPtr) sxe->document->ptr, (xmlNodePtr) sxe->node->node); + ns = xmlGetNsList((xmlDocPtr) sxe->document->ptr, nodeptr); if (ns != NULL) { while (ns[nsnbr] != NULL) { nsnbr++; diff --git a/ext/simplexml/tests/bug37386.phpt b/ext/simplexml/tests/bug37386.phpt new file mode 100644 index 0000000000..cf86906137 --- /dev/null +++ b/ext/simplexml/tests/bug37386.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #39760 (autocreating element doesn't assign value to first node) +--SKIPIF-- + +--FILE-- +"); + +$sx1->node[0] = 'node1'; +$sx1->node[1] = 'node2'; + +print $sx1->asXML()."\n"; +$node = $sx1->node[0]; +$node[0] = 'New Value'; + +print $sx1->asXML(); + +?> +--EXPECTF-- + +node1node2 + + +New Valuenode2