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