// Copyright 2018 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.

namespace array_of {
  // https://tc39.github.io/ecma262/#sec-array.of
  transitioning javascript builtin
  ArrayOf(js-implicit context: Context, receiver: Object)(...arguments):
      Object {
    // 1. Let len be the actual number of arguments passed to this function.
    const len: Smi = Convert<Smi>(arguments.length);

    // 2. Let items be the List of arguments passed to this function.
    const items: Arguments = arguments;

    // 3. Let C be the this value.
    const c: Object = receiver;

    let a: JSReceiver;

    // 4. If IsConstructor(C) is true, then
    typeswitch (c) {
      case (c: Constructor): {
        // a. Let A be ? Construct(C, « len »).
        a = Construct(c, len);
      }
      case (Object): {
        // a. Let A be ? ArrayCreate(len).
        a = ArrayCreate(len);
      }
    }

    // 6. Let k be 0.
    let k: Smi = 0;

    // 7. Repeat, while k < len
    while (k < len) {
      // a. Let kValue be items[k].
      const kValue: Object = items[Convert<intptr>(k)];

      // b. Let Pk be ! ToString(k).
      // c. Perform ? CreateDataPropertyOrThrow(A, Pk, kValue).
      FastCreateDataProperty(a, k, kValue);

      // d. Increase k by 1.
      k++;
    }

    // 8. Perform ? Set(A, "length", len, true).
    array::SetPropertyLength(a, len);

    // 9. Return A.
    return a;
  }
}
