Browse Source

Implement `findLast` and `findLastIndex` on TypedArray (#3135)

* Implement `findLast` and `findLastIndex` on `TypedArray`

* Apply cleanups based on feedback on the find_via_predicate introduction
pull/3142/head
Dirk de Visser 1 year ago committed by GitHub
parent
commit
b51e7cfb84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 98
      boa_engine/src/builtins/typed_array/mod.rs

98
boa_engine/src/builtins/typed_array/mod.rs

@ -321,6 +321,8 @@ impl IntrinsicObject for TypedArray {
.method(Self::filter, "filter", 1)
.method(Self::find, "find", 1)
.method(Self::find_index, "findIndex", 1)
.method(Self::find_last, "findLast", 1)
.method(Self::find_last_index, "findLastIndex", 1)
.method(Self::foreach, "forEach", 1)
.method(Self::includes, "includes", 1)
.method(Self::index_of, "indexOf", 1)
@ -1225,7 +1227,101 @@ impl TypedArray {
Ok(index)
}
/// `23.2.3.13 %TypedArray%.prototype.forEach ( callbackfn [ , thisArg ] )`
/// `23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )`
///
/// More information:
/// - [ECMAScript reference][spec]
///
/// [spec]: https://tc39.es/ecma262/#sec-%typedarray%.prototype.findlast
pub(crate) fn find_last(
this: &JsValue,
args: &[JsValue],
context: &mut Context<'_>,
) -> JsResult<JsValue> {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
let obj = this.as_object().ok_or_else(|| {
JsNativeError::typ().with_message("Value is not a typed array object")
})?;
let obj_borrow = obj.borrow();
let o = obj_borrow.as_typed_array().ok_or_else(|| {
JsNativeError::typ().with_message("Value is not a typed array object")
})?;
if o.is_detached() {
return Err(JsNativeError::typ()
.with_message("Buffer of the typed array is detached")
.into());
}
// 3. Let len be O.[[ArrayLength]].
let len = o.array_length();
let predicate = args.get_or_undefined(0);
let this_arg = args.get_or_undefined(1);
// 4. Let findRec be ? FindViaPredicate(O, len, descending, predicate, thisArg).
let (_, value) = find_via_predicate(
obj,
len,
Direction::Descending,
predicate,
this_arg,
context,
"TypedArray.prototype.findLast",
)?;
// 5. Return findRec.[[Value]].
Ok(value)
}
/// `23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )`
///
/// More information:
/// - [ECMAScript reference][spec]
///
/// [spec]: https://tc39.es/ecma262/#sec-%typedarray%.prototype.findlastindex
pub(crate) fn find_last_index(
this: &JsValue,
args: &[JsValue],
context: &mut Context<'_>,
) -> JsResult<JsValue> {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
let obj = this.as_object().ok_or_else(|| {
JsNativeError::typ().with_message("Value is not a typed array object")
})?;
let obj_borrow = obj.borrow();
let o = obj_borrow.as_typed_array().ok_or_else(|| {
JsNativeError::typ().with_message("Value is not a typed array object")
})?;
if o.is_detached() {
return Err(JsNativeError::typ()
.with_message("Buffer of the typed array is detached")
.into());
}
// 3. Let len be O.[[ArrayLength]].
let len = o.array_length();
let predicate = args.get_or_undefined(0);
let this_arg = args.get_or_undefined(1);
// 4. Let findRec be ? FindViaPredicate(O, len, descending, predicate, thisArg).
let (index, _) = find_via_predicate(
obj,
len,
Direction::Descending,
predicate,
this_arg,
context,
"TypedArray.prototype.findLastIndex",
)?;
// 5. Return findRec.[[Index]].
Ok(index)
}
/// `23.2.3.15 %TypedArray%.prototype.forEach ( callbackfn [ , thisArg ] )`
///
/// More information:
/// - [ECMAScript reference][spec]

Loading…
Cancel
Save