| Index: src/scopes.cc
 | 
| diff --git a/src/scopes.cc b/src/scopes.cc
 | 
| index a199da6b2b6644365941a3727abb0011cfd626ba..13745f2abdef37cf1ebdc500914007e2038226e8 100644
 | 
| --- a/src/scopes.cc
 | 
| +++ b/src/scopes.cc
 | 
| @@ -118,7 +118,7 @@ Scope::Scope(Scope* outer_scope, ScopeType type)
 | 
|        unresolved_(16),
 | 
|        decls_(4),
 | 
|        already_resolved_(false) {
 | 
| -  SetDefaults(type, outer_scope, Handle<SerializedScopeInfo>::null());
 | 
| +  SetDefaults(type, outer_scope, Handle<ScopeInfo>::null());
 | 
|    // At some point we might want to provide outer scopes to
 | 
|    // eval scopes (by walking the stack and reading the scope info).
 | 
|    // In that case, the ASSERT below needs to be adjusted.
 | 
| @@ -129,7 +129,7 @@ Scope::Scope(Scope* outer_scope, ScopeType type)
 | 
|  
 | 
|  Scope::Scope(Scope* inner_scope,
 | 
|               ScopeType type,
 | 
| -             Handle<SerializedScopeInfo> scope_info)
 | 
| +             Handle<ScopeInfo> scope_info)
 | 
|      : isolate_(Isolate::Current()),
 | 
|        inner_scopes_(4),
 | 
|        variables_(),
 | 
