Avoid creating unnecessary Twig_Markup instances, allows testing for falsiness of...
authorJordi Boggiano <j.boggiano@seld.be>
Fri, 17 Feb 2012 14:56:34 +0000 (15:56 +0100)
committerJordi Boggiano <j.boggiano@seld.be>
Fri, 17 Feb 2012 14:56:34 +0000 (15:56 +0100)
lib/Twig/Node/Set.php
lib/Twig/Template.php
test/Twig/Tests/Fixtures/tags/set/capture-empty.test [new file with mode: 0644]
test/Twig/Tests/Node/SetTest.php

index 098ed40..70bb519 100644 (file)
@@ -67,7 +67,7 @@ class Twig_Node_Set extends Twig_Node
             $compiler->subcompile($this->getNode('names'), false);
 
             if ($this->getAttribute('capture')) {
-                $compiler->raw(" = new Twig_Markup(ob_get_clean(), \$this->env->getCharset())");
+                $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");
             }
         }
 
@@ -87,9 +87,9 @@ class Twig_Node_Set extends Twig_Node
             } else {
                 if ($this->getAttribute('safe')) {
                     $compiler
-                        ->raw("new Twig_Markup(")
+                        ->raw("('' === \$tmp = ")
                         ->subcompile($this->getNode('values'))
-                        ->raw(", \$this->env->getCharset())")
+                        ->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())")
                     ;
                 } else {
                     $compiler->subcompile($this->getNode('values'));
index 324410e..7c4b4a1 100644 (file)
@@ -429,7 +429,7 @@ abstract class Twig_Template implements Twig_TemplateInterface
 
         // hack to be removed when macro calls are refactored
         if ($object instanceof Twig_TemplateInterface) {
-            return new Twig_Markup($ret, $this->env->getCharset());
+            return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset());
         }
 
         return $ret;
diff --git a/test/Twig/Tests/Fixtures/tags/set/capture-empty.test b/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
new file mode 100644 (file)
index 0000000..ec657f0
--- /dev/null
@@ -0,0 +1,9 @@
+--TEST--
+"set" tag block empty capture
+--TEMPLATE--
+{% set foo %}{% endset %}
+
+{% if foo %}FAIL{% endif %}
+--DATA--
+return array()
+--EXPECT--
index 4c59854..6319fb6 100644 (file)
@@ -51,14 +51,14 @@ class Twig_Tests_Node_SetTest extends Twig_Tests_Node_TestCase
         $tests[] = array($node, <<<EOF
 ob_start();
 echo "foo";
-\$context["foo"] = new Twig_Markup(ob_get_clean(), \$this->env->getCharset());
+\$context["foo"] = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
 EOF
         );
 
         $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 0)), array(), 0);
         $values = new Twig_Node_Text('foo', 0);
         $node = new Twig_Node_Set(true, $names, $values, 0);
-        $tests[] = array($node, '$context["foo"] = new Twig_Markup("foo", $this->env->getCharset());');
+        $tests[] = array($node, '$context["foo"] = (\'\' === $tmp = "foo") ? \'\' : new Twig_Markup($tmp, $this->env->getCharset());');
 
         $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 0), new Twig_Node_Expression_AssignName('bar', 0)), array(), 0);
         $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 0), new Twig_Node_Expression_Name('bar', 0)), array(), 0);