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

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

  // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright
  transitioning javascript builtin
  TypedArrayPrototypeReduceRight(
      js-implicit context: Context, receiver: Object)(...arguments): Object {
    // arguments[0] = callback
    // arguments[1] = initialValue.
    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 initialValue = arguments.length >= 2 ? arguments[1] : TheHole;

      return ReduceRightAllElements(uarray, callbackfn, initialValue);
    }
    label NotCallable deferred {
      ThrowTypeError(kCalledNonCallable, arguments[0]);
    }
    label NotTypedArray deferred {
      ThrowTypeError(kNotTypedArray, kBuiltinName);
    }
    label IsDetached deferred {
      ThrowTypeError(kDetachedOperation, kBuiltinName);
    }
  }
}
