bug70078.phpt 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. --TEST--
  2. Bug #70078 (XSL callbacks with nodes as parameter leak memory)
  3. --EXTENSIONS--
  4. xsl
  5. --FILE--
  6. <?php
  7. // create big dummy document:
  8. $dom = new \DOMDocument();
  9. $rootNode = $dom->appendChild($dom->createElement('root'));
  10. for ($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. function testPhpFunction($node) {
  20. return 'test2';
  21. }
  22. $xslStr = <<<EOF
  23. <?xml version="1.0" encoding="utf-8"?>
  24. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
  25. <xsl:template match="root">
  26. <output>
  27. <xsl:for-each select="level1">
  28. <node>
  29. <xsl:value-of select="php:function('testPhpFunction', .)" />
  30. </node>
  31. </xsl:for-each>
  32. </output>
  33. </xsl:template>
  34. </xsl:stylesheet>
  35. EOF;
  36. $xsl = new \DOMDocument();
  37. $xsl->loadXML($xslStr);
  38. $xslt = new \XSLTProcessor();
  39. $xslt->registerPHPFunctions('testPhpFunction');
  40. $xslt->importStyleSheet($xsl);
  41. echo $xslt->transformToXML($dom);
  42. ?>
  43. --EXPECT--
  44. <?xml version="1.0"?>
  45. <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>