Browse Source

LibJS: Propagate OOM from SetValueInBuffer AO

Shannon Booth 2 years ago
parent
commit
b1870bc47b

+ 4 - 3
Userland/Libraries/LibJS/Runtime/ArrayBuffer.h

@@ -74,7 +74,7 @@ public:
     template<typename type>
     template<typename type>
     ThrowCompletionOr<Value> get_value(size_t byte_index, bool is_typed_array, Order, bool is_little_endian = true);
     ThrowCompletionOr<Value> get_value(size_t byte_index, bool is_typed_array, Order, bool is_little_endian = true);
     template<typename type>
     template<typename type>
-    void set_value(size_t byte_index, Value value, bool is_typed_array, Order, bool is_little_endian = true);
+    ThrowCompletionOr<void> set_value(size_t byte_index, Value value, bool is_typed_array, Order, bool is_little_endian = true);
     template<typename T>
     template<typename T>
     ThrowCompletionOr<Value> get_modify_set_value(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true);
     ThrowCompletionOr<Value> get_modify_set_value(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true);
 
 
@@ -228,7 +228,7 @@ static ThrowCompletionOr<ByteBuffer> 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
 // 25.1.2.12 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)
+ThrowCompletionOr<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();
     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.
     //    NOTE: Done by default parameter at declaration of this function.
 
 
     // 7. Let rawBytes be NumericToRawBytes(type, value, isLittleEndian).
     // 7. Let rawBytes be NumericToRawBytes(type, value, isLittleEndian).
-    auto raw_bytes = numeric_to_raw_bytes<T>(vm, value, is_little_endian).release_allocated_value_but_fixme_should_propagate_errors();
+    auto raw_bytes = MUST_OR_THROW_OOM(numeric_to_raw_bytes<T>(vm, value, is_little_endian));
 
 
     // FIXME 8. If IsSharedArrayBuffer(arrayBuffer) is true, then
     // FIXME 8. If IsSharedArrayBuffer(arrayBuffer) is true, then
     if (false) {
     if (false) {
@@ -269,6 +269,7 @@ void ArrayBuffer::set_value(size_t byte_index, Value value, [[maybe_unused]] boo
     }
     }
 
 
     // 10. Return unused.
     // 10. Return unused.
+    return {};
 }
 }
 
 
 // 25.1.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer
 // 25.1.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer

+ 1 - 1
Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp

@@ -371,7 +371,7 @@ JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store)
 
 
     // 7. Let elementType be TypedArrayElementType(typedArray).
     // 7. Let elementType be TypedArrayElementType(typedArray).
     // 8. Perform SetValueInBuffer(buffer, indexedPosition, elementType, v, true, SeqCst).
     // 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.
     // 9. Return v.
     return value_to_set;
     return value_to_set;

+ 1 - 1
Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp

@@ -148,7 +148,7 @@ static ThrowCompletionOr<Value> set_view_value(VM& vm, Value request_index, Valu
         return vm.throw_completion<RangeError>(ErrorType::DataViewOutOfRangeByteOffset, get_index, view_size);
         return vm.throw_completion<RangeError>(ErrorType::DataViewOutOfRangeByteOffset, get_index, view_size);
 
 
     // 14. Perform SetValueInBuffer(buffer, bufferIndex, type, numberValue, false, Unordered, isLittleEndian).
     // 14. Perform SetValueInBuffer(buffer, bufferIndex, type, numberValue, false, Unordered, isLittleEndian).
-    buffer->set_value<T>(buffer_index.value(), number_value, false, ArrayBuffer::Order::Unordered, little_endian);
+    MUST_OR_THROW_OOM(buffer->set_value<T>(buffer_index.value(), number_value, false, ArrayBuffer::Order::Unordered, little_endian));
 
 
     // 15. Return undefined.
     // 15. Return undefined.
     return js_undefined();
     return js_undefined();

+ 1 - 1
Userland/Libraries/LibJS/Runtime/TypedArray.cpp

@@ -192,7 +192,7 @@ static ThrowCompletionOr<void> 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));
             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).
             // ii. Perform SetValueInBuffer(data, targetByteIndex, elementType, value, true, Unordered).
-            data->template set_value<T>(target_byte_index, value, true, ArrayBuffer::Order::Unordered);
+            MUST_OR_THROW_OOM(data->template set_value<T>(target_byte_index, value, true, ArrayBuffer::Order::Unordered));
 
 
             // iii. Set srcByteIndex to srcByteIndex + srcElementSize.
             // iii. Set srcByteIndex to srcByteIndex + srcElementSize.
             src_byte_index += src_element_size;
             src_byte_index += src_element_size;

