Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index 2372e1bb1d4b944a4acb668d1ff325c9199d0fd3..5b91bb6b7edee3be392a05077e73537a448a2a2c 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -1098,12 +1098,15 @@ Variable* Scope::LookupRecursive(VariableProxy* proxy, |
if (var != NULL && proxy->is_assigned()) var->set_maybe_assigned(); |
*binding_kind = DYNAMIC_LOOKUP; |
return NULL; |
- } else if (calls_sloppy_eval() && !is_script_scope() && |
- name_can_be_shadowed) { |
+ } else if (calls_sloppy_eval() && is_declaration_scope() && |
+ !is_script_scope() && name_can_be_shadowed) { |
// A variable binding may have been found in an outer scope, but the current |
// scope makes a sloppy 'eval' call, so the found variable may not be |
// the correct one (the 'eval' may introduce a binding with the same name). |
// In that case, change the lookup result to reflect this situation. |
+ // Only scopes that can host var bindings (declaration scopes) need be |
+ // considered here (this excludes block and catch scopes), and variable |
+ // lookups at script scope are always dynamic. |
if (*binding_kind == BOUND) { |
*binding_kind = BOUND_EVAL_SHADOWED; |
} else if (*binding_kind == UNBOUND) { |