1 | var DESCRIPTORS = require('../internals/descriptors');
|
2 | var global = require('../internals/global');
|
3 | var isForced = require('../internals/is-forced');
|
4 | var inheritIfRequired = require('../internals/inherit-if-required');
|
5 | var defineProperty = require('../internals/object-define-property').f;
|
6 | var getOwnPropertyNames = require('../internals/object-get-own-property-names').f;
|
7 | var isRegExp = require('../internals/is-regexp');
|
8 | var getFlags = require('../internals/regexp-flags');
|
9 | var stickyHelpers = require('../internals/regexp-sticky-helpers');
|
10 | var redefine = require('../internals/redefine');
|
11 | var fails = require('../internals/fails');
|
12 | var setInternalState = require('../internals/internal-state').set;
|
13 | var setSpecies = require('../internals/set-species');
|
14 | var wellKnownSymbol = require('../internals/well-known-symbol');
|
15 |
|
16 | var MATCH = wellKnownSymbol('match');
|
17 | var NativeRegExp = global.RegExp;
|
18 | var RegExpPrototype = NativeRegExp.prototype;
|
19 | var re1 = /a/g;
|
20 | var re2 = /a/g;
|
21 |
|
22 |
|
23 | var CORRECT_NEW = new NativeRegExp(re1) !== re1;
|
24 |
|
25 | var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
|
26 |
|
27 | var FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {
|
28 | re2[MATCH] = false;
|
29 |
|
30 | return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
|
31 | })));
|
32 |
|
33 |
|
34 |
|
35 | if (FORCED) {
|
36 | var RegExpWrapper = function RegExp(pattern, flags) {
|
37 | var thisIsRegExp = this instanceof RegExpWrapper;
|
38 | var patternIsRegExp = isRegExp(pattern);
|
39 | var flagsAreUndefined = flags === undefined;
|
40 | var sticky;
|
41 |
|
42 | if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {
|
43 | return pattern;
|
44 | }
|
45 |
|
46 | if (CORRECT_NEW) {
|
47 | if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;
|
48 | } else if (pattern instanceof RegExpWrapper) {
|
49 | if (flagsAreUndefined) flags = getFlags.call(pattern);
|
50 | pattern = pattern.source;
|
51 | }
|
52 |
|
53 | if (UNSUPPORTED_Y) {
|
54 | sticky = !!flags && flags.indexOf('y') > -1;
|
55 | if (sticky) flags = flags.replace(/y/g, '');
|
56 | }
|
57 |
|
58 | var result = inheritIfRequired(
|
59 | CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),
|
60 | thisIsRegExp ? this : RegExpPrototype,
|
61 | RegExpWrapper
|
62 | );
|
63 |
|
64 | if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });
|
65 |
|
66 | return result;
|
67 | };
|
68 | var proxy = function (key) {
|
69 | key in RegExpWrapper || defineProperty(RegExpWrapper, key, {
|
70 | configurable: true,
|
71 | get: function () { return NativeRegExp[key]; },
|
72 | set: function (it) { NativeRegExp[key] = it; }
|
73 | });
|
74 | };
|
75 | var keys = getOwnPropertyNames(NativeRegExp);
|
76 | var index = 0;
|
77 | while (keys.length > index) proxy(keys[index++]);
|
78 | RegExpPrototype.constructor = RegExpWrapper;
|
79 | RegExpWrapper.prototype = RegExpPrototype;
|
80 | redefine(global, 'RegExp', RegExpWrapper);
|
81 | }
|
82 |
|
83 |
|
84 | setSpecies('RegExp');
|