revert as workaround for compiler error with old clang < 17 commit 940af9f2c87b436559b97c53763aa9eaaf1254eb Author: Jeremy Roman 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 Commit-Queue: Jeremy Roman Cr-Commit-Position: refs/heads/main@{#1224978} --- 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,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 #include #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 +template struct NativeValueTraits; // This declaration serves only as a blueprint for specializations: the @@ -46,15 +45,22 @@ struct NativeValueTraits; namespace bindings { +template +struct NativeValueTraitsHasIsNull : std::false_type {}; + template -struct ImplTypeFor { - using type = T; -}; +struct NativeValueTraitsHasIsNull< + T, + std::void_t().IsNull())>> : std::true_type {}; template - requires std::derived_from -struct ImplTypeFor { - 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::value || + // Pointer types have nullptr as IDL null value. + std::is_pointer::value; }; } // namespace bindings @@ -72,17 +78,37 @@ struct ImplTypeFor { // 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 +template struct NativeValueTraitsBase { STATIC_ONLY(NativeValueTraitsBase); - using ImplType = bindings::ImplTypeFor::type; + using ImplType = T; + + static constexpr bool has_null_value = + bindings::NativeValueTraitsHasNullValue::value; + + template + static decltype(auto) ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state, + ExtraArgs... extra_args) { + return NativeValueTraits>::NativeValue( + isolate, value, exception_state, + std::forward(extra_args)...); + } +}; + +template +struct NativeValueTraitsBase< + T, + std::enable_if_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 || - requires(ImplType value) { value.IsNull(); }; + bindings::NativeValueTraitsHasNullValue::value; // This should only be true for certain subclasses of ScriptWrappable // that satisfy the assumptions of CreateIDLSequenceFromV8ArraySlow() with --- 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,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 { @@ -698,11 +697,12 @@ DOMArrayBufferBase* NativeValueTraits< // ArrayBufferView template - requires std::derived_from -NotShared NativeValueTraits>::NativeValue( - v8::Isolate* isolate, - v8::Local value, - ExceptionState& exception_state) { +NotShared NativeValueTraits< + NotShared, + typename std::enable_if_t::value>>:: + NativeValue(v8::Isolate* isolate, + v8::Local value, + ExceptionState& exception_state) { return NativeValueImpl< RecipeTrait>, ToDOMViewType, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -711,12 +711,13 @@ NotShared NativeValueTraits - requires std::derived_from -NotShared NativeValueTraits>::ArgumentValue( - v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +NotShared NativeValueTraits< + NotShared, + typename std::enable_if_t::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait>, ToDOMViewType, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -727,11 +728,12 @@ NotShared NativeValueTraits - requires std::derived_from -MaybeShared NativeValueTraits>::NativeValue( - v8::Isolate* isolate, - v8::Local value, - ExceptionState& exception_state) { +MaybeShared NativeValueTraits< + MaybeShared, + typename std::enable_if_t::value>>:: + NativeValue(v8::Isolate* isolate, + v8::Local value, + ExceptionState& exception_state) { return NativeValueImpl>, ToDOMViewType, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -740,12 +742,13 @@ MaybeShared NativeValueTraits - requires std::derived_from -MaybeShared NativeValueTraits>::ArgumentValue( - v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +MaybeShared NativeValueTraits< + MaybeShared, + typename std::enable_if_t::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl>, ToDOMViewType, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -756,12 +759,12 @@ MaybeShared NativeValueTraits - requires std::derived_from -MaybeShared -NativeValueTraits>>::NativeValue( - v8::Isolate* isolate, - v8::Local value, - ExceptionState& exception_state) { +MaybeShared NativeValueTraits< + IDLBufferSourceTypeNoSizeLimit>, + typename std::enable_if_t::value>>:: + NativeValue(v8::Isolate* isolate, + v8::Local value, + ExceptionState& exception_state) { return NativeValueImpl< RecipeTrait>, ToDOMViewType, Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck, @@ -770,12 +773,13 @@ NativeValueTraits - requires std::derived_from -MaybeShared NativeValueTraits>>::ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +MaybeShared NativeValueTraits< + IDLBufferSourceTypeNoSizeLimit>, + typename std::enable_if_t::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait>, ToDOMViewType, Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck, @@ -786,11 +790,12 @@ MaybeShared NativeValueTraits - requires std::derived_from -NotShared NativeValueTraits>>::NativeValue( - v8::Isolate* isolate, - v8::Local value, - ExceptionState& exception_state) { +NotShared NativeValueTraits< + IDLNullable>, + typename std::enable_if_t::value>>:: + NativeValue(v8::Isolate* isolate, + v8::Local value, + ExceptionState& exception_state) { return NativeValueImpl< RecipeTrait>, ToDOMViewType, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -799,12 +804,13 @@ NotShared NativeValueTraits - requires std::derived_from -NotShared NativeValueTraits>>::ArgumentValue( - v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +NotShared NativeValueTraits< + IDLNullable>, + typename std::enable_if_t::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait>, ToDOMViewType, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -815,11 +821,12 @@ NotShared NativeValueTraits - requires std::derived_from -MaybeShared NativeValueTraits>>::NativeValue( - v8::Isolate* isolate, - v8::Local value, - ExceptionState& exception_state) { +MaybeShared NativeValueTraits< + IDLNullable>, + typename std::enable_if_t::value>>:: + NativeValue(v8::Isolate* isolate, + v8::Local value, + ExceptionState& exception_state) { return NativeValueImpl>, ToDOMViewType, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -828,12 +835,13 @@ MaybeShared NativeValueTraits - requires std::derived_from -MaybeShared NativeValueTraits>>::ArgumentValue( - v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +MaybeShared NativeValueTraits< + IDLNullable>, + typename std::enable_if_t::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl>, ToDOMViewType, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -844,9 +852,9 @@ MaybeShared NativeValueTraits - requires std::derived_from -MaybeShared -NativeValueTraits>>>:: +MaybeShared NativeValueTraits< + IDLNullable>>, + typename std::enable_if_t::value>>:: ArgumentValue(v8::Isolate* isolate, int argument_index, v8::Local value, @@ -861,11 +869,13 @@ NativeValueTraits - requires std::derived_from -T NativeValueTraits::ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +T NativeValueTraits::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl, ToFlexibleArrayBufferView, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, ResizableAllowance::kDisallowResizable, @@ -877,12 +887,13 @@ T NativeValueTraits::ArgumentValue(v8 // ArrayBufferView template - requires std::derived_from -T NativeValueTraits>::ArgumentValue( - v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +T NativeValueTraits, + typename std::enable_if_t< + std::is_base_of::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait, ToFlexibleArrayBufferView, Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck, ResizableAllowance::kDisallowResizable, @@ -893,12 +904,13 @@ T NativeValueTraits - requires std::derived_from -T NativeValueTraits>::ArgumentValue( - v8::Isolate* isolate, - int argument_index, - v8::Local value, - ExceptionState& exception_state) { +T NativeValueTraits, + typename std::enable_if_t< + std::is_base_of::value>>:: + ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local value, + ExceptionState& exception_state) { return ArgumentValueImpl, ToFlexibleArrayBufferView, Nullablity::kIsNullable, BufferSizeCheck::kCheck, ResizableAllowance::kDisallowResizable, --- 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,9 +5,7 @@ #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 #include -#include #include "third_party/blink/renderer/bindings/core/v8/idl_types.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h" @@ -718,8 +716,9 @@ struct CORE_EXPORT NativeValueTraits< }; template - requires std::derived_from -struct NativeValueTraits { +struct NativeValueTraits< + T, + typename std::enable_if_t::value>> { // NotShared or MaybeShared should be used instead. static T* NativeValue(v8::Isolate* isolate, v8::Local value, @@ -731,8 +730,9 @@ struct NativeValueTraits { }; template - requires std::derived_from -struct NativeValueTraits> { +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t::value>> { // NotShared or MaybeShared should be used instead. static T* NativeValue(v8::Isolate* isolate, v8::Local value, @@ -744,8 +744,9 @@ struct NativeValueTraits> }; template - requires std::derived_from -struct NativeValueTraits> +struct NativeValueTraits< + NotShared, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static NotShared NativeValue(v8::Isolate* isolate, v8::Local value, @@ -758,8 +759,9 @@ struct NativeValueTraits> }; template - requires std::derived_from -struct NativeValueTraits>> +struct NativeValueTraits< + IDLNullable>, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static NotShared NativeValue(v8::Isolate* isolate, v8::Local value, @@ -772,8 +774,9 @@ struct NativeValueTraits - requires std::derived_from -struct NativeValueTraits> +struct NativeValueTraits< + MaybeShared, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static MaybeShared NativeValue(v8::Isolate* isolate, v8::Local value, @@ -786,8 +789,9 @@ struct NativeValueTraits> }; template - requires std::derived_from -struct NativeValueTraits>> +struct NativeValueTraits< + IDLBufferSourceTypeNoSizeLimit>, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { // FlexibleArrayBufferView uses this in its implementation, so we cannot // delete it. @@ -802,8 +806,9 @@ struct NativeValueTraits - requires std::derived_from -struct NativeValueTraits>> +struct NativeValueTraits< + IDLNullable>, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static MaybeShared NativeValue(v8::Isolate* isolate, v8::Local value, @@ -816,9 +821,9 @@ struct NativeValueTraits - requires std::derived_from struct NativeValueTraits< - IDLNullable>>> + IDLNullable>>, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { // BufferSourceTypeNoSizeLimit must be used only as arguments. static MaybeShared NativeValue(v8::Isolate* isolate, @@ -832,8 +837,11 @@ struct NativeValueTraits< }; template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t< + std::is_base_of::value>> + : public NativeValueTraitsBase { // FlexibleArrayBufferView must be used only as arguments. static T NativeValue(v8::Isolate* isolate, v8::Local value, @@ -846,8 +854,10 @@ struct NativeValueTraits : public Nat }; template - requires std::derived_from -struct NativeValueTraits> +struct NativeValueTraits< + IDLBufferSourceTypeNoSizeLimit, + typename std::enable_if_t< + std::is_base_of::value>> : public NativeValueTraitsBase { // BufferSourceTypeNoSizeLimit and FlexibleArrayBufferView must be used only // as arguments. @@ -862,8 +872,11 @@ struct NativeValueTraits - requires std::derived_from -struct NativeValueTraits> : public NativeValueTraitsBase { +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t< + std::is_base_of::value>> + : public NativeValueTraitsBase { // FlexibleArrayBufferView must be used only as arguments. static T NativeValue(v8::Isolate* isolate, v8::Local value, @@ -1199,8 +1212,9 @@ NativeValueTraits>::Nativ } template - requires NativeValueTraits>::has_null_value -struct NativeValueTraits>> +struct NativeValueTraits>, + typename std::enable_if_t< + NativeValueTraits>::has_null_value>> : public NativeValueTraitsBase>*> { using ImplType = typename NativeValueTraits>::ImplType*; @@ -1276,8 +1290,9 @@ struct NativeValueTraits> : public NativeValueTraits> {}; template - requires NativeValueTraits>::has_null_value -struct NativeValueTraits>> +struct NativeValueTraits>, + typename std::enable_if_t< + NativeValueTraits>::has_null_value>> : public NativeValueTraits>> {}; // Record types @@ -1407,8 +1422,10 @@ struct NativeValueTraits // Callback function types template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t::value>> + : public NativeValueTraitsBase { static T* NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1431,8 +1448,9 @@ struct NativeValueTraits : public Nat }; template - requires std::derived_from -struct NativeValueTraits> +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static T* NativeValue(v8::Isolate* isolate, v8::Local value, @@ -1461,8 +1479,10 @@ struct NativeValueTraits> // Callback interface types template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t::value>> + : public NativeValueTraitsBase { static T* NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1486,8 +1506,9 @@ struct NativeValueTraits : public Nat // Interface types template - requires std::derived_from -struct NativeValueTraits> +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static T* NativeValue(v8::Isolate* isolate, v8::Local value, @@ -1516,8 +1537,11 @@ struct NativeValueTraits> // Dictionary types template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t< + std::is_base_of::value>> + : public NativeValueTraitsBase { static T* NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1528,11 +1552,14 @@ struct NativeValueTraits : public Nat // We don't support nullable dictionary types in general since it's quite // confusing and often misused. template - requires std::derived_from && - (std::same_as || - std::same_as || - std::same_as) -struct NativeValueTraits> : public NativeValueTraitsBase { +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t< + std::is_base_of::value && + (std::is_same::value || + std::is_same::value || + std::is_same::value)>> + : public NativeValueTraitsBase { static T* NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1544,8 +1571,11 @@ struct NativeValueTraits> // Enumeration types template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t< + std::is_base_of::value>> + : public NativeValueTraitsBase { static T NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1555,8 +1585,10 @@ struct NativeValueTraits : public Nat // Interface types template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t::value>> + : public NativeValueTraitsBase { // This signifies that CreateIDLSequenceFromV8ArraySlow() may apply // certain optimization based on assumptions about `NativeValue()` // implementation below. For subclasses of ScriptWrappable that have @@ -1593,8 +1625,9 @@ struct NativeValueTraits : public Nat }; template - requires std::derived_from -struct NativeValueTraits> +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t::value>> : public NativeValueTraitsBase> { static inline T* NativeValue(v8::Isolate* isolate, v8::Local value, @@ -1629,8 +1662,10 @@ struct NativeValueTraits> }; template - requires std::derived_from -struct NativeValueTraits : public NativeValueTraitsBase { +struct NativeValueTraits< + T, + typename std::enable_if_t::value>> + : public NativeValueTraitsBase { static T* NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1646,8 +1681,10 @@ struct NativeValueTraits : public Nat }; template - requires std::derived_from -struct NativeValueTraits> : public NativeValueTraitsBase { +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t::value>> + : public NativeValueTraitsBase { static T* NativeValue(v8::Isolate* isolate, v8::Local value, ExceptionState& exception_state) { @@ -1668,8 +1705,9 @@ struct NativeValueTraits> // Nullable types template - requires(!NativeValueTraits::has_null_value) -struct NativeValueTraits> +struct NativeValueTraits< + IDLNullable, + typename std::enable_if_t::has_null_value>> : public NativeValueTraitsBase> { // https://webidl.spec.whatwg.org/#es-nullable-type using ImplType = @@ -1701,8 +1739,9 @@ struct NativeValueTraits - requires std::is_arithmetic_v::ImplType> -struct NativeValueTraits> +struct NativeValueTraits, + typename std::enable_if_t::ImplType>::value>> : public NativeValueTraitsBase::ImplType> { using ImplType = typename NativeValueTraits::ImplType; @@ -1724,8 +1763,9 @@ struct NativeValueTraits> }; template - requires std::is_pointer_v::ImplType> -struct NativeValueTraits> +struct NativeValueTraits, + typename std::enable_if_t::ImplType>::value>> : public NativeValueTraitsBase::ImplType> { using ImplType = typename NativeValueTraits::ImplType;