Add resolveValue method to base Template.

DRYs up compiled class output a bit and makes things FASTER!

Speeds up value resolution by 33% for primitives, 25% for methods and properties, and 10% for lambdas.
This commit is contained in:
Justin Hileman
2013-01-26 16:19:06 -08:00
parent cf76a4b8f9
commit a777c587f2
3 changed files with 25 additions and 8 deletions
+1 -6
View File
@@ -275,12 +275,7 @@ class Mustache_Compiler
} }
const VARIABLE = ' const VARIABLE = '
$value = $context->%s(%s); $value = $this->resolveValue($context->%s(%s), $context, $indent);%s
if (!is_string($value) && is_callable($value)) {
$value = $this->mustache
->loadLambda((string) call_user_func($value))
->renderInternal($context, $indent);
}%s
$buffer .= %s%s; $buffer .= %s%s;
'; ';
+22
View File
@@ -147,4 +147,26 @@ abstract class Mustache_Template
return $stack; return $stack;
} }
/**
* Resolve a context value.
*
* Invoke the value if it is callable, otherwise return the value.
*
* @param mixed $value
* @param Mustache_Context $context
* @param string $indent
*
* @return string
*/
protected function resolveValue($value, Mustache_Context $context, $indent = '')
{
if (!is_string($value) && is_callable($value)) {
return $this->mustache
->loadLambda((string) call_user_func($value))
->renderInternal($context, $indent);
}
return $value;
}
} }
+2 -2
View File
@@ -70,9 +70,9 @@ class Mustache_Test_CompilerTest extends PHPUnit_Framework_TestCase
"\nclass Monkey extends Mustache_Template", "\nclass Monkey extends Mustache_Template",
'$buffer .= $indent . \'foo\'', '$buffer .= $indent . \'foo\'',
'$buffer .= "\n"', '$buffer .= "\n"',
'$value = $context->find(\'name\');', '$value = $this->resolveValue($context->find(\'name\'), $context, $indent);',
'$buffer .= htmlspecialchars($value, ENT_COMPAT, \'UTF-8\');', '$buffer .= htmlspecialchars($value, ENT_COMPAT, \'UTF-8\');',
'$value = $context->last();', '$value = $this->resolveValue($context->last(), $context, $indent);',
'$buffer .= \'\\\'bar\\\'\';', '$buffer .= \'\\\'bar\\\'\';',
'return $buffer;', 'return $buffer;',
) )