diff options
Diffstat (limited to 'REVERT-simplify-blink-NativeValueTraitsBase.patch')
-rw-r--r-- | REVERT-simplify-blink-NativeValueTraitsBase.patch | 747 |
1 files changed, 747 insertions, 0 deletions
diff --git a/REVERT-simplify-blink-NativeValueTraitsBase.patch b/REVERT-simplify-blink-NativeValueTraitsBase.patch new file mode 100644 index 0000000..fc046cb --- /dev/null +++ b/REVERT-simplify-blink-NativeValueTraitsBase.patch @@ -0,0 +1,747 @@ +From 940af9f2c87b436559b97c53763aa9eaaf1254eb Mon Sep 17 00:00:00 2001 +From: Jeremy Roman <jbroman@chromium.org> +Date: Wed, 15 Nov 2023 16:24:54 +0000 +Subject: [PATCH] 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} +--- + .../bindings/core/v8/native_value_traits.h | 54 ++---- + .../v8/native_value_traits_buffer_sources.cc | 166 ++++++++---------- + .../core/v8/native_value_traits_impl.h | 159 +++++++---------- + 3 files changed, 151 insertions(+), 228 deletions(-) + +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 7fc91d14acc71a2..1e5a0790df6da81 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 508ea6d8eea481e..18de71d84023f0c 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 899929dcf49f90a..5011503dcf1c0c8 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; + |