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