| 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;
|
| }
|
|
|
|
|