Skip to content

Commit e0a2e2e

Browse files
authored
Fix GH-15123: var_dump doesn't actually work on XMLReader (#15130)
1 parent 2b97c84 commit e0a2e2e

File tree

5 files changed

+114
-39
lines changed

5 files changed

+114
-39
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ PHP NEWS
6464
. Add tidyNode::getNextSibling() and tidyNode::getPreviousSibling().
6565
(nielsdos)
6666

67+
- XMLReader:
68+
. Fixed bug GH-15123 (var_dump doesn't actually work on XMLReader).
69+
(nielsdos)
70+
6771
- XSL:
6872
. Fix trampoline leak in xpath callables. (nielsdos)
6973

ext/xmlreader/php_xmlreader.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl
8181
if (hnd->read_int_func) {
8282
retint = hnd->read_int_func(obj->ptr);
8383
if (retint == -1) {
84-
zend_throw_error(NULL, "Failed to read property due to libxml error");
84+
zend_throw_error(NULL, "Failed to read property because no XML data has been read yet");
8585
return FAILURE;
8686
}
8787
}
@@ -175,6 +175,28 @@ static zend_function *xmlreader_get_method(zend_object **obj, zend_string *name,
175175
}
176176
/* }}} */
177177

178+
static HashTable* xmlreader_get_debug_info(zend_object *object, int *is_temp)
179+
{
180+
*is_temp = 1;
181+
182+
xmlreader_object *obj = php_xmlreader_fetch_object(object);
183+
HashTable *std_props = zend_std_get_properties(object);
184+
HashTable *debug_info = zend_array_dup(std_props);
185+
186+
zend_string *string_key;
187+
xmlreader_prop_handler *entry;
188+
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&xmlreader_prop_handlers, string_key, entry) {
189+
ZEND_ASSERT(string_key != NULL);
190+
191+
zval value;
192+
if (xmlreader_property_reader(obj, entry, &value) == SUCCESS) {
193+
zend_hash_update(debug_info, string_key, &value);
194+
}
195+
} ZEND_HASH_FOREACH_END();
196+
197+
return debug_info;
198+
}
199+
178200
/* {{{ _xmlreader_get_valid_file_path */
179201
/* _xmlreader_get_valid_file_path and _xmlreader_get_relaxNG should be made a
180202
common function in libxml extension as code is common to a few xml extensions */
@@ -1272,6 +1294,7 @@ PHP_MINIT_FUNCTION(xmlreader)
12721294
xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr;
12731295
xmlreader_object_handlers.get_method = xmlreader_get_method;
12741296
xmlreader_object_handlers.clone_obj = NULL;
1297+
xmlreader_object_handlers.get_debug_info = xmlreader_get_debug_info;
12751298

12761299
xmlreader_class_entry = register_class_XMLReader();
12771300
xmlreader_class_entry->create_object = xmlreader_objects_new;

ext/xmlreader/tests/fromStream_custom_constructor.phpt

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,48 @@ fwrite($h, "<root/>");
1818
fseek($h, 0);
1919

2020
$reader = CustomXMLReader::fromStream($h, encoding: "UTF-8");
21-
var_dump($reader);
21+
try {
22+
var_dump($reader);
23+
} catch (Error $e) {
24+
echo $e->getMessage(), "\n";
25+
}
2226
var_dump($reader->read());
2327
var_dump($reader->nodeType);
2428

