diff --git a/NEWS b/NEWS
index b9753c06aa14..46fffae66629 100644
--- a/NEWS
+++ b/NEWS
@@ -57,6 +57,10 @@ PHP NEWS
. Add tidyNode::getNextSibling() and tidyNode::getPreviousSibling().
(nielsdos)
+- XMLReader:
+ . Fixed bug GH-15123 (var_dump doesn't actually work on XMLReader).
+ (nielsdos)
+
- XSL:
. Fix trampoline leak in xpath callables. (nielsdos)
diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c
index 4444d3f83a38..b5a4badd1381 100644
--- a/ext/xmlreader/php_xmlreader.c
+++ b/ext/xmlreader/php_xmlreader.c
@@ -81,7 +81,7 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl
if (hnd->read_int_func) {
retint = hnd->read_int_func(obj->ptr);
if (retint == -1) {
- zend_throw_error(NULL, "Failed to read property due to libxml error");
+ zend_throw_error(NULL, "Failed to read property because no XML data has been read yet");
return FAILURE;
}
}
@@ -175,6 +175,28 @@ static zend_function *xmlreader_get_method(zend_object **obj, zend_string *name,
}
/* }}} */
+static HashTable* xmlreader_get_debug_info(zend_object *object, int *is_temp)
+{
+ *is_temp = 1;
+
+ xmlreader_object *obj = php_xmlreader_fetch_object(object);
+ HashTable *std_props = zend_std_get_properties(object);
+ HashTable *debug_info = zend_array_dup(std_props);
+
+ zend_string *string_key;
+ xmlreader_prop_handler *entry;
+ ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&xmlreader_prop_handlers, string_key, entry) {
+ ZEND_ASSERT(string_key != NULL);
+
+ zval value;
+ if (xmlreader_property_reader(obj, entry, &value) == SUCCESS) {
+ zend_hash_update(debug_info, string_key, &value);
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ return debug_info;
+}
+
/* {{{ _xmlreader_get_valid_file_path */
/* _xmlreader_get_valid_file_path and _xmlreader_get_relaxNG should be made a
common function in libxml extension as code is common to a few xml extensions */
@@ -1272,6 +1294,7 @@ PHP_MINIT_FUNCTION(xmlreader)
xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr;
xmlreader_object_handlers.get_method = xmlreader_get_method;
xmlreader_object_handlers.clone_obj = NULL;
+ xmlreader_object_handlers.get_debug_info = xmlreader_get_debug_info;
xmlreader_class_entry = register_class_XMLReader();
xmlreader_class_entry->create_object = xmlreader_objects_new;
diff --git a/ext/xmlreader/tests/fromStream_custom_constructor.phpt b/ext/xmlreader/tests/fromStream_custom_constructor.phpt
index 4c94c4a4bbf4..3ec370274ad3 100644
--- a/ext/xmlreader/tests/fromStream_custom_constructor.phpt
+++ b/ext/xmlreader/tests/fromStream_custom_constructor.phpt
@@ -18,7 +18,11 @@ fwrite($h, "");
fseek($h, 0);
$reader = CustomXMLReader::fromStream($h, encoding: "UTF-8");
-var_dump($reader);
+try {
+ var_dump($reader);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
var_dump($reader->read());
var_dump($reader->nodeType);
@@ -26,37 +30,36 @@ fclose($h);
?>
--EXPECTF--
hello world
-object(CustomXMLReader)#%d (1) {
+object(CustomXMLReader)#%d (14) {
+ ["myField"]=>
+ int(1234)
["attributeCount"]=>
- uninitialized(int)
+ int(0)
["baseURI"]=>
- uninitialized(string)
+ string(0) ""
["depth"]=>
- uninitialized(int)
+ int(0)
["hasAttributes"]=>
- uninitialized(bool)
+ bool(false)
["hasValue"]=>
- uninitialized(bool)
+ bool(false)
["isDefault"]=>
- uninitialized(bool)
- ["isEmptyElement"]=>
- uninitialized(bool)
+ bool(false)
["localName"]=>
- uninitialized(string)
+ string(0) ""
["name"]=>
- uninitialized(string)
+ string(0) ""
["namespaceURI"]=>
- uninitialized(string)
+ string(0) ""
["nodeType"]=>
- uninitialized(int)
+ int(0)
["prefix"]=>
- uninitialized(string)
+ string(0) ""
["value"]=>
- uninitialized(string)
+ string(0) ""
["xmlLang"]=>
- uninitialized(string)
- ["myField"]=>
- int(1234)
+ string(0) ""
}
+Failed to read property because no XML data has been read yet
bool(true)
int(1)
diff --git a/ext/xmlreader/tests/fromString_custom_constructor.phpt b/ext/xmlreader/tests/fromString_custom_constructor.phpt
index f76af8d6b84d..4299544613d4 100644
--- a/ext/xmlreader/tests/fromString_custom_constructor.phpt
+++ b/ext/xmlreader/tests/fromString_custom_constructor.phpt
@@ -14,43 +14,46 @@ class CustomXMLReader extends XMLReader {
}
$reader = CustomXMLReader::fromString("");
-var_dump($reader);
+try {
+ var_dump($reader);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
var_dump($reader->read());
var_dump($reader->nodeType);
?>
--EXPECTF--
hello world
-object(CustomXMLReader)#%d (1) {
+object(CustomXMLReader)#%d (14) {
+ ["myField"]=>
+ int(1234)
["attributeCount"]=>
- uninitialized(int)
+ int(0)
["baseURI"]=>
- uninitialized(string)
+ string(0) ""
["depth"]=>
- uninitialized(int)
+ int(0)
["hasAttributes"]=>
- uninitialized(bool)
+ bool(false)
["hasValue"]=>
- uninitialized(bool)
+ bool(false)
["isDefault"]=>
- uninitialized(bool)
- ["isEmptyElement"]=>
- uninitialized(bool)
+ bool(false)
["localName"]=>
- uninitialized(string)
+ string(0) ""
["name"]=>
- uninitialized(string)
+ string(0) ""
["namespaceURI"]=>
- uninitialized(string)
+ string(0) ""
["nodeType"]=>
- uninitialized(int)
+ int(0)
["prefix"]=>
- uninitialized(string)
+ string(0) ""
["value"]=>
- uninitialized(string)
+ string(0) ""
["xmlLang"]=>
- uninitialized(string)
- ["myField"]=>
- int(1234)
+ string(0) ""
}
+Failed to read property because no XML data has been read yet
bool(true)
int(1)
diff --git a/ext/xmlreader/tests/var_dump.phpt b/ext/xmlreader/tests/var_dump.phpt
new file mode 100644
index 000000000000..a8a5489e6f22
--- /dev/null
+++ b/ext/xmlreader/tests/var_dump.phpt
@@ -0,0 +1,42 @@
+--TEST--
+XMLReader - var_dump
+--EXTENSIONS--
+xmlreader
+--FILE--
+hi");
+var_dump($reader->read());
+var_dump($reader);
+?>
+--EXPECTF--
+bool(true)
+object(XMLReader)#%d (14) {
+ ["attributeCount"]=>
+ int(0)
+ ["baseURI"]=>
+ string(%d) "%s"
+ ["depth"]=>
+ int(0)
+ ["hasAttributes"]=>
+ bool(false)
+ ["hasValue"]=>
+ bool(false)
+ ["isDefault"]=>
+ bool(false)
+ ["isEmptyElement"]=>
+ bool(false)
+ ["localName"]=>
+ string(4) "root"
+ ["name"]=>
+ string(4) "root"
+ ["namespaceURI"]=>
+ string(0) ""
+ ["nodeType"]=>
+ int(1)
+ ["prefix"]=>
+ string(0) ""
+ ["value"]=>
+ string(0) ""
+ ["xmlLang"]=>
+ string(0) ""
+}