From e983b1cece7d24f7b4776798916276d30b9e419a Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Wed, 27 May 2020 23:10:09 -0500 Subject: [PATCH] deps: V8: cherry-pick 0d6debcc5f08 Original commit message: [turbofan] Fixes for integrating the fast C API This commit adds a few fixes neccessary for integrating the fast C API into Blink: - added default constructor for CFunction - removed a bogus template specialization allowing void* params - extended the public Isolate class Bug: chromium:1052746 Change-Id: I4f2ba84299920e2cc9d66ec1ed59302313db6c0b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2120587 Commit-Queue: Maya Lekova Reviewed-by: Toon Verwaest Reviewed-by: Georg Neis Cr-Commit-Position: refs/heads/master@{#66986} Refs: https://github.com/v8/v8/commit/0d6debcc5f08fe3c41d07686f82c9de05310519f PR-URL: https://github.com/nodejs/node/pull/33600 Reviewed-By: Anna Henningsen Reviewed-By: Matteo Collina --- common.gypi | 2 +- deps/v8/include/v8-fast-api-calls.h | 40 ++++++++++++++++------------- deps/v8/include/v8.h | 12 ++++++++- deps/v8/src/api/api.cc | 9 +++++-- deps/v8/test/cctest/test-api.cc | 2 ++ 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/common.gypi b/common.gypi index 9801c3257ca322..76a55b7b628f72 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.17', + 'v8_embedder_string': '-node.18', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/include/v8-fast-api-calls.h b/deps/v8/include/v8-fast-api-calls.h index bfce66b652dd2d..79a5d4d82a764d 100644 --- a/deps/v8/include/v8-fast-api-calls.h +++ b/deps/v8/include/v8-fast-api-calls.h @@ -183,30 +183,32 @@ class CTypeInfo { kUnwrappedApiObject, }; - enum ArgFlags : char { - None = 0, - IsArrayBit = 1 << 0, // This argument is first in an array of values. + enum class ArgFlags : uint8_t { + kNone = 0, + kIsArrayBit = 1 << 0, // This argument is first in an array of values. }; static CTypeInfo FromWrapperType(const void* wrapper_type_info, - ArgFlags flags = ArgFlags::None) { + ArgFlags flags = ArgFlags::kNone) { uintptr_t wrapper_type_info_ptr = reinterpret_cast(wrapper_type_info); // Check that the lower kIsWrapperTypeBit bits are 0's. CHECK_EQ( wrapper_type_info_ptr & ~(static_cast(~0) << static_cast(kIsWrapperTypeBit)), - 0); + 0u); // TODO(mslekova): Refactor the manual bit manipulations to use // PointerWithPayload instead. - return CTypeInfo(wrapper_type_info_ptr | flags | kIsWrapperTypeBit); + return CTypeInfo(wrapper_type_info_ptr | static_cast(flags) | + kIsWrapperTypeBit); } static constexpr CTypeInfo FromCType(Type ctype, - ArgFlags flags = ArgFlags::None) { + ArgFlags flags = ArgFlags::kNone) { // ctype cannot be Type::kUnwrappedApiObject. return CTypeInfo( - ((static_cast(ctype) << kTypeOffset) & kTypeMask) | flags); + ((static_cast(ctype) << kTypeOffset) & kTypeMask) | + static_cast(flags)); } const void* GetWrapperInfo() const; @@ -218,7 +220,9 @@ class CTypeInfo { return static_cast((payload_ & kTypeMask) >> kTypeOffset); } - constexpr bool IsArray() const { return payload_ & ArgFlags::IsArrayBit; } + constexpr bool IsArray() const { + return payload_ & static_cast(ArgFlags::kIsArrayBit); + } private: explicit constexpr CTypeInfo(uintptr_t payload) : payload_(payload) {} @@ -283,9 +287,6 @@ SUPPORTED_C_TYPES(SPECIALIZE_GET_C_TYPE_FOR) template struct EnableIfHasWrapperTypeInfo {}; -template <> -struct EnableIfHasWrapperTypeInfo {}; - template struct EnableIfHasWrapperTypeInfo::GetTypeInfo(), void())> { @@ -297,7 +298,7 @@ template struct GetCTypePointerImpl { static constexpr CTypeInfo Get() { return CTypeInfo::FromCType(GetCType::Get().GetType(), - CTypeInfo::IsArrayBit); + CTypeInfo::ArgFlags::kIsArrayBit); } }; @@ -321,7 +322,7 @@ struct GetCTypePointerPointerImpl< T, typename EnableIfHasWrapperTypeInfo::type> { static constexpr CTypeInfo Get() { return CTypeInfo::FromWrapperType(WrapperTraits::GetTypeInfo(), - CTypeInfo::IsArrayBit); + CTypeInfo::ArgFlags::kIsArrayBit); } }; @@ -335,11 +336,12 @@ template class CFunctionInfoImpl : public CFunctionInfo { public: CFunctionInfoImpl() - : return_info_(i::GetCType::Get()), + : return_info_(internal::GetCType::Get()), arg_count_(sizeof...(Args)), - arg_info_{i::GetCType::Get()...} { - static_assert(i::GetCType::Get().GetType() == CTypeInfo::Type::kVoid, - "Only void return types are currently supported."); + arg_info_{internal::GetCType::Get()...} { + static_assert( + internal::GetCType::Get().GetType() == CTypeInfo::Type::kVoid, + "Only void return types are currently supported."); } const CTypeInfo& ReturnInfo() const override { return return_info_; } @@ -359,6 +361,8 @@ class CFunctionInfoImpl : public CFunctionInfo { class V8_EXPORT CFunction { public: + constexpr CFunction() : address_(nullptr), type_info_(nullptr) {} + const CTypeInfo& ReturnInfo() const { return type_info_->ReturnInfo(); } const CTypeInfo& ArgumentInfo(unsigned int index) const { diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 7c6fdb748bf368..da4eb341295671 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -8184,7 +8184,9 @@ class V8_EXPORT Isolate { array_buffer_allocator_shared(), external_references(nullptr), allow_atomics_wait(true), - only_terminate_in_safe_scope(false) {} + only_terminate_in_safe_scope(false), + embedder_wrapper_type_index(-1), + embedder_wrapper_object_index(-1) {} /** * Allows the host application to provide the address of a function that is @@ -8248,6 +8250,14 @@ class V8_EXPORT Isolate { * Termination is postponed when there is no active SafeForTerminationScope. */ bool only_terminate_in_safe_scope; + + /** + * The following parameters describe the offsets for addressing type info + * for wrapped API objects and are used by the fast C API + * (for details see v8-fast-api-calls.h). + */ + int embedder_wrapper_type_index; + int embedder_wrapper_object_index; }; diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index b2d6db3661a564..915a781f3aeb77 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -1582,8 +1582,9 @@ void FunctionTemplate::SetCallHandler(FunctionCallback callback, data = v8::Undefined(reinterpret_cast(isolate)); } obj->set_data(*Utils::OpenHandle(*data)); - if (c_function != nullptr) { - DCHECK_NOT_NULL(c_function->GetAddress()); + // Blink passes CFunction's constructed with the default constructor + // for non-fast calls, so we should check the address too. + if (c_function != nullptr && c_function->GetAddress()) { i::FunctionTemplateInfo::SetCFunction( isolate, info, i::handle(*FromCData(isolate, c_function->GetAddress()), isolate)); @@ -8333,6 +8334,10 @@ void Isolate::Initialize(Isolate* isolate, } i_isolate->set_only_terminate_in_safe_scope( params.only_terminate_in_safe_scope); + i_isolate->set_embedder_wrapper_type_index( + params.embedder_wrapper_type_index); + i_isolate->set_embedder_wrapper_object_index( + params.embedder_wrapper_object_index); if (!i::V8::GetCurrentPlatform() ->GetForegroundTaskRunner(isolate) diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 7f4b3002038179..6b7ea85452d2b0 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -27064,6 +27064,8 @@ void SetupTest(v8::Local initial_value, LocalContext* env, v8::Isolate* isolate = CcTest::isolate(); v8::CFunction c_func = v8::CFunction::Make(ApiNumberChecker::CheckArgFast); + CHECK_EQ(c_func.ArgumentInfo(0).GetType(), + v8::CTypeInfo::Type::kUnwrappedApiObject); Local checker_templ = v8::FunctionTemplate::New( isolate, ApiNumberChecker::CheckArgSlow, v8::Local(),