diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp index 5788de6c2b..0aeabb68a7 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp @@ -201,7 +201,7 @@ size_t array_buffer_byte_length(ArrayBuffer const& array_buffer, ArrayBuffer::Or ThrowCompletionOr detach_array_buffer(VM& vm, ArrayBuffer& array_buffer, Optional key) { // 1. Assert: IsSharedArrayBuffer(arrayBuffer) is false. - // FIXME: Check for shared buffer + VERIFY(!array_buffer.is_shared_array_buffer()); // 2. If key is not present, set key to undefined. if (!key.has_value()) diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp index 0039aa1a61..7b63f3599d 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp @@ -174,7 +174,8 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice) auto array_buffer_object = TRY(typed_this_value(vm)); // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception. - // FIXME: Check for shared buffer + if (array_buffer_object->is_shared_array_buffer()) + return vm.throw_completion(ErrorType::SharedArrayBuffer); // 4. If IsDetachedBuffer(O) is true, throw a TypeError exception. if (array_buffer_object->is_detached()) @@ -226,7 +227,8 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice) auto* new_array_buffer_object = static_cast(new_array_buffer.ptr()); // 18. If IsSharedArrayBuffer(new) is true, throw a TypeError exception. - // FIXME: Check for shared buffer + if (new_array_buffer_object->is_shared_array_buffer()) + return vm.throw_completion(ErrorType::SharedArrayBuffer); // 19. If IsDetachedBuffer(new) is true, throw a TypeError exception. if (new_array_buffer_object->is_detached()) diff --git a/Userland/Libraries/LibJS/Runtime/SharedArrayBufferPrototype.cpp b/Userland/Libraries/LibJS/Runtime/SharedArrayBufferPrototype.cpp index 5df8ef92d8..dbf7aa2992 100644 --- a/Userland/Libraries/LibJS/Runtime/SharedArrayBufferPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/SharedArrayBufferPrototype.cpp @@ -40,7 +40,8 @@ JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::byte_length_getter) auto array_buffer_object = TRY(typed_this_value(vm)); // 3. If IsSharedArrayBuffer(O) is false, throw a TypeError exception. - // FIXME: Check for shared buffer + if (!array_buffer_object->is_shared_array_buffer()) + return vm.throw_completion(ErrorType::NotASharedArrayBuffer); // 4. Let length be O.[[ArrayBufferByteLength]]. // 5. Return 𝔽(length). @@ -60,7 +61,8 @@ JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::slice) auto array_buffer_object = TRY(typed_this_value(vm)); // 3. If IsSharedArrayBuffer(O) is false, throw a TypeError exception. - // FIXME: Check for shared buffer + if (!array_buffer_object->is_shared_array_buffer()) + return vm.throw_completion(ErrorType::NotASharedArrayBuffer); // 4. Let len be O.[[ArrayBufferByteLength]]. auto length = array_buffer_object->byte_length(); @@ -108,7 +110,8 @@ JS_DEFINE_NATIVE_FUNCTION(SharedArrayBufferPrototype::slice) auto* new_array_buffer_object = static_cast(new_array_buffer.ptr()); // 17. If IsSharedArrayBuffer(new) is true, throw a TypeError exception. - // FIXME: Check for shared buffer + if (!new_array_buffer_object->is_shared_array_buffer()) + return vm.throw_completion(ErrorType::NotASharedArrayBuffer); // 18. If new.[[ArrayBufferData]] is O.[[ArrayBufferData]], throw a TypeError exception. if (new_array_buffer == array_buffer_object) diff --git a/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.slice.js b/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.slice.js index a8dd527d9b..311a774725 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.slice.js +++ b/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.slice.js @@ -1,3 +1,11 @@ +describe("errors", () => { + test("called on SharedArrayBuffer object", () => { + expect(() => { + ArrayBuffer.prototype.slice.call(new SharedArrayBuffer()); + }).toThrowWithMessage(TypeError, "The array buffer object cannot be a SharedArrayBuffer"); + }); +}); + test("single parameter", () => { const buffer = new ArrayBuffer(16); const fullView = new Int32Array(buffer); diff --git a/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.byteLength.js b/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.byteLength.js index a832d9425b..87d1be7f88 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.byteLength.js +++ b/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.byteLength.js @@ -1,3 +1,18 @@ +describe("errors", () => { + test("called on non-SharedArrayBuffer object", () => { + expect(() => { + SharedArrayBuffer.prototype.byteLength; + }).toThrowWithMessage(TypeError, "Not an object of type SharedArrayBuffer"); + + let byteLength = Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, "byteLength"); + let getter = byteLength.get; + + expect(() => { + getter.call(new ArrayBuffer()); + }).toThrowWithMessage(TypeError, "The array buffer object must be a SharedArrayBuffer"); + }); +}); + test("basic functionality", () => { expect(new SharedArrayBuffer().byteLength).toBe(0); expect(new SharedArrayBuffer(1).byteLength).toBe(1); diff --git a/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.slice.js b/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.slice.js index a46cdaf9ef..0e492d51d3 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.slice.js +++ b/Userland/Libraries/LibJS/Tests/builtins/SharedArrayBuffer/SharedArrayBuffer.prototype.slice.js @@ -1,3 +1,15 @@ +describe("errors", () => { + test("called on non-SharedArrayBuffer object", () => { + expect(() => { + SharedArrayBuffer.prototype.slice(Symbol.hasInstance); + }).toThrowWithMessage(TypeError, "Not an object of type SharedArrayBuffer"); + + expect(() => { + SharedArrayBuffer.prototype.slice.call(new ArrayBuffer()); + }).toThrowWithMessage(TypeError, "The array buffer object must be a SharedArrayBuffer"); + }); +}); + test("single parameter", () => { const buffer = new SharedArrayBuffer(16); const fullView = new Int32Array(buffer);