Chromium Code Reviews| Index: src/wasm/asm-types.cc |
| diff --git a/src/wasm/asm-types.cc b/src/wasm/asm-types.cc |
| index 3648c6bfd48038bf12f4dab62f48c45e83bef330..e5588ae922d3180bfa28da6a9dfd604d19417c09 100644 |
| --- a/src/wasm/asm-types.cc |
| +++ b/src/wasm/asm-types.cc |
| @@ -11,8 +11,14 @@ namespace internal { |
| namespace wasm { |
| AsmCallableType* AsmType::AsCallableType() { |
| + if (AsValueType() != nullptr) { |
| + return nullptr; |
| + } |
| + |
| DCHECK(this->AsFunctionType() != nullptr || |
| - this->AsOverloadedFunctionType() != nullptr); |
| + this->AsOverloadedFunctionType() != nullptr || |
| + this->AsFFIType() != nullptr || |
| + this->AsFunctionTableType() != nullptr); |
| return reinterpret_cast<AsmCallableType*>(this); |
| } |
| @@ -165,7 +171,8 @@ class AsmFroundType final : public AsmFunctionType { |
| explicit AsmFroundType(Zone* zone) |
| : AsmFunctionType(zone, AsmType::Float()) {} |
| - AsmType* ValidateCall(AsmType* function_type) override; |
| + AsmType* ValidateCall(AsmType* return_type, |
| + const ZoneVector<AsmType*>& args) override; |
| }; |
| } // namespace |
| @@ -174,13 +181,13 @@ AsmType* AsmType::FroundType(Zone* zone) { |
| return reinterpret_cast<AsmType*>(Fround); |
| } |
| -AsmType* AsmFroundType::ValidateCall(AsmType* function_type) { |
| - auto* callable = function_type->AsFunctionType(); |
| - if (callable->Arguments().size() != 1) { |
| +AsmType* AsmFroundType::ValidateCall(AsmType* return_type, |
| + const ZoneVector<AsmType*>& args) { |
| + if (args.size() != 1) { |
| return AsmType::None(); |
| } |
| - auto* arg = callable->Arguments()[0]; |
| + auto* arg = args[0]; |
| if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) && |
| !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) { |
| return AsmType::None(); |
| @@ -203,22 +210,18 @@ class AsmMinMaxType final : public AsmFunctionType { |
| AddArgument(src); |
| } |
| - AsmType* ValidateCall(AsmType* function_type) override { |
| - auto* callable = function_type->AsFunctionType(); |
| - if (callable == nullptr) { |
| - return nullptr; |
| - } |
| - |
| - if (!ReturnType()->IsExactly(callable->ReturnType())) { |
| + AsmType* ValidateCall(AsmType* return_type, |
| + const ZoneVector<AsmType*>& args) override { |
| + if (!ReturnType()->IsExactly(return_type)) { |
| return AsmType::None(); |
| } |
| - if (callable->Arguments().size() < 2) { |
| + if (args.size() < 2) { |
| return AsmType::None(); |
| } |
| for (size_t ii = 0; ii < Arguments().size(); ++ii) { |
| - if (!Arguments()[0]->IsExactly(callable->Arguments()[ii])) { |
| + if (!Arguments()[0]->IsExactly(args[ii])) { |
| return AsmType::None(); |
| } |
| } |
| @@ -235,22 +238,29 @@ AsmType* AsmType::MinMaxType(Zone* zone, AsmType* dest, AsmType* src) { |
| return reinterpret_cast<AsmType*>(MinMax); |
| } |
| -AsmType* AsmFunctionType::ValidateCall(AsmType* function_type) { |
| - auto* callable = function_type->AsFunctionType(); |
| - if (callable == nullptr) { |
| - return nullptr; |
| +AsmType* AsmFFIType::ValidateCall(AsmType* return_type, |
| + const ZoneVector<AsmType*>& args) { |
| + for (size_t ii = 0; ii < args.size(); ++ii) { |
| + if (!args[ii]->IsA(AsmType::Extern())) { |
| + return AsmType::None(); |
| + } |
| } |
| - if (!return_type_->IsExactly(callable->return_type_)) { |
| + return return_type; |
| +} |
| + |
| +AsmType* AsmFunctionType::ValidateCall(AsmType* return_type, |
| + const ZoneVector<AsmType*>& args) { |
| + if (!return_type_->IsExactly(return_type)) { |
| return AsmType::None(); |
| } |
| - if (args_.size() != callable->args_.size()) { |
| + if (args_.size() != args.size()) { |
| return AsmType::None(); |
| } |
| for (size_t ii = 0; ii < args_.size(); ++ii) { |
| - if (!args_[ii]->IsExactly(callable->args_[ii])) { |
| + if (!args_[ii]->IsExactly(args[ii])) { |
| return AsmType::None(); |
| } |
| } |
| @@ -271,15 +281,11 @@ std::string AsmOverloadedFunctionType::Name() { |
| return ret; |
| } |
| -AsmType* AsmOverloadedFunctionType::ValidateCall(AsmType* function_type) { |
| - auto* callable = function_type->AsFunctionType(); |
| - if (callable == nullptr) { |
| - return AsmType::None(); |
| - } |
| - |
| +AsmType* AsmOverloadedFunctionType::ValidateCall( |
| + AsmType* return_type, const ZoneVector<AsmType*>& args) { |
| for (size_t ii = 0; ii < overloads_.size(); ++ii) { |
| auto* validated_type = |
| - overloads_[ii]->AsCallableType()->ValidateCall(function_type); |
| + overloads_[ii]->AsCallableType()->ValidateCall(return_type, args); |
| if (validated_type != AsmType::None()) { |
| return validated_type; |
| } |
| @@ -293,6 +299,21 @@ void AsmOverloadedFunctionType::AddOverload(AsmType* overload) { |
| overloads_.push_back(overload); |
| } |
| +AsmFunctionTableType::AsmFunctionTableType(size_t length, AsmType* signature) |
| + : length_(length), signature_(signature) { |
| + DCHECK(signature_ != nullptr); |
| + DCHECK(signature_->AsFunctionType() != nullptr); |
| +} |
| + |
| +std::string AsmFunctionTableType::Name() { |
| + return signature_->Name() + "[" + std::to_string(length_) + "]"; |
|
Mostyn Bramley-Moore
2016/07/04 20:23:36
std::to_string is in the "C++11 Standard Library F
|
| +} |
| + |
| +AsmType* AsmFunctionTableType::ValidateCall(AsmType* return_type, |
| + const ZoneVector<AsmType*>& args) { |
| + return signature_->AsCallableType()->ValidateCall(return_type, args); |
| +} |
| + |
| } // namespace wasm |
| } // namespace internal |
| } // namespace v8 |