]> granicus.if.org Git - php/commitdiff
- Fix count/foreach interaction
authorMarcus Boerger <helly@php.net>
Mon, 27 Feb 2006 13:32:25 +0000 (13:32 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 27 Feb 2006 13:32:25 +0000 (13:32 +0000)
ext/simplexml/php_simplexml.h
ext/simplexml/simplexml.c
ext/simplexml/tests/029.phpt [new file with mode: 0755]

index 0b3b0860d4b60a3240bcb960ca425cbf6e1b7948..5af5e67245cc3358299f781b75486b0d7aa2a5b0 100644 (file)
@@ -67,7 +67,6 @@ typedef struct {
        HashTable *properties;
        xmlXPathContextPtr xpath;
        struct {
-               int                   itertype;
                char                  *name;
                char                  *nsprefix;
                SXE_ITER              type;
index 25dd25bd3b67a5255425c3fa46ce70796f00bb1c..5e287aa90070f4f7d48072d1a0eb917a7e146058 100644 (file)
@@ -1438,9 +1438,14 @@ static int sxe_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */
 {
        php_sxe_object  *sxe;
        xmlNodePtr       node;
+       zval            *data;
 
        *count = 0;
        sxe = php_sxe_fetch_object(object TSRMLS_CC);
+
+       data = sxe->iter.data;
+       sxe->iter.data = NULL;
+
        node = php_sxe_reset_iterator(sxe, 0 TSRMLS_CC);
        
        while (node)
@@ -1449,6 +1454,10 @@ static int sxe_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */
                node = php_sxe_iterator_fetch(sxe, node->next, 0 TSRMLS_CC);
        }
 
+       if (sxe->iter.data) {
+               zval_ptr_dtor(&sxe->iter.data);
+       }
+       sxe->iter.data = data;
 
        return SUCCESS;
 }
diff --git a/ext/simplexml/tests/029.phpt b/ext/simplexml/tests/029.phpt
new file mode 100755 (executable)
index 0000000..1624b12
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+SimpleXML: foreach and count
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip"; ?>
+--FILE--
+<?php 
+$xml =<<<EOF
+<people>
+  <person name="Joe"/>
+  <person name="John">
+    <children>
+      <person name="Joe"/>
+    </children>
+  </person>
+  <person name="Jane"/>
+</people>
+EOF;
+
+$people = simplexml_load_string($xml);
+
+foreach($people as $person)
+{
+       var_dump((string)$person['name']);
+       var_dump(count($people));
+       var_dump(count($person));
+}
+
+?>
+===DONE===
+--EXPECTF--
+string(3) "Joe"
+int(3)
+int(0)
+string(4) "John"
+int(3)
+int(1)
+string(4) "Jane"
+int(3)
+int(0)
+===DONE===
+--UEXPECTF--
+unicode(3) "Joe"
+int(3)
+int(0)
+unicode(4) "John"
+int(3)
+int(1)
+unicode(4) "Jane"
+int(3)
+int(0)
+===DONE===