diff options
author | Timothy Flynn <trflynn89@pm.me> | 2022-07-27 11:05:35 -0400 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-07-27 17:35:50 +0100 |
commit | 60f3880650f35dd4c34d9648617b426ef30b0835 (patch) | |
tree | afa2a7b0595759572099b6823a7affc0f2f944c0 /Userland/Libraries/LibJS | |
parent | a8d532c4fe85dff4f783acf4549ac41ef4fcdf1d (diff) | |
download | serenity-60f3880650f35dd4c34d9648617b426ef30b0835.zip |
LibJS: Remove %TypedArray%.prototype.toSpliced
This was removed from the change-array-by-copy proposal. See:
https://github.com/tc39/proposal-change-array-by-copy/commit/4c194d9
Diffstat (limited to 'Userland/Libraries/LibJS')
3 files changed, 1 insertions, 297 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp index bc85006fa0..65e4eaead3 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp @@ -59,7 +59,6 @@ void TypedArrayPrototype::initialize(GlobalObject& object) define_native_function(vm.names.toLocaleString, to_locale_string, 0, attr); define_native_function(vm.names.toReversed, to_reversed, 0, attr); define_native_function(vm.names.toSorted, to_sorted, 1, attr); - define_native_function(vm.names.toSpliced, to_spliced, 2, attr); define_native_function(vm.names.with, with, 2, attr); define_native_function(vm.names.values, values, 0, attr); @@ -1557,142 +1556,7 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::to_sorted) return return_array; } -// 1.2.2.1.5 %TypedArray%.prototype.toSpliced ( start, deleteCount, ...items ), https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toSpliced -JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::to_spliced) -{ - auto start = vm.argument(0); - auto delete_count = vm.argument(1); - - // 1. Let O be the this value. - // 2. Perform ? ValidateTypedArray(O). - auto* typed_array = TRY(validate_typed_array_from_this(global_object)); - - // 3. Let len be O.[[ArrayLength]]. - auto length = typed_array->array_length(); - - // 4. Let relativeStart be ? ToIntegerOrInfinity(start). - auto relative_start = TRY(start.to_integer_or_infinity(global_object)); - - size_t actual_start; - - // 5. If relativeStart is -โ, let actualStart be 0. - if (Value(relative_start).is_negative_infinity()) - actual_start = 0; - // 6. Else if relativeStart < 0, let actualStart be max(len + relativeStart, 0). - else if (relative_start < 0) - actual_start = static_cast<size_t>(max(static_cast<double>(length) + relative_start, 0)); - // 7. Else, let actualStart be min(relativeStart, len). - else - actual_start = static_cast<size_t>(min(relative_start, static_cast<double>(length))); - - size_t actual_delete_count; - - // 8. If start is not present, then - if (vm.argument_count() == 0) { - // a. Let actualDeleteCount be 0. - actual_delete_count = 0; - } - // 9. Else if deleteCount is not present, then - else if (vm.argument_count() == 1) { - // a. Let actualDeleteCount be len - actualStart. - actual_delete_count = length - actual_start; - } - // 10. Else, - else { - // a. Let dc be ? ToIntegerOrInfinity(deleteCount). - auto dc = TRY(delete_count.to_integer_or_infinity(global_object)); - - // b. Let actualDeleteCount be the result of clamping dc between 0 and len - actualStart. - actual_delete_count = static_cast<size_t>(clamp(dc, 0, static_cast<double>(length - actual_start))); - } - - // 11. Let insertCount be the number of elements in items. - auto insert_count = vm.argument_count() >= 2 ? vm.argument_count() - 2 : 0; - - // 12. Let convertedItems be a new empty List. - MarkedVector<Value> converted_items(vm.heap()); - - // 13. For each element E of items, do - for (size_t element_index = 2; element_index < vm.argument_count(); element_index++) { - auto element = vm.argument(element_index); - Value converted_value; - // a. If O.[[ContentType]] is BigInt, let convertedValue be ? ToBigInt(E). - if (typed_array->content_type() == TypedArrayBase::ContentType::BigInt) - converted_value = TRY(element.to_bigint(global_object)); - // Else, let convertedValue be ? ToNumber(E). - else - converted_value = TRY(element.to_number(global_object)); - - // c. Append convertedValue as the last element of convertedItems. - converted_items.append(converted_value); - } - - // Let newLen be len + insertCount - actualDeleteCount. - auto new_length = length + insert_count - actual_delete_count; - - // 15. Let A be ? TypedArrayCreateSameType(O, ยซ ๐ฝ(newLen) ยป). - MarkedVector<Value> arguments(vm.heap()); - arguments.empend(length); - auto* return_array = TRY(typed_array_create_same_type(global_object, *typed_array, move(arguments))); - - // 16. Let i be 0. - // 17. Let r be actualStart + actualDeleteCount. - size_t i = 0; - auto r = actual_start + actual_delete_count; - - // 18. Repeat, while i < actualStart, - while (i < actual_start) { - // a. Let Pi be ! ToString(๐ฝ(i)). - auto property_key = PropertyKey { i }; - - // b. Let iValue be ! Get(O, Pi). - auto index_value = MUST(typed_array->get(property_key)); - - // c. Perform ! Set(target, Pi, iValue, true). - MUST(return_array->set(property_key, index_value, Object::ShouldThrowExceptions::Yes)); - - // d. Set i to i + 1. - i++; - } - - // 19. For each element E of convertedItems, do - for (auto const& element : converted_items) { - // a. Let Pi be ! ToString(๐ฝ(i)). - auto property_key = PropertyKey { i }; - - // b. Perform ! Set(A, Pi, E, true). - MUST(return_array->set(property_key, element, Object::ShouldThrowExceptions::Yes)); - - // c. Set i to i + 1. - i++; - } - - // 20. Repeat, while i < newLen, - while (i < new_length) { - // a. Let Pi be ! ToString(๐ฝ(i)). - auto property_key = PropertyKey { i }; - - // b. Let from be ! ToString(๐ฝ(r)). - auto from = PropertyKey { r }; - - // c. Let fromValue be ! Get(O, from). - auto from_value = TRY(typed_array->get(from)); - - // d. Perform ! Set(A, Pi, fromValue, true). - MUST(return_array->set(property_key, from_value, Object::ShouldThrowExceptions::Yes)); - - // e. Set i to i + 1. - i++; - - // f. Set r to r + 1. - r++; - } - - // 21. Return A. - return return_array; -} - -// 1.2.2.1.6 %TypedArray%.prototype.with ( index, value ), https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with +// 1.2.2.1.5 %TypedArray%.prototype.with ( index, value ), https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::with) { auto index = vm.argument(0); diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h index 784c89ee1b..01a7222a39 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h @@ -53,7 +53,6 @@ private: JS_DECLARE_NATIVE_FUNCTION(to_locale_string); JS_DECLARE_NATIVE_FUNCTION(to_reversed); JS_DECLARE_NATIVE_FUNCTION(to_sorted); - JS_DECLARE_NATIVE_FUNCTION(to_spliced); JS_DECLARE_NATIVE_FUNCTION(with); JS_DECLARE_NATIVE_FUNCTION(values); JS_DECLARE_NATIVE_FUNCTION(to_string_tag_getter); diff --git a/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.toSpliced.js b/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.toSpliced.js deleted file mode 100644 index 6e21b1991f..0000000000 --- a/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.toSpliced.js +++ /dev/null @@ -1,159 +0,0 @@ -const TYPED_ARRAYS = [ - Uint8Array, - Uint8ClampedArray, - Uint16Array, - Uint32Array, - Int8Array, - Int16Array, - Int32Array, - Float32Array, - Float64Array, -]; - -const BIGINT_TYPED_ARRAYS = [BigUint64Array, BigInt64Array]; - -describe("normal behavior", () => { - test("length is 2", () => { - TYPED_ARRAYS.forEach(T => { - expect(T.prototype.toSpliced).toHaveLength(2); - }); - BIGINT_TYPED_ARRAYS.forEach(T => { - expect(T.prototype.toSpliced).toHaveLength(2); - }); - }); - - test("no start or delete count argument", () => { - TYPED_ARRAYS.forEach(T => { - const a = new T([1, 2, 3, 4, 5]); - const b = a.toSpliced(); - expect(a).not.toBe(b); - expect(a).toEqual([1, 2, 3, 4, 5]); - expect(b).toEqual([1, 2, 3, 4, 5]); - }); - BIGINT_TYPED_ARRAYS.forEach(T => { - const a = new T([1n, 2n, 3n, 4n, 5n]); - const b = a.toSpliced(); - expect(a).not.toBe(b); - expect(a).toEqual([1n, 2n, 3n, 4n, 5n]); - expect(b).toEqual([1n, 2n, 3n, 4n, 5n]); - }); - }); - - test("only start argument", () => { - TYPED_ARRAYS.forEach(T => { - const a = new T([1, 2, 3, 4, 5]); - const values = [ - [0, [0, 0, 0, 0, 0]], - [1, [1, 0, 0, 0, 0]], - [4, [1, 2, 3, 4, 0]], - [-1, [1, 2, 3, 4, 0]], - [999, [1, 2, 3, 4, 5]], - [Infinity, [1, 2, 3, 4, 5]], - ]; - for (const [start, expected] of values) { - const b = a.toSpliced(start); - expect(a).not.toBe(b); - expect(a).toEqual([1, 2, 3, 4, 5]); - expect(b).toEqual(expected); - } - }); - BIGINT_TYPED_ARRAYS.forEach(T => { - const a = new T([1n, 2n, 3n, 4n, 5n]); - const values = [ - [0, [0n, 0n, 0n, 0n, 0n]], - [1, [1n, 0n, 0n, 0n, 0n]], - [4, [1n, 2n, 3n, 4n, 0n]], - [-1, [1n, 2n, 3n, 4n, 0n]], - [999, [1n, 2n, 3n, 4n, 5n]], - [Infinity, [1n, 2n, 3n, 4n, 5n]], - ]; - for (const [start, expected] of values) { - const b = a.toSpliced(start); - expect(a).not.toBe(b); - expect(a).toEqual([1n, 2n, 3n, 4n, 5n]); - expect(b).toEqual(expected); - } - }); - }); - - test("start and delete count argument", () => { - TYPED_ARRAYS.forEach(T => { - const a = new T([1, 2, 3, 4, 5]); - const values = [ - [0, 5, [0, 0, 0, 0, 0]], - [1, 3, [1, 5, 0, 0, 0]], - [4, 1, [1, 2, 3, 4, 0]], - [-1, 1, [1, 2, 3, 4, 0]], - [999, 10, [1, 2, 3, 4, 5]], - [Infinity, Infinity, [1, 2, 3, 4, 5]], - ]; - for (const [start, deleteCount, expected] of values) { - const b = a.toSpliced(start, deleteCount); - expect(a).not.toBe(b); - expect(a).toEqual([1, 2, 3, 4, 5]); - expect(b).toEqual(expected); - } - }); - BIGINT_TYPED_ARRAYS.forEach(T => { - const a = new T([1n, 2n, 3n, 4n, 5n]); - const values = [ - [0, 5, [0n, 0n, 0n, 0n, 0n]], - [1, 3, [1n, 5n, 0n, 0n, 0n]], - [4, 1, [1n, 2n, 3n, 4n, 0n]], - [-1, 1, [1n, 2n, 3n, 4n, 0n]], - [999, 10, [1n, 2n, 3n, 4n, 5n]], - [Infinity, Infinity, [1n, 2n, 3n, 4n, 5n]], - ]; - for (const [start, deleteCount, expected] of values) { - const b = a.toSpliced(start, deleteCount); - expect(a).not.toBe(b); - expect(a).toEqual([1n, 2n, 3n, 4n, 5n]); - expect(b).toEqual(expected); - } - }); - }); -}); - -describe("errors", () => { - test("null or undefined this value", () => { - TYPED_ARRAYS.forEach(T => { - expect(() => { - T.prototype.toSpliced.call(); - }).toThrowWithMessage(TypeError, "ToObject on null or undefined"); - - expect(() => { - T.prototype.toSpliced.call(undefined); - }).toThrowWithMessage(TypeError, "ToObject on null or undefined"); - - expect(() => { - T.prototype.toSpliced.call(null); - }).toThrowWithMessage(TypeError, "ToObject on null or undefined"); - }); - BIGINT_TYPED_ARRAYS.forEach(T => { - expect(() => { - T.prototype.toSpliced.call(); - }).toThrowWithMessage(TypeError, "ToObject on null or undefined"); - - expect(() => { - T.prototype.toSpliced.call(undefined); - }).toThrowWithMessage(TypeError, "ToObject on null or undefined"); - - expect(() => { - T.prototype.toSpliced.call(null); - }).toThrowWithMessage(TypeError, "ToObject on null or undefined"); - }); - }); - - test("invalid typed array length", () => { - TYPED_ARRAYS.forEach(T => { - expect(() => { - new T({ length: 2 ** 32 - 1 }); - }).toThrowWithMessage(RangeError, "Invalid typed array length"); - }); - BIGINT_TYPED_ARRAYS.forEach(T => { - expect(() => { - new T({ length: 2 ** 32 - 1 }); - }).toThrowWithMessage(RangeError, "Invalid typed array length"); - }); - }); -}); |