]> granicus.if.org Git - php/commitdiff
MFB: fix bug #37386 (autocreating element doesn't assign value to first node)
authorRob Richards <rrichards@php.net>
Mon, 26 Mar 2007 20:16:16 +0000 (20:16 +0000)
committerRob Richards <rrichards@php.net>
Mon, 26 Mar 2007 20:16:16 +0000 (20:16 +0000)
all single SimpleXMLElements are addressable using offset 0
use correct node for xpath context node
add test

ext/simplexml/simplexml.c
ext/simplexml/tests/bug37386.phpt [new file with mode: 0644]

index 3e3de37824e9b61dada451ddaee87a7382f71a80..6c14cab32854e168c61aedafc58af8978eaf2294 100644 (file)
@@ -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)
@@ -430,7 +437,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) {
@@ -1158,9 +1165,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 (file)
index 0000000..cf86906
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #39760 (autocreating element doesn't assign value to first node)
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$sx1 = new SimpleXMLElement((binary)"<root />");
+
+$sx1->node[0] = 'node1';
+$sx1->node[1] = 'node2';
+
+print $sx1->asXML()."\n";
+$node = $sx1->node[0];
+$node[0] = 'New Value';
+
+print $sx1->asXML();
+
+?>
+--EXPECTF--
+<?xml version="1.0"?>
+<root><node>node1</node><node>node2</node></root>
+
+<?xml version="1.0"?>
+<root><node>New Value</node><node>node2</node></root>