// 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_findindex {
  const kBuiltinName: constexpr string = '%TypedArray%.prototype.findIndex';

  transitioning macro FindIndexAllElements(implicit context: Context)(
      array: typed_array::AttachedJSTypedArray, callbackfn: Callable,
      thisArg: Object): Number {
    let witness = typed_array::NewAttachedJSTypedArrayWitness(array);
    // TODO(v8:4153): Support huge TypedArrays here.
    const length =
        Cast<Smi>(Convert<Number>(witness.Get().length)) otherwise unreachable;
    for (let k: Smi = 0; k < length; k++) {
      // BUG(4895): We should throw on detached buffers rather than simply exit.
      witness.Recheck() otherwise break;
      const value: Object = witness.Load(k);
      const result =
          Call(context, callbackfn, thisArg, value, k, witness.GetStable());
      if (ToBoolean(result)) {
        return k;
      }
    }
    return -1;
  }

  // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findIndex
  transitioning javascript builtin
  TypedArrayPrototypeFindIndex(js-implicit context: Context, receiver: Object)(
      ...arguments): Object {
    // 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 FindIndexAllElements(uarray, callbackfn, thisArg);
    }
    label NotCallable deferred {
      ThrowTypeError(kCalledNonCallable, arguments[0]);
    }
    label NotTypedArray deferred {
      ThrowTypeError(kNotTypedArray, kBuiltinName);
    }
    label IsDetached deferred {
      ThrowTypeError(kDetachedOperation, kBuiltinName);
    }
  }
}
