| Index: src/ast/scopes.cc
|
| diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc
|
| index c150336668545eb1a8bf78b3af3823f70bb476c1..46591678f90896506d6e4cec86093b5c489e8b2e 100644
|
| --- a/src/ast/scopes.cc
|
| +++ b/src/ast/scopes.cc
|
| @@ -636,6 +636,35 @@ Variable* DeclarationScope::DeclareFunctionVar(const AstRawString* name) {
|
| return function_;
|
| }
|
|
|
| +bool Scope::HasBeenRemoved() const {
|
| + // TODO(neis): Store this information somewhere instead of calculating it.
|
| +
|
| + if (!is_block_scope() || is_declaration_scope()) return false;
|
| +
|
| + Scope* parent = outer_scope();
|
| + if (parent == nullptr) {
|
| + DCHECK(is_script_scope());
|
| + return false;
|
| + }
|
| +
|
| + Scope* sibling = parent->inner_scope();
|
| + for (; sibling != nullptr; sibling = sibling->sibling()) {
|
| + if (sibling == this) return false;
|
| + }
|
| +
|
| + DCHECK_NULL(inner_scope_);
|
| + return true;
|
| +}
|
| +
|
| +Scope* Scope::GetUnremovedScope() {
|
| + Scope* scope = this;
|
| + while (scope != nullptr && scope->HasBeenRemoved()) {
|
| + scope = scope->outer_scope();
|
| + }
|
| + DCHECK_NOT_NULL(scope);
|
| + return scope;
|
| +}
|
| +
|
| Scope* Scope::FinalizeBlockScope() {
|
| DCHECK(is_block_scope());
|
|
|
|
|