summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/array-of.tq
blob: ceb9edff63c5b8166db44e33d68c78920d0cf52a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
42
43
44
45
46
47
48
49
50
51
52
53
54
// 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: JSAny)(...arguments): JSAny {
    // 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: JSAny = 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 (JSAny): {
        // 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: JSAny = 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;
  }
}