Skip to content

Commit 9062eb7

Browse files
committed
Handle edge cases when parsing templates
- Do not attempt to parse empty contents - Prevent nesting problems with Xdebug - Catch and silence errors
1 parent 5fbf10b commit 9062eb7

File tree

1 file changed

+30
-14
lines changed
  • lib/internal/Magento/Framework/View/Template/Html

1 file changed

+30
-14
lines changed

lib/internal/Magento/Framework/View/Template/Html/Minifier.php

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,22 +117,38 @@ public function minify($file)
117117
$dir = dirname($file);
118118
$fileName = basename($file);
119119
$content = $this->readFactory->create($dir)->readFile($fileName);
120-
121-
$parser = (new \PhpParser\ParserFactory())->create(\PhpParser\ParserFactory::PREFER_PHP7);
122120
$heredocs = null;
123121

124-
try {
125-
$ast = $parser->parse($content);
126-
127-
$traverser = new \PhpParser\NodeTraverser();
128-
$traverser->addVisitor(new Php\NodeVisitor());
129-
$ast = $traverser->traverse($ast);
130-
131-
$prettyPrinter = new Php\PrettyPrinter();
132-
$content = $prettyPrinter->prettyPrintFile($ast);
133-
$heredocs = $prettyPrinter->getDelayedHeredocs();
134-
} catch (\PhpParser\Error $error) {
135-
// Some PHP code is seemingly invalid.
122+
if (null !== $content) {
123+
$parser = (new \PhpParser\ParserFactory())->create(\PhpParser\ParserFactory::PREFER_PHP7);
124+
125+
/**
126+
* Prevent problems with deeply nested ASTs if xDebug is enabled.
127+
* @see https://github.com/nikic/PHP-Parser/blob/v4.4.0/doc/2_Usage_of_basic_components.markdown#bootstrapping
128+
*/
129+
$nestingLevelConfigValue = ini_get('xdebug.max_nesting_level');
130+
131+
if (false !== $nestingLevelConfigValue) {
132+
ini_set('xdebug.max_nesting_level', '3000');
133+
}
134+
135+
try {
136+
$ast = $parser->parse($content);
137+
138+
$traverser = new \PhpParser\NodeTraverser();
139+
$traverser->addVisitor(new Php\NodeVisitor());
140+
$ast = $traverser->traverse($ast);
141+
142+
$prettyPrinter = new Php\PrettyPrinter();
143+
$content = $prettyPrinter->prettyPrintFile($ast);
144+
$heredocs = $prettyPrinter->getDelayedHeredocs();
145+
} catch (\Error $error) {
146+
// Some PHP code is seemingly invalid, or too complex.
147+
} finally {
148+
if (false !== $nestingLevelConfigValue) {
149+
ini_set('xdebug.max_nesting_level', $nestingLevelConfigValue);
150+
}
151+
}
136152
}
137153

138154
//Storing Heredocs

0 commit comments

Comments
 (0)