From fbc4e4fb3943a4c6553b7c50ec575a1432bf2885 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 17 Oct 2024 14:22:28 +0700 Subject: [PATCH] remove usage of `@@species` pattern from `%TypedArray%` and `ArrayBuffer` methods https://github.com/tc39/ecma262/pull/3450 --- CHANGELOG.md | 8 ++++++++ .../internals/typed-array-from-same-type-and-list.js | 7 +++++++ .../internals/typed-array-from-species-and-list.js | 7 ------- .../internals/typed-array-species-constructor.js | 12 ------------ packages/core-js/modules/es.array-buffer.slice.js | 3 +-- packages/core-js/modules/es.typed-array.filter.js | 4 ++-- packages/core-js/modules/es.typed-array.map.js | 4 ++-- packages/core-js/modules/es.typed-array.slice.js | 4 ++-- packages/core-js/modules/es.typed-array.subarray.js | 4 ++-- .../core-js/modules/esnext.typed-array.filter-out.js | 4 ++-- .../modules/esnext.typed-array.filter-reject.js | 4 ++-- .../core-js/modules/esnext.typed-array.group-by.js | 4 ++-- 12 files changed, 30 insertions(+), 35 deletions(-) create mode 100644 packages/core-js/internals/typed-array-from-same-type-and-list.js delete mode 100644 packages/core-js/internals/typed-array-from-species-and-list.js delete mode 100644 packages/core-js/internals/typed-array-species-constructor.js diff --git a/CHANGELOG.md b/CHANGELOG.md index b9a7a678ac88..62f1c82bc12c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,14 @@ - Moved to stage 3, [October 2024 TC39 meeting](https://x.com/robpalmer2/status/1843829675036160179) - Added `/actual/` namespace entries, unconditional forced replacement changed to feature detection - [Extractors proposal](https://github.com/tc39/proposal-extractors) moved to stage 2, [October 2024 TC39 meeting](https://github.com/tc39/proposals/commit/11bc489049fc5ce59b21e98a670a84f153a29a80) +- Usage of `@@species` pattern removed from `%TypedArray%` and `ArrayBuffer` methods, [tc39/ecma262/3450](https://github.com/tc39/ecma262/pull/3450): + - Built-ins: + - `%TypedArray%.prototype.filter` + - `%TypedArray%.prototype.filterReject` + - `%TypedArray%.prototype.map` + - `%TypedArray%.prototype.slice` + - `%TypedArray%.prototype.subarray` + - `ArrayBuffer.prototype.slice` - Compat data improvements: - [`JSON.parse` source text access proposal](https://github.com/tc39/proposal-json-parse-with-source) features marked as [shipped from FF132](https://bugzilla.mozilla.org/show_bug.cgi?id=1913085) - [`Uint8Array` to / from base64 and hex proposal](https://github.com/tc39/proposal-arraybuffer-base64) methods marked as [shipped from FF133](https://bugzilla.mozilla.org/show_bug.cgi?id=1917885#c9) diff --git a/packages/core-js/internals/typed-array-from-same-type-and-list.js b/packages/core-js/internals/typed-array-from-same-type-and-list.js new file mode 100644 index 000000000000..c6aea588f04b --- /dev/null +++ b/packages/core-js/internals/typed-array-from-same-type-and-list.js @@ -0,0 +1,7 @@ +'use strict'; +var arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list'); +var getTypedArrayConstructor = require('../internals/array-buffer-view-core').getTypedArrayConstructor; + +module.exports = function (instance, list) { + return arrayFromConstructorAndList(getTypedArrayConstructor(instance), list); +}; diff --git a/packages/core-js/internals/typed-array-from-species-and-list.js b/packages/core-js/internals/typed-array-from-species-and-list.js deleted file mode 100644 index 941708070899..000000000000 --- a/packages/core-js/internals/typed-array-from-species-and-list.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; -var arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list'); -var typedArraySpeciesConstructor = require('../internals/typed-array-species-constructor'); - -module.exports = function (instance, list) { - return arrayFromConstructorAndList(typedArraySpeciesConstructor(instance), list); -}; diff --git a/packages/core-js/internals/typed-array-species-constructor.js b/packages/core-js/internals/typed-array-species-constructor.js deleted file mode 100644 index 4e1e2358c52f..000000000000 --- a/packages/core-js/internals/typed-array-species-constructor.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; -var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); -var speciesConstructor = require('../internals/species-constructor'); - -var aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor; -var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; - -// a part of `TypedArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#typedarray-species-create -module.exports = function (originalArray) { - return aTypedArrayConstructor(speciesConstructor(originalArray, getTypedArrayConstructor(originalArray))); -}; diff --git a/packages/core-js/modules/es.array-buffer.slice.js b/packages/core-js/modules/es.array-buffer.slice.js index 52af48caefc0..b337ee5a10e0 100644 --- a/packages/core-js/modules/es.array-buffer.slice.js +++ b/packages/core-js/modules/es.array-buffer.slice.js @@ -6,7 +6,6 @@ var ArrayBufferModule = require('../internals/array-buffer'); var anObject = require('../internals/an-object'); var toAbsoluteIndex = require('../internals/to-absolute-index'); var toLength = require('../internals/to-length'); -var speciesConstructor = require('../internals/species-constructor'); var ArrayBuffer = ArrayBufferModule.ArrayBuffer; var DataView = ArrayBufferModule.DataView; @@ -29,7 +28,7 @@ $({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, var length = anObject(this).byteLength; var first = toAbsoluteIndex(start, length); var fin = toAbsoluteIndex(end === undefined ? length : end, length); - var result = new (speciesConstructor(this, ArrayBuffer))(toLength(fin - first)); + var result = new ArrayBuffer(toLength(fin - first)); var viewSource = new DataView(this); var viewTarget = new DataView(result); var index = 0; diff --git a/packages/core-js/modules/es.typed-array.filter.js b/packages/core-js/modules/es.typed-array.filter.js index 9d22eef3749a..51d5bc903e06 100644 --- a/packages/core-js/modules/es.typed-array.filter.js +++ b/packages/core-js/modules/es.typed-array.filter.js @@ -1,7 +1,7 @@ 'use strict'; var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); var $filter = require('../internals/array-iteration').filter; -var fromSpeciesAndList = require('../internals/typed-array-from-species-and-list'); +var fromSameTypeAndList = require('../internals/typed-array-from-same-type-and-list'); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -10,5 +10,5 @@ var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; // https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter exportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) { var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); - return fromSpeciesAndList(this, list); + return fromSameTypeAndList(this, list); }); diff --git a/packages/core-js/modules/es.typed-array.map.js b/packages/core-js/modules/es.typed-array.map.js index 92dd0629e694..103b6bb13865 100644 --- a/packages/core-js/modules/es.typed-array.map.js +++ b/packages/core-js/modules/es.typed-array.map.js @@ -1,15 +1,15 @@ 'use strict'; var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); var $map = require('../internals/array-iteration').map; -var typedArraySpeciesConstructor = require('../internals/typed-array-species-constructor'); var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.map` method // https://tc39.es/ecma262/#sec-%typedarray%.prototype.map exportTypedArrayMethod('map', function map(mapfn /* , thisArg */) { return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) { - return new (typedArraySpeciesConstructor(O))(length); + return new (getTypedArrayConstructor(O))(length); }); }); diff --git a/packages/core-js/modules/es.typed-array.slice.js b/packages/core-js/modules/es.typed-array.slice.js index 33dc2b9db8c1..810fb5a33135 100644 --- a/packages/core-js/modules/es.typed-array.slice.js +++ b/packages/core-js/modules/es.typed-array.slice.js @@ -1,10 +1,10 @@ 'use strict'; var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); -var typedArraySpeciesConstructor = require('../internals/typed-array-species-constructor'); var fails = require('../internals/fails'); var arraySlice = require('../internals/array-slice'); var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; var FORCED = fails(function () { @@ -16,7 +16,7 @@ var FORCED = fails(function () { // https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice exportTypedArrayMethod('slice', function slice(start, end) { var list = arraySlice(aTypedArray(this), start, end); - var C = typedArraySpeciesConstructor(this); + var C = getTypedArrayConstructor(this); var index = 0; var length = list.length; var result = new C(length); diff --git a/packages/core-js/modules/es.typed-array.subarray.js b/packages/core-js/modules/es.typed-array.subarray.js index f2e1ae5f57d8..5bf985570851 100644 --- a/packages/core-js/modules/es.typed-array.subarray.js +++ b/packages/core-js/modules/es.typed-array.subarray.js @@ -2,9 +2,9 @@ var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); var toLength = require('../internals/to-length'); var toAbsoluteIndex = require('../internals/to-absolute-index'); -var typedArraySpeciesConstructor = require('../internals/typed-array-species-constructor'); var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.subarray` method @@ -13,7 +13,7 @@ exportTypedArrayMethod('subarray', function subarray(begin, end) { var O = aTypedArray(this); var length = O.length; var beginIndex = toAbsoluteIndex(begin, length); - var C = typedArraySpeciesConstructor(O); + var C = getTypedArrayConstructor(O); return new C( O.buffer, O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT, diff --git a/packages/core-js/modules/esnext.typed-array.filter-out.js b/packages/core-js/modules/esnext.typed-array.filter-out.js index deb92308ef1b..ce5ec730dc14 100644 --- a/packages/core-js/modules/esnext.typed-array.filter-out.js +++ b/packages/core-js/modules/esnext.typed-array.filter-out.js @@ -2,7 +2,7 @@ // TODO: Remove from `core-js@4` var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); var $filterReject = require('../internals/array-iteration').filterReject; -var fromSpeciesAndList = require('../internals/typed-array-from-species-and-list'); +var fromSameTypeAndList = require('../internals/typed-array-from-same-type-and-list'); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -11,5 +11,5 @@ var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; // https://github.com/tc39/proposal-array-filtering exportTypedArrayMethod('filterOut', function filterOut(callbackfn /* , thisArg */) { var list = $filterReject(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); - return fromSpeciesAndList(this, list); + return fromSameTypeAndList(this, list); }, true); diff --git a/packages/core-js/modules/esnext.typed-array.filter-reject.js b/packages/core-js/modules/esnext.typed-array.filter-reject.js index ed3375f6f144..78e60d9e905c 100644 --- a/packages/core-js/modules/esnext.typed-array.filter-reject.js +++ b/packages/core-js/modules/esnext.typed-array.filter-reject.js @@ -1,7 +1,7 @@ 'use strict'; var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); var $filterReject = require('../internals/array-iteration').filterReject; -var fromSpeciesAndList = require('../internals/typed-array-from-species-and-list'); +var fromSameTypeAndList = require('../internals/typed-array-from-same-type-and-list'); var aTypedArray = ArrayBufferViewCore.aTypedArray; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; @@ -10,5 +10,5 @@ var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; // https://github.com/tc39/proposal-array-filtering exportTypedArrayMethod('filterReject', function filterReject(callbackfn /* , thisArg */) { var list = $filterReject(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); - return fromSpeciesAndList(this, list); + return fromSameTypeAndList(this, list); }, true); diff --git a/packages/core-js/modules/esnext.typed-array.group-by.js b/packages/core-js/modules/esnext.typed-array.group-by.js index c180bc20b519..9fe6354a7bfb 100644 --- a/packages/core-js/modules/esnext.typed-array.group-by.js +++ b/packages/core-js/modules/esnext.typed-array.group-by.js @@ -2,14 +2,14 @@ // TODO: Remove from `core-js@4` var ArrayBufferViewCore = require('../internals/array-buffer-view-core'); var $group = require('../internals/array-group'); -var typedArraySpeciesConstructor = require('../internals/typed-array-species-constructor'); var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.groupBy` method // https://github.com/tc39/proposal-array-grouping exportTypedArrayMethod('groupBy', function groupBy(callbackfn /* , thisArg */) { var thisArg = arguments.length > 1 ? arguments[1] : undefined; - return $group(aTypedArray(this), callbackfn, thisArg, typedArraySpeciesConstructor); + return $group(aTypedArray(this), callbackfn, thisArg, getTypedArrayConstructor); }, true);