diff options
author | Luke <luke.wilde@live.co.uk> | 2021-06-26 01:00:57 +0100 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-06-26 13:32:53 +0100 |
commit | a6324481e15579a13053c40cf0ddc1b6a872a0c5 (patch) | |
tree | 6888bdfa6ae5a6597abbcd30d8464a08ee7aa644 | |
parent | fb43b778abab1068fe2ba151bebb6dba4ecda756 (diff) | |
download | serenity-a6324481e15579a13053c40cf0ddc1b6a872a0c5.zip |
LibJS: Add %TypedArray%.prototype.values
3 files changed, 57 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp index 0ce14a7da5..887ea51914 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp @@ -35,6 +35,7 @@ void TypedArrayPrototype::initialize(GlobalObject& object) 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_function(vm.names.values, values, 0, attr); define_native_accessor(*vm.well_known_symbol_to_string_tag(), to_string_tag_getter, nullptr, Attribute::Configurable); @@ -249,6 +250,15 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::keys) return ArrayIterator::create(global_object, typed_array, Object::PropertyKind::Key); } +// 23.2.3.30 %TypedArray%.prototype.values ( ), https://tc39.es/ecma262/#sec-%typedarray%.prototype.values +JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::values) +{ + auto typed_array = typed_array_from(vm, global_object); + if (!typed_array) + return {}; + return ArrayIterator::create(global_object, typed_array, Object::PropertyKind::Value); +} + // 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 fc9b1735fe..06a802ff4f 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.h @@ -33,6 +33,7 @@ private: JS_DECLARE_NATIVE_FUNCTION(some); JS_DECLARE_NATIVE_FUNCTION(join); JS_DECLARE_NATIVE_FUNCTION(keys); + JS_DECLARE_NATIVE_FUNCTION(values); }; } diff --git a/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.values.js b/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.values.js new file mode 100644 index 0000000000..c25cc9402a --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/builtins/TypedArray/TypedArray.prototype.values.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.values).toHaveLength(0); + }); + + BIGINT_TYPED_ARRAYS.forEach(T => { + expect(T.prototype.values).toHaveLength(0); + }); +}); + +test("basic functionality", () => { + TYPED_ARRAYS.forEach(T => { + const a = new T([30, 40, 50]); + const it = a.values(); + expect(it.next()).toEqual({ value: 30, done: false }); + expect(it.next()).toEqual({ value: 40, done: false }); + expect(it.next()).toEqual({ value: 50, 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.values(); + expect(it.next()).toEqual({ value: 30n, done: false }); + expect(it.next()).toEqual({ value: 40n, done: false }); + expect(it.next()).toEqual({ value: 50n, 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 }); + }); +}); |