2020-08-25 23:57:08 +00:00
'use strict' ;
2021-02-26 03:58:33 +00:00
var GetIntrinsic = require ( 'get-intrinsic' ) ;
2020-08-25 23:57:08 +00:00
var $ArrayPrototype = GetIntrinsic ( '%Array.prototype%' ) ;
var $RangeError = GetIntrinsic ( '%RangeError%' ) ;
var $SyntaxError = GetIntrinsic ( '%SyntaxError%' ) ;
var $TypeError = GetIntrinsic ( '%TypeError%' ) ;
var IsInteger = require ( './IsInteger' ) ;
var MAX _ARRAY _LENGTH = Math . pow ( 2 , 32 ) - 1 ;
var $setProto = GetIntrinsic ( '%Object.setPrototypeOf%' , true ) || (
// eslint-disable-next-line no-proto, no-negated-condition
[ ] . _ _proto _ _ !== $ArrayPrototype
? null
: function ( O , proto ) {
O . _ _proto _ _ = proto ; // eslint-disable-line no-proto, no-param-reassign
return O ;
}
) ;
2021-02-26 03:58:33 +00:00
// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate
2020-08-25 23:57:08 +00:00
module . exports = function ArrayCreate ( length ) {
if ( ! IsInteger ( length ) || length < 0 ) {
throw new $TypeError ( 'Assertion failed: `length` must be an integer Number >= 0' ) ;
}
if ( length > MAX _ARRAY _LENGTH ) {
throw new $RangeError ( 'length is greater than (2**32 - 1)' ) ;
}
var proto = arguments . length > 1 ? arguments [ 1 ] : $ArrayPrototype ;
var A = [ ] ; // steps 5 - 7, and 9
if ( proto !== $ArrayPrototype ) { // step 8
if ( ! $setProto ) {
throw new $SyntaxError ( 'ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]' ) ;
}
$setProto ( A , proto ) ;
}
if ( length !== 0 ) { // bypasses the need for step 2
A . length = length ;
}
/ * s t e p 1 0 , t h e a b o v e a s a s h o r t c u t f o r t h e b e l o w
OrdinaryDefineOwnProperty ( A , 'length' , {
'[[Configurable]]' : false ,
'[[Enumerable]]' : false ,
'[[Value]]' : length ,
'[[Writable]]' : true
} ) ;
* /
return A ;
} ;