19bool CanonicalNumericIndexString(Isolate* isolate,
20 const PropertyKey& lookup_key,
21 bool* is_minus_zero) {
23 DCHECK(lookup_key.is_element() || IsString(*lookup_key.name()));
25 if (lookup_key.is_element())
return true;
38 DirectHandle<String> str =
48 std::shared_ptr<BackingStore> backing_store,
66 SetupLazilyInitializedCppHeapPointerField(
67 JSAPIObjectWithEmbedderSlots::kCppHeapWrappableOffset);
74 set_max_byte_length(0);
80 DCHECK((is_resizable_by_js() == backing_store->is_resizable_by_js()) ||
81 (backing_store->is_wasm_memory() &&
is_shared()));
83 !backing_store->is_wasm_memory() && !backing_store->is_resizable_by_js(),
84 backing_store->byte_length() == backing_store->max_byte_length());
86 void* backing_store_buffer = backing_store->buffer_start();
89 DCHECK_IMPLIES(backing_store->is_wasm_memory(), !backing_store->IsEmpty());
92 backing_store->IsEmpty());
103 (
is_shared() && is_resizable_by_js()) ? 0 : backing_store->byte_length();
105 set_byte_length(byte_len);
111 auto max_byte_len = is_resizable_by_js() ? backing_store->max_byte_length()
112 : backing_store->byte_length();
113 set_max_byte_length(max_byte_len);
115 if (backing_store->is_wasm_memory()) {
116 set_is_detachable(
false);
124 bool force_for_wasm_memory,
126 Isolate*
const isolate = buffer->GetIsolate();
130 bool key_mismatch =
false;
132 if (!IsUndefined(*detach_key, isolate)) {
144 NewTypeError(MessageTemplate::kArrayBufferDetachKeyDoesntMatch),
148 if (buffer->was_detached())
return Just(
true);
150 if (force_for_wasm_memory) {
152 }
else if (!buffer->is_detachable()) {
157 buffer->DetachInternal(force_for_wasm_memory, isolate);
167 isolate->heap()->DetachArrayBufferExtension(
extension);
169 CHECK_IMPLIES(force_for_wasm_memory, backing_store->is_wasm_memory());
172 if (Protectors::IsArrayBufferDetachingIntact(isolate)) {
173 Protectors::InvalidateArrayBufferDetaching(isolate);
179 set_was_detached(
true);
187 DisallowJavascriptExecution no_js(isolate);
190 CHECK(buffer->is_resizable_by_js());
191 CHECK(buffer->is_shared());
192 return buffer->GetBackingStore()->byte_length(std::memory_order_seq_cst);
197 Isolate* isolate,
size_t byte_length,
size_t max_byte_length,
198 ShouldThrow should_throw,
size_t* page_size,
size_t* initial_pages,
210 isolate, NewRangeError(MessageTemplate::kInvalidArrayBufferLength),
218 isolate, NewRangeError(MessageTemplate::kInvalidArrayBufferMaxLength),
226std::optional<MessageTemplate>
228 Isolate* isolate,
size_t byte_length,
size_t max_byte_length,
229 size_t* page_size,
size_t* initial_pages,
size_t* max_pages) {
238 return MessageTemplate::kInvalidArrayBufferLength;
243 return MessageTemplate::kInvalidArrayBufferMaxLength;
249 Isolate* isolate, std::shared_ptr<BackingStore> backing_store) {
261 isolate->heap()->AppendArrayBufferExtension(
extension);
271 set_extension(
nullptr);
298 Isolate* isolate = GetIsolate();
307 DCHECK(!array_buffer->is_resizable_by_js());
310 DCHECK(array_buffer->IsEmpty());
313 size_t byte_length = self->byte_length();
318 if (!backing_store) {
319 isolate->heap()->FatalProcessOutOfMemory(
"JSTypedArray::GetBuffer");
323 if (byte_length > 0) {
324 memcpy(backing_store->buffer_start(), self->DataPtr(), byte_length);
329 std::move(backing_store), isolate);
332 self->set_elements(
ReadOnlyRoots(isolate).empty_byte_array());
333 self->SetOffHeapDataPtr(isolate, array_buffer->backing_store(), 0);
334 DCHECK(!self->is_on_heap());
352 bool is_minus_zero =
false;
354 CanonicalNumericIndexString(isolate, lookup_key, &is_minus_zero)) {
358 size_t index = lookup_key.
index();
359 bool out_of_bounds =
false;
360 size_t length = o->GetLengthOrOutOfBounds(out_of_bounds);
361 if (o->WasDetached() || out_of_bounds || index >= length) {
363 NewTypeError(MessageTemplate::kInvalidTypedArrayIndex));
365 if (!lookup_key.
is_element() || is_minus_zero) {
367 NewTypeError(MessageTemplate::kInvalidTypedArrayIndex));
380 NewTypeError(MessageTemplate::kRedefineDisallowed,
key));
383 if ((desc->has_configurable() && !desc->configurable()) ||
384 (desc->has_enumerable() && !desc->enumerable()) ||
385 (desc->has_writable() && !desc->writable())) {
387 NewTypeError(MessageTemplate::kRedefineDisallowed,
key));
392 if (desc->has_value()) {
393 if (!desc->has_configurable()) desc->set_configurable(
true);
394 if (!desc->has_enumerable()) desc->set_enumerable(
true);
395 if (!desc->has_writable()) desc->set_writable(
true);
400 DefineOwnPropertyIgnoreAttributes(&it, value, desc->ToAttributes()),
408 return OrdinaryDefineOwnProperty(isolate, o, lookup_key, desc, should_throw);
412 switch (
map()->elements_kind()) {
413#define ELEMENTS_KIND_TO_ARRAY_TYPE(Type, type, TYPE, ctype) \
414 case TYPE##_ELEMENTS: \
415 return kExternal##Type##Array;
419#undef ELEMENTS_KIND_TO_ARRAY_TYPE
427 switch (
map()->elements_kind()) {
428#define ELEMENTS_KIND_TO_ELEMENT_SIZE(Type, type, TYPE, ctype) \
429 case TYPE##_ELEMENTS: \
430 return sizeof(ctype);
434#undef ELEMENTS_KIND_TO_ELEMENT_SIZE
446 DisallowJavascriptExecution no_js(isolate);
448 CHECK(array->is_length_tracking());
450 CHECK(buffer->is_resizable_by_js());
451 CHECK(buffer->is_shared());
452 size_t backing_byte_length =
453 buffer->GetBackingStore()->byte_length(std::memory_order_seq_cst);
454 CHECK_GE(backing_byte_length, array->byte_offset());
456 return (backing_byte_length - array->byte_offset()) / element_byte_size;
460 bool& out_of_bounds)
const {
462 size_t own_byte_offset = byte_offset();
463 if (is_length_tracking()) {
465 size_t buffer_byte_length = buffer()->byte_length();
466 if (own_byte_offset > buffer_byte_length) {
467 out_of_bounds =
true;
470 return (buffer_byte_length - own_byte_offset);
473 size_t buffer_byte_length =
474 buffer()->GetBackingStore()->byte_length(std::memory_order_seq_cst);
475 SBXCHECK(own_byte_offset <= buffer_byte_length);
476 return buffer_byte_length - own_byte_offset;
479 size_t own_byte_length = byte_length();
480 size_t buffer_byte_length = buffer()->byte_length();
481 if (own_byte_length > buffer_byte_length ||
482 own_byte_offset > buffer_byte_length - own_byte_length) {
483 out_of_bounds =
true;
486 return own_byte_length;
#define SBXCHECK(condition)
static constexpr int kEmbedderFieldCount
@ kSharedArrayBufferConstructed
static std::unique_ptr< BackingStore > Allocate(Isolate *isolate, size_t byte_length, SharedFlag shared, InitializedFlag initialized)
V8_INLINE bool is_null() const
static V8_INLINE bool InYoungGeneration(Tagged< Object > object)
std::shared_ptr< BackingStore > RemoveExtension()
V8_EXPORT_PRIVATE ArrayBufferExtension * CreateExtension(Isolate *isolate, std::shared_ptr< BackingStore > backing_store)
V8_EXPORT_PRIVATE void Setup(SharedFlag shared, ResizableFlag resizable, std::shared_ptr< BackingStore > backing_store, Isolate *isolate)
void DetachInternal(bool force_for_wasm_memory, Isolate *isolate)
static size_t GsabByteLength(Isolate *isolate, Address raw_array_buffer)
V8_INLINE void clear_padding()
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT Maybe< bool > Detach(DirectHandle< JSArrayBuffer > buffer, bool force_for_wasm_memory=false, DirectHandle< Object > key={})
static constexpr size_t kMaxByteLength
void YoungMarkExtension()
static Maybe< bool > GetResizableBackingStorePageConfiguration(Isolate *isolate, size_t byte_length, size_t max_byte_length, ShouldThrow should_throw, size_t *page_size, size_t *initial_pages, size_t *max_pages)
void set_backing_store(Isolate *isolate, void *value)
static std::optional< MessageTemplate > GetResizableBackingStorePageConfigurationImpl(Isolate *isolate, size_t byte_length, size_t max_byte_length, size_t *page_size, size_t *initial_pages, size_t *max_pages)
void YoungMarkExtensionPromoted()
size_t GetVariableByteLengthOrOutOfBounds(bool &out_of_bounds) const
V8_EXPORT_PRIVATE Handle< JSArrayBuffer > GetBuffer()
size_t GetVariableLengthOrOutOfBounds(bool &out_of_bounds) const
V8_EXPORT_PRIVATE size_t element_size() const
static V8_WARN_UNUSED_RESULT Maybe< bool > DefineOwnProperty(Isolate *isolate, DirectHandle< JSTypedArray > o, DirectHandle< Object > key, PropertyDescriptor *desc, Maybe< ShouldThrow > should_throw)
static size_t LengthTrackingGsabBackedTypedArrayLength(Isolate *isolate, Address raw_array)
static V8_WARN_UNUSED_RESULT HandleType< String >::MaybeType ToString(Isolate *isolate, HandleType< T > input)
static V8_EXPORT_PRIVATE bool SameValue(Tagged< Object > obj, Tagged< Object > other)
static V8_EXPORT_PRIVATE bool StrictEquals(Tagged< Object > obj, Tagged< Object > that)
static bool IsAccessorDescriptor(PropertyDescriptor *desc)
static constexpr Tagged< Smi > zero()
static HandleType< Number > ToNumber(Isolate *isolate, HandleType< String > subject)
#define V8_ENABLE_SANDBOX_BOOL
#define RAB_GSAB_TYPED_ARRAYS(V)
#define RAB_GSAB_TYPED_ARRAYS_WITH_TYPED_ARRAY_TYPE(V)
#define THROW_NEW_ERROR_RETURN_VALUE(isolate, call, value)
#define RETURN_FAILURE(isolate, should_throw, call)
#define RETURN_ON_EXCEPTION_VALUE(isolate, call, value)
#define ELEMENTS_KIND_TO_ELEMENT_SIZE(Type, type, TYPE, ctype)
#define ELEMENTS_KIND_TO_ARRAY_TYPE(Type, type, TYPE, ctype)
SharedFunctionInfoRef shared
ZoneVector< RpoNumber > & result
bool is_minus_zero(T value)
bool IsNumber(Tagged< Object > obj)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
bool RoundUpToPageSize(size_t byte_length, size_t page_size, size_t max_allowed_byte_length, size_t *pages)
Handle< To > UncheckedCast(Handle< From > value)
ShouldThrow GetShouldThrow(Isolate *isolate, Maybe< ShouldThrow > should_throw)
V8_INLINE void * EmptyBackingStoreBuffer()
size_t AllocatePageSize()
static bool IsMinusZero(double value)
bool IsTypedArrayOrRabGsabTypedArrayElementsKind(ElementsKind kind)
JSArrayBuffer::IsDetachableBit is_shared
constexpr int ElementsKindToByteSize(ElementsKind elements_kind)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Maybe< T > Just(const T &t)
#define CHECK_GE(lhs, rhs)
#define CHECK_IMPLIES(lhs, rhs)
#define CHECK_LE(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)