array-of.tq 1.46 KB
Newer Older
1 2 3 4
// 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.

5
namespace array_of {
6
  // https://tc39.github.io/ecma262/#sec-array.of
7 8
  transitioning javascript builtin
  ArrayOf(implicit context: Context)(receiver: Object, ...arguments): Object {
9 10 11 12
    // 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.
13
    const items: Arguments = arguments;
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

    // 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].
      let kValue: Object = items[Convert<intptr>(k)];

      // b. Let Pk be ! ToString(k).
      // c. Perform ? CreateDataPropertyOrThrow(A, Pk, kValue).
42
      FastCreateDataProperty(a, k, kValue);
43 44 45 46 47 48

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

    // 8. Perform ? Set(A, "length", len, true).
49
    array::SetPropertyLength(a, len);
50 51 52 53 54

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