| // 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_ |