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%' ) ;
2024-03-28 02:00:41 +00:00
var $RangeError = require ( 'es-errors/range' ) ;
var $SyntaxError = require ( 'es-errors/syntax' ) ;
var $TypeError = require ( 'es-errors/type' ) ;
2020-08-25 23:57:08 +00:00
2024-03-28 02:00:41 +00:00
var isInteger = require ( '../helpers/isInteger' ) ;
var hasProto = require ( 'has-proto' ) ( ) ;
2020-08-25 23:57:08 +00:00
var MAX _ARRAY _LENGTH = Math . pow ( 2 , 32 ) - 1 ;
var $setProto = GetIntrinsic ( '%Object.setPrototypeOf%' , true ) || (
2024-03-28 02:00:41 +00:00
hasProto
? function ( O , proto ) {
2020-08-25 23:57:08 +00:00
O . _ _proto _ _ = proto ; // eslint-disable-line no-proto, no-param-reassign
return O ;
}
2024-03-28 02:00:41 +00:00
: null
2020-08-25 23:57:08 +00:00
) ;
2024-03-28 02:00:41 +00:00
// https://262.ecma-international.org/6.0/#sec-arraycreate
2020-08-25 23:57:08 +00:00
module . exports = function ArrayCreate ( length ) {
2024-03-28 02:00:41 +00:00
if ( ! isInteger ( length ) || length < 0 ) {
2020-08-25 23:57:08 +00:00
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
2022-11-10 10:43:16 +00:00
OrdinaryDefineOwnProperty ( A , 'length' , {
'[[Configurable]]' : false ,
'[[Enumerable]]' : false ,
'[[Value]]' : length ,
'[[Writable]]' : true
} ) ;
* /
2020-08-25 23:57:08 +00:00
return A ;
} ;