blob: c2e5aa79245fac15a1e06d362511c3c7a402eb5b [file] [log] [blame]
// 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.
#include "src/torque/file-visitor.h"
#include "src/torque/declarable.h"
#include "src/torque/parameter-difference.h"
namespace v8 {
namespace internal {
namespace torque {
Signature FileVisitor::MakeSignature(const CallableNodeSignature* signature) {
LabelDeclarationVector definition_vector;
for (auto label : signature->labels) {
LabelDeclaration def = {label.name, GetTypeVector(label.types)};
definition_vector.push_back(def);
}
Signature result{signature->parameters.names,
{GetTypeVector(signature->parameters.types),
signature->parameters.has_varargs},
declarations()->GetType(signature->return_type),
definition_vector};
return result;
}
Signature FileVisitor::MakeSignatureFromReturnType(
TypeExpression* return_type) {
Signature result{{}, {{}, false}, declarations()->GetType(return_type), {}};
return result;
}
void FileVisitor::QueueGenericSpecialization(
const SpecializationKey& key, CallableNode* callable,
const CallableNodeSignature* signature, base::Optional<Statement*> body) {
pending_specializations_.push_back(
{key, callable, signature, body, CurrentSourcePosition::Get()});
}
void FileVisitor::SpecializeGeneric(
const PendingSpecialization& specialization) {
CurrentSourcePosition::Scope scope(specialization.request_position);
if (completed_specializations_.find(specialization.key) !=
completed_specializations_.end()) {
std::stringstream stream;
stream << "cannot redeclare specialization of "
<< specialization.key.first->name() << " with types <"
<< specialization.key.second << ">";
ReportError(stream.str());
}
if (!specialization.body) {
std::stringstream stream;
stream << "missing specialization of " << specialization.key.first->name()
<< " with types <" << specialization.key.second << ">";
ReportError(stream.str());
}
Declarations::ScopedGenericSpecializationKey instantiation(
declarations(), specialization.key);
FileVisitor::ScopedModuleActivator activator(
this, specialization.key.first->module());
Specialize(specialization.key, specialization.callable,
specialization.signature, *specialization.body);
completed_specializations_.insert(specialization.key);
}
void FileVisitor::DrainSpecializationQueue() {
while (pending_specializations_.size() != 0) {
PendingSpecialization specialization(pending_specializations_.front());
pending_specializations_.pop_front();
if (completed_specializations_.find(specialization.key) ==
completed_specializations_.end()) {
Declarations::ScopedGenericScopeChainSnapshot scope(declarations(),
specialization.key);
SpecializeGeneric(specialization);
}
}
}
} // namespace torque
} // namespace internal
} // namespace v8