+ 3 - 3
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
     // 25.1.2.10 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getvaluefrombuffer
     virtual ThrowCompletionOr<Value> get_value_from_buffer(size_t byte_index, ArrayBuffer::Order, bool is_little_endian = true) const = 0;
     virtual ThrowCompletionOr<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.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<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.2.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] ), https://tc39.es/ecma262/#sec-getmodifysetvalueinbuffer
     virtual ThrowCompletionOr<Value> get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) = 0;
     virtual ThrowCompletionOr<Value> 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<void> integer_indexed_element_set(TypedArrayBase& typed
 
 
     // d. Let elementType be TypedArrayElementType(O).
     // d. Let elementType be TypedArrayElementType(O).
     // e. Perform SetValueInBuffer(O.[[ViewedArrayBuffer]], indexedPosition, elementType, numValue, true, Unordered).
     // e. Perform SetValueInBuffer(O.[[ViewedArrayBuffer]], indexedPosition, elementType, numValue, true, Unordered).
-    typed_array.viewed_array_buffer()->template set_value<T>(indexed_position.value(), num_value, true, ArrayBuffer::Order::Unordered);
+    MUST_OR_THROW_OOM(typed_array.viewed_array_buffer()->template set_value<T>(indexed_position.value(), num_value, true, ArrayBuffer::Order::Unordered));
 
 
     // 4. Return unused.
     // 4. Return unused.
     return {};
     return {};
@@ -438,7 +438,7 @@ public:
     }
     }
 
 
     ThrowCompletionOr<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<T>(byte_index, true, order, is_little_endian); }
     ThrowCompletionOr<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<T>(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<T>(byte_index, value, true, order, is_little_endian); }
+    ThrowCompletionOr<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<T>(byte_index, value, true, order, is_little_endian); }
     ThrowCompletionOr<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<T>(byte_index, value, move(operation), is_little_endian); }
     ThrowCompletionOr<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<T>(byte_index, value, move(operation), is_little_endian); }
 
 
 protected:
 protected:

+ 3 - 3
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<u8>(from_byte_index, true, ArrayBuffer::Order::Unordered));
             auto value = MUST_OR_THROW_OOM(buffer->get_value<u8>(from_byte_index, true, ArrayBuffer::Order::Unordered));
 
 
             // ii. Perform SetValueInBuffer(buffer, toByteIndex, Uint8, value, true, Unordered).
             // ii. Perform SetValueInBuffer(buffer, toByteIndex, Uint8, value, true, Unordered).
-            buffer->set_value<u8>(to_byte_index, value, true, ArrayBuffer::Order::Unordered);
+            MUST_OR_THROW_OOM(buffer->set_value<u8>(to_byte_index, value, true, ArrayBuffer::Order::Unordered));
 
 
             // iii. Set fromByteIndex to fromByteIndex + direction.
             // iii. Set fromByteIndex to fromByteIndex + direction.
             from_byte_index += direction;
             from_byte_index += direction;
@@ -1233,7 +1233,7 @@ static ThrowCompletionOr<void> set_typed_array_from_typed_array(VM& vm, TypedArr
             // i. Let value be GetValueFromBuffer(srcBuffer, srcByteIndex, srcType, true, Unordered).
             // 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 = MUST_OR_THROW_OOM(source.get_value_from_buffer(source_byte_index, ArrayBuffer::Unordered));
             // ii. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, 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.
             // iii. Set srcByteIndex to srcByteIndex + srcElementSize.
             source_byte_index += source_element_size;
             source_byte_index += source_element_size;
             // iv. Set targetByteIndex to targetByteIndex + targetElementSize.
             // 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<u8>(source_byte_index.value(), true, ArrayBuffer::Unordered));
                 auto value = MUST_OR_THROW_OOM(source_buffer.get_value<u8>(source_byte_index.value(), true, ArrayBuffer::Unordered));
 
 
                 // 2. Perform SetValueInBuffer(targetBuffer, targetByteIndex, Uint8, value, true, Unordered).
                 // 2. Perform SetValueInBuffer(targetBuffer, targetByteIndex, Uint8, value, true, Unordered).
-                target_buffer.set_value<u8>(target_byte_index, value, true, ArrayBuffer::Unordered);
+                MUST_OR_THROW_OOM(target_buffer.set_value<u8>(target_byte_index, value, true, ArrayBuffer::Unordered));
 
 
                 // 3. Set srcByteIndex to srcByteIndex + 1.
                 // 3. Set srcByteIndex to srcByteIndex + 1.
                 // 4. Set targetByteIndex to targetByteIndex + 1.
                 // 4. Set targetByteIndex to targetByteIndex + 1.