From 2ac92de9220ac7391cb3f049084dc2c94985d26c Mon Sep 17 00:00:00 2001 From: Daniel Sloof Date: Tue, 23 Jul 2013 14:26:50 -0700 Subject: [PATCH] simplexml fixes for text children and casting - fixes text children count and bool cast of empty nodes --- hphp/runtime/ext/ext_simplexml.cpp | 8 ++++++-- hphp/test/slow/simple_xml/boolean_cast.php | 7 +++++++ hphp/test/slow/simple_xml/boolean_cast.php.expect | 2 ++ hphp/test/slow/simple_xml/text_children.php | 4 ++++ hphp/test/slow/simple_xml/text_children.php.expect | 2 ++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 hphp/test/slow/simple_xml/boolean_cast.php create mode 100644 hphp/test/slow/simple_xml/boolean_cast.php.expect create mode 100644 hphp/test/slow/simple_xml/text_children.php create mode 100644 hphp/test/slow/simple_xml/text_children.php.expect diff --git a/hphp/runtime/ext/ext_simplexml.cpp b/hphp/runtime/ext/ext_simplexml.cpp index 1b23e0e5a..c03a5d7c2 100644 --- a/hphp/runtime/ext/ext_simplexml.cpp +++ b/hphp/runtime/ext/ext_simplexml.cpp @@ -524,7 +524,9 @@ Object c_SimpleXMLElement::t_children(CStrRef ns /* = "" */, elem->m_is_text = m_is_text; elem->m_free_text = m_free_text; elem->m_is_children = true; - if (ns.empty()) { + if (m_is_text) { + // text nodes don't have children + } else if (ns.empty()) { elem->m_children.assignRef(m_children); } else { Array props = Array::Create(); @@ -873,7 +875,9 @@ Variant c_SimpleXMLElement::t___set(Variant name, Variant value) { } bool c_SimpleXMLElement::o_toBooleanImpl() const noexcept { - return (m_node || getDynProps().size()); + return (m_node || getDynProps().size()) && + (m_node->parent->type != XML_DOCUMENT_NODE || + m_children.toArray().size()); } int64_t c_SimpleXMLElement::o_toInt64Impl() const noexcept { diff --git a/hphp/test/slow/simple_xml/boolean_cast.php b/hphp/test/slow/simple_xml/boolean_cast.php new file mode 100644 index 000000000..f80acc242 --- /dev/null +++ b/hphp/test/slow/simple_xml/boolean_cast.php @@ -0,0 +1,7 @@ +'); +var_dump((bool)$element); + +$element = new SimpleXMLElement(''); +var_dump((bool)$element->child); diff --git a/hphp/test/slow/simple_xml/boolean_cast.php.expect b/hphp/test/slow/simple_xml/boolean_cast.php.expect new file mode 100644 index 000000000..5d42d704e --- /dev/null +++ b/hphp/test/slow/simple_xml/boolean_cast.php.expect @@ -0,0 +1,2 @@ +bool(false) +bool(true) diff --git a/hphp/test/slow/simple_xml/text_children.php b/hphp/test/slow/simple_xml/text_children.php new file mode 100644 index 000000000..4e2e72ec7 --- /dev/null +++ b/hphp/test/slow/simple_xml/text_children.php @@ -0,0 +1,4 @@ +world'); +var_dump($element->hello->children()); diff --git a/hphp/test/slow/simple_xml/text_children.php.expect b/hphp/test/slow/simple_xml/text_children.php.expect new file mode 100644 index 000000000..408dfe568 --- /dev/null +++ b/hphp/test/slow/simple_xml/text_children.php.expect @@ -0,0 +1,2 @@ +object(SimpleXMLElement)#4 (0) { +}