diff options
author | Nikita Popov <nikic@php.net> | 2016-08-30 13:06:22 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2016-08-30 13:06:32 +0200 |
commit | d49024c6ded6eea1f73bed895716b8494ea7b440 (patch) | |
tree | cff8379ba72645c49dd0533ca574a96a08e4db2b | |
parent | 51a564e50557093ec42206301d097dd4f2127acb (diff) | |
parent | bfd4277008d3bda95ff5b418c60d41d50488d33b (diff) | |
download | php-git-d49024c6ded6eea1f73bed895716b8494ea7b440.tar.gz |
Merge branch 'PHP-7.0' into PHP-7.1
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/simplexml/simplexml.c | 20 | ||||
-rw-r--r-- | ext/simplexml/tests/bug72957.phpt | 16 | ||||
-rw-r--r-- | ext/simplexml/tests/bug72971_2.phpt | 35 |
4 files changed, 60 insertions, 13 deletions
@@ -53,6 +53,8 @@ PHP NEWS - SimpleXML: . Fixed bug #72971 (SimpleXML isset/unset do not respect namespace). (Nikita) + . Fixed bug #72957 (Null coalescing operator doesn't behave as expected with + SimpleXMLElement). (Nikita) - Standard: . Fixed bug #72920 (Accessing a private constant using constant() creates diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index d26f68ee26..fdda30451d 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -356,7 +356,10 @@ long_dim: _node_as_zval(sxe, node, rv, newtype, name, sxe->iter.nsprefix, sxe->iter.isprefix); } #else - _node_as_zval(sxe, node, rv, SXE_ITER_ELEMENT, name, sxe->iter.nsprefix, sxe->iter.isprefix); + /* In BP_VAR_IS mode only return a proper node if it actually exists. */ + if (type != BP_VAR_IS || sxe_find_element_by_name(sxe, node->children, (xmlChar *) name)) { + _node_as_zval(sxe, node, rv, SXE_ITER_ELEMENT, name, sxe->iter.nsprefix, sxe->iter.isprefix); + } #endif } } @@ -610,7 +613,7 @@ long_dim: while (node) { SKIP_TEXT(node); - if (!xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member))) { + if (!xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member)) && match_ns(sxe, node, sxe->iter.nsprefix, sxe->iter.isprefix)) { newnode = node; ++counter; } @@ -803,17 +806,8 @@ static int sxe_prop_dim_exists(zval *object, zval *member, int check_empty, zend node = php_sxe_get_first_node(sxe, node); } node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, NULL); - } - else { - node = node->children; - while (node) { - xmlNodePtr nnext; - nnext = node->next; - if (node->type == XML_ELEMENT_NODE && !xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member)) && match_ns(sxe, node, sxe->iter.nsprefix, sxe->iter.isprefix)) { - break; - } - node = nnext; - } + } else { + node = sxe_find_element_by_name(sxe, node->children, (xmlChar *)Z_STRVAL_P(member)); } if (node) { exists = 1; diff --git a/ext/simplexml/tests/bug72957.phpt b/ext/simplexml/tests/bug72957.phpt new file mode 100644 index 0000000000..29ca69fa76 --- /dev/null +++ b/ext/simplexml/tests/bug72957.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #72957: Null coalescing operator doesn't behave as expected with SimpleXMLElement +--SKIPIF-- +<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?> +--FILE-- +<?php + +$xml = new SimpleXMLElement('<root><elem>Text</elem></root>'); + +echo 'elem2 is: ' . ($xml->elem2 ?? 'backup string') . "\n"; +echo 'elem2 is: ' . (isset($xml->elem2) ? $xml->elem2 : 'backup string') . "\n"; + +?> +--EXPECT-- +elem2 is: backup string +elem2 is: backup string diff --git a/ext/simplexml/tests/bug72971_2.phpt b/ext/simplexml/tests/bug72971_2.phpt new file mode 100644 index 0000000000..aa6e09438c --- /dev/null +++ b/ext/simplexml/tests/bug72971_2.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #72971 (2): SimpleXML property write does not respect namespace +--SKIPIF-- +<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?> +--FILE-- +<?php + +$xml = new SimpleXMLElement('<root xmlns:ns="ns"><foo>bar</foo><ns:foo>ns:bar</ns:foo></root>'); + +$xml->foo = 'new-bar'; +var_dump($xml->foo); +var_dump($xml->children('ns')->foo); + +$xml->children('ns')->foo = 'ns:new-bar'; +var_dump($xml->foo); +var_dump($xml->children('ns')->foo); + +?> +--EXPECT-- +object(SimpleXMLElement)#2 (1) { + [0]=> + string(7) "new-bar" +} +object(SimpleXMLElement)#3 (1) { + [0]=> + string(6) "ns:bar" +} +object(SimpleXMLElement)#3 (1) { + [0]=> + string(7) "new-bar" +} +object(SimpleXMLElement)#2 (1) { + [0]=> + string(10) "ns:new-bar" +} |