diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h index b8cd1e5ed1..d3e95ec071 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h +++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h @@ -74,7 +74,7 @@ public: template ThrowCompletionOr get_value(size_t byte_index, bool is_typed_array, Order, bool is_little_endian = true); template - void set_value(size_t byte_index, Value value, bool is_typed_array, Order, bool is_little_endian = true); + ThrowCompletionOr set_value(size_t byte_index, Value value, bool is_typed_array, Order, bool is_little_endian = true); template ThrowCompletionOr get_modify_set_value(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true); @@ -228,7 +228,7 @@ static ThrowCompletionOr numeric_to_raw_bytes(VM& vm, Value value, b // 25.1.2.12 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-setvalueinbuffer template -void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] bool is_typed_array, Order, bool is_little_endian) +ThrowCompletionOr ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] bool is_typed_array, Order, bool is_little_endian) { auto& vm = this->vm(); @@ -253,7 +253,7 @@ void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] boo // NOTE: Done by default parameter at declaration of this function. // 7. Let rawBytes be NumericToRawBytes(type, value, isLittleEndian). - auto raw_bytes = numeric_to_raw_bytes(vm, value, is_little_endian).release_allocated_value_but_fixme_should_propagate_errors(); + auto raw_bytes = MUST_OR_THROW_OOM(numeric_to_raw_bytes(vm, value, is_little_endian)); // FIXME 8. If IsSharedArrayBuffer(arrayBuffer) is true, then if (false) { @@ -269,6 +269,7 @@ void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] boo } // 10. Return unused. + return {}; } // 25.1.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer diff --git a/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp b/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp index a631ebbaf9..78317d3ac8 100644 --- a/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp @@ -371,7 +371,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store) // 7. Let elementType be TypedArrayElementType(typedArray). // 8. Perform SetValueInBuffer(buffer, indexedPosition, elementType, v, true, SeqCst). - typed_array->set_value_in_buffer(indexed_position, value_to_set, ArrayBuffer::Order::SeqCst, true); + MUST_OR_THROW_OOM(typed_array->set_value_in_buffer(indexed_position, value_to_set, ArrayBuffer::Order::SeqCst, true)); // 9. Return v. return value_to_set; diff --git a/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp b/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp index b92c604664..2565d32c58 100644 --- a/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp @@ -148,7 +148,7 @@ static ThrowCompletionOr set_view_value(VM& vm, Value request_index, Valu return vm.throw_completion(ErrorType::DataViewOutOfRangeByteOffset, get_index, view_size); // 14. Perform SetValueInBuffer(buffer, bufferIndex, type, numberValue, false, Unordered, isLittleEndian). - buffer->set_value(buffer_index.value(), number_value, false, ArrayBuffer::Order::Unordered, little_endian); + MUST_OR_THROW_OOM(buffer->set_value(buffer_index.value(), number_value, false, ArrayBuffer::Order::Unordered, little_endian)); // 15. Return undefined. return js_undefined(); diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index 92c6eb0912..f93b0e8fec 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -192,7 +192,7 @@ static ThrowCompletionOr initialize_typed_array_from_typed_array(VM& vm, T auto value = MUST_OR_THROW_OOM(src_array.get_value_from_buffer(src_byte_index, ArrayBuffer::Order::Unordered)); // ii. Perform SetValueInBuffer(data, targetByteIndex, elementType, value, true, Unordered). - data->template set_value(target_byte_index, value, true, ArrayBuffer::Order::Unordered); + MUST_OR_THROW_OOM(data->template set_value(target_byte_index, value, true, ArrayBuffer::Order::Unordered)); // iii. Set srcByteIndex to srcByteIndex + srcElementSize. src_byte_index += src_element_size; diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.h b/Userland/Libraries/LibJS/Runtime/TypedArray.h index 32fe262b4a..e8f8c68e5e 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -56,7 +56,7 @@ public: // 25.1.2.10 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getvaluefrombuffer virtual ThrowCompletionOr 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 - virtual void set_value_in_buffer(size_t byte_index, Value, ArrayBuffer::Order, bool is_little_endian = true) = 0; + virtual ThrowCompletionOr 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 virtual ThrowCompletionOr get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) = 0; @@ -165,7 +165,7 @@ inline ThrowCompletionOr integer_indexed_element_set(TypedArrayBase& typed // d. Let elementType be TypedArrayElementType(O). // e. Perform SetValueInBuffer(O.[[ViewedArrayBuffer]], indexedPosition, elementType, numValue, true, Unordered). - typed_array.viewed_array_buffer()->template set_value(indexed_position.value(), num_value, true, ArrayBuffer::Order::Unordered); + MUST_OR_THROW_OOM(typed_array.viewed_array_buffer()->template set_value(indexed_position.value(), num_value, true, ArrayBuffer::Order::Unordered)); // 4. Return unused. return {}; @@ -438,7 +438,7 @@ public: } ThrowCompletionOr get_value_from_buffer(size_t byte_index, ArrayBuffer::Order order, bool is_little_endian = true) const override { return viewed_array_buffer()->template get_value(byte_index, true, order, is_little_endian); } - void set_value_in_buffer(size_t byte_index, Value value, ArrayBuffer::Order order, bool is_little_endian = true) override { viewed_array_buffer()->template set_value(byte_index, value, true, order, is_little_endian); } + ThrowCompletionOr set_value_in_buffer(size_t byte_index, Value value, ArrayBuffer::Order order, bool is_little_endian = true) override { return viewed_array_buffer()->template set_value(byte_index, value, true, order, is_little_endian); } ThrowCompletionOr get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) override { return viewed_array_buffer()->template get_modify_set_value(byte_index, value, move(operation), is_little_endian); } protected: diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp index ddb572382d..b0863292b2 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp @@ -418,7 +418,7 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::copy_within) auto value = MUST_OR_THROW_OOM(buffer->get_value(from_byte_index, true, ArrayBuffer::Order::Unordered)); // ii. Perform SetValueInBuffer(buffer, toByteIndex, Uint8, value, true, Unordered). - buffer->set_value(to_byte_index, value, true, ArrayBuffer::Order::Unordered); + MUST_OR_THROW_OOM(buffer->set_value(to_byte_index, value, true, ArrayBuffer::Order::Unordered)); // iii. Set fromByteIndex to fromByteIndex + direction. from_byte_index += direction; @@ -1233,7 +1233,7 @@ static ThrowCompletionOr set_typed_array_from_typed_array(VM& vm, TypedArr // i. Let value be GetValueFromBuffer(srcBuffer, srcByteIndex, srcType, true, Unordered). auto value = MUST_OR_THROW_OOM(source.get_value_from_buffer(source_byte_index, ArrayBuffer::Unordered)); // ii. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, Unordered). - target.set_value_in_buffer(target_byte_index, value, ArrayBuffer::Unordered); + MUST_OR_THROW_OOM(target.set_value_in_buffer(target_byte_index, value, ArrayBuffer::Unordered)); // iii. Set srcByteIndex to srcByteIndex + srcElementSize. source_byte_index += source_element_size; // iv. Set targetByteIndex to targetByteIndex + targetElementSize. @@ -1462,7 +1462,7 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::slice) auto value = MUST_OR_THROW_OOM(source_buffer.get_value(source_byte_index.value(), true, ArrayBuffer::Unordered)); // 2. Perform SetValueInBuffer(targetBuffer, targetByteIndex, Uint8, value, true, Unordered). - target_buffer.set_value(target_byte_index, value, true, ArrayBuffer::Unordered); + MUST_OR_THROW_OOM(target_buffer.set_value(target_byte_index, value, true, ArrayBuffer::Unordered)); // 3. Set srcByteIndex to srcByteIndex + 1. // 4. Set targetByteIndex to targetByteIndex + 1.