Index: src/scopes.cc |
diff --git a/src/scopes.cc b/src/scopes.cc |
index 3167c4d0926f916dbe443dc5c3019e79ca74399b..78233d5a3f4430a33753a9abb6d7b0f76dc9fee5 100644 |
--- a/src/scopes.cc |
+++ b/src/scopes.cc |
@@ -707,9 +707,9 @@ static void PrintVar(int indent, Variable* var) { |
PrintName(var->name()); |
PrintF("; // "); |
PrintLocation(var); |
- if (var->is_accessed_from_inner_scope()) { |
+ if (var->has_forced_context_allocation()) { |
if (!var->IsUnallocated()) PrintF(", "); |
- PrintF("inner scope access"); |
+ PrintF("forced context allocation"); |
} |
PrintF("\n"); |
} |
@@ -848,7 +848,9 @@ Variable* Scope::LookupRecursive(Handle<String> name, |
*binding_kind = BOUND; |
} else if (outer_scope_ != NULL) { |
var = outer_scope_->LookupRecursive(name, context, binding_kind); |
- if (*binding_kind == BOUND) var->MarkAsAccessedFromInnerScope(); |
+ if (*binding_kind == BOUND && (is_function_scope() || is_with_scope())) { |
+ var->ForceContextAllocation(); |
+ } |
} |
if (is_with_scope()) { |
@@ -980,7 +982,7 @@ bool Scope::MustAllocate(Variable* var) { |
// via an eval() call. This is only possible if the variable has a |
// visible name. |
if ((var->is_this() || var->name()->length() > 0) && |
- (var->is_accessed_from_inner_scope() || |
+ (var->has_forced_context_allocation() || |
scope_calls_eval_ || |
inner_scope_calls_eval_ || |
scope_contains_with_ || |
@@ -1003,7 +1005,7 @@ bool Scope::MustAllocateInContext(Variable* var) { |
// catch-bound variables are always allocated in a context. |
if (var->mode() == TEMPORARY) return false; |
if (is_catch_scope() || is_block_scope()) return true; |
- return var->is_accessed_from_inner_scope() || |
+ return var->has_forced_context_allocation() || |
scope_calls_eval_ || |
inner_scope_calls_eval_ || |
scope_contains_with_ || |
@@ -1067,9 +1069,8 @@ void Scope::AllocateParameterLocals() { |
Variable* var = params_[i]; |
ASSERT(var->scope() == this); |
if (uses_nonstrict_arguments) { |
- // Give the parameter a use from an inner scope, to force allocation |
- // to the context. |
- var->MarkAsAccessedFromInnerScope(); |
+ // Force context allocation of the parameter. |
+ var->ForceContextAllocation(); |
} |
if (MustAllocate(var)) { |