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