// Copyright 2021 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/execution/encoded-c-signature.h" #include "include/v8-fast-api-calls.h" #include "src/base/bits.h" #include "src/base/logging.h" namespace v8 { namespace internal { int EncodedCSignature::FPParameterCount() const { CHECK(IsValid()); return base::bits::CountPopulation(bitfield_ & ~(1 << kReturnIndex)); } EncodedCSignature::EncodedCSignature(const CFunctionInfo* signature) { parameter_count_ = static_cast<int>(signature->ArgumentCount()); for (int i = 0; i < parameter_count_; ++i) { if (signature->ArgumentInfo(i).GetSequenceType() == CTypeInfo::SequenceType::kScalar && CTypeInfo::IsFloatingPointType(signature->ArgumentInfo(i).GetType())) { SetFloat(i); } } // The struct holding the options of the CFunction (e.g. callback) is not // included in the number of regular parameters, so we add it manually here. if (signature->HasOptions()) { parameter_count_++; } if (signature->ReturnInfo().GetSequenceType() == CTypeInfo::SequenceType::kScalar && CTypeInfo::IsFloatingPointType(signature->ReturnInfo().GetType())) { SetFloat(EncodedCSignature::kReturnIndex); } } } // namespace internal } // namespace v8