fixed compiler error with clang16 on epel 8/9 and fedora38

epel9
Than Ngo 10 months ago
parent b464554589
commit a058070a7f

@ -0,0 +1,171 @@
commit ce71348a09f6689dd01a68db64b172191d0182d8
Author: Andrey Kosyakov <caseq@chromium.org>
Date: Thu Dec 21 18:38:38 2023 +0000
[bindings] Use v8::Array::Iterate for converting script wrappables
This changes CreateIDLSequenceFromV8Array to use the new
v8::Array::Iterate() operation.
This speeds up the "execBundles" part of the microbenchmark
at crbug.com/dawn/1858 by around 3x.
This depends on crrev.com/c/4846594 landing (and rolling) first.
This is a slight re-work of https://crrev.com/c/4847447/3,
originally by jkummerow@chromium.org
Bug: v8:14218, dawn:1858, 1511239
Change-Id: Ia266556d05b4d53e6942e12609d1c08882b4ff0f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5132129
Commit-Queue: Andrey Kosyakov <caseq@chromium.org>
Reviewed-by: Yuki Shiino <yukishiino@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1240236}
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
index 1e5a0790df6da..a5c28b37e9454 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
@@ -84,6 +84,12 @@ struct NativeValueTraitsBase {
std::is_pointer_v<ImplType> ||
requires(ImplType value) { value.IsNull(); };
+ // This should only be true for certain subclasses of ScriptWrappable
+ // that satisfy the assumptions of CreateIDLSequenceFromV8ArraySlow() with
+ // regards to how NativeValue() is implemented for the underlying type.
+ static constexpr bool supports_scriptwrappable_specific_fast_array_iteration =
+ false;
+
template <typename... ExtraArgs>
static decltype(auto) ArgumentValue(v8::Isolate* isolate,
int argument_index,
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
index 5011503dcf1c0..f085b6e905161 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -1037,10 +1037,86 @@ CreateIDLSequenceFromV8ArraySlow(v8::Isolate* isolate,
return {};
}
- typename NativeValueTraits<IDLSequence<T>>::ImplType result;
+ using ResultType = typename NativeValueTraits<IDLSequence<T>>::ImplType;
+ ResultType result;
result.ReserveInitialCapacity(length);
v8::Local<v8::Context> current_context = isolate->GetCurrentContext();
v8::TryCatch try_block(isolate);
+
+ // Fast path -- we're creating a sequence of script wrappables, which can be
+ // done by directly getting underlying object as long as array types are
+ // homogeneous. With ScriptWrappables, we don't expect to enter JS during
+ // iteration, so we can rely on v8::Array::Iterate() which is much faster than
+ // iterating an array on the client side of the v8. Additionally, for most
+ // subsptyes of ScriptWrappables, we can speed up type checks (see more on
+ // that below next to supports_scriptwrappable_specific_fast_array_iteration
+ // check.
+ if constexpr (std::is_base_of_v<ScriptWrappable, T>) {
+ struct CallbackData {
+ STACK_ALLOCATED();
+
+ public:
+ v8::Isolate* isolate;
+ v8::TypecheckWitness witness;
+ ResultType& result;
+ ExceptionState& exception_state;
+ CallbackData(v8::Isolate* isolate,
+ ResultType& result,
+ ExceptionState& exception_state)
+ : isolate(isolate),
+ witness(isolate),
+ result(result),
+ exception_state(exception_state) {}
+ };
+
+ CallbackData callback_data(isolate, result, exception_state);
+ v8::Array::IterationCallback callback = [](uint32_t index,
+ v8::Local<v8::Value> v8_element,
+ void* data) {
+ CallbackData* callback_data = reinterpret_cast<CallbackData*>(data);
+ // 3.4. Initialize Si to the result of converting nextItem to an IDL value
+ // of type T.
+ v8::TypecheckWitness& witness = callback_data->witness;
+ // We can speed up type check by taking advantage of V8's type witness,
+ // provided traits' NativeValue implementation doesn't have additional
+ // logic beyond checking the type and calling ToScriptWrappable().
+ if constexpr (
+ NativeValueTraits<
+ T>::supports_scriptwrappable_specific_fast_array_iteration) {
+ if (witness.Matches(v8_element)) {
+ auto&& value = ToScriptWrappable(v8_element.As<v8::Object>())
+ ->template ToImpl<T>();
+ callback_data->result.push_back(std::move(value));
+ return v8::Array::CallbackResult::kContinue;
+ }
+ }
+ auto&& element = NativeValueTraits<T>::NativeValue(
+ callback_data->isolate, v8_element, callback_data->exception_state);
+ if (callback_data->exception_state.HadException()) {
+ // It doesn't matter whether we return `kException` or `kBreak` here,
+ // as that only affects the return value of `v8_array->Iterate()`,
+ // which we are ignoring.
+ return v8::Array::CallbackResult::kException;
+ }
+ if constexpr (
+ NativeValueTraits<
+ T>::supports_scriptwrappable_specific_fast_array_iteration) {
+ witness.Update(v8_element);
+ }
+ callback_data->result.push_back(std::move(element));
+ return v8::Array::CallbackResult::kContinue;
+ };
+ if (!v8_array->Iterate(current_context, callback, &callback_data)
+ .IsJust()) {
+ if (try_block.HasCaught()) {
+ exception_state.RethrowV8Exception(try_block.Exception());
+ }
+ DCHECK(exception_state.HadException());
+ return {};
+ }
+ return result;
+ }
+
// Array length may change if array is mutated during iteration.
for (uint32_t i = 0; i < v8_array->Length(); ++i) {
v8::Local<v8::Value> v8_element;
@@ -1056,6 +1132,7 @@ CreateIDLSequenceFromV8ArraySlow(v8::Isolate* isolate,
return {};
result.push_back(std::move(element));
}
+
// 3.2. If next is false, then return an IDL sequence value of type
// sequence<T> of length i, where the value of the element at index j is Sj.
return result;
@@ -1398,6 +1475,7 @@ struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
}
};
+// Interface types
template <typename T>
requires std::derived_from<T, CallbackInterfaceBase>
struct NativeValueTraits<IDLNullable<T>>
@@ -1470,12 +1548,21 @@ struct NativeValueTraits<T> : public NativeValueTraitsBase<T> {
template <typename T>
requires std::derived_from<T, ScriptWrappable>
struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+ // This signifies that CreateIDLSequenceFromV8ArraySlow() may apply
+ // certain optimization based on assumptions about `NativeValue()`
+ // implementation below. For subclasses of ScriptWrappable that have
+ // different implementation of NativeValue(), this should remain false.
+ static constexpr bool supports_scriptwrappable_specific_fast_array_iteration =
+ true;
+
static inline T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
const WrapperTypeInfo* wrapper_type_info = T::GetStaticWrapperTypeInfo();
- if (V8PerIsolateData::From(isolate)->HasInstance(wrapper_type_info, value))
+ if (V8PerIsolateData::From(isolate)->HasInstance(wrapper_type_info,
+ value)) {
return ToScriptWrappable(value.As<v8::Object>())->template ToImpl<T>();
+ }
bindings::NativeValueTraitsInterfaceNotOfType(wrapper_type_info,
exception_state);

@ -0,0 +1,743 @@
commit 940af9f2c87b436559b97c53763aa9eaaf1254eb
Author: Jeremy Roman <jbroman@chromium.org>
Date: Wed Nov 15 16:24:54 2023 +0000
Use C++20 features to simplify blink::NativeValueTraitsBase.
These allow some of the metaprogramming bits to be simplified a little.
Change-Id: I052b4397586d21348401616e1792afdb9662f975
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5030335
Reviewed-by: Yuki Shiino <yukishiino@chromium.org>
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1224978}
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
index 7fc91d14acc71..1e5a0790df6da 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_H_
+#include <concepts>
#include <type_traits>
#include "third_party/blink/renderer/bindings/core/v8/idl_types_base.h"
@@ -30,7 +31,7 @@ class ExceptionState;
// return toInt32(isolate, value, exceptionState, NormalConversion);
// }
// }
-template <typename T, typename SFINAEHelper = void>
+template <typename T>
struct NativeValueTraits;
// This declaration serves only as a blueprint for specializations: the
@@ -45,22 +46,15 @@ struct NativeValueTraits;
namespace bindings {
-template <typename T, typename = void>
-struct NativeValueTraitsHasIsNull : std::false_type {};
-
template <typename T>
-struct NativeValueTraitsHasIsNull<
- T,
- std::void_t<decltype(std::declval<T>().IsNull())>> : std::true_type {};
+struct ImplTypeFor {
+ using type = T;
+};
template <typename T>
-struct NativeValueTraitsHasNullValue {
- // true if |T| supports IDL null value.
- static constexpr bool value =
- // ScriptValue, String, and union types have IsNull member function.
- bindings::NativeValueTraitsHasIsNull<T>::value ||
- // Pointer types have nullptr as IDL null value.
- std::is_pointer<T>::value;
+ requires std::derived_from<T, IDLBase>
+struct ImplTypeFor<T> {
+ using type = typename T::ImplType;
};
} // namespace bindings
@@ -78,37 +72,17 @@ struct NativeValueTraitsHasNullValue {
// If present, |NullValue()| will be used when converting from the nullable type
// T?, and should be used if the impl type has an existing "null" state. If not
// present, WTF::Optional will be used to wrap the type.
-template <typename T, typename SFINAEHelper = void>
-struct NativeValueTraitsBase {
- STATIC_ONLY(NativeValueTraitsBase);
-
- using ImplType = T;
-
- static constexpr bool has_null_value =
- bindings::NativeValueTraitsHasNullValue<ImplType>::value;
-
- template <typename... ExtraArgs>
- static decltype(auto) ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state,
- ExtraArgs... extra_args) {
- return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue(
- isolate, value, exception_state,
- std::forward<ExtraArgs>(extra_args)...);
- }
-};
-
template <typename T>
-struct NativeValueTraitsBase<
- T,
- std::enable_if_t<std::is_base_of<IDLBase, T>::value>> {
+struct NativeValueTraitsBase {
STATIC_ONLY(NativeValueTraitsBase);
- using ImplType = typename T::ImplType;
+ using ImplType = bindings::ImplTypeFor<T>::type;
+ // Pointer types have nullptr as IDL null value.
+ // ScriptValue, String, and union types have IsNull member function.
static constexpr bool has_null_value =
- bindings::NativeValueTraitsHasNullValue<ImplType>::value;
+ std::is_pointer_v<ImplType> ||
+ requires(ImplType value) { value.IsNull(); };
template <typename... ExtraArgs>
static decltype(auto) ArgumentValue(v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc b/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc
index 508ea6d8eea48..18de71d84023f 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc
@@ -7,6 +7,7 @@
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
+#include "third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h"
#include "third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h"
namespace blink {
@@ -698,12 +699,11 @@ DOMArrayBufferBase* NativeValueTraits<
// ArrayBufferView
template <typename T>
-NotShared<T> NativeValueTraits<
- NotShared<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- NativeValue(v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+NotShared<T> NativeValueTraits<NotShared<T>>::NativeValue(
+ v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -712,13 +712,12 @@ NotShared<T> NativeValueTraits<
}
template <typename T>
-NotShared<T> NativeValueTraits<
- NotShared<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+NotShared<T> NativeValueTraits<NotShared<T>>::ArgumentValue(
+ v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -729,12 +728,11 @@ NotShared<T> NativeValueTraits<
// [AllowShared] ArrayBufferView
template <typename T>
-MaybeShared<T> NativeValueTraits<
- MaybeShared<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- NativeValue(v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T> NativeValueTraits<MaybeShared<T>>::NativeValue(
+ v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -743,13 +741,12 @@ MaybeShared<T> NativeValueTraits<
}
template <typename T>
-MaybeShared<T> NativeValueTraits<
- MaybeShared<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T> NativeValueTraits<MaybeShared<T>>::ArgumentValue(
+ v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -760,12 +757,12 @@ MaybeShared<T> NativeValueTraits<
// [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView
template <typename T>
-MaybeShared<T> NativeValueTraits<
- IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- NativeValue(v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T>
+NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>::NativeValue(
+ v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<
RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck,
@@ -774,13 +771,12 @@ MaybeShared<T> NativeValueTraits<
}
template <typename T>
-MaybeShared<T> NativeValueTraits<
- IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T> NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<
+ MaybeShared<T>>>::ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck,
@@ -791,12 +787,11 @@ MaybeShared<T> NativeValueTraits<
// Nullable ArrayBufferView
template <typename T>
-NotShared<T> NativeValueTraits<
- IDLNullable<NotShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- NativeValue(v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+NotShared<T> NativeValueTraits<IDLNullable<NotShared<T>>>::NativeValue(
+ v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -805,13 +800,12 @@ NotShared<T> NativeValueTraits<
}
template <typename T>
-NotShared<T> NativeValueTraits<
- IDLNullable<NotShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+NotShared<T> NativeValueTraits<IDLNullable<NotShared<T>>>::ArgumentValue(
+ v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -822,12 +816,11 @@ NotShared<T> NativeValueTraits<
// Nullable [AllowShared] ArrayBufferView
template <typename T>
-MaybeShared<T> NativeValueTraits<
- IDLNullable<MaybeShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- NativeValue(v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T> NativeValueTraits<IDLNullable<MaybeShared<T>>>::NativeValue(
+ v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -836,13 +829,12 @@ MaybeShared<T> NativeValueTraits<
}
template <typename T>
-MaybeShared<T> NativeValueTraits<
- IDLNullable<MaybeShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T> NativeValueTraits<IDLNullable<MaybeShared<T>>>::ArgumentValue(
+ v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -853,9 +845,9 @@ MaybeShared<T> NativeValueTraits<
// Nullable [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView
template <typename T>
-MaybeShared<T> NativeValueTraits<
- IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ requires std::derived_from<T, DOMArrayBufferView>
+MaybeShared<T>
+NativeValueTraits<IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>>::
ArgumentValue(v8::Isolate* isolate,
int argument_index,
v8::Local<v8::Value> value,
@@ -870,13 +862,11 @@ MaybeShared<T> NativeValueTraits<
// [AllowShared, FlexibleArrayBufferView] ArrayBufferView
template <typename T>
-T NativeValueTraits<T,
- typename std::enable_if_t<
- std::is_base_of<FlexibleArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, FlexibleArrayBufferView>
+T NativeValueTraits<T>::ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<T>, ToFlexibleArrayBufferView,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
ResizableAllowance::kDisallowResizable,
@@ -888,13 +878,12 @@ T NativeValueTraits<T,
// ArrayBufferView
template <typename T>
-T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>,
- typename std::enable_if_t<
- std::is_base_of<FlexibleArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, FlexibleArrayBufferView>
+T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>>::ArgumentValue(
+ v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<T>, ToFlexibleArrayBufferView, Nullablity::kIsNotNullable,
BufferSizeCheck::kDoNotCheck, ResizableAllowance::kDisallowResizable,
@@ -905,13 +894,12 @@ T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>,
// Nullable [AllowShared, FlexibleArrayBufferView] ArrayBufferView
template <typename T>
-T NativeValueTraits<IDLNullable<T>,
- typename std::enable_if_t<
- std::is_base_of<FlexibleArrayBufferView, T>::value>>::
- ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+ requires std::derived_from<T, FlexibleArrayBufferView>
+T NativeValueTraits<IDLNullable<T>>::ArgumentValue(
+ v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<T>, ToFlexibleArrayBufferView,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
ResizableAllowance::kDisallowResizable,
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
index 899929dcf49f9..5011503dcf1c0 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -5,6 +5,9 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_IMPL_H_
+#include <concepts>
+#include <type_traits>
+
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
#include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h"
@@ -715,9 +718,8 @@ struct CORE_EXPORT NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> {
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<T> {
// NotShared<T> or MaybeShared<T> should be used instead.
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -729,9 +731,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> {
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<IDLNullable<T>> {
// NotShared<T> or MaybeShared<T> should be used instead.
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -743,9 +744,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- NotShared<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<NotShared<T>>
: public NativeValueTraitsBase<NotShared<T>> {
static NotShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -758,9 +758,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<NotShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<IDLNullable<NotShared<T>>>
: public NativeValueTraitsBase<NotShared<T>> {
static NotShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -773,9 +772,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- MaybeShared<T>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<MaybeShared<T>>
: public NativeValueTraitsBase<MaybeShared<T>> {
static MaybeShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -788,9 +786,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>
: public NativeValueTraitsBase<MaybeShared<T>> {
// FlexibleArrayBufferView uses this in its implementation, so we cannot
// delete it.
@@ -805,9 +802,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<MaybeShared<T>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
+ requires std::derived_from<T, DOMArrayBufferView>
+struct NativeValueTraits<IDLNullable<MaybeShared<T>>>
: public NativeValueTraitsBase<MaybeShared<T>> {
static MaybeShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -820,9 +816,9 @@ struct NativeValueTraits<
};
template <typename T>
+ requires std::derived_from<T, DOMArrayBufferView>
struct NativeValueTraits<
- IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>,
- typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
+ IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>>
: public NativeValueTraitsBase<MaybeShared<T>> {
// BufferSourceTypeNoSizeLimit must be used only as arguments.
static MaybeShared<T> NativeValue(v8::Isolate* isolate,
@@ -836,11 +832,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<
- std::is_base_of<FlexibleArrayBufferView, T>::value>>
- : public NativeValueTraitsBase<T> {
+ requires std::derived_from<T, FlexibleArrayBufferView>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T> {
// FlexibleArrayBufferView must be used only as arguments.
static T NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -853,10 +846,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLBufferSourceTypeNoSizeLimit<T>,
- typename std::enable_if_t<
- std::is_base_of<FlexibleArrayBufferView, T>::value>>
+ requires std::derived_from<T, FlexibleArrayBufferView>
+struct NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>>
: public NativeValueTraitsBase<T> {
// BufferSourceTypeNoSizeLimit and FlexibleArrayBufferView must be used only
// as arguments.
@@ -871,11 +862,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<
- std::is_base_of<FlexibleArrayBufferView, T>::value>>
- : public NativeValueTraitsBase<T> {
+ requires std::derived_from<T, FlexibleArrayBufferView>
+struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T> {
// FlexibleArrayBufferView must be used only as arguments.
static T NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1134,9 +1122,8 @@ NativeValueTraits<IDLSequence<T>>::NativeValue(
}
template <typename T>
-struct NativeValueTraits<IDLNullable<IDLSequence<T>>,
- typename std::enable_if_t<
- NativeValueTraits<IDLSequence<T>>::has_null_value>>
+ requires NativeValueTraits<IDLSequence<T>>::has_null_value
+struct NativeValueTraits<IDLNullable<IDLSequence<T>>>
: public NativeValueTraitsBase<HeapVector<AddMemberIfNeeded<T>>*> {
using ImplType = typename NativeValueTraits<IDLSequence<T>>::ImplType*;
@@ -1203,9 +1190,8 @@ struct NativeValueTraits<IDLArray<T>>
: public NativeValueTraits<IDLSequence<T>> {};
template <typename T>
-struct NativeValueTraits<IDLNullable<IDLArray<T>>,
- typename std::enable_if_t<
- NativeValueTraits<IDLSequence<T>>::has_null_value>>
+ requires NativeValueTraits<IDLSequence<T>>::has_null_value
+struct NativeValueTraits<IDLNullable<IDLArray<T>>>
: public NativeValueTraits<IDLNullable<IDLSequence<T>>> {};
// Record types
@@ -1335,10 +1321,8 @@ struct NativeValueTraits<IDLRecord<K, V>>
// Callback function types
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<std::is_base_of<CallbackFunctionBase, T>::value>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, CallbackFunctionBase>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1361,9 +1345,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<std::is_base_of<CallbackFunctionBase, T>::value>>
+ requires std::derived_from<T, CallbackFunctionBase>
+struct NativeValueTraits<IDLNullable<T>>
: public NativeValueTraitsBase<IDLNullable<T>> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1392,10 +1375,8 @@ struct NativeValueTraits<
// Callback interface types
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<std::is_base_of<CallbackInterfaceBase, T>::value>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, CallbackInterfaceBase>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1418,9 +1399,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<std::is_base_of<CallbackInterfaceBase, T>::value>>
+ requires std::derived_from<T, CallbackInterfaceBase>
+struct NativeValueTraits<IDLNullable<T>>
: public NativeValueTraitsBase<IDLNullable<T>> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1449,11 +1429,8 @@ struct NativeValueTraits<
// Dictionary types
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<
- std::is_base_of<bindings::DictionaryBase, T>::value>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, bindings::DictionaryBase>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1464,14 +1441,11 @@ struct NativeValueTraits<
// We don't support nullable dictionary types in general since it's quite
// confusing and often misused.
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<
- std::is_base_of<bindings::DictionaryBase, T>::value &&
- (std::is_same<T, GPUColorTargetState>::value ||
- std::is_same<T, GPURenderPassColorAttachment>::value ||
- std::is_same<T, GPUVertexBufferLayout>::value)>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, bindings::DictionaryBase> &&
+ (std::same_as<T, GPUColorTargetState> ||
+ std::same_as<T, GPURenderPassColorAttachment> ||
+ std::same_as<T, GPUVertexBufferLayout>)
+struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1483,11 +1457,8 @@ struct NativeValueTraits<
// Enumeration types
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<
- std::is_base_of<bindings::EnumerationBase, T>::value>>
- : public NativeValueTraitsBase<T> {
+ requires std::derived_from<T, bindings::EnumerationBase>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T> {
static T NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1497,10 +1468,8 @@ struct NativeValueTraits<
// Interface types
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<std::is_base_of<ScriptWrappable, T>::value>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, ScriptWrappable>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
static inline T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1528,9 +1497,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<std::is_base_of<ScriptWrappable, T>::value>>
+ requires std::derived_from<T, ScriptWrappable>
+struct NativeValueTraits<IDLNullable<T>>
: public NativeValueTraitsBase<IDLNullable<T>> {
static inline T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1565,10 +1533,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- T,
- typename std::enable_if_t<std::is_base_of<bindings::UnionBase, T>::value>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, bindings::UnionBase>
+struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1584,10 +1550,8 @@ struct NativeValueTraits<
};
template <typename T>
-struct NativeValueTraits<
- IDLNullable<T>,
- typename std::enable_if_t<std::is_base_of<bindings::UnionBase, T>::value>>
- : public NativeValueTraitsBase<T*> {
+ requires std::derived_from<T, bindings::UnionBase>
+struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1608,9 +1572,8 @@ struct NativeValueTraits<
// Nullable types
template <typename InnerType>
-struct NativeValueTraits<
- IDLNullable<InnerType>,
- typename std::enable_if_t<!NativeValueTraits<InnerType>::has_null_value>>
+ requires(!NativeValueTraits<InnerType>::has_null_value)
+struct NativeValueTraits<IDLNullable<InnerType>>
: public NativeValueTraitsBase<IDLNullable<InnerType>> {
// https://webidl.spec.whatwg.org/#es-nullable-type
using ImplType =
@@ -1642,9 +1605,8 @@ struct NativeValueTraits<IDLNullable<IDLNullable<T>>>;
// Optional types
template <typename T>
-struct NativeValueTraits<IDLOptional<T>,
- typename std::enable_if_t<std::is_arithmetic<
- typename NativeValueTraits<T>::ImplType>::value>>
+ requires std::is_arithmetic_v<typename NativeValueTraits<T>::ImplType>
+struct NativeValueTraits<IDLOptional<T>>
: public NativeValueTraitsBase<typename NativeValueTraits<T>::ImplType> {
using ImplType = typename NativeValueTraits<T>::ImplType;
@@ -1666,9 +1628,8 @@ struct NativeValueTraits<IDLOptional<T>,
};
template <typename T>
-struct NativeValueTraits<IDLOptional<T>,
- typename std::enable_if_t<std::is_pointer<
- typename NativeValueTraits<T>::ImplType>::value>>
+ requires std::is_pointer_v<typename NativeValueTraits<T>::ImplType>
+struct NativeValueTraits<IDLOptional<T>>
: public NativeValueTraitsBase<typename NativeValueTraits<T>::ImplType> {
using ImplType = typename NativeValueTraits<T>::ImplType;

@ -1,740 +0,0 @@
commit 940af9f2c87b436559b97c53763aa9eaaf1254eb
Author: Jeremy Roman <jbroman@chromium.org>
Date: Wed Nov 15 16:24:54 2023 +0000
Use C++20 features to simplify blink::NativeValueTraitsBase.
These allow some of the metaprogramming bits to be simplified a little.
Change-Id: I052b4397586d21348401616e1792afdb9662f975
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5030335
Reviewed-by: Yuki Shiino <yukishiino@chromium.org>
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1224978}
diff -up chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc.me chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc
--- chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc.me 2024-02-21 01:20:53.138946500 +0100
+++ chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc 2024-02-21 12:33:53.226207103 +0100
@@ -7,7 +7,6 @@
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
-#include "third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h"
#include "third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h"
namespace blink {
@@ -699,11 +698,12 @@ DOMArrayBufferBase* NativeValueTraits<
// ArrayBufferView
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-NotShared<T> NativeValueTraits<NotShared<T>>::NativeValue(
- v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+NotShared<T> NativeValueTraits<
+ NotShared<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ NativeValue(v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -712,12 +712,13 @@ NotShared<T> NativeValueTraits<NotShared
}
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-NotShared<T> NativeValueTraits<NotShared<T>>::ArgumentValue(
- v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+NotShared<T> NativeValueTraits<
+ NotShared<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -728,11 +729,12 @@ NotShared<T> NativeValueTraits<NotShared
// [AllowShared] ArrayBufferView
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T> NativeValueTraits<MaybeShared<T>>::NativeValue(
- v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+MaybeShared<T> NativeValueTraits<
+ MaybeShared<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ NativeValue(v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -741,12 +743,13 @@ MaybeShared<T> NativeValueTraits<MaybeSh
}
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T> NativeValueTraits<MaybeShared<T>>::ArgumentValue(
- v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+MaybeShared<T> NativeValueTraits<
+ MaybeShared<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
@@ -757,12 +760,12 @@ MaybeShared<T> NativeValueTraits<MaybeSh
// [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T>
-NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>::NativeValue(
- v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+MaybeShared<T> NativeValueTraits<
+ IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ NativeValue(v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<
RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck,
@@ -771,12 +774,13 @@ NativeValueTraits<IDLBufferSourceTypeNoS
}
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T> NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<
- MaybeShared<T>>>::ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+MaybeShared<T> NativeValueTraits<
+ IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck,
@@ -787,11 +791,12 @@ MaybeShared<T> NativeValueTraits<IDLBuff
// Nullable ArrayBufferView
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-NotShared<T> NativeValueTraits<IDLNullable<NotShared<T>>>::NativeValue(
- v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+NotShared<T> NativeValueTraits<
+ IDLNullable<NotShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ NativeValue(v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -800,12 +805,13 @@ NotShared<T> NativeValueTraits<IDLNullab
}
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-NotShared<T> NativeValueTraits<IDLNullable<NotShared<T>>>::ArgumentValue(
- v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+NotShared<T> NativeValueTraits<
+ IDLNullable<NotShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -816,11 +822,12 @@ NotShared<T> NativeValueTraits<IDLNullab
// Nullable [AllowShared] ArrayBufferView
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T> NativeValueTraits<IDLNullable<MaybeShared<T>>>::NativeValue(
- v8::Isolate* isolate,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+MaybeShared<T> NativeValueTraits<
+ IDLNullable<MaybeShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ NativeValue(v8::Isolate* isolate,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return NativeValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -829,12 +836,13 @@ MaybeShared<T> NativeValueTraits<IDLNull
}
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T> NativeValueTraits<IDLNullable<MaybeShared<T>>>::ArgumentValue(
- v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+MaybeShared<T> NativeValueTraits<
+ IDLNullable<MaybeShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<MaybeShared<T>>,
ToDOMViewType<T, kMaybeShared>,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
@@ -845,9 +853,9 @@ MaybeShared<T> NativeValueTraits<IDLNull
// Nullable [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-MaybeShared<T>
-NativeValueTraits<IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>>::
+MaybeShared<T> NativeValueTraits<
+ IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>::
ArgumentValue(v8::Isolate* isolate,
int argument_index,
v8::Local<v8::Value> value,
@@ -862,11 +870,13 @@ NativeValueTraits<IDLNullable<IDLBufferS
// [AllowShared, FlexibleArrayBufferView] ArrayBufferView
template <typename T>
- requires std::derived_from<T, FlexibleArrayBufferView>
-T NativeValueTraits<T>::ArgumentValue(v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+T NativeValueTraits<T,
+ typename std::enable_if_t<
+ std::is_base_of<FlexibleArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<T>, ToFlexibleArrayBufferView,
Nullablity::kIsNotNullable, BufferSizeCheck::kCheck,
ResizableAllowance::kDisallowResizable,
@@ -878,12 +888,13 @@ T NativeValueTraits<T>::ArgumentValue(v8
// ArrayBufferView
template <typename T>
- requires std::derived_from<T, FlexibleArrayBufferView>
-T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>>::ArgumentValue(
- v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>,
+ typename std::enable_if_t<
+ std::is_base_of<FlexibleArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<
RecipeTrait<T>, ToFlexibleArrayBufferView, Nullablity::kIsNotNullable,
BufferSizeCheck::kDoNotCheck, ResizableAllowance::kDisallowResizable,
@@ -894,12 +905,13 @@ T NativeValueTraits<IDLBufferSourceTypeN
// Nullable [AllowShared, FlexibleArrayBufferView] ArrayBufferView
template <typename T>
- requires std::derived_from<T, FlexibleArrayBufferView>
-T NativeValueTraits<IDLNullable<T>>::ArgumentValue(
- v8::Isolate* isolate,
- int argument_index,
- v8::Local<v8::Value> value,
- ExceptionState& exception_state) {
+T NativeValueTraits<IDLNullable<T>,
+ typename std::enable_if_t<
+ std::is_base_of<FlexibleArrayBufferView, T>::value>>::
+ ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state) {
return ArgumentValueImpl<RecipeTrait<T>, ToFlexibleArrayBufferView,
Nullablity::kIsNullable, BufferSizeCheck::kCheck,
ResizableAllowance::kDisallowResizable,
diff -up chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits.h.me chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
--- chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits.h.me 2024-02-21 01:20:53.138946500 +0100
+++ chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits.h 2024-02-21 12:33:53.225207075 +0100
@@ -5,7 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_H_
-#include <concepts>
#include <type_traits>
#include "third_party/blink/renderer/bindings/core/v8/idl_types_base.h"
@@ -31,7 +30,7 @@ class ExceptionState;
// return toInt32(isolate, value, exceptionState, NormalConversion);
// }
// }
-template <typename T>
+template <typename T, typename SFINAEHelper = void>
struct NativeValueTraits;
// This declaration serves only as a blueprint for specializations: the
@@ -46,15 +45,22 @@ struct NativeValueTraits;
namespace bindings {
+template <typename T, typename = void>
+struct NativeValueTraitsHasIsNull : std::false_type {};
+
template <typename T>
-struct ImplTypeFor {
- using type = T;
-};
+struct NativeValueTraitsHasIsNull<
+ T,
+ std::void_t<decltype(std::declval<T>().IsNull())>> : std::true_type {};
template <typename T>
- requires std::derived_from<T, IDLBase>
-struct ImplTypeFor<T> {
- using type = typename T::ImplType;
+struct NativeValueTraitsHasNullValue {
+ // true if |T| supports IDL null value.
+ static constexpr bool value =
+ // ScriptValue, String, and union types have IsNull member function.
+ bindings::NativeValueTraitsHasIsNull<T>::value ||
+ // Pointer types have nullptr as IDL null value.
+ std::is_pointer<T>::value;
};
} // namespace bindings
@@ -72,17 +78,37 @@ struct ImplTypeFor<T> {
// If present, |NullValue()| will be used when converting from the nullable type
// T?, and should be used if the impl type has an existing "null" state. If not
// present, WTF::Optional will be used to wrap the type.
-template <typename T>
+template <typename T, typename SFINAEHelper = void>
struct NativeValueTraitsBase {
STATIC_ONLY(NativeValueTraitsBase);
- using ImplType = bindings::ImplTypeFor<T>::type;
+ using ImplType = T;
+
+ static constexpr bool has_null_value =
+ bindings::NativeValueTraitsHasNullValue<ImplType>::value;
+
+ template <typename... ExtraArgs>
+ static decltype(auto) ArgumentValue(v8::Isolate* isolate,
+ int argument_index,
+ v8::Local<v8::Value> value,
+ ExceptionState& exception_state,
+ ExtraArgs... extra_args) {
+ return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue(
+ isolate, value, exception_state,
+ std::forward<ExtraArgs>(extra_args)...);
+ }
+};
+
+template <typename T>
+struct NativeValueTraitsBase<
+ T,
+ std::enable_if_t<std::is_base_of<IDLBase, T>::value>> {
+ STATIC_ONLY(NativeValueTraitsBase);
+
+ using ImplType = typename T::ImplType;
- // Pointer types have nullptr as IDL null value.
- // ScriptValue, String, and union types have IsNull member function.
static constexpr bool has_null_value =
- std::is_pointer_v<ImplType> ||
- requires(ImplType value) { value.IsNull(); };
+ bindings::NativeValueTraitsHasNullValue<ImplType>::value;
// This should only be true for certain subclasses of ScriptWrappable
// that satisfy the assumptions of CreateIDLSequenceFromV8ArraySlow() with
diff -up chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h.me chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
--- chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h.me 2024-02-21 01:20:53.138946500 +0100
+++ chromium-122.0.6261.57/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h 2024-02-21 12:33:53.227207131 +0100
@@ -5,9 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_IMPL_H_
-#include <concepts>
-#include <type_traits>
-
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
#include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h"
@@ -736,8 +733,9 @@ struct CORE_EXPORT NativeValueTraits<
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<T> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> {
// NotShared<T> or MaybeShared<T> should be used instead.
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -749,8 +747,9 @@ struct NativeValueTraits<T> {
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<IDLNullable<T>> {
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> {
// NotShared<T> or MaybeShared<T> should be used instead.
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -762,8 +761,9 @@ struct NativeValueTraits<IDLNullable<T>>
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<NotShared<T>>
+struct NativeValueTraits<
+ NotShared<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
: public NativeValueTraitsBase<NotShared<T>> {
static NotShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -776,8 +776,9 @@ struct NativeValueTraits<NotShared<T>>
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<IDLNullable<NotShared<T>>>
+struct NativeValueTraits<
+ IDLNullable<NotShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
: public NativeValueTraitsBase<NotShared<T>> {
static NotShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -790,8 +791,9 @@ struct NativeValueTraits<IDLNullable<Not
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<MaybeShared<T>>
+struct NativeValueTraits<
+ MaybeShared<T>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
: public NativeValueTraitsBase<MaybeShared<T>> {
static MaybeShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -804,8 +806,9 @@ struct NativeValueTraits<MaybeShared<T>>
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>
+struct NativeValueTraits<
+ IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
: public NativeValueTraitsBase<MaybeShared<T>> {
// FlexibleArrayBufferView uses this in its implementation, so we cannot
// delete it.
@@ -820,8 +823,9 @@ struct NativeValueTraits<IDLBufferSource
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
-struct NativeValueTraits<IDLNullable<MaybeShared<T>>>
+struct NativeValueTraits<
+ IDLNullable<MaybeShared<T>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
: public NativeValueTraitsBase<MaybeShared<T>> {
static MaybeShared<T> NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -834,9 +838,9 @@ struct NativeValueTraits<IDLNullable<May
};
template <typename T>
- requires std::derived_from<T, DOMArrayBufferView>
struct NativeValueTraits<
- IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>>
+ IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>,
+ typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>
: public NativeValueTraitsBase<MaybeShared<T>> {
// BufferSourceTypeNoSizeLimit must be used only as arguments.
static MaybeShared<T> NativeValue(v8::Isolate* isolate,
@@ -850,8 +854,11 @@ struct NativeValueTraits<
};
template <typename T>
- requires std::derived_from<T, FlexibleArrayBufferView>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<
+ std::is_base_of<FlexibleArrayBufferView, T>::value>>
+ : public NativeValueTraitsBase<T> {
// FlexibleArrayBufferView must be used only as arguments.
static T NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -864,8 +871,10 @@ struct NativeValueTraits<T> : public Nat
};
template <typename T>
- requires std::derived_from<T, FlexibleArrayBufferView>
-struct NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>>
+struct NativeValueTraits<
+ IDLBufferSourceTypeNoSizeLimit<T>,
+ typename std::enable_if_t<
+ std::is_base_of<FlexibleArrayBufferView, T>::value>>
: public NativeValueTraitsBase<T> {
// BufferSourceTypeNoSizeLimit and FlexibleArrayBufferView must be used only
// as arguments.
@@ -880,8 +889,11 @@ struct NativeValueTraits<IDLBufferSource
};
template <typename T>
- requires std::derived_from<T, FlexibleArrayBufferView>
-struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T> {
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<
+ std::is_base_of<FlexibleArrayBufferView, T>::value>>
+ : public NativeValueTraitsBase<T> {
// FlexibleArrayBufferView must be used only as arguments.
static T NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1217,8 +1229,9 @@ NativeValueTraits<IDLSequence<T>>::Nativ
}
template <typename T>
- requires NativeValueTraits<IDLSequence<T>>::has_null_value
-struct NativeValueTraits<IDLNullable<IDLSequence<T>>>
+struct NativeValueTraits<IDLNullable<IDLSequence<T>>,
+ typename std::enable_if_t<
+ NativeValueTraits<IDLSequence<T>>::has_null_value>>
: public NativeValueTraitsBase<HeapVector<AddMemberIfNeeded<T>>*> {
using ImplType = typename NativeValueTraits<IDLSequence<T>>::ImplType*;
@@ -1294,8 +1307,9 @@ struct NativeValueTraits<IDLArray<T>>
: public NativeValueTraits<IDLSequence<T>> {};
template <typename T>
- requires NativeValueTraits<IDLSequence<T>>::has_null_value
-struct NativeValueTraits<IDLNullable<IDLArray<T>>>
+struct NativeValueTraits<IDLNullable<IDLArray<T>>,
+ typename std::enable_if_t<
+ NativeValueTraits<IDLSequence<T>>::has_null_value>>
: public NativeValueTraits<IDLNullable<IDLSequence<T>>> {};
// Record types
@@ -1425,8 +1439,10 @@ struct NativeValueTraits<IDLRecord<K, V>
// Callback function types
template <typename T>
- requires std::derived_from<T, CallbackFunctionBase>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<std::is_base_of<CallbackFunctionBase, T>::value>>
+ : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1449,8 +1465,9 @@ struct NativeValueTraits<T> : public Nat
};
template <typename T>
- requires std::derived_from<T, CallbackFunctionBase>
-struct NativeValueTraits<IDLNullable<T>>
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<std::is_base_of<CallbackFunctionBase, T>::value>>
: public NativeValueTraitsBase<IDLNullable<T>> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1479,8 +1496,10 @@ struct NativeValueTraits<IDLNullable<T>>
// Callback interface types
template <typename T>
- requires std::derived_from<T, CallbackInterfaceBase>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<std::is_base_of<CallbackInterfaceBase, T>::value>>
+ : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1504,8 +1523,9 @@ struct NativeValueTraits<T> : public Nat
// Interface types
template <typename T>
- requires std::derived_from<T, CallbackInterfaceBase>
-struct NativeValueTraits<IDLNullable<T>>
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<std::is_base_of<CallbackInterfaceBase, T>::value>>
: public NativeValueTraitsBase<IDLNullable<T>> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1534,8 +1554,11 @@ struct NativeValueTraits<IDLNullable<T>>
// Dictionary types
template <typename T>
- requires std::derived_from<T, bindings::DictionaryBase>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<
+ std::is_base_of<bindings::DictionaryBase, T>::value>>
+ : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1546,11 +1569,14 @@ struct NativeValueTraits<T> : public Nat
// We don't support nullable dictionary types in general since it's quite
// confusing and often misused.
template <typename T>
- requires std::derived_from<T, bindings::DictionaryBase> &&
- (std::same_as<T, GPUColorTargetState> ||
- std::same_as<T, GPURenderPassColorAttachment> ||
- std::same_as<T, GPUVertexBufferLayout>)
-struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<
+ std::is_base_of<bindings::DictionaryBase, T>::value &&
+ (std::is_same<T, GPUColorTargetState>::value ||
+ std::is_same<T, GPURenderPassColorAttachment>::value ||
+ std::is_same<T, GPUVertexBufferLayout>::value)>>
+ : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1562,8 +1588,11 @@ struct NativeValueTraits<IDLNullable<T>>
// Enumeration types
template <typename T>
- requires std::derived_from<T, bindings::EnumerationBase>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<
+ std::is_base_of<bindings::EnumerationBase, T>::value>>
+ : public NativeValueTraitsBase<T> {
static T NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1573,8 +1602,10 @@ struct NativeValueTraits<T> : public Nat
// Interface types
template <typename T>
- requires std::derived_from<T, ScriptWrappable>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<std::is_base_of<ScriptWrappable, T>::value>>
+ : public NativeValueTraitsBase<T*> {
// This signifies that CreateIDLSequenceFromV8ArraySlow() may apply
// certain optimization based on assumptions about `NativeValue()`
// implementation below. For subclasses of ScriptWrappable that have
@@ -1611,8 +1642,9 @@ struct NativeValueTraits<T> : public Nat
};
template <typename T>
- requires std::derived_from<T, ScriptWrappable>
-struct NativeValueTraits<IDLNullable<T>>
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<std::is_base_of<ScriptWrappable, T>::value>>
: public NativeValueTraitsBase<IDLNullable<T>> {
static inline T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
@@ -1647,8 +1679,10 @@ struct NativeValueTraits<IDLNullable<T>>
};
template <typename T>
- requires std::derived_from<T, bindings::UnionBase>
-struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ T,
+ typename std::enable_if_t<std::is_base_of<bindings::UnionBase, T>::value>>
+ : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1664,8 +1698,10 @@ struct NativeValueTraits<T> : public Nat
};
template <typename T>
- requires std::derived_from<T, bindings::UnionBase>
-struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T*> {
+struct NativeValueTraits<
+ IDLNullable<T>,
+ typename std::enable_if_t<std::is_base_of<bindings::UnionBase, T>::value>>
+ : public NativeValueTraitsBase<T*> {
static T* NativeValue(v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
@@ -1686,8 +1722,9 @@ struct NativeValueTraits<IDLNullable<T>>
// Nullable types
template <typename InnerType>
- requires(!NativeValueTraits<InnerType>::has_null_value)
-struct NativeValueTraits<IDLNullable<InnerType>>
+struct NativeValueTraits<
+ IDLNullable<InnerType>,
+ typename std::enable_if_t<!NativeValueTraits<InnerType>::has_null_value>>
: public NativeValueTraitsBase<IDLNullable<InnerType>> {
// https://webidl.spec.whatwg.org/#es-nullable-type
using ImplType =
@@ -1719,8 +1756,9 @@ struct NativeValueTraits<IDLNullable<IDL
// Optional types
template <typename T>
- requires std::is_arithmetic_v<typename NativeValueTraits<T>::ImplType>
-struct NativeValueTraits<IDLOptional<T>>
+struct NativeValueTraits<IDLOptional<T>,
+ typename std::enable_if_t<std::is_arithmetic<
+ typename NativeValueTraits<T>::ImplType>::value>>
: public NativeValueTraitsBase<typename NativeValueTraits<T>::ImplType> {
using ImplType = typename NativeValueTraits<T>::ImplType;
@@ -1742,8 +1780,9 @@ struct NativeValueTraits<IDLOptional<T>>
};
template <typename T>
- requires std::is_pointer_v<typename NativeValueTraits<T>::ImplType>
-struct NativeValueTraits<IDLOptional<T>>
+struct NativeValueTraits<IDLOptional<T>,
+ typename std::enable_if_t<std::is_pointer<
+ typename NativeValueTraits<T>::ImplType>::value>>
: public NativeValueTraitsBase<typename NativeValueTraits<T>::ImplType> {
using ImplType = typename NativeValueTraits<T>::ImplType;

@ -430,9 +430,9 @@ Patch304: chromium-117-string-convert.patch
Patch306: chromium-119-assert.patch
# compiler errors on epel
Patch307: chromium-122-clang16-buildflags.patch
# revert it for old clang on rhel and f38
Patch308: chromium-122-v8-c++20.patch
Patch307: chromium-121-v8-c++20-p1.patch
Patch308: chromium-121-v8-c++20.patch
Patch309: chromium-122-constexpr.patch
# missing include header files
@ -446,6 +446,7 @@ Patch312: chromium-119-fstack-protector-strong.patch
# fixed static assert error
Patch313: chromium-122-static-assert.patch
Patch314: chromium-122-clang16-buildflags.patch
# build error
Patch351: chromium-121-mnemonic-error.patch
@ -1115,10 +1116,11 @@ udev.
%endif
%if 0%{?rhel} || 0%{?fedora} && 0%{?fedora} < 39
%patch -P307 -p1 -b .clang16-buildflag
%patch -P308 -p1 -b .v8-c++20
%patch -P307 -p1 -R -b .v8-c++20
%patch -P308 -p1 -R -b .v8-c++20
%patch -P309 -p1 -b .constexpr
%patch -P313 -p1 -b .static-assert
%patch -P314 -p1 -b .clang16-buildflag
%endif
%patch -P310 -p1 -b .missing-header-files

Loading…
Cancel
Save