fixed a crash when an object with __toString() method is passed as template name
authorMartin Hasoň <martin.hason@gmail.com>
Thu, 1 Dec 2011 11:43:07 +0000 (12:43 +0100)
committerMartin Hasoň <martin.hason@gmail.com>
Thu, 1 Dec 2011 11:43:07 +0000 (12:43 +0100)
lib/Twig/Loader/Array.php
test/Twig/Tests/Loader/ArrayTest.php

index 962d64c..32bb7e4 100644 (file)
@@ -47,7 +47,7 @@ class Twig_Loader_Array implements Twig_LoaderInterface
      */
     public function setTemplate($name, $template)
     {
-        $this->templates[$name] = $template;
+        $this->templates[(string) $name] = $template;
     }
 
     /**
@@ -59,6 +59,7 @@ class Twig_Loader_Array implements Twig_LoaderInterface
      */
     public function getSource($name)
     {
+        $name = (string) $name;
         if (!isset($this->templates[$name])) {
             throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
         }
@@ -75,6 +76,7 @@ class Twig_Loader_Array implements Twig_LoaderInterface
      */
     public function getCacheKey($name)
     {
+        $name = (string) $name;
         if (!isset($this->templates[$name])) {
             throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
         }
@@ -90,6 +92,7 @@ class Twig_Loader_Array implements Twig_LoaderInterface
      */
     public function isFresh($name, $time)
     {
+        $name = (string) $name;
         if (!isset($this->templates[$name])) {
             throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
         }
index ae7648f..1369a6b 100644 (file)
@@ -68,4 +68,30 @@ class Twig_Tests_Loader_ArrayTest extends PHPUnit_Framework_TestCase
 
         $loader->isFresh('foo', time());
     }
+
+    public function testTemplateReference()
+    {
+        $name = new Twig_Test_Loader_TemplateReference('foo');
+        $loader = new Twig_Loader_Array(array('foo' => 'bar'));
+
+        $loader->getCacheKey($name);
+        $loader->getSource($name);
+        $loader->isFresh($name, time());
+        $loader->setTemplate($name, 'foobar');
+    }
+}
+
+class Twig_Test_Loader_TemplateReference
+{
+    private $name;
+
+    public function __construct($name)
+    {
+        $this->name = $name;
+    }
+
+    public function __toString()
+    {
+        return $this->name;
+    }
 }