fixed escaper when wrapping a Twig_Node_Print (the original class must be preserved)
authorFabien Potencier <fabien.potencier@gmail.com>
Thu, 2 Dec 2010 07:42:09 +0000 (08:42 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Thu, 2 Dec 2010 07:51:53 +0000 (08:51 +0100)
lib/Twig/Node/SandboxedPrint.php
lib/Twig/NodeVisitor/Escaper.php
lib/Twig/NodeVisitor/Sandbox.php
test/Twig/Tests/Node/SandboxedPrintTest.php

index 34db421..877838e 100644 (file)
@@ -22,9 +22,9 @@
  */
 class Twig_Node_SandboxedPrint extends Twig_Node_Print
 {
-    public function __construct(Twig_Node_Print $node)
+    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
     {
-        parent::__construct($node->getNode('expr'), $node->getLine(), $node->getNodeTag());
+        parent::__construct($expr, $lineno, $tag);
     }
 
     /**
@@ -46,8 +46,8 @@ class Twig_Node_SandboxedPrint extends Twig_Node_Print
             ->raw('$_tmp, \'__toString\');'."\n")
             ->outdent()
             ->write('}'."\n")
-            ->write('echo ')
-            ->raw("\$_tmp;\n")
         ;
+
+        parent::compile($compiler);
     }
 }
index ad0e420..8f0cc14 100644 (file)
@@ -84,7 +84,9 @@ class Twig_NodeVisitor_Escaper implements Twig_NodeVisitorInterface
             return $node;
         }
 
-        return new Twig_Node_Print(
+        $class = get_class($node);
+
+        return new $class(
             $this->getEscaperFilter($type, $expression),
             $node->getLine()
         );
index 7155f58..3f9d168 100644 (file)
@@ -50,7 +50,7 @@ class Twig_NodeVisitor_Sandbox implements Twig_NodeVisitorInterface
 
             // wrap print to check __toString() calls
             if ($node instanceof Twig_Node_Print) {
-                return new Twig_Node_SandboxedPrint($node);
+                return new Twig_Node_SandboxedPrint($node->getNode('expr'), $node->getLine(), $node->getNodeTag());
             }
         }
 
index 3e53b6e..6e30241 100644 (file)
@@ -18,9 +18,7 @@ class Twig_Tests_Node_SandboxedPrintTest extends Twig_Tests_Node_TestCase
      */
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant('foo', 0);
-        $node = new Twig_Node_Print($expr, 0);
-        $node = new Twig_Node_SandboxedPrint($node);
+        $node = new Twig_Node_SandboxedPrint($expr = new Twig_Node_Expression_Constant('foo', 0), 0);
 
         $this->assertEquals($expr, $node->getNode('expr'));
     }
@@ -38,13 +36,11 @@ class Twig_Tests_Node_SandboxedPrintTest extends Twig_Tests_Node_TestCase
     {
         $tests = array();
 
-        $node = new Twig_Node_Print(new Twig_Node_Expression_Constant('foo', 0), 0);
-        $tests[] = array(new Twig_Node_SandboxedPrint($node), <<<EOF
-\$_tmp = "foo";
-if (is_object(\$_tmp)) {
+        $tests[] = array(new Twig_Node_SandboxedPrint(new Twig_Node_Expression_Constant('foo', 0), 0), <<<EOF
+if (is_object(\$_tmp = "foo")) {
     \$this->env->getExtension('sandbox')->checkMethodAllowed(\$_tmp, '__toString');
 }
-echo \$_tmp;
+echo "foo";
 EOF
         );