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) private function findVariableInStack($id, array $stack)
{ {
for ($i = count($stack) - 1; $i >= 0; $i--) { for ($i = count($stack) - 1; $i >= 0; $i--) {
switch (gettype($stack[$i])) { $frame = &$stack[$i];
switch (gettype($frame)) {
case 'object': case 'object':
if (!($stack[$i] instanceof Closure)) { if (!($frame instanceof Closure)) {
// Note that is_callable() *will not work here* // Note that is_callable() *will not work here*
// See https://github.com/bobthecow/mustache.php/wiki/Magic-Methods // See https://github.com/bobthecow/mustache.php/wiki/Magic-Methods
if (method_exists($stack[$i], $id)) { if (method_exists($frame, $id)) {
return $stack[$i]->$id(); return $frame->$id();
} elseif (isset($stack[$i]->$id)) { } elseif (isset($frame->$id)) {
return $stack[$i]->$id; return $frame->$id;
} elseif ($stack[$i] instanceof ArrayAccess && isset($stack[$i][$id])) { } elseif ($frame instanceof ArrayAccess && isset($frame[$id])) {
return $stack[$i][$id]; return $frame[$id];
} }
} }
break; break;
case 'array': case 'array':
if (array_key_exists($id, $stack[$i])) { if (array_key_exists($id, $frame)) {
return $stack[$i][$id]; return $frame[$id];
} }
break; break;
} }