2529
fclose($h);
2630
?>
2731
--EXPECTF--
2832
hello world
29-
object(CustomXMLReader)#%d (1) {
33+
object(CustomXMLReader)#%d (14) {
34+
["myField"]=>
35+
int(1234)
3036
["attributeCount"]=>
31-
uninitialized(int)
37+
int(0)
3238
["baseURI"]=>
33-
uninitialized(string)
39+
string(0) ""
3440
["depth"]=>
35-
uninitialized(int)
41+
int(0)
3642
["hasAttributes"]=>
37-
uninitialized(bool)
43+
bool(false)
3844
["hasValue"]=>
39-
uninitialized(bool)
45+
bool(false)
4046
["isDefault"]=>
41-
uninitialized(bool)
42-
["isEmptyElement"]=>
43-
uninitialized(bool)
47+
bool(false)
4448
["localName"]=>
45-
uninitialized(string)
49+
string(0) ""
4650
["name"]=>
47-
uninitialized(string)
51+
string(0) ""
4852
["namespaceURI"]=>
49-
uninitialized(string)
53+
string(0) ""
5054
["nodeType"]=>
51-
uninitialized(int)
55+
int(0)
5256
["prefix"]=>
53-
uninitialized(string)
57+
string(0) ""
5458
["value"]=>
55-
uninitialized(string)
59+
string(0) ""
5660
["xmlLang"]=>
57-
uninitialized(string)
58-
["myField"]=>
59-
int(1234)
61+
string(0) ""
6062
}
63+
Failed to read property because no XML data has been read yet
6164
bool(true)
6265
int(1)

ext/xmlreader/tests/fromString_custom_constructor.phpt

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,43 +14,46 @@ class CustomXMLReader extends XMLReader {
1414
}
1515

1616
$reader = CustomXMLReader::fromString("<root/>");
17-
var_dump($reader);
17+
try {
18+
var_dump($reader);
19+
} catch (Error $e) {
20+
echo $e->getMessage(), "\n";
21+
}
1822
var_dump($reader->read());
1923
var_dump($reader->nodeType);
2024
?>
2125
--EXPECTF--
2226
hello world
23-
object(CustomXMLReader)#%d (1) {
27+
object(CustomXMLReader)#%d (14) {
28+
["myField"]=>
29+
int(1234)
2430
["attributeCount"]=>
25-
uninitialized(int)
31+
int(0)
2632
["baseURI"]=>
27-
uninitialized(string)
33+
string(0) ""
2834
["depth"]=>
29-
uninitialized(int)
35+
int(0)
3036
["hasAttributes"]=>
31-
uninitialized(bool)
37+
bool(false)
3238
["hasValue"]=>
33-
uninitialized(bool)
39+
bool(false)
3440
["isDefault"]=>
35-
uninitialized(bool)
36-
["isEmptyElement"]=>
37-
uninitialized(bool)
41+
bool(false)
3842
["localName"]=>
39-
uninitialized(string)
43+
string(0) ""
4044
["name"]=>
41-
uninitialized(string)
45+
string(0) ""
4246
["namespaceURI"]=>
43-
uninitialized(string)
47+
string(0) ""
4448
["nodeType"]=>
45-
uninitialized(int)
49+
int(0)
4650
["prefix"]=>
47-
uninitialized(string)
51+
string(0) ""
4852
["value"]=>
49-
uninitialized(string)
53+
string(0) ""
5054
["xmlLang"]=>
51-
uninitialized(string)
52-
["myField"]=>
53-
int(1234)
55+
string(0) ""
5456
}
57+
Failed to read property because no XML data has been read yet
5558
bool(true)
5659
int(1)

ext/xmlreader/tests/var_dump.phpt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
--TEST--
2+
XMLReader - var_dump
3+
--EXTENSIONS--
4+
xmlreader
5+
--FILE--
6+
<?php
7+
$reader = XMLReader::fromString("<root>hi</root>");
8+
var_dump($reader->read());
9+
var_dump($reader);
10+
?>
11+
--EXPECTF--
12+
bool(true)
13+
object(XMLReader)#%d (14) {
14+
["attributeCount"]=>
15+
int(0)
16+
["baseURI"]=>
17+
string(%d) "%s"
18+
["depth"]=>
19+
int(0)
20+
["hasAttributes"]=>
21+
bool(false)
22+
["hasValue"]=>
23+
bool(false)
24+
["isDefault"]=>
25+
bool(false)
26+
["isEmptyElement"]=>
27+
bool(false)
28+
["localName"]=>
29+
string(4) "root"
30+
["name"]=>
31+
string(4) "root"
32+
["namespaceURI"]=>
33+
string(0) ""
34+
["nodeType"]=>
35+
int(1)
36+
["prefix"]=>
37+
string(0) ""
38+
["value"]=>
39+
string(0) ""
40+
["xmlLang"]=>
41+
string(0) ""
42+
}

0 commit comments

Comments
 (0)