Source code

Revision control

Copy as Markdown

Other Tools

var BUGNUMBER = 1130860;
var summary = "RegExp constructor shouldn't invoke source/flags getters on argument RegExp instance.";
print(BUGNUMBER + ": " + summary);
// same-compartment
var a = /foo/;
var flagsCalled = false;
var sourceCalled = false;
Object.defineProperty(a, "source", { get: () => {
sourceCalled = true;
return "bar";
}});
Object.defineProperty(a, "flags", { get: () => {
flagsCalled = true;
return "i";
}});
assertEq(a.source, "bar");
assertEq(a.flags, "i");
assertEq(sourceCalled, true);
assertEq(flagsCalled, true);
sourceCalled = false;
flagsCalled = false;
assertEq(new RegExp(a).source, "foo");
assertEq(sourceCalled, false);
assertEq(flagsCalled, false);
// cross-compartment
var g = newGlobal();
var b = g.eval(`
var b = /foo2/;
var flagsCalled = false;
var sourceCalled = false;
Object.defineProperty(b, "source", { get: () => {
sourceCalled = true;
return "bar2";
}});
Object.defineProperty(b, "flags", { get: () => {
flagsCalled = true;
return "i";
}});
b;
`);
assertEq(b.source, "bar2");
assertEq(b.flags, "i");
assertEq(g.eval("sourceCalled;"), true);
assertEq(g.eval("flagsCalled;"), true);
g.eval(`
sourceCalled = false;
flagsCalled = false;
`);
assertEq(new RegExp(b).source, "foo2");
assertEq(g.eval("sourceCalled;"), false);
assertEq(g.eval("flagsCalled;"), false);
if (typeof reportCompare === "function")
reportCompare(true, true);