xref: /PHP-8.3/ext/xsl/tests/bug70078.phpt (revision 74859783)
1--TEST--
2Bug #70078 (XSL callbacks with nodes as parameter leak memory)
3--EXTENSIONS--
4xsl
5--FILE--
6<?php
7// create big dummy document:
8$dom = new \DOMDocument();
9$rootNode = $dom->appendChild($dom->createElement('root'));
10for ($i = 0; $i <= 100; $i++) {
11    $level1Node = $rootNode->appendChild($dom->createElement('level1'));
12    for ($j = 0; $j <= 100; $j++) {
13        $level2Node = $level1Node->appendChild($dom->createElement('level2'));
14        for ($k = 0; $k <= 10; $k++) {
15            $level3Node = $level2Node->appendChild($dom->createElement('level3', 'test'));
16        }
17    }
18}
19
20function testPhpFunction($node) {
21    return 'test2';
22}
23
24$xslStr = <<<EOF
25<?xml version="1.0" encoding="utf-8"?>
26<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
27    <xsl:template match="root">
28        <output>
29            <xsl:for-each select="level1">
30                <node>
31                    <xsl:value-of select="php:function('testPhpFunction', .)" />
32                </node>
33            </xsl:for-each>
34        </output>
35    </xsl:template>
36</xsl:stylesheet>
37EOF;
38
39$xsl = new \DOMDocument();
40$xsl->loadXML($xslStr);
41$xslt = new \XSLTProcessor();
42$xslt->registerPHPFunctions('testPhpFunction');
43$xslt->importStyleSheet($xsl);
44
45echo $xslt->transformToXML($dom);
46?>
47--EXPECT--
48<?xml version="1.0"?>
49<output xmlns:php="http://php.net/xsl"><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node></output>
50