]> granicus.if.org Git - php/commitdiff
MFH: fix bug #42259 (SimpleXMLIterator loses ancestry)
authorRob Richards <rrichards@php.net>
Tue, 14 Aug 2007 12:10:46 +0000 (12:10 +0000)
committerRob Richards <rrichards@php.net>
Tue, 14 Aug 2007 12:10:46 +0000 (12:10 +0000)
add test

ext/spl/spl_sxe.c
ext/spl/tests/bug42259.phpt [new file with mode: 0644]

index 2d05086a9f50545ffa9ab4ecdd36ec20600c72d7..21b53c3ee08d7c2313d12a8c73deb5ebe3759988 100755 (executable)
@@ -142,8 +142,7 @@ SPL_METHOD(SimpleXMLIterator, getChildren)
        if (!sxe->iter.data || sxe->iter.type == SXE_ITER_ATTRLIST) {
                return; /* return NULL */
        }
-       return_value->type = IS_OBJECT;
-       return_value->value.obj = zend_objects_store_clone_obj(sxe->iter.data TSRMLS_CC);
+       RETURN_ZVAL(sxe->iter.data, 1, 0);
 }
 
 /* {{{ proto int SimpleXMLIterator::count()
diff --git a/ext/spl/tests/bug42259.phpt b/ext/spl/tests/bug42259.phpt
new file mode 100644 (file)
index 0000000..22c8bc5
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Bug #42259 (SimpleXMLIterator loses ancestry)
+--SKIPIF--
+if (!extension_loaded("spl")) print "skip";
+if (!extension_loaded('simplexml')) print 'skip';
+if (!extension_loaded("libxml")) print "skip LibXML not present";
+if (!class_exists('RecursiveIteratorIterator')) print 'skip RecursiveIteratorIterator not available';
+--FILE--
+<?php
+$xml =<<<EOF
+<xml>
+  <fieldset1>
+    <field1/>
+    <field2/>
+  </fieldset1>
+  <fieldset2>
+    <options>
+      <option1/>
+      <option2/>
+      <option3/>
+    </options>
+    <field1/>
+    <field2/>
+  </fieldset2>
+</xml>
+EOF;
+
+$sxe = new SimpleXMLIterator($xml);
+$rit = new RecursiveIteratorIterator($sxe, RecursiveIteratorIterator::LEAVES_ONLY);
+foreach ($rit as $child) {
+  $path = '';
+  $ancestry = $child->xpath('ancestor-or-self::*');
+  foreach ($ancestry as $ancestor) {
+    $path .= $ancestor->getName() . '/';
+  }
+  $path = substr($path, 0, strlen($path) - 1);
+  echo count($ancestry) . ' steps: ' . $path . PHP_EOL;
+}
+?>
+===DONE===
+--EXPECT--
+3 steps: xml/fieldset1/field1
+3 steps: xml/fieldset1/field2
+4 steps: xml/fieldset2/options/option1
+4 steps: xml/fieldset2/options/option2
+4 steps: xml/fieldset2/options/option3
+3 steps: xml/fieldset2/field1
+3 steps: xml/fieldset2/field2
+===DONE===