Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --fast-warmup
// Same source with different flags shares the statics' input and source, so
// the lazily replayed match must use the flags of the latest execution. Reading
// the statics clears their lazy source, so the later cases run two executions
// before reading to cover the case where only the flags changed.
const s = "Ab a Ab a";
const insensitive = /a/gi;
const sensitive = /a/g;
const sticky = /a/y;
const unanchored = /a/;
for (let i = 0; i < 500; i++) {
insensitive.lastIndex = 0;
assertEq(insensitive.exec(s).index, 0);
assertEq(RegExp.lastMatch, "A");
assertEq(RegExp.leftContext, "");
sensitive.lastIndex = 0;
assertEq(sensitive.exec(s).index, 3);
assertEq(RegExp.lastMatch, "a");
assertEq(RegExp.leftContext, "Ab ");
sticky.lastIndex = 8;
assertEq(sticky.exec(s).index, 8);
assertEq(RegExp.leftContext, "Ab a Ab ");
assertEq(unanchored.exec(s).index, 3);
assertEq(RegExp.leftContext, "Ab ");
assertEq(s.replace(insensitive, "-"), "-b - -b -");
assertEq(RegExp.leftContext, "Ab a Ab ");
assertEq(s.replace(/A/g, "-"), "-b a -b a");
assertEq(RegExp.leftContext, "Ab a ");
insensitive.lastIndex = 0;
insensitive.exec(s);
sensitive.lastIndex = 0;
sensitive.exec(s);
assertEq(RegExp.lastMatch, "a");
assertEq(RegExp.leftContext, "Ab ");
sensitive.lastIndex = 0;
sensitive.exec(s);
insensitive.lastIndex = 0;
insensitive.exec(s);
assertEq(RegExp.lastMatch, "A");
assertEq(RegExp.leftContext, "");
s.replace(/a/gi, "-");
s.replace(/a/g, "-");
assertEq(RegExp.leftContext, "Ab a Ab ");
assertEq(RegExp.lastMatch, "a");
unanchored.exec(s);
sticky.lastIndex = 0;
sticky.test(s);
/a/i.exec(s);
assertEq(RegExp.lastMatch, "A");
assertEq(RegExp.leftContext, "");
}