blob: 7293318625723106ff4f95695c0456f2a1b65821 [file] [log] [blame]
// 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;
}
}