diff options
author | Luke <luke.wilde@live.co.uk> | 2021-06-26 01:00:07 +0100 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-06-26 13:32:53 +0100 |
commit | fb43b778abab1068fe2ba151bebb6dba4ecda756 (patch) | |
tree | 86e605fd71014dd7b60585530d4d3f768eb8f3ae | |
parent | 293974c1cbc094d63e6a036cdbd55b212f0420a1 (diff) | |
download | serenity-fb43b778abab1068fe2ba151bebb6dba4ecda756.zip |
LibJS: Add %TypedArray%.prototype.keys
3 files changed, 58 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp index 6819c7367a..0ce14a7da5 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include <LibJS/Runtime/ArrayIterator.h> #include <LibJS/Runtime/GlobalObject.h> #include <LibJS/Runtime/TypedArray.h> #include <LibJS/Runtime/TypedArrayPrototype.h> @@ -33,6 +34,7 @@ void TypedArrayPrototype::initialize(GlobalObject& object) define_native_function(vm.names.forEach, for_each, 1, attr); define_native_function(vm.names.some, some, 1, attr); define_native_function(vm.names.join, join, 1, attr); + define_native_function(vm.names.keys, keys, 0, attr); define_native_accessor(*vm.well_known_symbol_to_string_tag(), to_string_tag_getter, nullptr, Attribute::Configurable); @@ -238,6 +240,15 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::join) return js_string(vm, builder.to_string()); } +// 23.2.3.16 %TypedArray%.prototype.keys ( ), https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys +JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::keys) +{ + auto typed_array = typed_array_from(vm, global_object); + if (!typed_array) + return {}; + return ArrayIterator::create(global_object, typed_array, Object::PropertyKind::Key); +} + // 23.2.3.1 get %TypedArray%.prototype.buffer, https://tc39.es/ecma262/#sec-get-%typedarray%.prototype.buffer JS_DEFINE_NATIVE_GETTER(TypedArrayPrototype::buffer_getter) { diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h index 72d58b79a3..fc9b1735fe 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h @@ -32,6 +32,7 @@ private: JS_DECLARE_NATIVE_FUNCTION(for_each); JS_DECLARE_NATIVE_FUNCTION(some); JS_DECLARE_NATIVE_FUNCTION(join); + JS_DECLARE_NATIVE_FUNCTION(keys); }; } diff --git a/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.keys.js b/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.keys.js new file mode 100644 index 0000000000..7124ed36c5 --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.keys.js @@ -0,0 +1,46 @@ +const TYPED_ARRAYS = [ + Uint8Array, + Uint16Array, + Uint32Array, + Int8Array, + Int16Array, + Int32Array, + Float32Array, + Float64Array, +]; + +const BIGINT_TYPED_ARRAYS = [BigUint64Array, BigInt64Array]; + +test("length is 0", () => { + TYPED_ARRAYS.forEach(T => { + expect(T.prototype.keys).toHaveLength(0); + }); + + BIGINT_TYPED_ARRAYS.forEach(T => { + expect(T.prototype.keys).toHaveLength(0); + }); +}); + +test("basic functionality", () => { + TYPED_ARRAYS.forEach(T => { + const a = new T([30, 40, 50]); + const it = a.keys(); + expect(it.next()).toEqual({ value: 0, done: false }); + expect(it.next()).toEqual({ value: 1, done: false }); + expect(it.next()).toEqual({ value: 2, done: false }); + expect(it.next()).toEqual({ value: undefined, done: true }); + expect(it.next()).toEqual({ value: undefined, done: true }); + expect(it.next()).toEqual({ value: undefined, done: true }); + }); + + BIGINT_TYPED_ARRAYS.forEach(T => { + const a = new T([30n, 40n, 50n]); + const it = a.keys(); + expect(it.next()).toEqual({ value: 0, done: false }); + expect(it.next()).toEqual({ value: 1, done: false }); + expect(it.next()).toEqual({ value: 2, done: false }); + expect(it.next()).toEqual({ value: undefined, done: true }); + expect(it.next()).toEqual({ value: undefined, done: true }); + expect(it.next()).toEqual({ value: undefined, done: true }); + }); +}); |