Skip to content

Commit

Permalink
42
Browse files Browse the repository at this point in the history
- Ensured proper `.length` of polyfilled functions even in compressed code
- Ensured proper `.name` of polyfilled accessors
- Ensured proper source / `ToString` conversion of polyfilled accessors
- Refactoring
  • Loading branch information
zloirock committed Apr 29, 2022
1 parent 49ad2ac commit ba6ea46
Show file tree
Hide file tree
Showing 59 changed files with 267 additions and 234 deletions.
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
## Changelog
##### Unreleased
- Nothing
- Ensured proper `.length` of polyfilled functions even in compressed code
- Ensured proper `.name` of polyfilled accessors
- Ensured proper source / `ToString` conversion of polyfilled accessors
- Refactoring

##### 3.22.3 - 2022.04.28
- Added a fix for FF99+ `Array.prototype.includes` broken on sparse arrays
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var defineProperty = require('../internals/object-define-property');

module.exports = function (target, name, descriptor) {
return defineProperty.f(target, name, descriptor);
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ var createNonEnumerableProperty = require('../internals/create-non-enumerable-pr
module.exports = function (target, key, value, options) {
if (options && options.enumerable) target[key] = value;
else createNonEnumerableProperty(target, key, value);
return target;
};
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');

module.exports = function (target, src, options) {
for (var key in src) {
if (options && options.unsafe && target[key]) target[key] = src[key];
else redefine(target, key, src[key], options);
else defineBuiltIn(target, key, src[key], options);
} return target;
};
3 changes: 3 additions & 0 deletions packages/core-js-pure/override/internals/make-built-in.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = function (value) {
return value;
};
8 changes: 4 additions & 4 deletions packages/core-js/internals/array-buffer-view-core.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ var hasOwn = require('../internals/has-own-property');
var classof = require('../internals/classof');
var tryToString = require('../internals/try-to-string');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var defineProperty = require('../internals/object-define-property').f;
var isPrototypeOf = require('../internals/object-is-prototype-of');
var getPrototypeOf = require('../internals/object-get-prototype-of');
Expand Down Expand Up @@ -89,7 +89,7 @@ var exportTypedArrayMethod = function (KEY, property, forced, options) {
}
}
if (!TypedArrayPrototype[KEY] || forced) {
redefine(TypedArrayPrototype, KEY, forced ? property
defineBuiltIn(TypedArrayPrototype, KEY, forced ? property
: NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);
}
};
Expand All @@ -107,14 +107,14 @@ var exportTypedArrayStaticMethod = function (KEY, property, forced) {
if (!TypedArray[KEY] || forced) {
// V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
try {
return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);
return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);
} catch (error) { /* empty */ }
} else return;
}
for (ARRAY in TypedArrayConstructorsList) {
TypedArrayConstructor = global[ARRAY];
if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
redefine(TypedArrayConstructor, KEY, property);
defineBuiltIn(TypedArrayConstructor, KEY, property);
}
}
};
Expand Down
6 changes: 3 additions & 3 deletions packages/core-js/internals/array-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ var DESCRIPTORS = require('../internals/descriptors');
var NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');
var FunctionName = require('../internals/function-name');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefineAll = require('../internals/redefine-all');
var defineBuiltIns = require('../internals/define-built-ins');
var fails = require('../internals/fails');
var anInstance = require('../internals/an-instance');
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
Expand Down Expand Up @@ -134,7 +134,7 @@ if (!NATIVE_ARRAY_BUFFER) {
addGetter($DataView, 'byteOffset');
}

