in lib/VM/JSLib/Array.cpp [29:314]
Handle<JSObject> createArrayConstructor(Runtime &runtime) {
auto arrayPrototype = Handle<JSArray>::vmcast(&runtime.arrayPrototype);
// Array.prototype.xxx methods.
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::toString),
nullptr,
arrayPrototypeToString,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::toLocaleString),
nullptr,
arrayPrototypeToLocaleString,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::concat),
nullptr,
arrayPrototypeConcat,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::join),
nullptr,
arrayPrototypeJoin,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::push),
nullptr,
arrayPrototypePush,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::sort),
nullptr,
arrayPrototypeSort,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::forEach),
nullptr,
arrayPrototypeForEach,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::flat),
nullptr,
arrayPrototypeFlat,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::flatMap),
nullptr,
arrayPrototypeFlatMap,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::keys),
(void *)IterationKind::Key,
arrayPrototypeIterator,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::values),
(void *)IterationKind::Value,
arrayPrototypeIterator,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::entries),
(void *)IterationKind::Entry,
arrayPrototypeIterator,
0);
auto propValue = runtime.ignoreAllocationFailure(JSObject::getNamed_RJS(
arrayPrototype, runtime, Predefined::getSymbolID(Predefined::values)));
runtime.arrayPrototypeValues = std::move(propValue);
DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
arrayPrototype,
runtime,
Predefined::getSymbolID(Predefined::SymbolIterator),
dpf,
Handle<>(&runtime.arrayPrototypeValues)));
auto cons = defineSystemConstructor<JSArray>(
runtime,
Predefined::getSymbolID(Predefined::Array),
arrayConstructor,
arrayPrototype,
1,
CellKind::JSArrayKind);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::isArray),
nullptr,
arrayIsArray,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::slice),
nullptr,
arrayPrototypeSlice,
2);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::splice),
nullptr,
arrayPrototypeSplice,
2);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::copyWithin),
nullptr,
arrayPrototypeCopyWithin,
2);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::pop),
nullptr,
arrayPrototypePop,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::shift),
nullptr,
arrayPrototypeShift,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::unshift),
nullptr,
arrayPrototypeUnshift,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::indexOf),
nullptr,
arrayPrototypeIndexOf,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::lastIndexOf),
nullptr,
arrayPrototypeLastIndexOf,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::every),
nullptr,
arrayPrototypeEvery,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::some),
nullptr,
arrayPrototypeSome,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::map),
nullptr,
arrayPrototypeMap,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::filter),
nullptr,
arrayPrototypeFilter,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::fill),
nullptr,
arrayPrototypeFill,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::find),
nullptr,
arrayPrototypeFind,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::findIndex),
// Pass a non-null pointer here to indicate we're finding the index.
(void *)true,
arrayPrototypeFind,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::findLast),
nullptr,
arrayPrototypeFindLast,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::findLastIndex),
// Pass a non-null pointer here to indicate we're finding the index.
(void *)true,
arrayPrototypeFindLast,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::reduce),
nullptr,
arrayPrototypeReduce,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::reduceRight),
nullptr,
arrayPrototypeReduceRight,
1);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::reverse),
nullptr,
arrayPrototypeReverse,
0);
defineMethod(
runtime,
arrayPrototype,
Predefined::getSymbolID(Predefined::includes),
nullptr,
arrayPrototypeIncludes,
1);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::of),
nullptr,
arrayOf,
0);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::from),
nullptr,
arrayFrom,
1);
return cons;
}