Skip to content

Commit aa66fb2

Browse files
committed
fix cloning of regex through RegExp constructor, close #948
1 parent e8d9527 commit aa66fb2

File tree

3 files changed

+18
-14
lines changed

3 files changed

+18
-14
lines changed

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## Changelog
22
##### Unreleased
3-
- Nothing
3+
- Fixed cloning of regex through `RegExp` constructor, [#948](https://github.com/zloirock/core-js/issues/948)
44

55
##### 3.15.0 - 2021.06.21
66
- Added `RegExp` named capture groups polyfill, [#521](https://github.com/zloirock/core-js/issues/521), [#944](https://github.com/zloirock/core-js/issues/944)

packages/core-js/modules/es.regexp.constructor.js

+6-11
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,16 @@ if (isForced('RegExp', BASE_FORCED)) {
113113
var patternIsRegExp = isRegExp(pattern);
114114
var flagsAreUndefined = flags === undefined;
115115
var groups = [];
116-
var rawPattern, rawFlags, dotAll, sticky, handled, result, state;
116+
var rawPattern = pattern;
117+
var rawFlags, dotAll, sticky, handled, result, state;
117118

118-
if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {
119+
if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
119120
return pattern;
120121
}
121122

122-
if (CORRECT_NEW) {
123-
if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;
124-
} else if (pattern instanceof RegExpWrapper) {
125-
if (flagsAreUndefined) flags = getFlags.call(pattern);
123+
if (patternIsRegExp || pattern instanceof RegExpWrapper) {
126124
pattern = pattern.source;
125+
if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags.call(rawPattern);
127126
}
128127

129128
pattern = pattern === undefined ? '' : String(pattern);
@@ -148,11 +147,7 @@ if (isForced('RegExp', BASE_FORCED)) {
148147
groups = handled[1];
149148
}
150149

151-
result = inheritIfRequired(
152-
CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),
153-
thisIsRegExp ? this : RegExpPrototype,
154-
RegExpWrapper
155-
);
150+
result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);
156151

157152
if (dotAll || sticky || groups.length) {
158153
state = enforceInternalState(result);

tests/tests/es.regexp.constructor.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if (DESCRIPTORS) {
1212
assert.looksNative(RegExp);
1313
assert.ok({}.toString.call(RegExp()).slice(8, -1), 'RegExp');
1414
assert.ok({}.toString.call(new RegExp()).slice(8, -1), 'RegExp');
15-
const regexp = /a/g;
15+
let regexp = /a/g;
1616
assert.notStrictEqual(regexp, new RegExp(regexp), 'new RegExp(regexp) isnt regexp');
1717
assert.strictEqual(regexp, RegExp(regexp), 'RegExp(regexp) is regexp');
1818
regexp[Symbol.match] = false;
@@ -26,8 +26,17 @@ if (DESCRIPTORS) {
2626
assert.strictEqual(String(new RegExp(/a/g, 'mi')), '/a/im', 'Allows a regex with flags');
2727
assert.ok(new RegExp(/a/g, 'im') instanceof RegExp, 'Works with instanceof');
2828
assert.strictEqual(new RegExp(/a/g, 'im').constructor, RegExp, 'Has the right constructor');
29+
30+
const orig = /^https?:\/\//i;
31+
// eslint-disable-next-line regexp/no-useless-assertions -- false positive
32+
regexp = new RegExp(orig);
33+
assert.ok(regexp !== orig, 'new + re + no flags #1');
34+
assert.same(String(regexp), '/^https?:\\/\\//i', 'new + re + no flags #2');
35+
let result = regexp.exec('http://github.com');
36+
assert.deepEqual(result, ['http://'], 'new + re + no flags #3');
37+
2938
/(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)/.exec('abcdefghijklmnopq');
30-
let result = true;
39+
result = true;
3140
const characters = 'bcdefghij';
3241
for (let i = 0, { length } = characters; i < length; ++i) {
3342
const chr = characters[i];

0 commit comments

Comments
 (0)