28 lines
1012 B
JavaScript
28 lines
1012 B
JavaScript
|
'use strict';
|
||
|
var DESCRIPTORS = require('../internals/descriptors');
|
||
|
var isArray = require('../internals/is-array');
|
||
|
|
||
|
var $TypeError = TypeError;
|
||
|
// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
|
||
|
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
||
|
|
||
|
// Safari < 13 does not throw an error in this case
|
||
|
var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {
|
||
|
// makes no sense without proper strict mode support
|
||
|
if (this !== undefined) return true;
|
||
|
try {
|
||
|
// eslint-disable-next-line es/no-object-defineproperty -- safe
|
||
|
Object.defineProperty([], 'length', { writable: false }).length = 1;
|
||
|
} catch (error) {
|
||
|
return error instanceof TypeError;
|
||
|
}
|
||
|
}();
|
||
|
|
||
|
module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {
|
||
|
if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {
|
||
|
throw new $TypeError('Cannot set read only .length');
|
||
|
} return O.length = length;
|
||
|
} : function (O, length) {
|
||
|
return O.length = length;
|
||
|
};
|