Use reference to current stack frame

(saves quite a few array lookups)

See #218
This commit is contained in:
Justin Hileman
2014-08-18 09:01:57 -07:00
parent 3d37a88f0b
commit df67052626
+12 -10
View File
@@ -172,24 +172,26 @@ class Mustache_Context
private function findVariableInStack($id, array $stack)
{
for ($i = count($stack) - 1; $i >= 0; $i--) {
switch (gettype($stack[$i])) {
$frame = &$stack[$i];
switch (gettype($frame)) {
case 'object':
if (!($stack[$i] instanceof Closure)) {
if (!($frame instanceof Closure)) {
// Note that is_callable() *will not work here*
// See https://github.com/bobthecow/mustache.php/wiki/Magic-Methods
if (method_exists($stack[$i], $id)) {
return $stack[$i]->$id();
} elseif (isset($stack[$i]->$id)) {
return $stack[$i]->$id;
} elseif ($stack[$i] instanceof ArrayAccess && isset($stack[$i][$id])) {
return $stack[$i][$id];
if (method_exists($frame, $id)) {
return $frame->$id();
} elseif (isset($frame->$id)) {
return $frame->$id;
} elseif ($frame instanceof ArrayAccess && isset($frame[$id])) {
return $frame[$id];
}
}
break;
case 'array':
if (array_key_exists($id, $stack[$i])) {
return $stack[$i][$id];
if (array_key_exists($id, $frame)) {
return $frame[$id];
}
break;
}