| @@ -139,8 +139,8 @@ Scope::Scope(Scope* inner_scope,
 | 
|        decls_(4),
 | 
|        already_resolved_(true) {
 | 
|    SetDefaults(type, NULL, scope_info);
 | 
| -  if (!scope_info.is_null() && scope_info->HasHeapAllocatedLocals()) {
 | 
| -    num_heap_slots_ = scope_info_->NumberOfContextSlots();
 | 
| +  if (!scope_info.is_null()) {
 | 
| +    num_heap_slots_ = scope_info_->ContextLength();
 | 
|    }
 | 
|    AddInnerScope(inner_scope);
 | 
|  }
 | 
| @@ -155,7 +155,7 @@ Scope::Scope(Scope* inner_scope, Handle<String> catch_variable_name)
 | 
|        unresolved_(0),
 | 
|        decls_(0),
 | 
|        already_resolved_(true) {
 | 
| -  SetDefaults(CATCH_SCOPE, NULL, Handle<SerializedScopeInfo>::null());
 | 
| +  SetDefaults(CATCH_SCOPE, NULL, Handle<ScopeInfo>::null());
 | 
|    AddInnerScope(inner_scope);
 | 
|    ++num_var_or_const_;
 | 
|    Variable* variable = variables_.Declare(this,
 | 
| @@ -169,7 +169,7 @@ Scope::Scope(Scope* inner_scope, Handle<String> catch_variable_name)
 | 
|  
 | 
|  void Scope::SetDefaults(ScopeType type,
 | 
|                          Scope* outer_scope,
 | 
| -                        Handle<SerializedScopeInfo> scope_info) {
 | 
| +                        Handle<ScopeInfo> scope_info) {
 | 
|    outer_scope_ = outer_scope;
 | 
|    type_ = type;
 | 
|    scope_name_ = isolate_->factory()->empty_symbol();
 | 
| @@ -206,8 +206,9 @@ Scope* Scope::DeserializeScopeChain(CompilationInfo* info,
 | 
|    bool contains_with = false;
 | 
|    while (!context->IsGlobalContext()) {
 | 
|      if (context->IsWithContext()) {
 | 
| -      Scope* with_scope = new Scope(current_scope, WITH_SCOPE,
 | 
| -                                    Handle<SerializedScopeInfo>::null());
 | 
| +      Scope* with_scope = new Scope(current_scope,
 | 
| +                                    WITH_SCOPE,
 | 
| +                                    Handle<ScopeInfo>::null());
 | 
|        current_scope = with_scope;
 | 
|        // All the inner scopes are inside a with.
 | 
|        contains_with = true;
 | 
| @@ -215,15 +216,15 @@ Scope* Scope::DeserializeScopeChain(CompilationInfo* info,
 | 
|          s->scope_inside_with_ = true;
 | 
|        }
 | 
|      } else if (context->IsFunctionContext()) {
 | 
| -      SerializedScopeInfo* scope_info =
 | 
| -          context->closure()->shared()->scope_info();
 | 
| -      current_scope = new Scope(current_scope, FUNCTION_SCOPE,
 | 
| -                                Handle<SerializedScopeInfo>(scope_info));
 | 
| +      ScopeInfo* scope_info = context->closure()->shared()->scope_info();
 | 
| +      current_scope = new Scope(current_scope,
 | 
| +                                FUNCTION_SCOPE,
 | 
| +                                Handle<ScopeInfo>(scope_info));
 | 
|      } else if (context->IsBlockContext()) {
 | 
| -      SerializedScopeInfo* scope_info =
 | 
| -          SerializedScopeInfo::cast(context->extension());
 | 
| -      current_scope = new Scope(current_scope, BLOCK_SCOPE,
 | 
| -                                Handle<SerializedScopeInfo>(scope_info));
 | 
| +      ScopeInfo* scope_info = ScopeInfo::cast(context->extension());
 | 
| +      current_scope = new Scope(current_scope,
 | 
| +                                BLOCK_SCOPE,
 | 
| +                                Handle<ScopeInfo>(scope_info));
 | 
|      } else {
 | 
|        ASSERT(context->IsCatchContext());
 | 
|        String* name = String::cast(context->extension());
 | 
| @@ -361,7 +362,7 @@ Variable* Scope::LocalLookup(Handle<String> name) {
 | 
|      index = scope_info_->ParameterIndex(*name);
 | 
|      if (index < 0) {
 | 
|        // Check the function name.
 | 
| -      index = scope_info_->FunctionContextSlotIndex(*name, NULL);
 | 
| +      index = scope_info_->FunctionContextSlotIndex(*name, &mode);
 | 
|        if (index < 0) return NULL;
 | 
|      }
 | 
|    }
 | 
| @@ -504,8 +505,7 @@ Declaration* Scope::CheckConflictingVarDeclarations() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -template<class Allocator>
 | 
| -void Scope::CollectUsedVariables(List<Variable*, Allocator>* locals) {
 | 
| +void Scope::CollectUsedVariables(ZoneList<Variable*>* locals) {
 | 
|    // Collect variables in this scope.
 | 
|    // Note that the function_ variable - if present - is not
 | 
|    // collected here but handled separately in ScopeInfo
 | 
| @@ -527,15 +527,6 @@ void Scope::CollectUsedVariables(List<Variable*, Allocator>* locals) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -// Make sure the method gets instantiated by the template system.
 | 
| -template void Scope::CollectUsedVariables(
 | 
| -    List<Variable*, FreeStoreAllocationPolicy>* locals);
 | 
| -template void Scope::CollectUsedVariables(
 | 
| -    List<Variable*, PreallocatedStorage>* locals);
 | 
| -template void Scope::CollectUsedVariables(
 | 
| -    List<Variable*, ZoneListAllocationPolicy>* locals);
 | 
| -
 | 
| -
 | 
|  void Scope::AllocateVariables(Handle<Context> context) {
 | 
|    ASSERT(outer_scope_ == NULL);  // eval or global scopes only
 | 
|  
 | 
| @@ -610,18 +601,18 @@ Scope* Scope::DeclarationScope() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -Handle<SerializedScopeInfo> Scope::GetSerializedScopeInfo() {
 | 
| +Handle<ScopeInfo> Scope::GetScopeInfo() {
 | 
|    if (scope_info_.is_null()) {
 | 
| -    scope_info_ = SerializedScopeInfo::Create(this);
 | 
| +    scope_info_ = ScopeInfo::Create(this);
 | 
|    }
 | 
|    return scope_info_;
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void Scope::GetNestedScopeChain(
 | 
| -    List<Handle<SerializedScopeInfo> >* chain,
 | 
| +    List<Handle<ScopeInfo> >* chain,
 | 
|      int position) {
 | 
| -  chain->Add(Handle<SerializedScopeInfo>(GetSerializedScopeInfo()));
 | 
| +  chain->Add(Handle<ScopeInfo>(GetScopeInfo()));
 | 
|  
 | 
|    for (int i = 0; i < inner_scopes_.length(); i++) {
 | 
|      Scope* scope = inner_scopes_[i];
 | 
| @@ -1126,21 +1117,15 @@ void Scope::AllocateVariablesRecursively() {
 | 
|    if (is_function_scope()) AllocateParameterLocals();
 | 
|    AllocateNonParameterLocals();
 | 
|  
 | 
| -  // Allocate context if necessary.
 | 
| -  bool must_have_local_context = false;
 | 
| -  if (scope_calls_eval_ || scope_contains_with_) {
 | 
| -    // The context for the eval() call or 'with' statement in this scope.
 | 
| -    // Unless we are in the global or an eval scope, we need a local
 | 
| -    // context even if we didn't statically allocate any locals in it,
 | 
| -    // and the compiler will access the context variable. If we are
 | 
| -    // not in an inner scope, the scope is provided from the outside.
 | 
| -    must_have_local_context = is_function_scope();
 | 
| -  }
 | 
| +  // Force allocation of a context for this scope if necessary. For a 'with'
 | 
| +  // scope and for a function scope that makes an 'eval' call we need a context,
 | 
| +  // even if no local variables were statically allocated in the scope.
 | 
| +  bool must_have_context = is_with_scope() ||
 | 
| +      (is_function_scope() && calls_eval());
 | 
|  
 | 
|    // If we didn't allocate any locals in the local context, then we only
 | 
| -  // need the minimal number of slots if we must have a local context.
 | 
| -  if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS &&
 | 
| -      !must_have_local_context) {
 | 
| +  // need the minimal number of slots if we must have a context.
 | 
| +  if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && !must_have_context) {
 | 
|      num_heap_slots_ = 0;
 | 
|    }
 | 
|  
 | 
| 
 |