Explorar o código

Handle broken pipes

Justin Hileman %!s(int64=13) %!d(string=hai) anos
pai
achega
a64a6f82ee

+ 4 - 2
src/Mustache/Compiler.php

@@ -298,8 +298,10 @@ class Mustache_Compiler
     }
 
     const FILTER = '
-        $filter = $context->%s(%s);
-        $value = (is_string($filter) || !is_callable($filter)) ? "" : call_user_func($filter, $value);
+        if (!empty($value)) {
+            $filter = $context->%s(%s);
+            $value = (is_string($filter) || !is_callable($filter)) ? "" : call_user_func($filter, $value);
+        }
     ';
 
     /**

+ 22 - 0
test/Mustache/Test/FiveThree/Functional/FiltersTest.php

@@ -50,4 +50,26 @@ class Mustache_Test_FiveThree_Functional_FiltersTest extends PHPUnit_Framework_T
 
         $this->assertEquals('[[2000-01-01 12:01:00]]', $tpl->render($foo));
     }
+
+    public function testBrokenPipe() {
+        $tpl = $this->mustache->loadTemplate('{{% FILTERS }}{{ foo | bar | baz }}');
+        $this->assertEquals('', $tpl->render(array(
+            'foo' => 'FOO',
+        )));
+
+        $this->assertEquals('', $tpl->render(array(
+            'foo' => 'FOO',
+            'bar' => function($value) { return 'BAR'; },
+        )));
+
+        $this->assertEquals('', $tpl->render(array(
+            'foo' => 'FOO',
+            'baz' => function($value) { return 'BAZ'; },
+        )));
+
+        $this->assertEquals('', $tpl->render(array(
+            'bar' => function($value) { return 'BAR'; },
+            'baz' => function($value) { return 'BAZ'; },
+        )));
+    }
 }