// Copyright 2020 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/objects/js-objects.h'

namespace error {

transitioning javascript builtin AggregateErrorConstructor(
    js-implicit context: NativeContext, target: JSFunction,
    newTarget: JSAny)(...arguments): JSAny {
  // 1. If NewTarget is undefined, let newTarget be the active function
  // object, else let newTarget be NewTarget.
  // 2. Let O be ? OrdinaryCreateFromConstructor(newTarget,
  // "%AggregateError.prototype%", « [[ErrorData]], [[AggregateErrors]] »).
  // 3. If _message_ is not _undefined_, then
  //   a. Let msg be ? ToString(_message_).
  //   b. Let msgDesc be the PropertyDescriptor { [[Value]]: _msg_,
  //   [[Writable]]: *true*, [[Enumerable]]: *false*, [[Configurable]]: *true*
  //   c. Perform ! DefinePropertyOrThrow(_O_, *"message"*, _msgDesc_).
  const message: JSAny = arguments[1];
  const obj: JSObject =
      ConstructAggregateErrorHelper(context, target, newTarget, message);

  // 4. Let errorsList be ? IterableToList(errors).
  const errors: JSAny = arguments[0];
  const errorsList = iterator::IterableToListWithSymbolLookup(errors);

  // 5. Perform ! DefinePropertyOrThrow(_O_, `"errors"`, Property Descriptor {
  // [[Configurable]]: *true*, [[Enumerable]]: *false*, [[Writable]]: *true*,
  // [[Value]]: ! CreateArrayFromList(_errorsList_) }).
  SetOwnPropertyIgnoreAttributes(
      obj, ErrorsStringConstant(), errorsList,
      SmiConstant(PropertyAttributes::DONT_ENUM));

  // 6. Return O.
  return obj;
}

extern transitioning runtime ConstructAggregateErrorHelper(
    Context, JSFunction, JSAny, Object): JSObject;

extern transitioning runtime ConstructInternalAggregateErrorHelper(
    Context, Object): JSObject;
}
