// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include 'src/builtins/builtins-typed-array-gen.h'

namespace typed_array {
const kBuiltinNameEvery: constexpr string = '%TypedArray%.prototype.every';

transitioning macro EveryAllElements(implicit context: Context)(
    array: typed_array::AttachedJSTypedArray, callbackfn: Callable,
    thisArg: JSAny): Boolean {
  let witness = typed_array::NewAttachedJSTypedArrayWitness(array);
  const length: uintptr = witness.Get().length;
  for (let k: uintptr = 0; k < length; k++) {
    // BUG(4895): We should throw on detached buffers rather than simply exit.
    witness.Recheck() otherwise break;
    const value: JSAny = witness.Load(k);
    // TODO(v8:4153): Consider versioning this loop for Smi and non-Smi
    // indices to optimize Convert<Number>(k) for the most common case.
    const result = Call(
        context, callbackfn, thisArg, value, Convert<Number>(k),
        witness.GetStable());
    if (!ToBoolean(result)) {
      return False;
    }
  }
  return True;
}

// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every
transitioning javascript builtin
TypedArrayPrototypeEvery(
    js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
  // arguments[0] = callback
  // arguments[1] = thisArg
  try {
    const array: JSTypedArray = Cast<JSTypedArray>(receiver)
        otherwise NotTypedArray;
    const uarray = typed_array::EnsureAttached(array) otherwise IsDetached;

    const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable;
    const thisArg = arguments[1];
    return EveryAllElements(uarray, callbackfn, thisArg);
  } label NotCallable deferred {
    ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
  } label NotTypedArray deferred {
    ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameEvery);
  } label IsDetached deferred {
    ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameEvery);
  }
}
}