redefineAll(DataViewPrototype, {
defineBuiltIns(DataViewPrototype, {
getInt8: function getInt8(byteOffset) {
return get(this, 1, byteOffset)[0] << 24 >> 24;
},
Expand Down Expand Up @@ -228,7 +228,7 @@ if (!NATIVE_ARRAY_BUFFER) {
var $setInt8 = uncurryThis(DataViewPrototype.setInt8);
testView.setInt8(0, 2147483648);
testView.setInt8(1, 2147483649);
if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll(DataViewPrototype, {
if (testView.getInt8(0) || !testView.getInt8(1)) defineBuiltIns(DataViewPrototype, {
setInt8: function setInt8(byteOffset, value) {
$setInt8(this, byteOffset, value << 24 >> 24);
},
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/internals/async-from-sync-iterator.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ var apply = require('../internals/function-apply');
var anObject = require('../internals/an-object');
var create = require('../internals/object-create');
var getMethod = require('../internals/get-method');
var redefineAll = require('../internals/redefine-all');
var defineBuiltIns = require('../internals/define-built-ins');
var InternalStateModule = require('../internals/internal-state');
var getBuiltIn = require('../internals/get-built-in');
var AsyncIteratorPrototype = require('../internals/async-iterator-prototype');
Expand All @@ -29,7 +29,7 @@ var AsyncFromSyncIterator = function AsyncIterator(iterator) {
});
};

AsyncFromSyncIterator.prototype = redefineAll(create(AsyncIteratorPrototype), {
AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype), {
next: function next(arg) {
var state = getInternalState(this);
var hasArg = !!arguments.length;
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/internals/async-iterator-create-proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var create = require('../internals/object-create');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefineAll = require('../internals/redefine-all');
var defineBuiltIns = require('../internals/define-built-ins');
var wellKnownSymbol = require('../internals/well-known-symbol');
var InternalStateModule = require('../internals/internal-state');
var getBuiltIn = require('../internals/get-built-in');
Expand All @@ -28,7 +28,7 @@ module.exports = function (nextHandler, IS_ITERATOR) {
setInternalState(this, state);
};

AsyncIteratorProxy.prototype = redefineAll(create(AsyncIteratorPrototype), {
AsyncIteratorProxy.prototype = defineBuiltIns(create(AsyncIteratorPrototype), {
next: function next(arg) {
var that = this;
var hasArgument = !!arguments.length;
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/internals/async-iterator-prototype.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ var shared = require('../internals/shared-store');
var isCallable = require('../internals/is-callable');
var create = require('../internals/object-create');
var getPrototypeOf = require('../internals/object-get-prototype-of');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var wellKnownSymbol = require('../internals/well-known-symbol');
var IS_PURE = require('../internals/is-pure');

Expand All @@ -29,7 +29,7 @@ if (!AsyncIteratorPrototype) AsyncIteratorPrototype = {};
else if (IS_PURE) AsyncIteratorPrototype = create(AsyncIteratorPrototype);

if (!isCallable(AsyncIteratorPrototype[ASYNC_ITERATOR])) {
redefine(AsyncIteratorPrototype, ASYNC_ITERATOR, function () {
defineBuiltIn(AsyncIteratorPrototype, ASYNC_ITERATOR, function () {
return this;
});
}
Expand Down
6 changes: 3 additions & 3 deletions packages/core-js/internals/collection-strong.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';
var defineProperty = require('../internals/object-define-property').f;
var create = require('../internals/object-create');
var redefineAll = require('../internals/redefine-all');
var defineBuiltIns = require('../internals/define-built-ins');
var bind = require('../internals/function-bind-context');
var anInstance = require('../internals/an-instance');
var iterate = require('../internals/iterate');
Expand Down Expand Up @@ -71,7 +71,7 @@ module.exports = {
}
};

redefineAll(Prototype, {
defineBuiltIns(Prototype, {
// `{ Map, Set }.prototype.clear()` methods
// https://tc39.es/ecma262/#sec-map.prototype.clear
// https://tc39.es/ecma262/#sec-set.prototype.clear
Expand Down Expand Up @@ -131,7 +131,7 @@ module.exports = {
}
});

redefineAll(Prototype, IS_MAP ? {
defineBuiltIns(Prototype, IS_MAP ? {
// `Map.prototype.get(key)` method
// https://tc39.es/ecma262/#sec-map.prototype.get
get: function get(key) {
Expand Down
6 changes: 3 additions & 3 deletions packages/core-js/internals/collection-weak.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';
var uncurryThis = require('../internals/function-uncurry-this');
var redefineAll = require('../internals/redefine-all');
var defineBuiltIns = require('../internals/define-built-ins');
var getWeakData = require('../internals/internal-metadata').getWeakData;
var anObject = require('../internals/an-object');
var isObject = require('../internals/is-object');
Expand Down Expand Up @@ -78,7 +78,7 @@ module.exports = {
return that;
};

redefineAll(Prototype, {
defineBuiltIns(Prototype, {
// `{ WeakMap, WeakSet }.prototype.delete(key)` methods
// https://tc39.es/ecma262/#sec-weakmap.prototype.delete
// https://tc39.es/ecma262/#sec-weakset.prototype.delete
Expand All @@ -101,7 +101,7 @@ module.exports = {
}
});

redefineAll(Prototype, IS_MAP ? {
defineBuiltIns(Prototype, IS_MAP ? {
// `WeakMap.prototype.get(key)` method
// https://tc39.es/ecma262/#sec-weakmap.prototype.get
get: function get(key) {
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/internals/collection.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ var $ = require('../internals/export');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var isForced = require('../internals/is-forced');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var InternalMetadataModule = require('../internals/internal-metadata');
var iterate = require('../internals/iterate');
var anInstance = require('../internals/an-instance');
Expand All @@ -25,7 +25,7 @@ module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {

var fixMethod = function (KEY) {
var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);
redefine(NativePrototype, KEY,
defineBuiltIn(NativePrototype, KEY,
KEY == 'add' ? function add(value) {
uncurriedNativeMethod(this, value === 0 ? 0 : value);
return this;
Expand Down
8 changes: 8 additions & 0 deletions packages/core-js/internals/define-built-in-accessor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
var makeBuiltIn = require('../internals/make-built-in');
var defineProperty = require('../internals/object-define-property');

module.exports = function (target, name, descriptor) {
if (descriptor.get) descriptor.get = makeBuiltIn(descriptor.get, name, { getter: true });
if (descriptor.set) descriptor.set = makeBuiltIn(descriptor.set, name, { setter: true });
return defineProperty.f(target, name, descriptor);
};
25 changes: 25 additions & 0 deletions packages/core-js/internals/define-built-in.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
var global = require('../internals/global');
var isCallable = require('../internals/is-callable');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var makeBuiltIn = require('../internals/make-built-in');
var setGlobal = require('../internals/set-global');

module.exports = function (O, key, value, options) {
var unsafe = options ? !!options.unsafe : false;
var simple = options ? !!options.enumerable : false;
var noTargetGet = options ? !!options.noTargetGet : false;
var name = options && options.name !== undefined ? options.name : key;
if (isCallable(value)) makeBuiltIn(value, name, options);
if (O === global) {
if (simple) O[key] = value;
else setGlobal(key, value);
return O;
} else if (!unsafe) {
delete O[key];
} else if (!noTargetGet && O[key]) {
simple = true;
}
if (simple) O[key] = value;
else createNonEnumerableProperty(O, key, value);
return O;
};
6 changes: 6 additions & 0 deletions packages/core-js/internals/define-built-ins.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var defineBuiltIn = require('../internals/define-built-in');

module.exports = function (target, src, options) {
for (var key in src) defineBuiltIn(target, key, src[key], options);
return target;
};
8 changes: 4 additions & 4 deletions packages/core-js/internals/define-iterator.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ var getPrototypeOf = require('../internals/object-get-prototype-of');
var setPrototypeOf = require('../internals/object-set-prototype-of');
var setToStringTag = require('../internals/set-to-string-tag');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var wellKnownSymbol = require('../internals/well-known-symbol');
var Iterators = require('../internals/iterators');
var IteratorsCore = require('../internals/iterators-core');
Expand Down Expand Up @@ -56,7 +56,7 @@ module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, I
if (setPrototypeOf) {
setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
} else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {
redefine(CurrentIteratorPrototype, ITERATOR, returnThis);
defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);
}
}
// Set @@toStringTag to native iterators
Expand Down Expand Up @@ -84,14 +84,14 @@ module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, I
};
if (FORCED) for (KEY in methods) {
if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
redefine(IterablePrototype, KEY, methods[KEY]);
defineBuiltIn(IterablePrototype, KEY, methods[KEY]);
}
} else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
}

// define iterator
if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });
defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });
}
Iterators[NAME] = defaultIterator;

Expand Down
5 changes: 2 additions & 3 deletions packages/core-js/internals/export.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var global = require('../internals/global');
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var setGlobal = require('../internals/set-global');
var copyConstructorProperties = require('../internals/copy-constructor-properties');
var isForced = require('../internals/is-forced');
Expand Down Expand Up @@ -49,7 +49,6 @@ module.exports = function (options, source) {
if (options.sham || (targetProperty && targetProperty.sham)) {
createNonEnumerableProperty(sourceProperty, 'sham', true);
}
// extend global
redefine(target, key, sourceProperty, options);
defineBuiltIn(target, key, sourceProperty, options);
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// TODO: Remove from `core-js@4` since it's moved to entry points
require('../modules/es.regexp.exec');
var uncurryThis = require('../internals/function-uncurry-this');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var regexpExec = require('../internals/regexp-exec');
var fails = require('../internals/fails');
var wellKnownSymbol = require('../internals/well-known-symbol');
Expand Down Expand Up @@ -66,8 +66,8 @@ module.exports = function (KEY, exec, FORCED, SHAM) {
return { done: false };
});

redefine(String.prototype, KEY, methods[0]);
redefine(RegExpPrototype, SYMBOL, methods[1]);
defineBuiltIn(String.prototype, KEY, methods[0]);
defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);
}

if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/internals/iterator-create-proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var aCallable = require('../internals/a-callable');
var anObject = require('../internals/an-object');
var create = require('../internals/object-create');
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
var redefineAll = require('../internals/redefine-all');
var defineBuiltIns = require('../internals/define-built-ins');
var wellKnownSymbol = require('../internals/well-known-symbol');
var InternalStateModule = require('../internals/internal-state');
var getMethod = require('../internals/get-method');
Expand All @@ -25,7 +25,7 @@ module.exports = function (nextHandler, IS_ITERATOR) {
setInternalState(this, state);
};

IteratorProxy.prototype = redefineAll(create(IteratorPrototype), {
IteratorProxy.prototype = defineBuiltIns(create(IteratorPrototype), {
next: function next(arg) {
var state = getInternalState(this);
var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined];
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/internals/iterators-core.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ var fails = require('../internals/fails');
var isCallable = require('../internals/is-callable');
var create = require('../internals/object-create');
var getPrototypeOf = require('../internals/object-get-prototype-of');
var redefine = require('../internals/redefine');
var defineBuiltIn = require('../internals/define-built-in');
var wellKnownSymbol = require('../internals/well-known-symbol');
var IS_PURE = require('../internals/is-pure');

Expand Down Expand Up @@ -37,7 +37,7 @@ else if (IS_PURE) IteratorPrototype = create(IteratorPrototype);
// `%IteratorPrototype%[@@iterator]()` method
// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
if (!isCallable(IteratorPrototype[ITERATOR])) {
redefine(IteratorPrototype, ITERATOR, function () {
defineBuiltIn(IteratorPrototype, ITERATOR, function () {
return this;
});
}
Expand Down
Loading

0 comments on commit ba6ea46

Please sign in to comment.