diff --git a/CHANGELOG b/CHANGELOG index c8781b64f..7efc6003a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ * 1.38.0 (2019-XX-XX) + * improved the performance of the sandbox * added a spaceless filter * added max value to the "random" function * made namespace classes the default classes (PSR-0 ones are aliases now) diff --git a/src/Node/SandboxedPrintNode.php b/src/Node/SandboxedPrintNode.php index b083963a7..efb7b3577 100644 --- a/src/Node/SandboxedPrintNode.php +++ b/src/Node/SandboxedPrintNode.php @@ -12,6 +12,7 @@ namespace Twig\Node; use Twig\Compiler; +use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\FilterExpression; /** @@ -29,10 +30,21 @@ class SandboxedPrintNode extends PrintNode { $compiler ->addDebugInfo($this) - ->write('echo $this->env->getExtension(\'\Twig\Extension\SandboxExtension\')->ensureToStringAllowed(') - ->subcompile($this->getNode('expr')) - ->raw(");\n") + ->write('echo ') ; + $expr = $this->getNode('expr'); + if ($expr instanceof ConstantExpression) { + $compiler + ->subcompile($expr) + ->raw(";\n") + ; + } else { + $compiler + ->write('$this->env->getExtension(\'\Twig\Extension\SandboxExtension\')->ensureToStringAllowed(') + ->subcompile($expr) + ->raw(");\n") + ; + } } /** diff --git a/test/Twig/Tests/Node/SandboxedPrintTest.php b/test/Twig/Tests/Node/SandboxedPrintTest.php index 7a06d97d9..077dbeba9 100644 --- a/test/Twig/Tests/Node/SandboxedPrintTest.php +++ b/test/Twig/Tests/Node/SandboxedPrintTest.php @@ -9,8 +9,12 @@ * file that was distributed with this source code. */ +use Twig\Node\Expression\ArrayExpression; use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\NameExpression; use Twig\Node\SandboxedPrintNode; +use Twig\Template; use Twig\Test\NodeTestCase; class Twig_Tests_Node_SandboxedPrintTest extends NodeTestCase @@ -24,11 +28,15 @@ class Twig_Tests_Node_SandboxedPrintTest extends NodeTestCase public function getTests() { - $tests = []; - $tests[] = [new SandboxedPrintNode(new ConstantExpression('foo', 1), 1), <<env->getExtension('\Twig\Extension\SandboxExtension')->ensureToStringAllowed("foo"); +echo "foo"; +EOF + ]; + + $tests[] = [new SandboxedPrintNode(new NameExpression('foo', 1), 1), <<env->getExtension('\Twig\Extension\SandboxExtension')->ensureToStringAllowed({$this->getVariableGetter('foo', false)}); EOF ];