Skip to content

Commit

Permalink
deps: V8: cherry-pick 0d6debcc5f08
Browse files Browse the repository at this point in the history
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 <mslekova@chromium.org>
    Reviewed-by: Toon Verwaest <verwaest@chromium.org>
    Reviewed-by: Georg Neis <neis@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#66986}

Refs: v8/v8@0d6debc

PR-URL: #33600
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
devsnek committed Jun 6, 2020
1 parent f5ed5fe commit e983b1c
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 22 deletions.
2 changes: 1 addition & 1 deletion common.gypi
Expand Up @@ -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 #####

Expand Down
40 changes: 22 additions & 18 deletions deps/v8/include/v8-fast-api-calls.h
Expand Up @@ -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<uintptr_t>(wrapper_type_info);
// Check that the lower kIsWrapperTypeBit bits are 0's.
CHECK_EQ(
wrapper_type_info_ptr & ~(static_cast<uintptr_t>(~0)
<< static_cast<uintptr_t>(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<int>(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<uintptr_t>(ctype) << kTypeOffset) & kTypeMask) | flags);
((static_cast<uintptr_t>(ctype) << kTypeOffset) & kTypeMask) |
static_cast<int>(flags));
}

const void* GetWrapperInfo() const;
Expand All @@ -218,7 +220,9 @@ class CTypeInfo {
return static_cast<Type>((payload_ & kTypeMask) >> kTypeOffset);
}

constexpr bool IsArray() const { return payload_ & ArgFlags::IsArrayBit; }
constexpr bool IsArray() const {
return payload_ & static_cast<int>(ArgFlags::kIsArrayBit);
}

private:
explicit constexpr CTypeInfo(uintptr_t payload) : payload_(payload) {}
Expand Down Expand Up @@ -283,9 +287,6 @@ SUPPORTED_C_TYPES(SPECIALIZE_GET_C_TYPE_FOR)
template <typename T, typename = void>
struct EnableIfHasWrapperTypeInfo {};

template <>
struct EnableIfHasWrapperTypeInfo<void> {};

template <typename T>
struct EnableIfHasWrapperTypeInfo<T, decltype(WrapperTraits<T>::GetTypeInfo(),
void())> {
Expand All @@ -297,7 +298,7 @@ template <typename T, typename = void>
struct GetCTypePointerImpl {
static constexpr CTypeInfo Get() {
return CTypeInfo::FromCType(GetCType<T>::Get().GetType(),
CTypeInfo::IsArrayBit);
CTypeInfo::ArgFlags::kIsArrayBit);
}
};

Expand All @@ -321,7 +322,7 @@ struct GetCTypePointerPointerImpl<
T, typename EnableIfHasWrapperTypeInfo<T>::type> {
static constexpr CTypeInfo Get() {
return CTypeInfo::FromWrapperType(WrapperTraits<T>::GetTypeInfo(),
CTypeInfo::IsArrayBit);
CTypeInfo::ArgFlags::kIsArrayBit);
}
};

Expand All @@ -335,11 +336,12 @@ template <typename R, typename... Args>
class CFunctionInfoImpl : public CFunctionInfo {
public:
CFunctionInfoImpl()
: return_info_(i::GetCType<R>::Get()),
: return_info_(internal::GetCType<R>::Get()),
arg_count_(sizeof...(Args)),
arg_info_{i::GetCType<Args>::Get()...} {
static_assert(i::GetCType<R>::Get().GetType() == CTypeInfo::Type::kVoid,
"Only void return types are currently supported.");
arg_info_{internal::GetCType<Args>::Get()...} {
static_assert(
internal::GetCType<R>::Get().GetType() == CTypeInfo::Type::kVoid,
"Only void return types are currently supported.");
}

const CTypeInfo& ReturnInfo() const override { return return_info_; }
Expand All @@ -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 {
Expand Down
12 changes: 11 additions & 1 deletion deps/v8/include/v8.h
Expand Up @@ -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
Expand Down Expand Up @@ -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;
};


Expand Down
9 changes: 7 additions & 2 deletions deps/v8/src/api/api.cc
Expand Up @@ -1582,8 +1582,9 @@ void FunctionTemplate::SetCallHandler(FunctionCallback callback,
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(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));
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions deps/v8/test/cctest/test-api.cc
Expand Up @@ -27064,6 +27064,8 @@ void SetupTest(v8::Local<v8::Value> initial_value, LocalContext* env,
v8::Isolate* isolate = CcTest::isolate();

v8::CFunction c_func = v8::CFunction::Make(ApiNumberChecker<T>::CheckArgFast);
CHECK_EQ(c_func.ArgumentInfo(0).GetType(),
v8::CTypeInfo::Type::kUnwrappedApiObject);

Local<v8::FunctionTemplate> checker_templ = v8::FunctionTemplate::New(
isolate, ApiNumberChecker<T>::CheckArgSlow, v8::Local<v8::Value>(),
Expand Down

0 comments on commit e983b1c

Please sign in to comment.