5#ifndef V8_OBJECTS_JS_ARRAY_BUFFER_INL_H_
6#define V8_OBJECTS_JS_ARRAY_BUFFER_INL_H_
21#include "torque-generated/src/objects/js-array-buffer-tq-inl.inc"
37 return byte_length_unchecked();
44void JSArrayBuffer::set_byte_length(
size_t value) {
48size_t JSArrayBuffer::max_byte_length()
const {
52void JSArrayBuffer::set_max_byte_length(
size_t value) {
58 return reinterpret_cast<void*
>(
value);
87 return backing_store->byte_length(std::memory_order_seq_cst);
93 return static_cast<uint32_t
>(ReadField<Address>(kBackingStoreOffset));
97 WriteField<Address>(kBackingStoreOffset,
static_cast<Address>(ref));
101#if V8_COMPRESS_POINTERS
111#if V8_COMPRESS_POINTERS
125void JSArrayBuffer::set_extension(ArrayBufferExtension*
extension) {
126#if V8_COMPRESS_POINTERS
133 ExternalPointerTable& table = isolate.GetExternalPointerTableFor(tag);
140 isolate.GetExternalPointerTableSpaceFor(tag, address()), value, tag);
144 table.Set(current_handle, value, tag);
152#if V8_COMPRESS_POINTERS
154 Address location = field_address(kExtensionOffset);
159 Address location = field_address(kExtensionOffset);
165 if (
FIELD_SIZE(kOptionalPaddingOffset) != 0) {
167 memset(
reinterpret_cast<void*
>(address() + kOptionalPaddingOffset), 0,
174void JSArrayBuffer::set_bit_field(uint32_t bits) {
178uint32_t JSArrayBuffer::bit_field()
const {
184 JSArrayBuffer::IsExternalBit)
195 auto backing_store = GetBackingStore();
196 bool is_empty = !backing_store || backing_store->IsEmpty();
201size_t JSArrayBufferView::byte_offset()
const {
205void JSArrayBufferView::set_byte_offset(
size_t value) {
209size_t JSArrayBufferView::byte_length()
const {
213void JSArrayBufferView::set_byte_length(
size_t value) {
222 JSArrayBufferView::IsLengthTrackingBit)
232 if (WasDetached())
return 0;
233 if (IsVariableLength()) {
240 bool out_of_bounds =
false;
249 bool out_of_bounds =
false;
251 return out_of_bounds;
269 size_t* element_size,
271 switch (array_type) {
272#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype) \
273 case kExternal##Type##Array: \
274 *element_size = sizeof(ctype); \
275 *element_kind = TYPE##_ELEMENTS; \
279#undef TYPED_ARRAY_CASE
284size_t JSTypedArray::length()
const {
285 DCHECK(!is_length_tracking());
294void JSTypedArray::set_length(
size_t value) {
308#ifdef V8_COMPRESS_POINTERS
309 return cage_base.address();
317 return static_cast<uint32_t
>(ReadField<Address>(kExternalPointerOffset));
322 WriteField<Address>(kExternalPointerOffset,
static_cast<Address>(ref));
330 WriteField<Address>(kExternalPointerOffset,
offset);
336 Address pointer = ReadField<Address>(kExternalPointerOffset) +
347 return reinterpret_cast<void*
>(external_pointer() +
348 static_cast<Tagged_t>(base_pointer().ptr()));
391 isolate->factory()->NewStringFromAsciiChecked(method_name);
395 if (
V8_UNLIKELY(array->IsVariableLength() && array->IsOutOfBounds())) {
398 isolate->factory()->NewStringFromAsciiChecked(method_name);
409 return reinterpret_cast<void*
>(
value);
422 if (is_length_tracking()) {
425 return buffer()->GetByteLength() - byte_offset();
427 return byte_length();
434 if (is_length_tracking()) {
435 return byte_offset() > buffer()->GetByteLength();
437 return byte_offset() + byte_length() > buffer()->GetByteLength();
#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype)
static void Release_Store(T *addr, typename std::remove_reference< T >::type new_value)
static T Acquire_Load(T *addr)
static T Relaxed_Load(T *addr)
size_t byte_length_unchecked() const
void SetBackingStoreRefForSerialization(uint32_t ref)
uint32_t GetBackingStoreRefForDeserialization() const
V8_INLINE void clear_padding()
size_t GetByteLength() const
void set_backing_store(Isolate *isolate, void *value)
ArrayBufferExtension ** extension_location() const
std::shared_ptr< BackingStore > GetBackingStore() const
void set_data_pointer(Isolate *isolate, void *value)
size_t GetByteLength() const
bool IsOutOfBounds() const
void SetOffHeapDataPtr(Isolate *isolate, void *base, Address offset)
static Address ExternalPointerCompensationForOnHeapArray(PtrComprCageBase cage_base)
bool IsOutOfBounds() const
void RemoveExternalPointerCompensationForSerialization(Isolate *isolate)
size_t GetLengthOrOutOfBounds(bool &out_of_bounds) const
uint32_t GetExternalBackingStoreRefForDeserialization() const
size_t GetVariableLengthOrOutOfBounds(bool &out_of_bounds) const
size_t GetByteLength() const
static constexpr bool kOffHeapDataPtrEqualsExternalPointer
V8_EXPORT_PRIVATE size_t element_size() const
size_t LengthUnchecked() const
static MaybeDirectHandle< JSTypedArray > Validate(Isolate *isolate, DirectHandle< Object > receiver, const char *method_name)
void set_external_pointer(Isolate *isolate, Address value)
bool IsDetachedOrOutOfBounds() const
void AddExternalPointerCompensationForDeserialization(Isolate *isolate)
void SetExternalBackingStoreRefForSerialization(uint32_t ref)
static void ForFixedTypedArray(ExternalArrayType array_type, size_t *element_size, ElementsKind *element_kind)
static constexpr Tagged< Smi > zero()
static void ForArrayBufferExtension(Tagged< JSArrayBuffer > host, ArrayBufferExtension *extension)
#define THROW_NEW_ERROR(isolate, call)
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
V8_INLINE size_t ReadBoundedSizeField(Address field_address)
V8_INLINE Address ReadSandboxedPointerField(Address field_address, PtrComprCageBase cage_base)
V8_INLINE void WriteBoundedSizeField(Address field_address, size_t value)
V8_INLINE Isolate * GetIsolateFromWritableObject(Tagged< HeapObject > object)
constexpr ExternalPointerHandle kNullExternalPointerHandle
@ kArrayBufferExtensionTag
uint32_t ExternalPointerHandle
V8_INLINE void WriteSandboxedPointerField(Address field_address, PtrComprCageBase cage_base, Address pointer)
JSArrayBuffer::IsDetachableBit is_shared
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr ReleaseStoreTag kReleaseStore
#define RELAXED_READ_UINT32_FIELD(p, offset)
#define ACCESSORS(holder, name, type, offset)
#define EXTERNAL_POINTER_WRITE_BARRIER(object, offset, tag)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define RELAXED_WRITE_UINT32_FIELD(p, offset, value)
#define BIT_FIELD_ACCESSORS(holder, field, name, BitField)
#define RELEASE_ACQUIRE_ACCESSORS(holder, name, type, offset)
#define DEF_GETTER(Camel, Lower, Bit)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_UNLIKELY(condition)