Skip to content

Commit

Permalink
Merge pull request #1077 from zloirock/array-push
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Jun 10, 2022
2 parents ac80fe8 + 19f126a commit 94f69a4
Show file tree
Hide file tree
Showing 39 changed files with 328 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -7,6 +7,8 @@
- `%TypedArray%.prototype.findLastIndex`
- Changed the order of operations in `%TypedArray%.prototype.with` following [proposal-change-array-by-copy/86](https://github.com/tc39/proposal-change-array-by-copy/issues/86), per June 2022 TC39 meeting
- [Decorator Metadata proposal](https://github.com/tc39/proposal-decorator-metadata) extracted from [Decorators proposal](https://github.com/tc39/proposal-decorators) as a separate stage 2 proposal, `Symbol.metadataKey` replaces `Symbol.metadata`
- Added `Array.prototype.push` polyfill with some fixes for modern engines
- Added `Array.prototype.unshift` polyfill with some fixes for modern engines
- Fixed a bug in the order of getting flags in `RegExp.prototype.flags` in the actual version of V8
- Fixed property descriptors of some `Math` and `Number` constants
- Added detection of NodeJS [bug](https://github.com/nodejs/node/issues/41038) in `structuredClone` that can not clone `DOMException` (just in case for future versions that will fix other issues)
Expand Down
8 changes: 7 additions & 1 deletion README.md
Expand Up @@ -637,7 +637,7 @@ Error.prototype.toString.call({ message: 1, name: 2 }) === '2: 1'; // => true
```
#### ECMAScript: Array[⬆](#index)
Modules [`es.array.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.from.js), [`es.array.is-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.is-array.js), [`es.array.of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.of.js), [`es.array.copy-within`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.copy-within.js), [`es.array.fill`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.fill.js), [`es.array.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find.js), [`es.array.find-index`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find-index.js), [`es.array.find-last`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find-last.js), [`es.array.find-last-index`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find-last-index.js), [`es.array.iterator`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.iterator.js), [`es.array.includes`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.includes.js), [`es.array.slice`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.slice.js), [`es.array.join`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.join.js), [`es.array.index-of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.index-of.js), [`es.array.last-index-of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.last-index-of.js), [`es.array.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.every.js), [`es.array.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.some.js), [`es.array.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.for-each.js), [`es.array.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.map.js), [`es.array.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.filter.js), [`es.array.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.reduce.js), [`es.array.reduce-right`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.reduce-right.js), [`es.array.reverse`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.reverse.js), [`es.array.sort`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.sort.js), [`es.array.flat`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.flat.js), [`es.array.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.flat-map.js), [`es.array.unscopables.flat`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.unscopables.flat.js), [`es.array.unscopables.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.unscopables.flat-map.js), [`es.array.at`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.at.js).
Modules [`es.array.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.from.js), [`es.array.is-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.is-array.js), [`es.array.of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.of.js), [`es.array.copy-within`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.copy-within.js), [`es.array.fill`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.fill.js), [`es.array.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find.js), [`es.array.find-index`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find-index.js), [`es.array.find-last`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find-last.js), [`es.array.find-last-index`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.find-last-index.js), [`es.array.iterator`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.iterator.js), [`es.array.includes`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.includes.js), [`es.array.push`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.push.js), [`es.array.slice`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.slice.js), [`es.array.join`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.join.js), [`es.array.unshift`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.unshift.js), [`es.array.index-of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.index-of.js), [`es.array.last-index-of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.last-index-of.js), [`es.array.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.every.js), [`es.array.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.some.js), [`es.array.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.for-each.js), [`es.array.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.map.js), [`es.array.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.filter.js), [`es.array.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.reduce.js), [`es.array.reduce-right`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.reduce-right.js), [`es.array.reverse`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.reverse.js), [`es.array.sort`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.sort.js), [`es.array.flat`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.flat.js), [`es.array.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.flat-map.js), [`es.array.unscopables.flat`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.unscopables.flat.js), [`es.array.unscopables.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.unscopables.flat-map.js), [`es.array.at`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.at.js).
```js
class Array {
at(index: int): any;
Expand All @@ -660,13 +660,15 @@ class Array {
keys(): Iterator<index>;
lastIndexOf(searchElement: any, from?: number): number;
map(mapFn: (value: any, index: number, target: any) => any, thisArg?: any): Array<mixed>; // with adding support of @@species
push(...args: Array<mixed>): uint;
reduce(callbackfn: (memo: any, value: any, index: number, target: any) => any, initialValue?: any): any;
reduceRight(callbackfn: (memo: any, value: any, index: number, target: any) => any, initialValue?: any): any;
reverse(): this; // Safari 12.0 bug fix
slice(start?: number, end?: number): Array<mixed>; // with adding support of @@species
splice(start?: number, deleteCount?: number, ...items: Array<mixed>): Array<mixed>; // with adding support of @@species
some(callbackfn: (value: any, index: number, target: any) => boolean, thisArg?: any): boolean;
sort(comparefn?: (a: any, b: any) => number): this; // with modern behavior like stable sort
unshift(...args: Array<mixed>): uint;
values(): Iterator<value>;
@@iterator(): Iterator<value>;
@@unscopables: { [newMethodNames: string]: true };
Expand Down Expand Up @@ -706,13 +708,15 @@ core-js(-pure)/es|stable|actual|full/array/join
core-js(-pure)/es|stable|actual|full/array/keys
core-js(-pure)/es|stable|actual|full/array/last-index-of
core-js(-pure)/es|stable|actual|full/array/map
core-js(-pure)/es|stable|actual|full/array/push
core-js(-pure)/es|stable|actual|full/array/reduce
core-js(-pure)/es|stable|actual|full/array/reduce-right
core-js(-pure)/es|stable|actual|full/array/reverse
core-js(-pure)/es|stable|actual|full/array/slice
core-js(-pure)/es|stable|actual|full/array/splice
core-js(-pure)/es|stable|actual|full/array/some
core-js(-pure)/es|stable|actual|full/array/sort
core-js(-pure)/es|stable|actual|full/array/unshift
core-js(-pure)/es|stable|actual|full/array/values
core-js(-pure)/es|stable|actual|full/array/virtual/at
core-js(-pure)/es|stable|actual|full/array/virtual/concat
Expand All @@ -735,13 +739,15 @@ core-js(-pure)/es|stable|actual|full/array/virtual/join
core-js(-pure)/es|stable|actual|full/array/virtual/keys
core-js(-pure)/es|stable|actual|full/array/virtual/last-index-of
core-js(-pure)/es|stable|actual|full/array/virtual/map
core-js(-pure)/es|stable|actual|full/array/virtual/push
core-js(-pure)/es|stable|actual|full/array/virtual/reduce
core-js(-pure)/es|stable|actual|full/array/virtual/reduce-right
core-js(-pure)/es|stable|actual|full/array/virtual/reverse
core-js(-pure)/es|stable|actual|full/array/virtual/slice
core-js(-pure)/es|stable|actual|full/array/virtual/some
core-js(-pure)/es|stable|actual|full/array/virtual/sort
core-js(-pure)/es|stable|actual|full/array/virtual/splice
core-js(-pure)/es|stable|actual|full/array/virtual/unshift
core-js(-pure)/es|stable|actual|full/array/virtual/values
```
[*Examples*](https://tinyurl.com/2br28bgj):
Expand Down
15 changes: 15 additions & 0 deletions packages/core-js-compat/src/data.mjs
Expand Up @@ -274,6 +274,14 @@ export const data = {
safari: '9.0',
rhino: '1.7.13',
},
'es.array.push': {
// bug with setting length
// chrome: '103',
// edge: '15',
firefox: '55',
// the same to Chrome bug fixed only in Safari TP
// safari: '15.4',
},
'es.array.reduce': {
chrome: '83', // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
firefox: '4',
Expand Down Expand Up @@ -339,6 +347,13 @@ export const data = {
firefox: '67',
safari: '13',
},
'es.array.unshift': {
chrome: '71',
firefox: '23',
ie: '9',
// bug with setting length fixed only in Safari TP
// safari: '15.4',
},
'es.array-buffer.constructor': {
chrome: '26',
edge: '14',
Expand Down
2 changes: 2 additions & 0 deletions packages/core-js-compat/src/modules-by-versions.mjs
Expand Up @@ -142,6 +142,8 @@ export default {
3.23: [
'es.array.find-last',
'es.array.find-last-index',
'es.array.push',
'es.array.unshift',
'es.typed-array.find-last',
'es.typed-array.find-last-index',
'esnext.symbol.metadata-key',
Expand Down
3 changes: 3 additions & 0 deletions packages/core-js/actual/array/push.js
@@ -0,0 +1,3 @@
var parent = require('../../stable/array/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/actual/array/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../stable/array/unshift');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/actual/array/virtual/push.js
@@ -0,0 +1,3 @@
var parent = require('../../../stable/array/virtual/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/actual/array/virtual/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../../stable/array/virtual/unshift');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/actual/instance/push.js
@@ -0,0 +1,3 @@
var parent = require('../../stable/instance/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/actual/instance/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../stable/instance/push');

module.exports = parent;
2 changes: 2 additions & 0 deletions packages/core-js/es/array/index.js
Expand Up @@ -20,6 +20,7 @@ require('../../modules/es.array.iterator');
require('../../modules/es.array.join');
require('../../modules/es.array.last-index-of');
require('../../modules/es.array.map');
require('../../modules/es.array.push');
require('../../modules/es.array.reduce');
require('../../modules/es.array.reduce-right');
require('../../modules/es.array.reverse');
Expand All @@ -30,6 +31,7 @@ require('../../modules/es.array.species');
require('../../modules/es.array.splice');
require('../../modules/es.array.unscopables.flat');
require('../../modules/es.array.unscopables.flat-map');
require('../../modules/es.array.unshift');
require('../../modules/es.object.to-string');
require('../../modules/es.string.iterator');
var path = require('../../internals/path');
Expand Down
4 changes: 4 additions & 0 deletions packages/core-js/es/array/push.js
@@ -0,0 +1,4 @@
require('../../modules/es.array.push');
var entryUnbind = require('../../internals/entry-unbind');

module.exports = entryUnbind('Array', 'push');
4 changes: 4 additions & 0 deletions packages/core-js/es/array/unshift.js
@@ -0,0 +1,4 @@
require('../../modules/es.array.unshift');
var entryUnbind = require('../../internals/entry-unbind');

module.exports = entryUnbind('Array', 'unshift');
2 changes: 2 additions & 0 deletions packages/core-js/es/array/virtual/index.js
Expand Up @@ -17,6 +17,7 @@ require('../../../modules/es.array.iterator');
require('../../../modules/es.array.join');
require('../../../modules/es.array.last-index-of');
require('../../../modules/es.array.map');
require('../../../modules/es.array.push');
require('../../../modules/es.array.reduce');
require('../../../modules/es.array.reduce-right');
require('../../../modules/es.array.reverse');
Expand All @@ -27,6 +28,7 @@ require('../../../modules/es.array.species');
require('../../../modules/es.array.splice');
require('../../../modules/es.array.unscopables.flat');
require('../../../modules/es.array.unscopables.flat-map');
require('../../../modules/es.array.unshift');
require('../../../modules/es.object.to-string');
var entryVirtual = require('../../../internals/entry-virtual');

Expand Down
4 changes: 4 additions & 0 deletions packages/core-js/es/array/virtual/push.js
@@ -0,0 +1,4 @@
require('../../../modules/es.array.push');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').push;
4 changes: 4 additions & 0 deletions packages/core-js/es/array/virtual/unshift.js
@@ -0,0 +1,4 @@
require('../../../modules/es.array.unshift');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').unshift;
9 changes: 9 additions & 0 deletions packages/core-js/es/instance/push.js
@@ -0,0 +1,9 @@
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/push');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
var own = it.push;
return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.push) ? method : own;
};
9 changes: 9 additions & 0 deletions packages/core-js/es/instance/unshift.js
@@ -0,0 +1,9 @@
var isPrototypeOf = require('../../internals/object-is-prototype-of');
var method = require('../array/virtual/unshift');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
var own = it.unshift;
return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.unshift) ? method : own;
};
3 changes: 3 additions & 0 deletions packages/core-js/full/array/push.js
@@ -0,0 +1,3 @@
var parent = require('../../actual/array/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/full/array/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../actual/array/unshift');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/full/array/virtual/push.js
@@ -0,0 +1,3 @@
var parent = require('../../../actual/array/virtual/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/full/array/virtual/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../../actual/array/virtual/unshift');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/full/instance/push.js
@@ -0,0 +1,3 @@
var parent = require('../../actual/instance/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/full/instance/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../actual/instance/push');

module.exports = parent;
39 changes: 39 additions & 0 deletions packages/core-js/modules/es.array.push.js
@@ -0,0 +1,39 @@
'use strict';
var $ = require('../internals/export');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');
var fails = require('../internals/fails');

var INCORRECT_TO_LENGTH = fails(function () {
return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;
});

// V8 and Safari <= 15.4, FF < 23 throws InternalError
// https://bugs.chromium.org/p/v8/issues/detail?id=12681
var SILENT_ON_NON_WRITABLE_LENGTH = !function () {
try {
// eslint-disable-next-line es-x/no-object-defineproperty -- safe
Object.defineProperty([], 'length', { writable: false }).push();
} catch (error) {
return error instanceof TypeError;
}
}();

// `Array.prototype.push` method
// https://tc39.es/ecma262/#sec-array.prototype.push
$({ target: 'Array', proto: true, arity: 1, forced: INCORRECT_TO_LENGTH || SILENT_ON_NON_WRITABLE_LENGTH }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
push: function push(item) {
var O = toObject(this);
var len = lengthOfArrayLike(O);
var argCount = arguments.length;
doesNotExceedSafeInteger(len + argCount);
for (var i = 0; i < argCount; i++) {
O[len] = arguments[i];
len++;
}
O.length = len;
return len;
}
});
42 changes: 42 additions & 0 deletions packages/core-js/modules/es.array.unshift.js
@@ -0,0 +1,42 @@
'use strict';
var $ = require('../internals/export');
var toObject = require('../internals/to-object');
var lengthOfArrayLike = require('../internals/length-of-array-like');
var deletePropertyOrThrow = require('../internals/delete-property-or-throw');
var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');

// IE8-
var INCORRECT_RESULT = [].unshift(0) !== 1;

// V8 ~ Chrome < 71 and Safari <= 15.4, FF < 23 throws InternalError
var SILENT_ON_NON_WRITABLE_LENGTH = !function () {
try {
// eslint-disable-next-line es-x/no-object-defineproperty -- safe
Object.defineProperty([], 'length', { writable: false }).unshift();
} catch (error) {
return error instanceof TypeError;
}
}();

// `Array.prototype.unshift` method
// https://tc39.es/ecma262/#sec-array.prototype.unshift
$({ target: 'Array', proto: true, arity: 1, forced: INCORRECT_RESULT || SILENT_ON_NON_WRITABLE_LENGTH }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
unshift: function unshift(item) {
var O = toObject(this);
var len = lengthOfArrayLike(O);
var argCount = arguments.length;
if (argCount) {
doesNotExceedSafeInteger(len + argCount);
var k = len;
while (k--) {
var to = k + argCount;
if (k in O) O[to] = O[k];
else deletePropertyOrThrow(O, to);
}
for (var j = 0; j < argCount; j++) {
O[j] = arguments[j];
}
} return O.length = len + argCount;
}
});
3 changes: 3 additions & 0 deletions packages/core-js/stable/array/push.js
@@ -0,0 +1,3 @@
var parent = require('../../es/array/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/stable/array/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../es/array/unshift');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/stable/array/virtual/push.js
@@ -0,0 +1,3 @@
var parent = require('../../../es/array/virtual/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/stable/array/virtual/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../../es/array/virtual/unshift');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/stable/instance/push.js
@@ -0,0 +1,3 @@
var parent = require('../../es/instance/push');

module.exports = parent;
3 changes: 3 additions & 0 deletions packages/core-js/stable/instance/unshift.js
@@ -0,0 +1,3 @@
var parent = require('../../es/instance/push');

module.exports = parent;

0 comments on commit 94f69a4

Please sign in to comment.