summaryrefslogtreecommitdiff
path: root/ext/xml
diff options
context:
space:
mode:
Diffstat (limited to 'ext/xml')
-rwxr-xr-xext/xml/tests/xml_closures_001.phpt47
-rw-r--r--ext/xml/xml.c2
2 files changed, 48 insertions, 1 deletions
diff --git a/ext/xml/tests/xml_closures_001.phpt b/ext/xml/tests/xml_closures_001.phpt
new file mode 100755
index 0000000000..5439a2a918
--- /dev/null
+++ b/ext/xml/tests/xml_closures_001.phpt
@@ -0,0 +1,47 @@
+--TEST--
+XML parser test using closures as callbacks
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--INI--
+magic_quotes_runtime=0
+--FILE--
+<?php
+chdir(dirname(__FILE__));
+
+$start_element = function ($xp, $elem, $attribs)
+{
+ print "<$elem";
+ if (sizeof($attribs)) {
+ while (list($k, $v) = each($attribs)) {
+ print " $k=\"$v\"";
+ }
+ }
+ print ">\n";
+};
+
+$end_element = function ($xp, $elem)
+{
+ print "</$elem>\n";
+};
+
+$xp = xml_parser_create();
+xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false);
+xml_set_element_handler($xp, $start_element, $end_element);
+$fp = fopen("xmltest.xml", "r");
+while ($data = fread($fp, 4096)) {
+ xml_parse($xp, $data, feof($fp));
+}
+xml_parser_free($xp);
+
+?>
+--EXPECT--
+<root id="elem1">
+<elem1>
+<elem2>
+<elem3>
+<elem4>
+</elem4>
+</elem3>
+</elem2>
+</elem1>
+</root>
diff --git a/ext/xml/xml.c b/ext/xml/xml.c
index b276f8d892..6f8ff34210 100644
--- a/ext/xml/xml.c
+++ b/ext/xml/xml.c
@@ -508,7 +508,7 @@ static void xml_set_handler(zval **handler, zval **data)
}
/* IS_ARRAY might indicate that we're using array($obj, 'method') syntax */
- if (Z_TYPE_PP(data) != IS_ARRAY) {
+ if (Z_TYPE_PP(data) != IS_ARRAY && Z_TYPE_PP(data) != IS_OBJECT) {
convert_to_string_ex(data);
if (Z_STRLEN_PP(data) == 0) {