2023-10-03 11:14:36 +08:00
'use strict' ;
var GetIntrinsic = require ( 'get-intrinsic' ) ;
var $ArrayPrototype = GetIntrinsic ( '%Array.prototype%' ) ;
var $RangeError = GetIntrinsic ( '%RangeError%' ) ;
var $SyntaxError = GetIntrinsic ( '%SyntaxError%' ) ;
var $TypeError = GetIntrinsic ( '%TypeError%' ) ;
var IsIntegralNumber = require ( './IsIntegralNumber' ) ;
var MAX _ARRAY _LENGTH = Math . pow ( 2 , 32 ) - 1 ;
var hasProto = require ( 'has-proto' ) ( ) ;
var $setProto = GetIntrinsic ( '%Object.setPrototypeOf%' , true ) || (
hasProto
? function ( O , proto ) {
O . _ _proto _ _ = proto ; // eslint-disable-line no-proto, no-param-reassign
return O ;
}
: null
) ;
// https://262.ecma-international.org/12.0/#sec-arraycreate
module . exports = function ArrayCreate ( length ) {
if ( ! IsIntegralNumber ( 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 3, 5
if ( proto !== $ArrayPrototype ) { // step 4
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 6
A . length = length ;
}
/ * s t e p 6 , 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 ;
} ;