12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 'use strict';
- // TODO: Remove from `core-js@4` since it's moved to entry points
- require('../modules/es.regexp.exec');
- var call = require('../internals/function-call');
- 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');
- var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-
- var SPECIES = wellKnownSymbol('species');
- var RegExpPrototype = RegExp.prototype;
-
- module.exports = function (KEY, exec, FORCED, SHAM) {
- var SYMBOL = wellKnownSymbol(KEY);
-
- var DELEGATES_TO_SYMBOL = !fails(function () {
- // String methods call symbol-named RegExp methods
- var O = {};
- O[SYMBOL] = function () { return 7; };
- return ''[KEY](O) !== 7;
- });
-
- var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
- // Symbol-named RegExp methods call .exec
- var execCalled = false;
- var re = /a/;
-
- if (KEY === 'split') {
- // We can't use real regex here since it causes deoptimization
- // and serious performance degradation in V8
- // https://github.com/zloirock/core-js/issues/306
- re = {};
- // RegExp[@@split] doesn't call the regex's exec method, but first creates
- // a new one. We need to return the patched regex when creating the new one.
- re.constructor = {};
- re.constructor[SPECIES] = function () { return re; };
- re.flags = '';
- re[SYMBOL] = /./[SYMBOL];
- }
-
- re.exec = function () {
- execCalled = true;
- return null;
- };
-
- re[SYMBOL]('');
- return !execCalled;
- });
-
- if (
- !DELEGATES_TO_SYMBOL ||
- !DELEGATES_TO_EXEC ||
- FORCED
- ) {
- var nativeRegExpMethod = /./[SYMBOL];
- var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
- var $exec = regexp.exec;
- if ($exec === regexpExec || $exec === RegExpPrototype.exec) {
- if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
- // The native String method already delegates to @@method (this
- // polyfilled function), leasing to infinite recursion.
- // We avoid it by directly calling the native @@method method.
- return { done: true, value: call(nativeRegExpMethod, regexp, str, arg2) };
- }
- return { done: true, value: call(nativeMethod, str, regexp, arg2) };
- }
- return { done: false };
- });
-
- defineBuiltIn(String.prototype, KEY, methods[0]);
- defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);
- }
-
- if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);
- };
|