summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp
index 1d4d9ef9d0..1d5e151df1 100644
--- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp
+++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp
@@ -667,42 +667,68 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::includes)
// 23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] ), https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof
JS_DEFINE_NATIVE_FUNCTION(TypedArrayPrototype::index_of)
{
+ // 1. Let O be the this value.
+ // 2. Perform ? ValidateTypedArray(O).
auto typed_array = TRY(validate_typed_array_from_this(vm));
+ // 3. Let len be O.[[ArrayLength]].
auto length = typed_array->array_length();
+ // 4. If len is 0, return -1𝔽.
if (length == 0)
return Value(-1);
+ // 5. Let n be ? ToIntegerOrInfinity(fromIndex).
auto n = TRY(vm.argument(1).to_integer_or_infinity(vm));
+ // FIXME: 6. Assert: If fromIndex is undefined, then n is 0.
+
auto value_n = Value(n);
+ // 7. If n is +∞, return -1𝔽.
if (value_n.is_positive_infinity())
return Value(-1);
+ // 8. Else if n is -∞, set n to 0.
else if (value_n.is_negative_infinity())
n = 0;
u32 k;
+ // 9. If n ≥ 0, then
if (n >= 0) {
+ // a. Let k be n.
k = n;
- } else {
+ }
+ // 10. Else,
+ else {
+ // a. Let k be len + n.
auto relative_k = length + n;
+
+ // b. If k < 0, set k to 0.
if (relative_k < 0)
relative_k = 0;
k = relative_k;
}
+ // 11. Repeat, while k < len,
auto search_element = vm.argument(0);
for (; k < length; ++k) {
+ // a. Let kPresent be ! HasProperty(O, ! ToString(𝔽(k))).
auto k_present = MUST(typed_array->has_property(k));
+
+ // b. If kPresent is true, then
if (k_present) {
+ // i. Let elementK be ! Get(O, ! ToString(𝔽(k))).
auto element_k = MUST(typed_array->get(k));
+ // ii. Let same be IsStrictlyEqual(searchElement, elementK).
+ // iii. If same is true, return 𝔽(k).
if (is_strictly_equal(search_element, element_k))
return Value(k);
}
+
+ // c. Set k to k + 1.
}
+ // 12. Return -1𝔽.
return Value(-1);
}