fixed macro compilation when a variable name is a PHP reserved keyword (closes #881)
authorFabien Potencier <fabien.potencier@gmail.com>
Mon, 5 Nov 2012 07:50:56 +0000 (08:50 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Mon, 5 Nov 2012 07:52:04 +0000 (08:52 +0100)
CHANGELOG
lib/Twig/Node/Macro.php
test/Twig/Tests/Fixtures/macros/reserved_variables.test [new file with mode: 0644]
test/Twig/Tests/Node/MacroTest.php

index f51ea8b..bceaf2f 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 * 1.11.0 (2012-XX-XX)
 
+ * fixed macro compilation when a variable name is a PHP reserved keyword
  * changed the date filter behavior to always apply the default timezone, except if false is passed as the timezone
  * fixed bitwise operator precedences
  * added the template_from_string function
index 11a7d1a..bdbef27 100644 (file)
@@ -31,7 +31,7 @@ class Twig_Node_Macro extends Twig_Node
     {
         $arguments = array();
         foreach ($this->getNode('arguments') as $argument) {
-            $arguments[] = '$'.$argument->getAttribute('name').' = null';
+            $arguments[] = '$_'.$argument->getAttribute('name').' = null';
         }
 
         $compiler
@@ -52,7 +52,7 @@ class Twig_Node_Macro extends Twig_Node
                 $compiler
                     ->write('')
                     ->string($argument->getAttribute('name'))
-                    ->raw(' => $'.$argument->getAttribute('name'))
+                    ->raw(' => $_'.$argument->getAttribute('name'))
                     ->raw(",\n")
                 ;
             }
diff --git a/test/Twig/Tests/Fixtures/macros/reserved_variables.test b/test/Twig/Tests/Fixtures/macros/reserved_variables.test
new file mode 100644 (file)
index 0000000..cbfb921
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+macro
+--TEMPLATE--
+{% from _self import test %}
+
+{% macro test(this) -%}
+    {{ this }}
+{%- endmacro %}
+
+{{ test(this) }}
+--DATA--
+return array('this' => 'foo');
+--EXPECT--
+foo
index 28364c3..b6841d3 100644 (file)
@@ -43,10 +43,10 @@ class Twig_Tests_Node_MacroTest extends Twig_Test_NodeTestCase
         return array(
             array($node, <<<EOF
 // line 1
-public function getfoo(\$foo = null)
+public function getfoo(\$_foo = null)
 {
     \$context = \$this->env->mergeGlobals(array(
-        "foo" => \$foo,
+        "foo" => \$_foo,
     ));
 
     \$blocks = array();