// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. bitfield struct JSArrayBufferFlags extends uint32 { is_external: bool: 1 bit; is_detachable: bool: 1 bit; was_detached: bool: 1 bit; is_asm_js_memory: bool: 1 bit; is_shared: bool: 1 bit; is_resizable: bool: 1 bit; } @generateCppClass extern class JSArrayBuffer extends JSObject { byte_length: uintptr; max_byte_length: uintptr; backing_store: ExternalPointer; extension: RawPtr; bit_field: JSArrayBufferFlags; // Pads header size to be a multiple of kTaggedSize. @if(TAGGED_SIZE_8_BYTES) optional_padding: uint32; @ifnot(TAGGED_SIZE_8_BYTES) optional_padding: void; } extern operator '.backing_store_ptr' macro LoadJSArrayBufferBackingStorePtr( JSArrayBuffer): RawPtr; @export macro IsDetachedBuffer(buffer: JSArrayBuffer): bool { return buffer.bit_field.was_detached; } @export macro IsSharedArrayBuffer(buffer: JSArrayBuffer): bool { return buffer.bit_field.is_shared; } @export macro IsResizableArrayBuffer(buffer: JSArrayBuffer): bool { return buffer.bit_field.is_resizable; } @abstract @generateCppClass extern class JSArrayBufferView extends JSObject { buffer: JSArrayBuffer; byte_offset: uintptr; byte_length: uintptr; } // We have 4 different TypedArrays: // 1) Normal (backed by AB / SAB) or non-length tracking backed by GSAB (can't // go oob once constructed) 2) Non-length tracking backed by RAB (can go oob // once constructed) 3) Length-tracking backed by RAB (JSArrayBuffer stores the // length) 4) Length-tracking backed by GSAB (BackingStore stores the length) bitfield struct JSTypedArrayFlags extends uint32 { is_length_tracking: bool: 1 bit; is_backed_by_rab: bool: 1 bit; } @generateCppClass extern class JSTypedArray extends JSArrayBufferView { length: uintptr; external_pointer: ExternalPointer; base_pointer: ByteArray|Smi; bit_field: JSTypedArrayFlags; // Pads header size to be a multiple of kTaggedSize. @if(TAGGED_SIZE_8_BYTES) optional_padding: uint32; @ifnot(TAGGED_SIZE_8_BYTES) optional_padding: void; } @export macro IsVariableLengthTypedArray(array: JSTypedArray): bool { return array.bit_field.is_length_tracking || array.bit_field.is_backed_by_rab; } @export macro IsLengthTrackingTypedArray(array: JSTypedArray): bool { return array.bit_field.is_length_tracking; } @generateCppClass extern class JSDataView extends JSArrayBufferView { data_pointer: ExternalPointer; } @abstract @doNotGenerateCast extern class TypedArrayConstructor extends JSFunction generates 'TNode'; @doNotGenerateCast extern class Uint8TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Int8TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Uint16TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Int16TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Uint32TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Int32TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Float32TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Float64TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Uint8ClampedTypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Biguint64TypedArrayConstructor extends TypedArrayConstructor generates 'TNode'; @doNotGenerateCast extern class Bigint64TypedArrayConstructor extends TypedArrayConstructor generates 'TNode';