// 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 #include #include "src/torque/declarable.h" #include "src/torque/utils.h" namespace v8 { namespace internal { namespace torque { static constexpr const char* const kFromConstexprMacroName = "FromConstexpr"; static constexpr const char* kMacroEndLabelName = "__macro_end"; static constexpr const char* kBreakLabelName = "__break"; static constexpr const char* kContinueLabelName = "__continue"; static constexpr const char* kCatchLabelName = "__catch"; static constexpr const char* kNextCaseLabelName = "__NextCase"; template std::vector FilterDeclarables(const std::vector list) { std::vector result; for (Declarable* declarable : list) { if (T* t = T::DynamicCast(declarable)) { result.push_back(t); } } return result; } inline std::string UnwrapTNodeTypeName(const std::string& generates) { if (generates.length() < 7 || generates.substr(0, 6) != "TNode<" || generates.substr(generates.length() - 1, 1) != ">") { ReportError("generated type \"", generates, "\" should be of the form \"TNode<...>\""); } return generates.substr(6, generates.length() - 7); } class Declarations { public: static std::vector TryLookup(const QualifiedName& name) { return CurrentScope::Get()->Lookup(name); } static std::vector TryLookupShallow(const QualifiedName& name) { return CurrentScope::Get()->LookupShallow(name); } template static std::vector TryLookup(const QualifiedName& name) { return FilterDeclarables(TryLookup(name)); } static std::vector Lookup(const QualifiedName& name) { std::vector d = TryLookup(name); if (d.empty()) { ReportError("cannot find \"", name, "\""); } return d; } static std::vector LookupGlobalScope(const QualifiedName& name); static const TypeAlias* LookupTypeAlias(const QualifiedName& name); static const Type* LookupType(const QualifiedName& name); static const Type* LookupType(const Identifier* identifier); static base::Optional TryLookupType(const QualifiedName& name); static const Type* LookupGlobalType(const QualifiedName& name); static Builtin* FindSomeInternalBuiltinWithType( const BuiltinPointerType* type); static Value* LookupValue(const QualifiedName& name); static Macro* TryLookupMacro(const std::string& name, const TypeVector& types); static base::Optional TryLookupBuiltin(const QualifiedName& name); static std::vector LookupGeneric(const std::string& name); static GenericCallable* LookupUniqueGeneric(const QualifiedName& name); static GenericType* LookupUniqueGenericType(const QualifiedName& name); static GenericType* LookupGlobalUniqueGenericType(const std::string& name); static base::Optional TryLookupGenericType( const QualifiedName& name); static Namespace* DeclareNamespace(const std::string& name); static TypeAlias* DeclareType(const Identifier* name, const Type* type); static TypeAlias* PredeclareTypeAlias(const Identifier* name, TypeDeclaration* type, bool redeclaration); static TorqueMacro* CreateTorqueMacro(std::string external_name, std::string readable_name, bool exported_to_csa, Signature signature, base::Optional body, bool is_user_defined); static ExternMacro* CreateExternMacro(std::string name, std::string external_assembler_name, Signature signature); static Macro* DeclareMacro( const std::string& name, bool accessible_from_csa, base::Optional external_assembler_name, const Signature& signature, base::Optional body, base::Optional op = {}, bool is_user_defined = true); static Method* CreateMethod(AggregateType* class_type, const std::string& name, Signature signature, Statement* body); static Intrinsic* CreateIntrinsic(const std::string& name, const Signature& signature); static Intrinsic* DeclareIntrinsic(const std::string& name, const Signature& signature); static Builtin* CreateBuiltin(std::string external_name, std::string readable_name, Builtin::Kind kind, Signature signature, base::Optional body); static Builtin* DeclareBuiltin(const std::string& name, Builtin::Kind kind, const Signature& signature, base::Optional body); static RuntimeFunction* DeclareRuntimeFunction(const std::string& name, const Signature& signature); static ExternConstant* DeclareExternConstant(Identifier* name, const Type* type, std::string value); static NamespaceConstant* DeclareNamespaceConstant(Identifier* name, const Type* type, Expression* body); static GenericCallable* DeclareGenericCallable( const std::string& name, GenericCallableDeclaration* ast_node); static GenericType* DeclareGenericType(const std::string& name, GenericTypeDeclaration* ast_node); template static T* Declare(const std::string& name, T* d) { CurrentScope::Get()->AddDeclarable(name, d); return d; } template static T* Declare(const std::string& name, std::unique_ptr d) { return CurrentScope::Get()->AddDeclarable(name, RegisterDeclarable(std::move(d))); } static Macro* DeclareOperator(const std::string& name, Macro* m); static std::string GetGeneratedCallableName( const std::string& name, const TypeVector& specialized_types); }; } // namespace torque } // namespace internal } // namespace v8 #endif // V8_TORQUE_DECLARATIONS_H_