Skip to content

Commit

Permalink
drop ToLength detection from array methods feature detection
Browse files Browse the repository at this point in the history
which could cause hanging FF11-21 and some versions of old WebKit

I don't see any possible workaround

closes #764, #896, #911
  • Loading branch information
zloirock committed Feb 15, 2021
1 parent 5543070 commit 944a687
Show file tree
Hide file tree
Showing 29 changed files with 48 additions and 222 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## Changelog
##### Unreleased
- Dropped `ToLength` detection from array methods feature detection which could cause hanging FF11-21 and some versions of old WebKit, [#764](https://github.com/zloirock/core-js/issues/764)
- Minified bundle from `core-js-bundle` uses `terser` instead of `uglify-js`

##### 3.8.3 - 2021.01.19
Expand Down
58 changes: 29 additions & 29 deletions packages/core-js-compat/src/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,10 @@ const data = {
safari: '9.0',
},
'es.array.every': {
chrome: '48',
edge: '15',
firefox: '50',
safari: '9.0',
chrome: '26',
firefox: '4',
ie: '9',
safari: '8.0',
},
'es.array.fill': {
chrome: '45',
Expand Down Expand Up @@ -141,10 +141,10 @@ const data = {
safari: '12.0',
},
'es.array.for-each': {
chrome: '48',
edge: '15',
firefox: '50',
safari: '9.0',
chrome: '26',
firefox: '4',
ie: '9',
safari: '8.0',
},
'es.array.from': {
chrome: '51',
Expand All @@ -154,15 +154,15 @@ const data = {
},
'es.array.includes': {
chrome: '53',
edge: '15',
edge: '14',
firefox: '48',
safari: '10.0',
},
'es.array.index-of': {
chrome: '51',
edge: '15',
firefox: '50',
safari: '11.0',
firefox: '4',
ie: '9',
safari: '8.0',
},
'es.array.is-array': {
chrome: '5',
Expand All @@ -185,9 +185,9 @@ const data = {
},
'es.array.last-index-of': {
chrome: '51',
edge: '13',
firefox: '50',
safari: '11.0',
firefox: '4',
ie: '9',
safari: '8.0',
},
'es.array.map': {
chrome: '51',
Expand All @@ -203,17 +203,17 @@ const data = {
},
'es.array.reduce': {
chrome: '83', // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
edge: '15',
firefox: '50',
firefox: '4',
ie: '9',
node: '6.0', // ^^^
safari: '9.0',
safari: '8.0',
},
'es.array.reduce-right': {
chrome: '83', // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
edge: '15',
firefox: '50',
firefox: '4',
ie: '9',
node: '6.0', // ^^^
safari: '9.0',
safari: '8.0',
},
'es.array.reverse': {
chrome: '1',
Expand All @@ -225,15 +225,15 @@ const data = {
},
'es.array.slice': {
chrome: '51',
edge: '15',
edge: '13',
firefox: '48',
safari: '11.0',
safari: '10.0',
},
'es.array.some': {
chrome: '48',
edge: '15',
firefox: '50',
safari: '9.0',
chrome: '26',
firefox: '4',
ie: '9',
safari: '8.0',
},
'es.array.sort': {
chrome: '63',
Expand All @@ -249,9 +249,9 @@ const data = {
},
'es.array.splice': {
chrome: '51',
edge: '15',
edge: '13',
firefox: '49',
safari: '11.0',
safari: '10.0',
},
'es.array.unscopables.flat': {
chrome: '73',
Expand Down
4 changes: 1 addition & 3 deletions packages/core-js/internals/array-for-each.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
'use strict';
var $forEach = require('../internals/array-iteration').forEach;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var STRICT_METHOD = arrayMethodIsStrict('forEach');
var USES_TO_LENGTH = arrayMethodUsesToLength('forEach');

// `Array.prototype.forEach` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.foreach
module.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {
module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {
return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
} : [].forEach;
5 changes: 1 addition & 4 deletions packages/core-js/internals/array-last-index-of.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@ var toIndexedObject = require('../internals/to-indexed-object');
var toInteger = require('../internals/to-integer');
var toLength = require('../internals/to-length');
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var min = Math.min;
var nativeLastIndexOf = [].lastIndexOf;
var NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
var STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');
// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method
var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
var FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;
var FORCED = NEGATIVE_ZERO || !STRICT_METHOD;

// `Array.prototype.lastIndexOf` method implementation
// https://tc39.es/ecma262/#sec-array.prototype.lastindexof
Expand Down
27 changes: 0 additions & 27 deletions packages/core-js/internals/array-method-uses-to-length.js

This file was deleted.

4 changes: 1 addition & 3 deletions packages/core-js/modules/es.array.every.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@
var $ = require('../internals/export');
var $every = require('../internals/array-iteration').every;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var STRICT_METHOD = arrayMethodIsStrict('every');
var USES_TO_LENGTH = arrayMethodUsesToLength('every');

// `Array.prototype.every` method
// https://tc39.es/ecma262/#sec-array.prototype.every
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
every: function every(callbackfn /* , thisArg */) {
return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
5 changes: 1 addition & 4 deletions packages/core-js/modules/es.array.filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@
var $ = require('../internals/export');
var $filter = require('../internals/array-iteration').filter;
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');
// Edge 14- issue
var USES_TO_LENGTH = arrayMethodUsesToLength('filter');

// `Array.prototype.filter` method
// https://tc39.es/ecma262/#sec-array.prototype.filter
// with adding support of @@species
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
filter: function filter(callbackfn /* , thisArg */) {
return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
5 changes: 1 addition & 4 deletions packages/core-js/modules/es.array.find-index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@
var $ = require('../internals/export');
var $findIndex = require('../internals/array-iteration').findIndex;
var addToUnscopables = require('../internals/add-to-unscopables');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var FIND_INDEX = 'findIndex';
var SKIPS_HOLES = true;

var USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);

// Shouldn't skip holes
if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });

// `Array.prototype.findIndex` method
// https://tc39.es/ecma262/#sec-array.prototype.findindex
$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
findIndex: function findIndex(callbackfn /* , that = undefined */) {
return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
5 changes: 1 addition & 4 deletions packages/core-js/modules/es.array.find.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@
var $ = require('../internals/export');
var $find = require('../internals/array-iteration').find;
var addToUnscopables = require('../internals/add-to-unscopables');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var FIND = 'find';
var SKIPS_HOLES = true;

var USES_TO_LENGTH = arrayMethodUsesToLength(FIND);

// Shouldn't skip holes
if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });

// `Array.prototype.find` method
// https://tc39.es/ecma262/#sec-array.prototype.find
$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
find: function find(callbackfn /* , that = undefined */) {
return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
5 changes: 1 addition & 4 deletions packages/core-js/modules/es.array.includes.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@
var $ = require('../internals/export');
var $includes = require('../internals/array-includes').includes;
var addToUnscopables = require('../internals/add-to-unscopables');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });

// `Array.prototype.includes` method
// https://tc39.es/ecma262/#sec-array.prototype.includes
$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true }, {
includes: function includes(el /* , fromIndex = 0 */) {
return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
4 changes: 1 addition & 3 deletions packages/core-js/modules/es.array.index-of.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@
var $ = require('../internals/export');
var $indexOf = require('../internals/array-includes').indexOf;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var nativeIndexOf = [].indexOf;

var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;
var STRICT_METHOD = arrayMethodIsStrict('indexOf');
var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });

// `Array.prototype.indexOf` method
// https://tc39.es/ecma262/#sec-array.prototype.indexof
$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {
indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
return NEGATIVE_ZERO
// convert -0 to +0
Expand Down
5 changes: 1 addition & 4 deletions packages/core-js/modules/es.array.map.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@
var $ = require('../internals/export');
var $map = require('../internals/array-iteration').map;
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
// FF49- issue
var USES_TO_LENGTH = arrayMethodUsesToLength('map');

// `Array.prototype.map` method
// https://tc39.es/ecma262/#sec-array.prototype.map
// with adding support of @@species
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
map: function map(callbackfn /* , thisArg */) {
return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
5 changes: 1 addition & 4 deletions packages/core-js/modules/es.array.reduce-right.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@
var $ = require('../internals/export');
var $reduceRight = require('../internals/array-reduce').right;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
var CHROME_VERSION = require('../internals/engine-v8-version');
var IS_NODE = require('../internals/engine-is-node');

var STRICT_METHOD = arrayMethodIsStrict('reduceRight');
// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method
var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
// Chrome 80-82 has a critical bug
// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;

// `Array.prototype.reduceRight` method
// https://tc39.es/ecma262/#sec-array.prototype.reduceright
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
reduceRight: function reduceRight(callbackfn /* , initialValue */) {
return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
4 changes: 1 addition & 3 deletions packages/core-js/modules/es.array.reduce.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,17 @@
var $ = require('../internals/export');
var $reduce = require('../internals/array-reduce').left;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
var CHROME_VERSION = require('../internals/engine-v8-version');
var IS_NODE = require('../internals/engine-is-node');

var STRICT_METHOD = arrayMethodIsStrict('reduce');
var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
// Chrome 80-82 has a critical bug
// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;

// `Array.prototype.reduce` method
// https://tc39.es/ecma262/#sec-array.prototype.reduce
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
reduce: function reduce(callbackfn /* , initialValue */) {
return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down
4 changes: 1 addition & 3 deletions packages/core-js/modules/es.array.slice.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ var toIndexedObject = require('../internals/to-indexed-object');
var createProperty = require('../internals/create-property');
var wellKnownSymbol = require('../internals/well-known-symbol');
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
var USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });

var SPECIES = wellKnownSymbol('species');
var nativeSlice = [].slice;
Expand All @@ -20,7 +18,7 @@ var max = Math.max;
// `Array.prototype.slice` method
// https://tc39.es/ecma262/#sec-array.prototype.slice
// fallback for not array-like ES3 strings and DOM objects
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
slice: function slice(start, end) {
var O = toIndexedObject(this);
var length = toLength(O.length);
Expand Down
4 changes: 1 addition & 3 deletions packages/core-js/modules/es.array.some.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@
var $ = require('../internals/export');
var $some = require('../internals/array-iteration').some;
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');

var STRICT_METHOD = arrayMethodIsStrict('some');
var USES_TO_LENGTH = arrayMethodUsesToLength('some');

// `Array.prototype.some` method
// https://tc39.es/ecma262/#sec-array.prototype.some
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
some: function some(callbackfn /* , thisArg */) {
return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
Expand Down

0 comments on commit 944a687

Please sign in to comment.