summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/array-of.tq
blob: 44c2cdca27665fd81804b161495941a210e883b6 (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
55
// 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 {
// https://tc39.github.io/ecma262/#sec-array.of
transitioning javascript builtin
ArrayOf(
    js-implicit context: NativeContext, 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 = HasBuiltinSubclassingFlag() ? receiver : GetArrayFunction();

  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;
}
}