// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_AST_SCOPES_H_ #define V8_AST_SCOPES_H_ #include <numeric> #include "src/ast/ast.h" #include "src/base/compiler-specific.h" #include "src/base/hashmap.h" #include "src/base/pointer-with-payload.h" #include "src/base/threaded-list.h" #include "src/common/globals.h" #include "src/objects/function-kind.h" #include "src/zone/zone-hashmap.h" #include "src/zone/zone.h" namespace v8 { namespace internal { class Scope; } // namespace internal namespace base { template <> struct PointerWithPayloadTraits<v8::internal::Scope> { … }; } // namespace base namespace internal { class AstNodeFactory; class AstValueFactory; class AstRawString; class Declaration; class ParseInfo; class Parser; class PreparseDataBuilder; class SloppyBlockFunctionStatement; class Statement; class StringSet; class VariableProxy; using UnresolvedList = base::ThreadedList<VariableProxy, VariableProxy::UnresolvedNext>; // A hash map to support fast variable declaration and lookup. class VariableMap : public ZoneHashMap { … }; // Global invariants after AST construction: Each reference (i.e. identifier) // to a JavaScript variable (including global properties) is represented by a // VariableProxy node. Immediately after AST construction and before variable // allocation, most VariableProxy nodes are "unresolved", i.e. not bound to a // corresponding variable (though some are bound during parse time). Variable // allocation binds each unresolved VariableProxy to one Variable and assigns // a location. Note that many VariableProxy nodes may refer to the same Java- // Script variable. // JS environments are represented in the parser using Scope, DeclarationScope // and ModuleScope. DeclarationScope is used for any scope that hosts 'var' // declarations. This includes script, module, eval, varblock, and function // scope. ModuleScope further specializes DeclarationScope. class V8_EXPORT_PRIVATE Scope : public NON_EXPORTED_BASE(ZoneObject) { … }; class V8_EXPORT_PRIVATE DeclarationScope : public Scope { … }; void Scope::RecordEvalCall() { … } Scope::Snapshot::Snapshot(Scope* scope) : … { … } class ModuleScope final : public DeclarationScope { … }; class V8_EXPORT_PRIVATE ClassScope : public Scope { … }; // Iterate over the private name scope chain. The iteration proceeds from the // innermost private name scope outwards. class PrivateNameScopeIterator { … }; } // namespace internal } // namespace v8 #endif // V8_AST_SCOPES_H_