Chromium Code Reviews| Index: src/ast/scopes.cc |
| diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
| index 6eb11387303946ed11178749b3653b0a6328a1ec..0b2dc8ddfb2a62a30f771cf36b58de4ea26c9d51 100644 |
| --- a/src/ast/scopes.cc |
| +++ b/src/ast/scopes.cc |
| @@ -96,7 +96,6 @@ Scope::Scope(Zone* zone) |
| : zone_(zone), |
| outer_scope_(nullptr), |
| variables_(zone), |
| - locals_(4, zone), |
| scope_type_(SCRIPT_SCOPE) { |
| SetDefaults(); |
| } |
| @@ -105,7 +104,6 @@ Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type) |
| : zone_(zone), |
| outer_scope_(outer_scope), |
| variables_(zone), |
| - locals_(4, zone), |
| scope_type_(scope_type) { |
| DCHECK_NE(SCRIPT_SCOPE, scope_type); |
| SetDefaults(); |
| @@ -119,7 +117,7 @@ Scope::Snapshot::Snapshot(Scope* scope) |
| : outer_scope_(scope), |
| top_inner_scope_(scope->inner_scope_), |
| top_unresolved_(scope->unresolved_), |
| - top_local_(scope->GetClosureScope()->locals_.length()), |
| + top_local_(scope->GetClosureScope()->locals_.end()), |
| top_decl_(scope->GetClosureScope()->decls_.end()) {} |
| DeclarationScope::DeclarationScope(Zone* zone, |
| @@ -209,7 +207,6 @@ Scope::Scope(Zone* zone, ScopeType scope_type, Handle<ScopeInfo> scope_info) |
| : zone_(zone), |
| outer_scope_(nullptr), |
| variables_(zone), |
| - locals_(0, zone), |
| scope_info_(scope_info), |
| scope_type_(scope_type) { |
| DCHECK(!scope_info.is_null()); |
| @@ -238,7 +235,6 @@ Scope::Scope(Zone* zone, const AstRawString* catch_variable_name, |
| : zone_(zone), |
| outer_scope_(nullptr), |
| variables_(zone), |
| - locals_(0, zone), |
| scope_info_(scope_info), |
| scope_type_(CATCH_SCOPE) { |
| SetDefaults(); |
| @@ -684,13 +680,32 @@ Scope* Scope::FinalizeBlockScope() { |
| return NULL; |
| } |
| +void DeclarationScope::AddLocal(Variable* var) { |
| + DCHECK(!already_resolved_); |
| + // Temporaries are only placed in ClosureScopes. |
| + DCHECK_EQ(GetClosureScope(), this); |
| + locals_.Add(var); |
| +} |
| + |
| +Variable* Scope::Declare(Zone* zone, Scope* scope, const AstRawString* name, |
| + VariableMode mode, VariableKind kind, |
| + InitializationFlag initialization_flag, |
| + MaybeAssignedFlag maybe_assigned_flag) { |
| + bool added; |
| + Variable* var = |
| + variables_.Declare(zone, scope, name, mode, kind, initialization_flag, |
| + maybe_assigned_flag, &added); |
| + if (added) locals_.Add(var); |
| + return var; |
| +} |
| + |
| void Scope::Snapshot::Reparent(DeclarationScope* new_parent) const { |
| DCHECK_EQ(new_parent, outer_scope_->inner_scope_); |
| DCHECK_EQ(new_parent->outer_scope_, outer_scope_); |
| DCHECK_EQ(new_parent, new_parent->GetClosureScope()); |
| DCHECK_NULL(new_parent->inner_scope_); |
| DCHECK_NULL(new_parent->unresolved_); |
| - DCHECK_EQ(0, new_parent->locals_.length()); |
| + DCHECK(new_parent->locals_.is_empty()); |
| Scope* inner_scope = new_parent->sibling_; |
| if (inner_scope != top_inner_scope_) { |
| for (; inner_scope->sibling() != top_inner_scope_; |
| @@ -722,13 +737,13 @@ void Scope::Snapshot::Reparent(DeclarationScope* new_parent) const { |
| // name in the closure-scope. See |
| // test/mjsunit/harmony/default-parameter-do-expression.js. |
| DeclarationScope* outer_closure = outer_scope_->GetClosureScope(); |
| - for (int i = top_local_; i < outer_closure->locals_.length(); i++) { |
| - Variable* local = outer_closure->locals_.at(i); |
| + |
| + new_parent->locals_.MoveTail(outer_closure->locals_, top_local_); |
| + for (Variable* local : new_parent->locals_) { |
| DCHECK(local->mode() == TEMPORARY || local->mode() == VAR); |
| DCHECK_EQ(local->scope(), local->scope()->GetClosureScope()); |
| DCHECK_NE(local->scope(), new_parent); |
| local->set_scope(new_parent); |
| - new_parent->AddLocal(local); |
| if (local->mode() == VAR) { |
| outer_closure->variables_.Remove(local); |
| new_parent->variables_.Add(new_parent->zone(), local); |
| @@ -1238,7 +1253,7 @@ void DeclarationScope::ResetAfterPreparsing(AstValueFactory* ast_value_factory, |
| // Reset all non-trivial members. |
| decls_.Clear(); |
| - locals_.Rewind(0); |
| + locals_.Clear(); |
| sloppy_block_function_map_.Clear(); |
| variables_.Clear(); |
| // Make sure we won't walk the scope tree from here on. |
| @@ -1255,10 +1270,12 @@ void DeclarationScope::ResetAfterPreparsing(AstValueFactory* ast_value_factory, |
| for (int i = 0; i < params_.length(); i++) { |
| Variable* var = params_[i]; |
| if (var->mode() == TEMPORARY) { |
| - locals_.Add(var, zone()); |
| + *var->next() = nullptr; |
|
adamk
2016/11/02 18:54:05
Please add TODOs here and below, since it looks li
Toon Verwaest
2016/11/02 18:59:58
Will do. There's already a cl in the pipeline from
|
| + locals_.Add(var); |
| } else if (variables_.Lookup(var->raw_name()) == nullptr) { |
| + *var->next() = nullptr; |
| variables_.Add(zone(), var); |
| - locals_.Add(var, zone()); |
| + locals_.Add(var); |
| } |
| } |
| } else { |
| @@ -1884,8 +1901,8 @@ void Scope::AllocateNonParameterLocal(Variable* var) { |
| } |
| void Scope::AllocateNonParameterLocalsAndDeclaredGlobals() { |
| - for (int i = 0; i < locals_.length(); i++) { |
| - AllocateNonParameterLocal(locals_[i]); |
| + for (Variable* local : locals_) { |
| + AllocateNonParameterLocal(local); |
| } |
| if (is_declaration_scope()) { |