made the parsing independent of the template loaders
authorFabien Potencier <fabien.potencier@gmail.com>
Tue, 10 Jul 2012 16:30:12 +0000 (18:30 +0200)
committerFabien Potencier <fabien.potencier@gmail.com>
Tue, 10 Jul 2012 16:30:53 +0000 (18:30 +0200)
This basically reverts 57ff88255ef35ad8da325d0cb0bf140e653b132c

CHANGELOG
lib/Twig/Parser.php
test/Twig/Tests/ParserTest.php

index 0b9d53d..8a322bd 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 * 1.9.0 (2012-XX-XX)
 
+ * made the parsing independent of the template loaders
  * fixed exception trace when an error occurs when rendering a child template
  * added escaping strategies for CSS, URL, and HTML attributes
  * fixed nested embed tag calls
index 771a7bd..66f5d2a 100644 (file)
@@ -30,7 +30,6 @@ class Twig_Parser implements Twig_ParserInterface
     protected $env;
     protected $reservedMacroNames;
     protected $importedFunctions;
-    protected $tmpVarCount;
     protected $traits;
     protected $embeddedTemplates = array();
 
@@ -51,7 +50,7 @@ class Twig_Parser implements Twig_ParserInterface
 
     public function getVarName()
     {
-        return sprintf('__internal_%s_%d', substr($this->env->getTemplateClass($this->stream->getFilename()), strlen($this->env->getTemplateClassPrefix())), ++$this->tmpVarCount);
+        return sprintf('__internal_%s', hash('sha1', uniqid(mt_rand(), true), false));
     }
 
     /**
@@ -68,8 +67,6 @@ class Twig_Parser implements Twig_ParserInterface
         unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser']);
         $this->stack[] = $vars;
 
-        $this->tmpVarCount = 0;
-
         // tag handlers
         if (null === $this->handlers) {
             $this->handlers = $this->env->getTokenParsers();
index 76f257a..1e773a6 100644 (file)
@@ -115,6 +115,26 @@ class Twig_Tests_ParserTest extends PHPUnit_Framework_TestCase
         $this->assertEquals(null, $parser->getParent());
     }
 
+    // The getVarName() must not depend on the template loaders,
+    // If this test does not throw any exception, that's good.
+    // see https://github.com/symfony/symfony/issues/4218
+    public function testGetVarName()
+    {
+        $twig = new Twig_Environment(null, array(
+            'autoescape' => false,
+            'optimizations' => 0,
+        ));
+
+        $twig->parse($twig->tokenize(<<<EOF
+{% from _self import foo %}
+
+{% macro foo() %}
+    {{ foo }}
+{% endmacro %}
+EOF
+        ));
+    }
+
     protected function getParserForFilterBodyNodes()
     {
         $parser = new TestParser(new Twig_Environment());