From 46e43f4bde4a35785b4997b81e86cd19f046b69b Mon Sep 17 00:00:00 2001 From: Minteck Date: Tue, 21 Dec 2021 16:52:28 +0100 Subject: Commit --- .../es-abstract/2015/ArraySpeciesCreate.js | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/node_modules/es-abstract/2015/ArraySpeciesCreate.js (limited to 'src/node_modules/es-abstract/2015/ArraySpeciesCreate.js') diff --git a/src/node_modules/es-abstract/2015/ArraySpeciesCreate.js b/src/node_modules/es-abstract/2015/ArraySpeciesCreate.js new file mode 100644 index 0000000..98b9b56 --- /dev/null +++ b/src/node_modules/es-abstract/2015/ArraySpeciesCreate.js @@ -0,0 +1,46 @@ +'use strict'; + +var GetIntrinsic = require('../GetIntrinsic'); + +var $Array = GetIntrinsic('%Array%'); +var $species = GetIntrinsic('%Symbol.species%', true); +var $TypeError = GetIntrinsic('%TypeError%'); + +var Get = require('./Get'); +var IsArray = require('./IsArray'); +var IsConstructor = require('./IsConstructor'); +var IsInteger = require('./IsInteger'); +var Type = require('./Type'); + +// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate + +module.exports = function ArraySpeciesCreate(originalArray, length) { + if (!IsInteger(length) || length < 0) { + throw new $TypeError('Assertion failed: length must be an integer >= 0'); + } + var len = length === 0 ? 0 : length; + var C; + var isArray = IsArray(originalArray); + if (isArray) { + C = Get(originalArray, 'constructor'); + // TODO: figure out how to make a cross-realm normal Array, a same-realm Array + // if (IsConstructor(C)) { + // if C is another realm's Array, C = undefined + // Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ? + // } + if ($species && Type(C) === 'Object') { + C = Get(C, $species); + if (C === null) { + C = void 0; + } + } + } + if (typeof C === 'undefined') { + return $Array(len); + } + if (!IsConstructor(C)) { + throw new $TypeError('C must be a constructor'); + } + return new C(len); // Construct(C, len); +}; + -- cgit