Skip to content

Commit

Permalink
extract doesNonExceededSafeInteger helper
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed May 28, 2022
1 parent 75ea104 commit 373e276
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 25 deletions.
6 changes: 2 additions & 4 deletions packages/core-js/internals/array-to-spliced.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
var lengthOfArrayLike = require('../internals/length-of-array-like');
var doesNonExceededSafeInteger = require('../internals/does-non-exceeded-safe-integer');
var toAbsoluteIndex = require('../internals/to-absolute-index');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');

var $TypeError = TypeError;
var max = Math.max;
var min = Math.min;
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;

// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.toSpliced
// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toSpliced
Expand All @@ -26,8 +25,7 @@ module.exports = function (O, C, args) {
insertCount = argumentsLength - 2;
actualDeleteCount = min(max(toIntegerOrInfinity(deleteCount), 0), len - actualStart);
}
newLen = len + insertCount - actualDeleteCount;
if (newLen > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed length exceeded');
newLen = doesNonExceededSafeInteger(len + insertCount - actualDeleteCount);
A = new C(newLen);

for (; k < actualStart; k++) A[k] = O[k];
Expand Down
9 changes: 2 additions & 7 deletions packages/core-js/internals/async-iterator-iteration.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
'use strict';
// https://github.com/tc39/proposal-iterator-helpers
// https://github.com/tc39/proposal-array-from-async
var global = require('../internals/global');
var call = require('../internals/function-call');
var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var doesNonExceededSafeInteger = require('../internals/does-non-exceeded-safe-integer');
var getBuiltIn = require('../internals/get-built-in');
var getMethod = require('../internals/get-method');

var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
var TypeError = global.TypeError;

var createMethod = function (TYPE) {
var IS_TO_ARRAY = TYPE == 0;
var IS_FOR_EACH = TYPE == 1;
Expand Down Expand Up @@ -46,9 +43,7 @@ var createMethod = function (TYPE) {

var loop = function () {
try {
if (IS_TO_ARRAY && (index > MAX_SAFE_INTEGER) && MAPPING) {
throw TypeError('The allowed number of iterations has been exceeded');
}
if (IS_TO_ARRAY && MAPPING) doesNonExceededSafeInteger(index);
Promise.resolve(anObject(call(next, iterator))).then(function (step) {
try {
if (anObject(step).done) {
Expand Down
7 changes: 7 additions & 0 deletions packages/core-js/internals/does-non-exceeded-safe-integer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
var $TypeError = TypeError;
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991

module.exports = function (it) {
if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');
return it;
};
9 changes: 3 additions & 6 deletions packages/core-js/modules/es.array.concat.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var fails = require('../internals/fails');
var isArray = require('../internals/is-array');
var isObject = require('../internals/is-object');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var doesNonExceededSafeInteger = require('../internals/does-non-exceeded-safe-integer');
var createProperty = require('../internals/create-property');
var arraySpeciesCreate = require('../internals/array-species-create');
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
var wellKnownSymbol = require('../internals/well-known-symbol');
var V8_VERSION = require('../internals/engine-v8-version');

var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
var TypeError = global.TypeError;

// We can't use this feature detection in V8 since it causes
// deoptimization and serious performance degradation
Expand Down Expand Up @@ -50,10 +47,10 @@ $({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {
E = i === -1 ? O : arguments[i];
if (isConcatSpreadable(E)) {
len = lengthOfArrayLike(E);
if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
doesNonExceededSafeInteger(n + len);
for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
} else {
if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
doesNonExceededSafeInteger(n + 1);
createProperty(A, n++, E);
}
}
Expand Down
11 changes: 3 additions & 8 deletions packages/core-js/modules/es.array.splice.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var toObject = require('../internals/to-object');
var toAbsoluteIndex = require('../internals/to-absolute-index');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var toObject = require('../internals/to-object');
var doesNonExceededSafeInteger = require('../internals/does-non-exceeded-safe-integer');
var arraySpeciesCreate = require('../internals/array-species-create');
var createProperty = require('../internals/create-property');
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');

var TypeError = global.TypeError;
var max = Math.max;
var min = Math.min;
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';

// `Array.prototype.splice` method
// https://tc39.es/ecma262/#sec-array.prototype.splice
Expand All @@ -36,9 +33,7 @@ $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
insertCount = argumentsLength - 2;
actualDeleteCount = min(max(toIntegerOrInfinity(deleteCount), 0), len - actualStart);
}
if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {
throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
}
doesNonExceededSafeInteger(len + insertCount - actualDeleteCount);
A = arraySpeciesCreate(O, actualDeleteCount);
for (k = 0; k < actualDeleteCount; k++) {
from = actualStart + k;
Expand Down

0 comments on commit 373e276

Please sign in to comment.