| // Copyright 2017 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_TORQUE_DECLARATIONS_H_ | |
| #define V8_TORQUE_DECLARATIONS_H_ | |
| #include <string> | |
| #include "src/torque/declarable.h" | |
| #include "src/torque/scope.h" | |
| #include "src/torque/utils.h" | |
| namespace v8 { | |
| namespace internal { | |
| namespace torque { | |
| static constexpr const char* const kFromConstexprMacroName = "from_constexpr"; | |
| static constexpr const char* kTrueLabelName = "_True"; | |
| static constexpr const char* kFalseLabelName = "_False"; | |
| class Declarations { | |
| public: | |
| Declarations() | |
| : unique_declaration_number_(0), | |
| current_generic_specialization_(nullptr) {} | |
| Declarable* TryLookup(const std::string& name) { return chain_.Lookup(name); } | |
| Declarable* Lookup(const std::string& name) { | |
| Declarable* d = TryLookup(name); | |
| if (d == nullptr) { | |
| std::stringstream s; | |
| s << "cannot find \"" << name << "\""; | |
| ReportError(s.str()); | |
| } | |
| return d; | |
| } | |
| Declarable* LookupGlobalScope(const std::string& name) { | |
| Declarable* d = chain_.LookupGlobalScope(name); | |
| if (d == nullptr) { | |
| std::stringstream s; | |
| s << "cannot find \"" << name << "\" in global scope"; | |
| ReportError(s.str()); | |
| } | |
| return d; | |
| } | |
| const Type* LookupType(const std::string& name); | |
| const Type* LookupGlobalType(const std::string& name); | |
| const Type* GetType(TypeExpression* type_expression); | |
| Builtin* FindSomeInternalBuiltinWithType(const FunctionPointerType* type); | |
| Value* LookupValue(const std::string& name); | |
| Macro* TryLookupMacro(const std::string& name, const TypeVector& types); | |
| Macro* LookupMacro(const std::string& name, const TypeVector& types); | |
| Builtin* LookupBuiltin(const std::string& name); | |
| Label* TryLookupLabel(const std::string& name) { | |
| Declarable* d = TryLookup(name); | |
| return d && d->IsLabel() ? Label::cast(d) : nullptr; | |
| } | |
| Label* LookupLabel(const std::string& name); | |
| GenericList* LookupGeneric(const std::string& name); | |
| ModuleConstant* LookupModuleConstant(const std::string& name); | |
| const AbstractType* DeclareAbstractType( | |
| const std::string& name, const std::string& generated, | |
| base::Optional<const AbstractType*> non_constexpr_version, | |
| const base::Optional<std::string>& parent = {}); | |
| void DeclareType(const std::string& name, const Type* type); | |
| void DeclareStruct(Module* module, const std::string& name, | |
| const std::vector<NameAndType>& fields); | |
| Label* DeclareLabel(const std::string& name); | |
| Macro* DeclareMacro(const std::string& name, const Signature& signature, | |
| base::Optional<std::string> op = {}); | |
| Builtin* DeclareBuiltin(const std::string& name, Builtin::Kind kind, | |
| bool external, const Signature& signature); | |
| RuntimeFunction* DeclareRuntimeFunction(const std::string& name, | |
| const Signature& signature); | |
| Variable* DeclareVariable(const std::string& var, const Type* type, | |
| bool is_const); | |
| Parameter* DeclareParameter(const std::string& name, | |
| const std::string& mangled_name, | |
| const Type* type); | |
| Label* DeclarePrivateLabel(const std::string& name); | |
| void DeclareExternConstant(const std::string& name, const Type* type, | |
| const std::string& value); | |
| ModuleConstant* DeclareModuleConstant(const std::string& name, | |
| const Type* type); | |
| Generic* DeclareGeneric(const std::string& name, Module* module, | |
| GenericDeclaration* generic); | |
| TypeVector GetCurrentSpecializationTypeNamesVector(); | |
| base::Optional<Generic*> GetCurrentGeneric(); | |
| ScopeChain::Snapshot GetScopeChainSnapshot() { return chain_.TaskSnapshot(); } | |
| std::set<const Variable*> GetLiveVariables() { | |
| return chain_.GetLiveVariables(); | |
| } | |
| bool IsDeclaredInCurrentScope(const std::string& name); | |
| Statement* next_body() const { return next_body_; } | |
| void PrintScopeChain() { chain_.Print(); } | |
| class ModuleScopeActivator; | |
| class NodeScopeActivator; | |
| class CleanNodeScopeActivator; | |
| class GenericScopeActivator; | |
| class ScopedGenericSpecializationKey; | |
| class ScopedGenericScopeChainSnapshot; | |
| private: | |
| Scope* GetModuleScope(const Module* module); | |
| Scope* GetNodeScope(const AstNode* node, bool reset_scope = false); | |
| Scope* GetGenericScope(Generic* generic, const TypeVector& types); | |
| template <class T> | |
| T* RegisterDeclarable(std::unique_ptr<T> d) { | |
| T* ptr = d.get(); | |
| declarables_.push_back(std::move(d)); | |
| return ptr; | |
| } | |
| MacroList* GetMacroListForName(const std::string& name, | |
| const Signature& signature); | |
| void Declare(const std::string& name, std::unique_ptr<Declarable> d) { | |
| chain_.Declare(name, RegisterDeclarable(std::move(d))); | |
| } | |
| int GetNextUniqueDeclarationNumber() { return unique_declaration_number_++; } | |
| void CheckAlreadyDeclared(const std::string& name, const char* new_type); | |
| int unique_declaration_number_; | |
| ScopeChain chain_; | |
| const SpecializationKey* current_generic_specialization_; | |
| Statement* next_body_; | |
| std::vector<std::unique_ptr<Declarable>> declarables_; | |
| std::map<const Module*, Scope*> module_scopes_; | |
| std::map<std::pair<const AstNode*, TypeVector>, Scope*> scopes_; | |
| std::map<Generic*, ScopeChain::Snapshot> generic_declaration_scopes_; | |
| }; | |
| class Declarations::NodeScopeActivator { | |
| public: | |
| NodeScopeActivator(Declarations* declarations, AstNode* node) | |
| : activator_(declarations->GetNodeScope(node)) {} | |
| private: | |
| Scope::Activator activator_; | |
| }; | |
| class Declarations::ModuleScopeActivator { | |
| public: | |
| ModuleScopeActivator(Declarations* declarations, const Module* module) | |
| : activator_(declarations->GetModuleScope(module)) {} | |
| private: | |
| Scope::Activator activator_; | |
| }; | |
| class Declarations::CleanNodeScopeActivator { | |
| public: | |
| CleanNodeScopeActivator(Declarations* declarations, AstNode* node) | |
| : activator_(declarations->GetNodeScope(node, true)) {} | |
| private: | |
| Scope::Activator activator_; | |
| }; | |
| class Declarations::GenericScopeActivator { | |
| public: | |
| GenericScopeActivator(Declarations* declarations, | |
| const SpecializationKey& key) | |
| : activator_(declarations->GetGenericScope(key.first, key.second)) {} | |
| private: | |
| Scope::Activator activator_; | |
| }; | |
| class Declarations::ScopedGenericSpecializationKey { | |
| public: | |
| ScopedGenericSpecializationKey(Declarations* declarations, | |
| const SpecializationKey& key) | |
| : declarations_(declarations) { | |
| declarations->current_generic_specialization_ = &key; | |
| } | |
| ~ScopedGenericSpecializationKey() { | |
| declarations_->current_generic_specialization_ = nullptr; | |
| } | |
| private: | |
| Declarations* declarations_; | |
| }; | |
| class Declarations::ScopedGenericScopeChainSnapshot { | |
| public: | |
| ScopedGenericScopeChainSnapshot(Declarations* declarations, | |
| const SpecializationKey& key) | |
| : restorer_(declarations->generic_declaration_scopes_[key.first]) {} | |
| ~ScopedGenericScopeChainSnapshot() {} | |
| private: | |
| ScopeChain::ScopedSnapshotRestorer restorer_; | |
| }; | |
| std::string GetGeneratedCallableName(const std::string& name, | |
| const TypeVector& specialized_types); | |
| } // namespace torque | |
| } // namespace internal | |
| } // namespace v8 | |
| #endif // V8_TORQUE_DECLARATIONS_H_ |