summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2006-02-27 13:32:25 +0000
committerMarcus Boerger <helly@php.net>2006-02-27 13:32:25 +0000
commit10a5901abf1d11499994e211f6d605ac5ccda055 (patch)
treeb07d232d4ac67449cee7691b05c5e6b5bc3795cd
parentd8b7f1dea048465b9ca4a88d4527959835b3bf81 (diff)
downloadphp-git-10a5901abf1d11499994e211f6d605ac5ccda055.tar.gz
- Fix count/foreach interaction
-rw-r--r--ext/simplexml/php_simplexml.h1
-rw-r--r--ext/simplexml/simplexml.c9
-rwxr-xr-xext/simplexml/tests/029.phpt51
3 files changed, 60 insertions, 1 deletions
diff --git a/ext/simplexml/php_simplexml.h b/ext/simplexml/php_simplexml.h
index 0b3b0860d4..5af5e67245 100644
--- a/ext/simplexml/php_simplexml.h
+++ b/ext/simplexml/php_simplexml.h
@@ -67,7 +67,6 @@ typedef struct {
HashTable *properties;
xmlXPathContextPtr xpath;
struct {
- int itertype;
char *name;
char *nsprefix;
SXE_ITER type;
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
index 25dd25bd3b..5e287aa900 100644
--- a/ext/simplexml/simplexml.c
+++ b/ext/simplexml/simplexml.c
@@ -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
index 0000000000..1624b12d50
--- /dev/null
+++ b/ext/simplexml/tests/029.phpt
@@ -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===