mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:17:44 +00:00
LibJS: Update spec headers of ArrayBuffer, TypedArray, DataView, Atomics
After the resizable ArrayBuffer proposal was merged, a bunch of methods had their spec numbers/headers changed. This patch just updates existing methods to make future patches easier to grok.
This commit is contained in:
parent
d053d6f7bb
commit
4f32392426
10 changed files with 72 additions and 72 deletions
|
@ -138,7 +138,7 @@ void copy_data_block_bytes(ByteBuffer& to_block, u64 to_index, ByteBuffer const&
|
||||||
// 7. Return unused.
|
// 7. Return unused.
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.2.1 AllocateArrayBuffer ( constructor, byteLength ), https://tc39.es/ecma262/#sec-allocatearraybuffer
|
// 25.1.3.1 AllocateArrayBuffer ( constructor, byteLength [ , maxByteLength ] ), https://tc39.es/ecma262/#sec-allocatearraybuffer
|
||||||
ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(VM& vm, FunctionObject& constructor, size_t byte_length)
|
ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(VM& vm, FunctionObject& constructor, size_t byte_length)
|
||||||
{
|
{
|
||||||
// 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] »).
|
// 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] »).
|
||||||
|
@ -156,7 +156,7 @@ ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(VM& vm, FunctionObject& co
|
||||||
return obj.ptr();
|
return obj.ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.2.3 DetachArrayBuffer ( arrayBuffer [ , key ] ), https://tc39.es/ecma262/#sec-detacharraybuffer
|
// 25.1.3.4 DetachArrayBuffer ( arrayBuffer [ , key ] ), https://tc39.es/ecma262/#sec-detacharraybuffer
|
||||||
ThrowCompletionOr<void> detach_array_buffer(VM& vm, ArrayBuffer& array_buffer, Optional<Value> key)
|
ThrowCompletionOr<void> detach_array_buffer(VM& vm, ArrayBuffer& array_buffer, Optional<Value> key)
|
||||||
{
|
{
|
||||||
// 1. Assert: IsSharedArrayBuffer(arrayBuffer) is false.
|
// 1. Assert: IsSharedArrayBuffer(arrayBuffer) is false.
|
||||||
|
@ -178,7 +178,7 @@ ThrowCompletionOr<void> detach_array_buffer(VM& vm, ArrayBuffer& array_buffer, O
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.2.4 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength, cloneConstructor ), https://tc39.es/ecma262/#sec-clonearraybuffer
|
// 25.1.3.5 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength, cloneConstructor ), https://tc39.es/ecma262/#sec-clonearraybuffer
|
||||||
ThrowCompletionOr<ArrayBuffer*> clone_array_buffer(VM& vm, ArrayBuffer& source_buffer, size_t source_byte_offset, size_t source_length)
|
ThrowCompletionOr<ArrayBuffer*> clone_array_buffer(VM& vm, ArrayBuffer& source_buffer, size_t source_byte_offset, size_t source_length)
|
||||||
{
|
{
|
||||||
auto& realm = *vm.current_realm();
|
auto& realm = *vm.current_realm();
|
||||||
|
@ -249,7 +249,7 @@ ThrowCompletionOr<ArrayBuffer*> array_buffer_copy_and_detach(VM& vm, ArrayBuffer
|
||||||
return new_buffer;
|
return new_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.1.1 AllocateSharedArrayBuffer ( constructor, byteLength ), https://tc39.es/ecma262/#sec-allocatesharedarraybuffer
|
// 25.2.2.1 AllocateSharedArrayBuffer ( constructor, byteLength [ , maxByteLength ] ), https://tc39.es/ecma262/#sec-allocatesharedarraybuffer
|
||||||
ThrowCompletionOr<NonnullGCPtr<ArrayBuffer>> allocate_shared_array_buffer(VM& vm, FunctionObject& constructor, size_t byte_length)
|
ThrowCompletionOr<NonnullGCPtr<ArrayBuffer>> allocate_shared_array_buffer(VM& vm, FunctionObject& constructor, size_t byte_length)
|
||||||
{
|
{
|
||||||
// 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] »).
|
// 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] »).
|
||||||
|
|
|
@ -77,7 +77,7 @@ public:
|
||||||
|
|
||||||
void detach_buffer() { m_data_block.byte_buffer = Empty {}; }
|
void detach_buffer() { m_data_block.byte_buffer = Empty {}; }
|
||||||
|
|
||||||
// 25.1.2.2 IsDetachedBuffer ( arrayBuffer ), https://tc39.es/ecma262/#sec-isdetachedbuffer
|
// 25.1.3.3 IsDetachedBuffer ( arrayBuffer ), https://tc39.es/ecma262/#sec-isdetachedbuffer
|
||||||
bool is_detached() const
|
bool is_detached() const
|
||||||
{
|
{
|
||||||
// 1. If arrayBuffer.[[ArrayBufferData]] is null, return true.
|
// 1. If arrayBuffer.[[ArrayBufferData]] is null, return true.
|
||||||
|
@ -87,7 +87,7 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.1.2 IsSharedArrayBuffer ( obj ), https://tc39.es/ecma262/#sec-issharedarraybuffer
|
// 25.2.2.2 IsSharedArrayBuffer ( obj ), https://tc39.es/ecma262/#sec-issharedarraybuffer
|
||||||
bool is_shared_array_buffer() const
|
bool is_shared_array_buffer() const
|
||||||
{
|
{
|
||||||
// 1. Let bufferData be obj.[[ArrayBufferData]].
|
// 1. Let bufferData be obj.[[ArrayBufferData]].
|
||||||
|
@ -134,7 +134,7 @@ ThrowCompletionOr<ArrayBuffer*> clone_array_buffer(VM&, ArrayBuffer& source_buff
|
||||||
ThrowCompletionOr<ArrayBuffer*> array_buffer_copy_and_detach(VM&, ArrayBuffer& array_buffer, Value new_length, PreserveResizability preserve_resizability);
|
ThrowCompletionOr<ArrayBuffer*> array_buffer_copy_and_detach(VM&, ArrayBuffer& array_buffer, Value new_length, PreserveResizability preserve_resizability);
|
||||||
ThrowCompletionOr<NonnullGCPtr<ArrayBuffer>> allocate_shared_array_buffer(VM&, FunctionObject& constructor, size_t byte_length);
|
ThrowCompletionOr<NonnullGCPtr<ArrayBuffer>> allocate_shared_array_buffer(VM&, FunctionObject& constructor, size_t byte_length);
|
||||||
|
|
||||||
// 25.1.2.9 RawBytesToNumeric ( type, rawBytes, isLittleEndian ), https://tc39.es/ecma262/#sec-rawbytestonumeric
|
// 25.1.3.13 RawBytesToNumeric ( type, rawBytes, isLittleEndian ), https://tc39.es/ecma262/#sec-rawbytestonumeric
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static Value raw_bytes_to_numeric(VM& vm, Bytes raw_value, bool is_little_endian)
|
static Value raw_bytes_to_numeric(VM& vm, Bytes raw_value, bool is_little_endian)
|
||||||
{
|
{
|
||||||
|
@ -206,7 +206,7 @@ static Value raw_bytes_to_numeric(VM& vm, Bytes raw_value, bool is_little_endian
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implementation for 25.1.2.10 GetValueFromBuffer, used in TypedArray<T>::get_value_from_buffer(), https://tc39.es/ecma262/#sec-getvaluefrombuffer
|
// 25.1.3.15 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getvaluefrombuffer
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Value ArrayBuffer::get_value(size_t byte_index, [[maybe_unused]] bool is_typed_array, Order, bool is_little_endian)
|
Value ArrayBuffer::get_value(size_t byte_index, [[maybe_unused]] bool is_typed_array, Order, bool is_little_endian)
|
||||||
{
|
{
|
||||||
|
@ -252,7 +252,7 @@ Value ArrayBuffer::get_value(size_t byte_index, [[maybe_unused]] bool is_typed_a
|
||||||
return raw_bytes_to_numeric<T>(vm, raw_value, is_little_endian);
|
return raw_bytes_to_numeric<T>(vm, raw_value, is_little_endian);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.2.11 NumericToRawBytes ( type, value, isLittleEndian ), https://tc39.es/ecma262/#sec-numerictorawbytes
|
// 25.1.3.16 NumericToRawBytes ( type, value, isLittleEndian ), https://tc39.es/ecma262/#sec-numerictorawbytes
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void numeric_to_raw_bytes(VM& vm, Value value, bool is_little_endian, Bytes raw_bytes)
|
static void numeric_to_raw_bytes(VM& vm, Value value, bool is_little_endian, Bytes raw_bytes)
|
||||||
{
|
{
|
||||||
|
@ -317,7 +317,7 @@ static void numeric_to_raw_bytes(VM& vm, Value value, bool is_little_endian, Byt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.2.12 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-setvalueinbuffer
|
// 25.1.3.17 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-setvalueinbuffer
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] bool is_typed_array, Order, bool is_little_endian)
|
void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] bool is_typed_array, Order, bool is_little_endian)
|
||||||
{
|
{
|
||||||
|
@ -363,7 +363,7 @@ void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] boo
|
||||||
// 10. Return unused.
|
// 10. Return unused.
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer
|
// 25.1.3.18 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Value ArrayBuffer::get_modify_set_value(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian)
|
Value ArrayBuffer::get_modify_set_value(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,19 +26,19 @@ void ArrayBufferConstructor::initialize(Realm& realm)
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
Base::initialize(realm);
|
Base::initialize(realm);
|
||||||
|
|
||||||
// 25.1.4.2 ArrayBuffer.prototype, https://tc39.es/ecma262/#sec-arraybuffer.prototype
|
// 25.1.5.2 ArrayBuffer.prototype, https://tc39.es/ecma262/#sec-arraybuffer.prototype
|
||||||
define_direct_property(vm.names.prototype, realm.intrinsics().array_buffer_prototype(), 0);
|
define_direct_property(vm.names.prototype, realm.intrinsics().array_buffer_prototype(), 0);
|
||||||
|
|
||||||
u8 attr = Attribute::Writable | Attribute::Configurable;
|
u8 attr = Attribute::Writable | Attribute::Configurable;
|
||||||
define_native_function(realm, vm.names.isView, is_view, 1, attr);
|
define_native_function(realm, vm.names.isView, is_view, 1, attr);
|
||||||
|
|
||||||
// 25.1.5.4 ArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-arraybuffer.prototype-@@tostringtag
|
// 25.1.6.7 ArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-arraybuffer.prototype-@@tostringtag
|
||||||
define_native_accessor(realm, vm.well_known_symbol_species(), symbol_species_getter, {}, Attribute::Configurable);
|
define_native_accessor(realm, vm.well_known_symbol_species(), symbol_species_getter, {}, Attribute::Configurable);
|
||||||
|
|
||||||
define_direct_property(vm.names.length, Value(1), Attribute::Configurable);
|
define_direct_property(vm.names.length, Value(1), Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.3.1 ArrayBuffer ( length ), https://tc39.es/ecma262/#sec-arraybuffer-length
|
// 25.1.4.1 ArrayBuffer ( length [ , options ] ), https://tc39.es/ecma262/#sec-arraybuffer-length
|
||||||
ThrowCompletionOr<Value> ArrayBufferConstructor::call()
|
ThrowCompletionOr<Value> ArrayBufferConstructor::call()
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
@ -47,7 +47,7 @@ ThrowCompletionOr<Value> ArrayBufferConstructor::call()
|
||||||
return vm.throw_completion<TypeError>(ErrorType::ConstructorWithoutNew, vm.names.ArrayBuffer);
|
return vm.throw_completion<TypeError>(ErrorType::ConstructorWithoutNew, vm.names.ArrayBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.3.1 ArrayBuffer ( length ), https://tc39.es/ecma262/#sec-arraybuffer-length
|
// 25.1.4.1 ArrayBuffer ( length [ , options ] ), https://tc39.es/ecma262/#sec-arraybuffer-length
|
||||||
ThrowCompletionOr<NonnullGCPtr<Object>> ArrayBufferConstructor::construct(FunctionObject& new_target)
|
ThrowCompletionOr<NonnullGCPtr<Object>> ArrayBufferConstructor::construct(FunctionObject& new_target)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
@ -68,7 +68,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> ArrayBufferConstructor::construct(Functi
|
||||||
return *TRY(allocate_array_buffer(vm, new_target, byte_length_or_error.release_value()));
|
return *TRY(allocate_array_buffer(vm, new_target, byte_length_or_error.release_value()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.4.1 ArrayBuffer.isView ( arg ), https://tc39.es/ecma262/#sec-arraybuffer.isview
|
// 25.1.5.1 ArrayBuffer.isView ( arg ), https://tc39.es/ecma262/#sec-arraybuffer.isview
|
||||||
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferConstructor::is_view)
|
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferConstructor::is_view)
|
||||||
{
|
{
|
||||||
auto arg = vm.argument(0);
|
auto arg = vm.argument(0);
|
||||||
|
@ -87,7 +87,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayBufferConstructor::is_view)
|
||||||
return Value(false);
|
return Value(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.4.3 get ArrayBuffer [ @@species ], https://tc39.es/ecma262/#sec-get-arraybuffer-@@species
|
// 25.1.5.3 get ArrayBuffer [ @@species ], https://tc39.es/ecma262/#sec-get-arraybuffer-@@species
|
||||||
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferConstructor::symbol_species_getter)
|
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferConstructor::symbol_species_getter)
|
||||||
{
|
{
|
||||||
// 1. Return the this value.
|
// 1. Return the this value.
|
||||||
|
|
|
@ -26,17 +26,35 @@ void ArrayBufferPrototype::initialize(Realm& realm)
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
Base::initialize(realm);
|
Base::initialize(realm);
|
||||||
u8 attr = Attribute::Writable | Attribute::Configurable;
|
u8 attr = Attribute::Writable | Attribute::Configurable;
|
||||||
|
define_native_accessor(realm, vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable);
|
||||||
define_native_function(realm, vm.names.slice, slice, 2, attr);
|
define_native_function(realm, vm.names.slice, slice, 2, attr);
|
||||||
|
define_native_accessor(realm, vm.names.detached, detached_getter, {}, Attribute::Configurable);
|
||||||
define_native_function(realm, vm.names.transfer, transfer, 0, attr);
|
define_native_function(realm, vm.names.transfer, transfer, 0, attr);
|
||||||
define_native_function(realm, vm.names.transferToFixedLength, transfer_to_fixed_length, 0, attr);
|
define_native_function(realm, vm.names.transferToFixedLength, transfer_to_fixed_length, 0, attr);
|
||||||
define_native_accessor(realm, vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable);
|
|
||||||
define_native_accessor(realm, vm.names.detached, detached_getter, {}, Attribute::Configurable);
|
|
||||||
|
|
||||||
// 25.1.5.4 ArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-arraybuffer.prototype-@@tostringtag
|
// 25.1.6.7 ArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-arraybuffer.prototype-@@tostringtag
|
||||||
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, vm.names.ArrayBuffer.as_string()), Attribute::Configurable);
|
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, vm.names.ArrayBuffer.as_string()), Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.5.3 ArrayBuffer.prototype.slice ( start, end ), https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice
|
// 25.1.6.1 get ArrayBuffer.prototype.byteLength, https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.bytelength
|
||||||
|
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::byte_length_getter)
|
||||||
|
{
|
||||||
|
// 1. Let O be the this value.
|
||||||
|
// 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
|
||||||
|
auto array_buffer_object = TRY(typed_this_value(vm));
|
||||||
|
|
||||||
|
// 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
|
||||||
|
if (array_buffer_object->is_shared_array_buffer())
|
||||||
|
return vm.throw_completion<TypeError>(ErrorType::ThisCannotBeSharedArrayBuffer);
|
||||||
|
|
||||||
|
// NOTE: These steps are done in byte_length()
|
||||||
|
// 4. If IsDetachedBuffer(O) is true, return +0𝔽.
|
||||||
|
// 5. Let length be O.[[ArrayBufferByteLength]].
|
||||||
|
// 6. Return 𝔽(length).
|
||||||
|
return Value(array_buffer_object->byte_length());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 25.1.6.6 ArrayBuffer.prototype.slice ( start, end ), https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice
|
||||||
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice)
|
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice)
|
||||||
{
|
{
|
||||||
auto& realm = *vm.current_realm();
|
auto& realm = *vm.current_realm();
|
||||||
|
@ -133,24 +151,6 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice)
|
||||||
return new_array_buffer_object;
|
return new_array_buffer_object;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.1.5.1 get ArrayBuffer.prototype.byteLength, https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.bytelength
|
|
||||||
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::byte_length_getter)
|
|
||||||
{
|
|
||||||
// 1. Let O be the this value.
|
|
||||||
// 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
|
|
||||||
auto array_buffer_object = TRY(typed_this_value(vm));
|
|
||||||
|
|
||||||
// 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
|
|
||||||
if (array_buffer_object->is_shared_array_buffer())
|
|
||||||
return vm.throw_completion<TypeError>(ErrorType::ThisCannotBeSharedArrayBuffer);
|
|
||||||
|
|
||||||
// NOTE: These steps are done in byte_length()
|
|
||||||
// 4. If IsDetachedBuffer(O) is true, return +0𝔽.
|
|
||||||
// 5. Let length be O.[[ArrayBufferByteLength]].
|
|
||||||
// 6. Return 𝔽(length).
|
|
||||||
return Value(array_buffer_object->byte_length());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 25.1.5.4 get ArrayBuffer.prototype.detached, https://tc39.es/proposal-arraybuffer-transfer/#sec-get-arraybuffer.prototype.detached
|
// 25.1.5.4 get ArrayBuffer.prototype.detached, https://tc39.es/proposal-arraybuffer-transfer/#sec-get-arraybuffer.prototype.detached
|
||||||
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::detached_getter)
|
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::detached_getter)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,11 +22,11 @@ public:
|
||||||
private:
|
private:
|
||||||
explicit ArrayBufferPrototype(Realm&);
|
explicit ArrayBufferPrototype(Realm&);
|
||||||
|
|
||||||
|
JS_DECLARE_NATIVE_FUNCTION(byte_length_getter);
|
||||||
JS_DECLARE_NATIVE_FUNCTION(slice);
|
JS_DECLARE_NATIVE_FUNCTION(slice);
|
||||||
|
JS_DECLARE_NATIVE_FUNCTION(detached_getter);
|
||||||
JS_DECLARE_NATIVE_FUNCTION(transfer);
|
JS_DECLARE_NATIVE_FUNCTION(transfer);
|
||||||
JS_DECLARE_NATIVE_FUNCTION(transfer_to_fixed_length);
|
JS_DECLARE_NATIVE_FUNCTION(transfer_to_fixed_length);
|
||||||
JS_DECLARE_NATIVE_FUNCTION(byte_length_getter);
|
|
||||||
JS_DECLARE_NATIVE_FUNCTION(detached_getter);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ static ThrowCompletionOr<size_t> validate_atomic_access(VM& vm, TypedArrayBase&
|
||||||
return (access_index * element_size) + offset;
|
return (access_index * element_size) + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.2.11 AtomicReadModifyWrite ( typedArray, index, value, op ), https://tc39.es/ecma262/#sec-atomicreadmodifywrite
|
// 25.4.2.17 AtomicReadModifyWrite ( typedArray, index, value, op ), https://tc39.es/ecma262/#sec-atomicreadmodifywrite
|
||||||
static ThrowCompletionOr<Value> atomic_read_modify_write(VM& vm, TypedArrayBase& typed_array, Value index, Value value, ReadWriteModifyFunction operation)
|
static ThrowCompletionOr<Value> atomic_read_modify_write(VM& vm, TypedArrayBase& typed_array, Value index, Value value, ReadWriteModifyFunction operation)
|
||||||
{
|
{
|
||||||
// 1. Let buffer be ? ValidateIntegerTypedArray(typedArray).
|
// 1. Let buffer be ? ValidateIntegerTypedArray(typedArray).
|
||||||
|
@ -216,11 +216,11 @@ void AtomicsObject::initialize(Realm& realm)
|
||||||
define_native_function(realm, vm.names.notify, notify, 3, attr);
|
define_native_function(realm, vm.names.notify, notify, 3, attr);
|
||||||
define_native_function(realm, vm.names.xor_, xor_, 3, attr);
|
define_native_function(realm, vm.names.xor_, xor_, 3, attr);
|
||||||
|
|
||||||
// 25.4.15 Atomics [ @@toStringTag ], https://tc39.es/ecma262/#sec-atomics-@@tostringtag
|
// 25.4.17 Atomics [ @@toStringTag ], https://tc39.es/ecma262/#sec-atomics-@@tostringtag
|
||||||
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, "Atomics"_string), Attribute::Configurable);
|
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, "Atomics"_string), Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.3 Atomics.add ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.add
|
// 25.4.4 Atomics.add ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.add
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::add)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::add)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
@ -236,7 +236,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::add)
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.4 Atomics.and ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.and
|
// 25.4.5 Atomics.and ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.and
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::and_)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::and_)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
@ -252,7 +252,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::and_)
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implementation of 25.4.5 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue ), https://tc39.es/ecma262/#sec-atomics.compareexchange
|
// 25.4.6 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue ), https://tc39.es/ecma262/#sec-atomics.compareexchange
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static ThrowCompletionOr<Value> atomic_compare_exchange_impl(VM& vm, TypedArrayBase& typed_array)
|
static ThrowCompletionOr<Value> atomic_compare_exchange_impl(VM& vm, TypedArrayBase& typed_array)
|
||||||
{
|
{
|
||||||
|
@ -331,7 +331,7 @@ static ThrowCompletionOr<Value> atomic_compare_exchange_impl(VM& vm, TypedArrayB
|
||||||
return raw_bytes_to_numeric<T>(vm, raw_bytes_read, is_little_endian);
|
return raw_bytes_to_numeric<T>(vm, raw_bytes_read, is_little_endian);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.5 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue ), https://tc39.es/ecma262/#sec-atomics.compareexchange
|
// 25.4.6 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue ), https://tc39.es/ecma262/#sec-atomics.compareexchange
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::compare_exchange)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::compare_exchange)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
@ -345,7 +345,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::compare_exchange)
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.6 Atomics.exchange ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.exchange
|
// 25.4.7 Atomics.exchange ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.exchange
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::exchange)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::exchange)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
@ -361,7 +361,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::exchange)
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.7 Atomics.isLockFree ( size ), https://tc39.es/ecma262/#sec-atomics.islockfree
|
// 25.4.8 Atomics.isLockFree ( size ), https://tc39.es/ecma262/#sec-atomics.islockfree
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::is_lock_free)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::is_lock_free)
|
||||||
{
|
{
|
||||||
auto size = TRY(vm.argument(0).to_integer_or_infinity(vm));
|
auto size = TRY(vm.argument(0).to_integer_or_infinity(vm));
|
||||||
|
@ -376,7 +376,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::is_lock_free)
|
||||||
return Value(false);
|
return Value(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.8 Atomics.load ( typedArray, index ), https://tc39.es/ecma262/#sec-atomics.load
|
// 25.4.9 Atomics.load ( typedArray, index ), https://tc39.es/ecma262/#sec-atomics.load
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::load)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::load)
|
||||||
{
|
{
|
||||||
// 1. Let buffer be ? ValidateIntegerTypedArray(typedArray).
|
// 1. Let buffer be ? ValidateIntegerTypedArray(typedArray).
|
||||||
|
@ -397,7 +397,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::load)
|
||||||
return typed_array->get_value_from_buffer(indexed_position, ArrayBuffer::Order::SeqCst, true);
|
return typed_array->get_value_from_buffer(indexed_position, ArrayBuffer::Order::SeqCst, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.9 Atomics.or ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.or
|
// 25.4.10 Atomics.or ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.or
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::or_)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::or_)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
@ -413,7 +413,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::or_)
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.10 Atomics.store ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.store
|
// 25.4.11 Atomics.store ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.store
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store)
|
||||||
{
|
{
|
||||||
// 1. Let buffer be ? ValidateIntegerTypedArray(typedArray).
|
// 1. Let buffer be ? ValidateIntegerTypedArray(typedArray).
|
||||||
|
@ -447,7 +447,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store)
|
||||||
return value_to_set;
|
return value_to_set;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.11 Atomics.sub ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.sub
|
// 25.4.12 Atomics.sub ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.sub
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::sub)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::sub)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
@ -532,7 +532,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::notify)
|
||||||
return vm.throw_completion<InternalError>(ErrorType::NotImplemented, "SharedArrayBuffer"sv);
|
return vm.throw_completion<InternalError>(ErrorType::NotImplemented, "SharedArrayBuffer"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.4.14 Atomics.xor ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.xor
|
// 25.4.16 Atomics.xor ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.xor
|
||||||
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::xor_)
|
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::xor_)
|
||||||
{
|
{
|
||||||
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
auto* typed_array = TRY(typed_array_from(vm, vm.argument(0)));
|
||||||
|
|
|
@ -53,7 +53,7 @@ void DataViewPrototype::initialize(Realm& realm)
|
||||||
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, vm.names.DataView.as_string()), Attribute::Configurable);
|
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, vm.names.DataView.as_string()), Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.3.1.1 GetViewValue ( view, requestIndex, isLittleEndian, type ), https://tc39.es/ecma262/#sec-getviewvalue
|
// 25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type ), https://tc39.es/ecma262/#sec-getviewvalue
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static ThrowCompletionOr<Value> get_view_value(VM& vm, Value request_index, Value is_little_endian)
|
static ThrowCompletionOr<Value> get_view_value(VM& vm, Value request_index, Value is_little_endian)
|
||||||
{
|
{
|
||||||
|
@ -98,7 +98,7 @@ static ThrowCompletionOr<Value> get_view_value(VM& vm, Value request_index, Valu
|
||||||
return buffer->get_value<T>(buffer_index.value(), false, ArrayBuffer::Order::Unordered, little_endian);
|
return buffer->get_value<T>(buffer_index.value(), false, ArrayBuffer::Order::Unordered, little_endian);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.3.1.2 SetViewValue ( view, requestIndex, isLittleEndian, type, value ), https://tc39.es/ecma262/#sec-setviewvalue
|
// 25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value ), https://tc39.es/ecma262/#sec-setviewvalue
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static ThrowCompletionOr<Value> set_view_value(VM& vm, Value request_index, Value is_little_endian, Value value)
|
static ThrowCompletionOr<Value> set_view_value(VM& vm, Value request_index, Value is_little_endian, Value value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,16 +26,16 @@ void SharedArrayBufferConstructor::initialize(Realm& realm)
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
Base::initialize(realm);
|
Base::initialize(realm);
|
||||||
|
|
||||||
// 25.2.4.2 SharedArrayBuffer.prototype, https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype
|
// 25.2.4.1 SharedArrayBuffer.prototype, https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype
|
||||||
define_direct_property(vm.names.prototype, realm.intrinsics().shared_array_buffer_prototype(), 0);
|
define_direct_property(vm.names.prototype, realm.intrinsics().shared_array_buffer_prototype(), 0);
|
||||||
|
|
||||||
// 25.2.4.4 SharedArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype.toString
|
// 25.2.5.7 SharedArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype.toString
|
||||||
define_native_accessor(realm, vm.well_known_symbol_species(), symbol_species_getter, {}, Attribute::Configurable);
|
define_native_accessor(realm, vm.well_known_symbol_species(), symbol_species_getter, {}, Attribute::Configurable);
|
||||||
|
|
||||||
define_direct_property(vm.names.length, Value(1), Attribute::Configurable);
|
define_direct_property(vm.names.length, Value(1), Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.2.1 SharedArrayBuffer ( length ), https://tc39.es/ecma262/#sec-sharedarraybuffer-length
|
// 25.2.3.1 SharedArrayBuffer ( length [ , options ] ), https://tc39.es/ecma262/#sec-sharedarraybuffer-length
|
||||||
ThrowCompletionOr<Value> SharedArrayBufferConstructor::call()
|
ThrowCompletionOr<Value> SharedArrayBufferConstructor::call()
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
@ -44,7 +44,7 @@ ThrowCompletionOr<Value> SharedArrayBufferConstructor::call()
|
||||||
return vm.throw_completion<TypeError>(ErrorType::ConstructorWithoutNew, vm.names.SharedArrayBuffer);
|
return vm.throw_completion<TypeError>(ErrorType::ConstructorWithoutNew, vm.names.SharedArrayBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.2.1 SharedArrayBuffer ( length ), https://tc39.es/ecma262/#sec-sharedarraybuffer-length
|
// 25.2.3.1 SharedArrayBuffer ( length [ , options ] ), https://tc39.es/ecma262/#sec-sharedarraybuffer-length
|
||||||
ThrowCompletionOr<NonnullGCPtr<Object>> SharedArrayBufferConstructor::construct(FunctionObject& new_target)
|
ThrowCompletionOr<NonnullGCPtr<Object>> SharedArrayBufferConstructor::construct(FunctionObject& new_target)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
|
@ -65,7 +65,7 @@ ThrowCompletionOr<NonnullGCPtr<Object>> SharedArrayBufferConstructor::construct(
|
||||||
return *TRY(allocate_shared_array_buffer(vm, new_target, byte_length_or_error.release_value()));
|
return *TRY(allocate_shared_array_buffer(vm, new_target, byte_length_or_error.release_value()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.3.2 get SharedArrayBuffer [ @@species ], https://tc39.es/ecma262/#sec-sharedarraybuffer-@@species
|
// 25.2.4.2 get SharedArrayBuffer [ @@species ], https://tc39.es/ecma262/#sec-sharedarraybuffer-@@species
|
||||||
JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferConstructor::symbol_species_getter)
|
JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferConstructor::symbol_species_getter)
|
||||||
{
|
{
|
||||||
// 1. Return the this value.
|
// 1. Return the this value.
|
||||||
|
|
|
@ -28,11 +28,11 @@ void SharedArrayBufferPrototype::initialize(Realm& realm)
|
||||||
define_native_accessor(realm, vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable);
|
define_native_accessor(realm, vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable);
|
||||||
define_native_function(realm, vm.names.slice, slice, 2, attr);
|
define_native_function(realm, vm.names.slice, slice, 2, attr);
|
||||||
|
|
||||||
// 25.2.4.4 SharedArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype.toString
|
// 25.2.5.7 SharedArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype.toString
|
||||||
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, vm.names.SharedArrayBuffer.as_string()), Attribute::Configurable);
|
define_direct_property(vm.well_known_symbol_to_string_tag(), PrimitiveString::create(vm, vm.names.SharedArrayBuffer.as_string()), Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.4.1 get SharedArrayBuffer.prototype.byteLength, https://tc39.es/ecma262/#sec-get-sharedarraybuffer.prototype.bytelength
|
// 25.2.5.1 get SharedArrayBuffer.prototype.byteLength, https://tc39.es/ecma262/#sec-get-sharedarraybuffer.prototype.bytelength
|
||||||
JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::byte_length_getter)
|
JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::byte_length_getter)
|
||||||
{
|
{
|
||||||
// 1. Let O be the this value.
|
// 1. Let O be the this value.
|
||||||
|
@ -47,7 +47,7 @@ JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::byte_length_getter)
|
||||||
return Value(array_buffer_object->byte_length());
|
return Value(array_buffer_object->byte_length());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 25.2.4.3 SharedArrayBuffer.prototype.slice ( start, end ), https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype.slice
|
// 25.2.5.6 SharedArrayBuffer.prototype.slice ( start, end ), https://tc39.es/ecma262/#sec-sharedarraybuffer.prototype.slice
|
||||||
JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::slice)
|
JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::slice)
|
||||||
{
|
{
|
||||||
auto& realm = *vm.current_realm();
|
auto& realm = *vm.current_realm();
|
||||||
|
|
|
@ -58,15 +58,15 @@ public:
|
||||||
virtual size_t element_size() const = 0;
|
virtual size_t element_size() const = 0;
|
||||||
virtual DeprecatedFlyString const& element_name() const = 0;
|
virtual DeprecatedFlyString const& element_name() const = 0;
|
||||||
|
|
||||||
// 25.1.2.6 IsUnclampedIntegerElementType ( type ), https://tc39.es/ecma262/#sec-isunclampedintegerelementtype
|
// 25.1.3.10 IsUnclampedIntegerElementType ( type ), https://tc39.es/ecma262/#sec-isunclampedintegerelementtype
|
||||||
virtual bool is_unclamped_integer_element_type() const = 0;
|
virtual bool is_unclamped_integer_element_type() const = 0;
|
||||||
// 25.1.2.7 IsBigIntElementType ( type ), https://tc39.es/ecma262/#sec-isbigintelementtype
|
// 25.1.3.11 IsBigIntElementType ( type ), https://tc39.es/ecma262/#sec-isbigintelementtype
|
||||||
virtual bool is_bigint_element_type() const = 0;
|
virtual bool is_bigint_element_type() const = 0;
|
||||||
// 25.1.2.10 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getvaluefrombuffer
|
// 25.1.3.15 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getvaluefrombuffer
|
||||||
virtual Value get_value_from_buffer(size_t byte_index, ArrayBuffer::Order, bool is_little_endian = true) const = 0;
|
virtual Value get_value_from_buffer(size_t byte_index, ArrayBuffer::Order, bool is_little_endian = true) const = 0;
|
||||||
// 25.1.2.12 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-setvalueinbuffer
|
// 25.1.3.17 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-setvalueinbuffer
|
||||||
virtual void set_value_in_buffer(size_t byte_index, Value, ArrayBuffer::Order, bool is_little_endian = true) = 0;
|
virtual void set_value_in_buffer(size_t byte_index, Value, ArrayBuffer::Order, bool is_little_endian = true) = 0;
|
||||||
// 25.1.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer
|
// 25.1.3.18 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer
|
||||||
virtual Value get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) = 0;
|
virtual Value get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -90,7 +90,7 @@ private:
|
||||||
virtual void visit_edges(Visitor&) override;
|
virtual void visit_edges(Visitor&) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 10.4.5.9 IsValidIntegerIndex ( O, index ), https://tc39.es/ecma262/#sec-isvalidintegerindex
|
// 10.4.5.14 IsValidIntegerIndex ( O, index ), https://tc39.es/ecma262/#sec-isvalidintegerindex
|
||||||
inline bool is_valid_integer_index(TypedArrayBase const& typed_array, CanonicalIndex property_index)
|
inline bool is_valid_integer_index(TypedArrayBase const& typed_array, CanonicalIndex property_index)
|
||||||
{
|
{
|
||||||
// 1. If IsDetachedBuffer(O.[[ViewedArrayBuffer]]) is true, return false.
|
// 1. If IsDetachedBuffer(O.[[ViewedArrayBuffer]]) is true, return false.
|
||||||
|
@ -110,7 +110,7 @@ inline bool is_valid_integer_index(TypedArrayBase const& typed_array, CanonicalI
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.4.5.10 IntegerIndexedElementGet ( O, index ), https://tc39.es/ecma262/#sec-integerindexedelementget
|
// 10.4.5.15 IntegerIndexedElementGet ( O, index ), https://tc39.es/ecma262/#sec-integerindexedelementget
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline ThrowCompletionOr<Value> integer_indexed_element_get(TypedArrayBase const& typed_array, CanonicalIndex property_index)
|
inline ThrowCompletionOr<Value> integer_indexed_element_get(TypedArrayBase const& typed_array, CanonicalIndex property_index)
|
||||||
{
|
{
|
||||||
|
@ -138,7 +138,7 @@ inline ThrowCompletionOr<Value> integer_indexed_element_get(TypedArrayBase const
|
||||||
return typed_array.viewed_array_buffer()->template get_value<T>(indexed_position.value(), true, ArrayBuffer::Order::Unordered);
|
return typed_array.viewed_array_buffer()->template get_value<T>(indexed_position.value(), true, ArrayBuffer::Order::Unordered);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.4.5.11 IntegerIndexedElementSet ( O, index, value ), https://tc39.es/ecma262/#sec-integerindexedelementset
|
// 10.4.5.16 IntegerIndexedElementSet ( O, index, value ), https://tc39.es/ecma262/#sec-integerindexedelementset
|
||||||
// NOTE: In error cases, the function will return as if it succeeded.
|
// NOTE: In error cases, the function will return as if it succeeded.
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline ThrowCompletionOr<void> integer_indexed_element_set(TypedArrayBase& typed_array, CanonicalIndex property_index, Value value)
|
inline ThrowCompletionOr<void> integer_indexed_element_set(TypedArrayBase& typed_array, CanonicalIndex property_index, Value value)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue