From abcf71a8ca169d8dec43c7da4028349d57c45e55 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 26 Nov 2023 10:33:56 +0100 Subject: [PATCH] LibJS: Remove unnecessary ThrowCompletionOr return types in TypedArray We used to need these because we worried about tiny OOM errors. Work towards #20449 --- Userland/Libraries/LibJS/Runtime/ArrayBuffer.h | 13 ++++++------- Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp | 2 +- .../Libraries/LibJS/Runtime/DataViewPrototype.cpp | 2 +- Userland/Libraries/LibJS/Runtime/TypedArray.cpp | 4 ++-- Userland/Libraries/LibJS/Runtime/TypedArray.h | 14 +++++++------- .../LibJS/Runtime/TypedArrayPrototype.cpp | 12 ++++++------ 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h index 80a7077ea1..6e6708cbb7 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h +++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h @@ -108,11 +108,11 @@ public: Unordered }; template - ThrowCompletionOr get_value(size_t byte_index, bool is_typed_array, Order, bool is_little_endian = true); + Value get_value(size_t byte_index, bool is_typed_array, Order, bool is_little_endian = true); template - ThrowCompletionOr set_value(size_t byte_index, Value value, bool is_typed_array, Order, bool is_little_endian = true); + void 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); + Value get_modify_set_value(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true); private: ArrayBuffer(ByteBuffer buffer, Object& prototype); @@ -208,7 +208,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::get_value_from_buffer(), https://tc39.es/ecma262/#sec-getvaluefrombuffer template -ThrowCompletionOr 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) { auto& vm = this->vm(); // 1. Assert: IsDetachedBuffer(arrayBuffer) is false. @@ -319,7 +319,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 template -ThrowCompletionOr 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) { auto& vm = this->vm(); @@ -361,12 +361,11 @@ ThrowCompletionOr ArrayBuffer::set_value(size_t byte_index, Value value, [ } // 10. Return unused. - return {}; } // 25.1.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer template -ThrowCompletionOr 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) { auto& vm = this->vm(); diff --git a/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp b/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp index 80f271065a..e484d822a7 100644 --- a/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp @@ -381,7 +381,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store) // 7. Let elementType be TypedArrayElementType(typedArray). // 8. Perform SetValueInBuffer(buffer, indexedPosition, elementType, v, true, SeqCst). - MUST_OR_THROW_OOM(typed_array->set_value_in_buffer(indexed_position, value_to_set, ArrayBuffer::Order::SeqCst, true)); + 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 3d8263d5ed..8edb9f7d4b 100644 --- a/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp @@ -149,7 +149,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). - MUST_OR_THROW_OOM(buffer->set_value(buffer_index.value(), number_value, false, ArrayBuffer::Order::Unordered, little_endian)); + 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 2d10af0715..4ea8e4423d 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -190,10 +190,10 @@ static ThrowCompletionOr initialize_typed_array_from_typed_array(VM& vm, T // g. Repeat, while count > 0, for (u32 i = 0; i < element_length; ++i) { // i. Let value be GetValueFromBuffer(srcData, srcByteIndex, srcType, true, Unordered). - auto value = MUST_OR_THROW_OOM(src_array.get_value_from_buffer(src_byte_index, ArrayBuffer::Order::Unordered)); + auto value = src_array.get_value_from_buffer(src_byte_index, ArrayBuffer::Order::Unordered); // ii. Perform SetValueInBuffer(data, targetByteIndex, elementType, value, true, Unordered). - MUST_OR_THROW_OOM(data->template set_value(target_byte_index, value, true, ArrayBuffer::Order::Unordered)); + 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 f0ef451cbb..4e5a2eb87d 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -62,11 +62,11 @@ public: // 25.1.2.7 IsBigIntElementType ( type ), https://tc39.es/ecma262/#sec-isbigintelementtype 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 - virtual ThrowCompletionOr 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 - virtual ThrowCompletionOr 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 - virtual ThrowCompletionOr 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: TypedArrayBase(Object& prototype, IntrinsicConstructor intrinsic_constructor) @@ -173,7 +173,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). - MUST_OR_THROW_OOM(typed_array.viewed_array_buffer()->template set_value(indexed_position.value(), num_value, true, ArrayBuffer::Order::Unordered)); + typed_array.viewed_array_buffer()->template set_value(indexed_position.value(), num_value, true, ArrayBuffer::Order::Unordered); // 4. Return unused. return {}; @@ -445,9 +445,9 @@ public: return is_bigint; } - 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); } - 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); } + Value 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 { return viewed_array_buffer()->template set_value(byte_index, value, true, order, is_little_endian); } + Value 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: TypedArray(Object& prototype, IntrinsicConstructor intrinsic_constructor, u32 array_length, ArrayBuffer& array_buffer) diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp index 9e177edd20..f0a5979aad 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp @@ -416,10 +416,10 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::copy_within) // k. Repeat, while countBytes > 0, for (; count_bytes > 0; --count_bytes) { // i. Let value be GetValueFromBuffer(buffer, fromByteIndex, Uint8, true, Unordered). - auto value = MUST_OR_THROW_OOM(buffer->get_value(from_byte_index, true, ArrayBuffer::Order::Unordered)); + auto value = buffer->get_value(from_byte_index, true, ArrayBuffer::Order::Unordered); // ii. Perform SetValueInBuffer(buffer, toByteIndex, Uint8, value, true, Unordered). - MUST_OR_THROW_OOM(buffer->set_value(to_byte_index, value, true, ArrayBuffer::Order::Unordered)); + buffer->set_value(to_byte_index, value, true, ArrayBuffer::Order::Unordered); // iii. Set fromByteIndex to fromByteIndex + direction. from_byte_index += direction; @@ -1232,9 +1232,9 @@ static ThrowCompletionOr set_typed_array_from_typed_array(VM& vm, TypedArr // a. Repeat, while targetByteIndex < limit, while (target_byte_index < limit) { // 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)); + auto value = source.get_value_from_buffer(source_byte_index, ArrayBuffer::Unordered); // ii. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, Unordered). - MUST_OR_THROW_OOM(target.set_value_in_buffer(target_byte_index, value, ArrayBuffer::Unordered)); + 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. @@ -1460,10 +1460,10 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::slice) // ix. Repeat, while targetByteIndex < limit, for (; target_byte_index < limit.value(); ++source_byte_index, ++target_byte_index) { // 1. Let value be GetValueFromBuffer(srcBuffer, srcByteIndex, Uint8, true, Unordered). - auto value = MUST_OR_THROW_OOM(source_buffer.get_value(source_byte_index.value(), true, ArrayBuffer::Unordered)); + auto value = source_buffer.get_value(source_byte_index.value(), true, ArrayBuffer::Unordered); // 2. Perform SetValueInBuffer(targetBuffer, targetByteIndex, Uint8, value, true, Unordered). - MUST_OR_THROW_OOM(target_buffer.set_value(target_byte_index, value, true, ArrayBuffer::Unordered)); + target_buffer.set_value(target_byte_index, value, true, ArrayBuffer::Unordered); // 3. Set srcByteIndex to srcByteIndex + 1. // 4. Set targetByteIndex to targetByteIndex + 1.