blob: 7af184a9f7a01cc16aa7ec9c9fa9a84f5b056dcd [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
#include "third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h"
namespace blink {
namespace {
DOMArrayBuffer* ToDOMArrayBuffer(v8::Isolate* isolate,
v8::Local<v8::Value> value) {
if (UNLIKELY(!value->IsArrayBuffer()))
return nullptr;
v8::Local<v8::ArrayBuffer> v8_array_buffer = value.As<v8::ArrayBuffer>();
if (DOMArrayBuffer* array_buffer =
ToScriptWrappable(v8_array_buffer)->ToImpl<DOMArrayBuffer>()) {
return array_buffer;
}
// Transfer the ownership of the allocated memory to a DOMArrayBuffer without
// copying.
ArrayBufferContents contents(v8_array_buffer->GetBackingStore());
DOMArrayBuffer* array_buffer = DOMArrayBuffer::Create(contents);
v8::Local<v8::Object> wrapper = array_buffer->AssociateWithWrapper(
isolate, array_buffer->GetWrapperTypeInfo(), v8_array_buffer);
DCHECK(wrapper == v8_array_buffer);
return array_buffer;
}
DOMSharedArrayBuffer* ToDOMSharedArrayBuffer(v8::Isolate* isolate,
v8::Local<v8::Value> value) {
if (UNLIKELY(!value->IsSharedArrayBuffer()))
return nullptr;
v8::Local<v8::SharedArrayBuffer> v8_shared_array_buffer =
value.As<v8::SharedArrayBuffer>();
if (DOMSharedArrayBuffer* shared_array_buffer =
ToScriptWrappable(v8_shared_array_buffer)
->ToImpl<DOMSharedArrayBuffer>()) {
return shared_array_buffer;
}
// Transfer the ownership of the allocated memory to a DOMArrayBuffer without
// copying.
ArrayBufferContents contents(v8_shared_array_buffer->GetBackingStore());
DOMSharedArrayBuffer* shared_array_buffer =
DOMSharedArrayBuffer::Create(contents);
v8::Local<v8::Object> wrapper = shared_array_buffer->AssociateWithWrapper(
isolate, shared_array_buffer->GetWrapperTypeInfo(),
v8_shared_array_buffer);
DCHECK(wrapper == v8_shared_array_buffer);
return shared_array_buffer;
}
template <typename T>
struct ABVTrait; // ABV = ArrayBufferView
template <typename DOMViewTypeArg,
typename V8ViewTypeArg,
bool (v8::Value::*IsV8ViewTypeMemFunc)() const>
struct ABVTraitImpl {
using DOMViewType = DOMViewTypeArg;
using V8ViewType = V8ViewTypeArg;
static DOMViewType* CreateDOMViewType(DOMArrayBufferBase* blink_buffer,
v8::Local<V8ViewType> v8_view) {
return DOMViewType::Create(blink_buffer, v8_view->ByteOffset(),
v8_view->Length());
}
static bool IsV8ViewType(v8::Local<v8::Value> value) {
return ((*value)->*IsV8ViewTypeMemFunc)();
}
static bool IsShared(v8::Local<v8::Value> value) {
return IsV8ViewType(value) &&
value.As<V8ViewType>()->Buffer()->IsSharedArrayBuffer();
}
};
#define DEFINE_ABV_TRAIT(name) \
template <> \
struct ABVTrait<DOM##name> \
: ABVTraitImpl<DOM##name, v8::name, &v8::Value::Is##name> {}; \
template <> \
struct ABVTrait<Flexible##name> \
: ABVTraitImpl<DOM##name, v8::name, &v8::Value::Is##name> {};
DEFINE_ABV_TRAIT(ArrayBufferView)
DEFINE_ABV_TRAIT(Int8Array)
DEFINE_ABV_TRAIT(Int16Array)
DEFINE_ABV_TRAIT(Int32Array)
DEFINE_ABV_TRAIT(Uint8Array)
DEFINE_ABV_TRAIT(Uint8ClampedArray)
DEFINE_ABV_TRAIT(Uint16Array)
DEFINE_ABV_TRAIT(Uint32Array)
DEFINE_ABV_TRAIT(BigInt64Array)
DEFINE_ABV_TRAIT(BigUint64Array)
DEFINE_ABV_TRAIT(Float32Array)
DEFINE_ABV_TRAIT(Float64Array)
#undef DEFINE_ABV_TRAIT
template <>
struct ABVTrait<DOMDataView>
: ABVTraitImpl<DOMDataView, v8::DataView, &v8::Value::IsDataView> {
static DOMViewType* CreateDOMViewType(DOMArrayBufferBase* blink_buffer,
v8::Local<V8ViewType> v8_view) {
return DOMViewType::Create(blink_buffer, v8_view->ByteOffset(),
v8_view->ByteLength());
}
};
constexpr bool kNotShared = false;
constexpr bool kMaybeShared = true;
template <typename DOMViewType, bool allow_shared>
DOMViewType* ToDOMViewType(v8::Isolate* isolate, v8::Local<v8::Value> value) {
using Trait = ABVTrait<DOMViewType>;
if (UNLIKELY(!Trait::IsV8ViewType(value)))
return nullptr;
v8::Local<typename Trait::V8ViewType> v8_view =
value.As<typename Trait::V8ViewType>();
if (DOMViewType* blink_view =
ToScriptWrappable(v8_view)->template ToImpl<DOMViewType>()) {
return blink_view;
}
v8::Local<v8::Object> v8_buffer = v8_view->Buffer();
DOMArrayBufferBase* blink_buffer = nullptr;
if (allow_shared) {
if (v8_buffer->IsArrayBuffer())
blink_buffer = ToDOMArrayBuffer(isolate, v8_buffer);
else // must be IsSharedArrayBuffer()
blink_buffer = ToDOMSharedArrayBuffer(isolate, v8_buffer);
} else {
if (LIKELY(v8_buffer->IsArrayBuffer()))
blink_buffer = ToDOMArrayBuffer(isolate, v8_buffer);
else // must be IsSharedArrayBuffer()
return nullptr;
}
DOMViewType* blink_view = Trait::CreateDOMViewType(blink_buffer, v8_view);
v8::Local<v8::Object> wrapper = blink_view->AssociateWithWrapper(
isolate, blink_view->GetWrapperTypeInfo(), v8_view);
DCHECK(wrapper == v8_view);
return blink_view;
}
template <bool allow_shared>
DOMArrayBufferView* ToDOMArrayBufferView(v8::Isolate* isolate,
v8::Local<v8::Value> value) {
if (UNLIKELY(!value->IsArrayBufferView()))
return nullptr;
v8::Local<v8::ArrayBufferView> v8_view = value.As<v8::ArrayBufferView>();
if (DOMArrayBufferView* blink_view =
ToScriptWrappable(v8_view)->template ToImpl<DOMArrayBufferView>()) {
return blink_view;
}
if (v8_view->IsInt8Array())
return ToDOMViewType<DOMInt8Array, allow_shared>(isolate, value);
if (v8_view->IsInt16Array())
return ToDOMViewType<DOMInt16Array, allow_shared>(isolate, value);
if (v8_view->IsInt32Array())
return ToDOMViewType<DOMInt32Array, allow_shared>(isolate, value);
if (v8_view->IsUint8Array())
return ToDOMViewType<DOMUint8Array, allow_shared>(isolate, value);
if (v8_view->IsUint8ClampedArray())
return ToDOMViewType<DOMUint8ClampedArray, allow_shared>(isolate, value);
if (v8_view->IsUint16Array())
return ToDOMViewType<DOMUint16Array, allow_shared>(isolate, value);
if (v8_view->IsUint32Array())
return ToDOMViewType<DOMUint32Array, allow_shared>(isolate, value);
if (v8_view->IsBigInt64Array())
return ToDOMViewType<DOMBigInt64Array, allow_shared>(isolate, value);
if (v8_view->IsBigUint64Array())
return ToDOMViewType<DOMBigUint64Array, allow_shared>(isolate, value);
if (v8_view->IsFloat32Array())
return ToDOMViewType<DOMFloat32Array, allow_shared>(isolate, value);
if (v8_view->IsFloat64Array())
return ToDOMViewType<DOMFloat64Array, allow_shared>(isolate, value);
if (v8_view->IsDataView())
return ToDOMViewType<DOMDataView, allow_shared>(isolate, value);
NOTREACHED();
return nullptr;
}
template <>
DOMArrayBufferView* ToDOMViewType<DOMArrayBufferView, kNotShared>(
v8::Isolate* isolate,
v8::Local<v8::Value> value) {
return ToDOMArrayBufferView<kNotShared>(isolate, value);
}
template <>
DOMArrayBufferView* ToDOMViewType<DOMArrayBufferView, kMaybeShared>(
v8::Isolate* isolate,
v8::Local<v8::Value> value) {
return ToDOMArrayBufferView<kMaybeShared>(isolate, value);
}
} // namespace
// ArrayBuffer
DOMArrayBuffer* NativeValueTraits<DOMArrayBuffer>::NativeValue(
v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMArrayBuffer* array_buffer = ToDOMArrayBuffer(isolate, value);
if (LIKELY(array_buffer))
return array_buffer;
exception_state.ThrowTypeError(
ExceptionMessages::FailedToConvertJSValue("ArrayBuffer"));
return nullptr;
}
DOMArrayBuffer* NativeValueTraits<DOMArrayBuffer>::ArgumentValue(
v8::Isolate* isolate,
int argument_index,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMArrayBuffer* array_buffer = ToDOMArrayBuffer(isolate, value);
if (LIKELY(array_buffer))
return array_buffer;
exception_state.ThrowTypeError(
ExceptionMessages::ArgumentNotOfType(argument_index, "ArrayBuffer"));
return nullptr;
}
// Nullable ArrayBuffer
DOMArrayBuffer* NativeValueTraits<IDLNullable<DOMArrayBuffer>>::NativeValue(
v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMArrayBuffer* array_buffer = ToDOMArrayBuffer(isolate, value);
if (LIKELY(array_buffer))
return array_buffer;
if (LIKELY(value->IsNullOrUndefined()))
return nullptr;
exception_state.ThrowTypeError(
ExceptionMessages::FailedToConvertJSValue("ArrayBuffer"));
return nullptr;
}
DOMArrayBuffer* NativeValueTraits<IDLNullable<DOMArrayBuffer>>::ArgumentValue(
v8::Isolate* isolate,
int argument_index,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMArrayBuffer* array_buffer = ToDOMArrayBuffer(isolate, value);
if (LIKELY(array_buffer))
return array_buffer;
if (LIKELY(value->IsNullOrUndefined()))
return nullptr;
exception_state.ThrowTypeError(
ExceptionMessages::ArgumentNotOfType(argument_index, "ArrayBuffer"));
return nullptr;
}
// SharedArrayBuffer
DOMSharedArrayBuffer* NativeValueTraits<DOMSharedArrayBuffer>::NativeValue(
v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMSharedArrayBuffer* shared_array_buffer =
ToDOMSharedArrayBuffer(isolate, value);
if (LIKELY(shared_array_buffer))
return shared_array_buffer;
exception_state.ThrowTypeError(
ExceptionMessages::FailedToConvertJSValue("SharedArrayBuffer"));
return nullptr;
}
DOMSharedArrayBuffer* NativeValueTraits<DOMSharedArrayBuffer>::ArgumentValue(
v8::Isolate* isolate,
int argument_index,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMSharedArrayBuffer* shared_array_buffer =
ToDOMSharedArrayBuffer(isolate, value);
if (LIKELY(shared_array_buffer))
return shared_array_buffer;
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index, "SharedArrayBuffer"));
return nullptr;
}
// Nullable SharedArrayBuffer
DOMSharedArrayBuffer*
NativeValueTraits<IDLNullable<DOMSharedArrayBuffer>>::NativeValue(
v8::Isolate* isolate,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMSharedArrayBuffer* shared_array_buffer =
ToDOMSharedArrayBuffer(isolate, value);
if (LIKELY(shared_array_buffer))
return shared_array_buffer;
if (LIKELY(value->IsNullOrUndefined()))
return nullptr;
exception_state.ThrowTypeError(
ExceptionMessages::FailedToConvertJSValue("SharedArrayBuffer"));
return nullptr;
}
DOMSharedArrayBuffer*
NativeValueTraits<IDLNullable<DOMSharedArrayBuffer>>::ArgumentValue(
v8::Isolate* isolate,
int argument_index,
v8::Local<v8::Value> value,
ExceptionState& exception_state) {
DOMSharedArrayBuffer* shared_array_buffer =
ToDOMSharedArrayBuffer(isolate, value);
if (LIKELY(shared_array_buffer))
return shared_array_buffer;
if (LIKELY(value->IsNullOrUndefined()))
return nullptr;
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index, "SharedArrayBuffer"));
return nullptr;
}
// 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) {
T* blink_view = ToDOMViewType<T, kNotShared>(isolate, value);
if (LIKELY(blink_view))
return NotShared<T>(blink_view);
if (ABVTrait<T>::IsShared(value)) {
exception_state.ThrowTypeError(
ExceptionMessages::SharedArrayBufferNotAllowed(
T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
exception_state.ThrowTypeError(ExceptionMessages::FailedToConvertJSValue(
T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
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) {
T* blink_view = ToDOMViewType<T, kNotShared>(isolate, value);
if (LIKELY(blink_view))
return NotShared<T>(blink_view);
if (ABVTrait<T>::IsShared(value)) {
exception_state.ThrowTypeError(
ExceptionMessages::SharedArrayBufferNotAllowed(
T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index, T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
// [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) {
T* blink_view = ToDOMViewType<T, kMaybeShared>(isolate, value);
if (LIKELY(blink_view))
return MaybeShared<T>(blink_view);
exception_state.ThrowTypeError(ExceptionMessages::FailedToConvertJSValue(
T::GetStaticWrapperTypeInfo()->interface_name));
return MaybeShared<T>();
}
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) {
T* blink_view = ToDOMViewType<T, kMaybeShared>(isolate, value);
if (LIKELY(blink_view))
return MaybeShared<T>(blink_view);
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index, T::GetStaticWrapperTypeInfo()->interface_name));
return MaybeShared<T>();
}
// 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) {
T* blink_view = ToDOMViewType<T, kNotShared>(isolate, value);
if (LIKELY(blink_view))
return NotShared<T>(blink_view);
if (LIKELY(value->IsNullOrUndefined()))
return NotShared<T>();
if (ABVTrait<T>::IsShared(value)) {
exception_state.ThrowTypeError(
ExceptionMessages::SharedArrayBufferNotAllowed(
T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
exception_state.ThrowTypeError(ExceptionMessages::FailedToConvertJSValue(
T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
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) {
T* blink_view = ToDOMViewType<T, kNotShared>(isolate, value);
if (LIKELY(blink_view))
return NotShared<T>(blink_view);
if (LIKELY(value->IsNullOrUndefined()))
return NotShared<T>();
if (ABVTrait<T>::IsShared(value)) {
exception_state.ThrowTypeError(
ExceptionMessages::SharedArrayBufferNotAllowed(
T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index, T::GetStaticWrapperTypeInfo()->interface_name));
return NotShared<T>();
}
// 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) {
T* blink_view = ToDOMViewType<T, kMaybeShared>(isolate, value);
if (LIKELY(blink_view))
return MaybeShared<T>(blink_view);
if (LIKELY(value->IsNullOrUndefined()))
return MaybeShared<T>();
exception_state.ThrowTypeError(ExceptionMessages::FailedToConvertJSValue(
T::GetStaticWrapperTypeInfo()->interface_name));
return MaybeShared<T>();
}
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) {
T* blink_view = ToDOMViewType<T, kMaybeShared>(isolate, value);
if (LIKELY(blink_view))
return MaybeShared<T>(blink_view);
if (LIKELY(value->IsNullOrUndefined()))
return MaybeShared<T>();
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index, T::GetStaticWrapperTypeInfo()->interface_name));
return MaybeShared<T>();
}
// [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) {
if (LIKELY(ABVTrait<T>::IsV8ViewType(value)))
return T(value.As<typename ABVTrait<T>::V8ViewType>());
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index,
ABVTrait<T>::DOMViewType::GetStaticWrapperTypeInfo()->interface_name));
return 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) {
if (LIKELY(ABVTrait<T>::IsV8ViewType(value)))
return T(value.As<typename ABVTrait<T>::V8ViewType>());
if (LIKELY(value->IsNullOrUndefined()))
return T();
exception_state.ThrowTypeError(ExceptionMessages::ArgumentNotOfType(
argument_index,
ABVTrait<T>::DOMViewType::GetStaticWrapperTypeInfo()->interface_name));
return T();
}
#define INSTANTIATE_NVT(type) \
template struct CORE_EXPORT NativeValueTraits<type>;
// NotShared<T>
INSTANTIATE_NVT(NotShared<DOMArrayBufferView>)
INSTANTIATE_NVT(NotShared<DOMInt8Array>)
INSTANTIATE_NVT(NotShared<DOMInt16Array>)
INSTANTIATE_NVT(NotShared<DOMInt32Array>)
INSTANTIATE_NVT(NotShared<DOMUint8Array>)
INSTANTIATE_NVT(NotShared<DOMUint8ClampedArray>)
INSTANTIATE_NVT(NotShared<DOMUint16Array>)
INSTANTIATE_NVT(NotShared<DOMUint32Array>)
INSTANTIATE_NVT(NotShared<DOMBigInt64Array>)
INSTANTIATE_NVT(NotShared<DOMBigUint64Array>)
INSTANTIATE_NVT(NotShared<DOMFloat32Array>)
INSTANTIATE_NVT(NotShared<DOMFloat64Array>)
INSTANTIATE_NVT(NotShared<DOMDataView>)
// MaybeShared<T>
INSTANTIATE_NVT(MaybeShared<DOMArrayBufferView>)
INSTANTIATE_NVT(MaybeShared<DOMInt8Array>)
INSTANTIATE_NVT(MaybeShared<DOMInt16Array>)
INSTANTIATE_NVT(MaybeShared<DOMInt32Array>)
INSTANTIATE_NVT(MaybeShared<DOMUint8Array>)
INSTANTIATE_NVT(MaybeShared<DOMUint8ClampedArray>)
INSTANTIATE_NVT(MaybeShared<DOMUint16Array>)
INSTANTIATE_NVT(MaybeShared<DOMUint32Array>)
INSTANTIATE_NVT(MaybeShared<DOMBigInt64Array>)
INSTANTIATE_NVT(MaybeShared<DOMBigUint64Array>)
INSTANTIATE_NVT(MaybeShared<DOMFloat32Array>)
INSTANTIATE_NVT(MaybeShared<DOMFloat64Array>)
INSTANTIATE_NVT(MaybeShared<DOMDataView>)
// IDLNullable<NotShared<T>>
INSTANTIATE_NVT(IDLNullable<NotShared<DOMArrayBufferView>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMInt8Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMInt16Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMInt32Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMUint8Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMUint8ClampedArray>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMUint16Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMUint32Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMBigInt64Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMBigUint64Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMFloat32Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMFloat64Array>>)
INSTANTIATE_NVT(IDLNullable<NotShared<DOMDataView>>)
// IDLNullable<MaybeShared<T>>
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMArrayBufferView>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMInt8Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMInt16Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMInt32Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMUint8Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMUint8ClampedArray>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMUint16Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMUint32Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMBigInt64Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMBigUint64Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMFloat32Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMFloat64Array>>)
INSTANTIATE_NVT(IDLNullable<MaybeShared<DOMDataView>>)
// FlexibleArrayBufferView
INSTANTIATE_NVT(FlexibleArrayBufferView)
INSTANTIATE_NVT(FlexibleInt8Array)
INSTANTIATE_NVT(FlexibleInt16Array)
INSTANTIATE_NVT(FlexibleInt32Array)
INSTANTIATE_NVT(FlexibleUint8Array)
INSTANTIATE_NVT(FlexibleUint8ClampedArray)
INSTANTIATE_NVT(FlexibleUint16Array)
INSTANTIATE_NVT(FlexibleUint32Array)
INSTANTIATE_NVT(FlexibleBigInt64Array)
INSTANTIATE_NVT(FlexibleBigUint64Array)
INSTANTIATE_NVT(FlexibleFloat32Array)
INSTANTIATE_NVT(FlexibleFloat64Array)
// IDLNullable<FlexibleArrayBufferView>
INSTANTIATE_NVT(IDLNullable<FlexibleArrayBufferView>)
INSTANTIATE_NVT(IDLNullable<FlexibleInt8Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleInt16Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleInt32Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleUint8Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleUint8ClampedArray>)
INSTANTIATE_NVT(IDLNullable<FlexibleUint16Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleUint32Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleBigInt64Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleBigUint64Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleFloat32Array>)
INSTANTIATE_NVT(IDLNullable<FlexibleFloat64Array>)
#undef INSTANTIATE_NVT
} // namespace blink