Source code
Revision control
Copy as Markdown
Other Tools
// Tests for IsRegExpPrototypeOptimizable and IsOptimizableRegExpObject intrinsics.
function test() {
const IsRegExpPrototypeOptimizable = getSelfHostedValue("IsRegExpPrototypeOptimizable");
const IsOptimizableRegExpObject = getSelfHostedValue("IsOptimizableRegExpObject");
for (var i = 0; i < 20; i++) {
assertEq(IsRegExpPrototypeOptimizable(), true);
assertEq(IsOptimizableRegExpObject(/a/), true);
assertEq(IsOptimizableRegExpObject({}), false);
// Proto is not RegExp.prototype.
var re1 = /abc/;
assertEq(IsOptimizableRegExpObject(re1), true);
Object.setPrototypeOf(re1, Object.create(RegExp.prototype));
assertEq(IsOptimizableRegExpObject(re1), false);
// Own "flags" property.
var re2 = /abc.*def/;
assertEq(IsOptimizableRegExpObject(re2), true);
Object.defineProperty(re2, "flags", {value: ""});
assertEq(IsOptimizableRegExpObject(re2), false);
// Other own properties.
var re3 = /.+/gi;
assertEq(IsOptimizableRegExpObject(re3), true);
re3.foobar = 1;
assertEq(IsOptimizableRegExpObject(re3), false);
}
for (var i = 0; i < 20; i++) {
if (i === 13) {
// This pops the fuse!
RegExp.prototype.exec = function() {};
}
assertEq(IsRegExpPrototypeOptimizable(), i < 13);
assertEq(IsOptimizableRegExpObject(/abc.*/), i < 13);
var re = /abc/;
Object.setPrototypeOf(re, Object.create(RegExp.prototype));
assertEq(IsOptimizableRegExpObject(re), false);
}
}
test();