regexp-2.js (1494B)
1 // Tests for IsRegExpPrototypeOptimizable and IsOptimizableRegExpObject intrinsics. 2 function test() { 3 const IsRegExpPrototypeOptimizable = getSelfHostedValue("IsRegExpPrototypeOptimizable"); 4 const IsOptimizableRegExpObject = getSelfHostedValue("IsOptimizableRegExpObject"); 5 6 for (var i = 0; i < 20; i++) { 7 assertEq(IsRegExpPrototypeOptimizable(), true); 8 assertEq(IsOptimizableRegExpObject(/a/), true); 9 assertEq(IsOptimizableRegExpObject({}), false); 10 11 // Proto is not RegExp.prototype. 12 var re1 = /abc/; 13 assertEq(IsOptimizableRegExpObject(re1), true); 14 Object.setPrototypeOf(re1, Object.create(RegExp.prototype)); 15 assertEq(IsOptimizableRegExpObject(re1), false); 16 17 // Own "flags" property. 18 var re2 = /abc.*def/; 19 assertEq(IsOptimizableRegExpObject(re2), true); 20 Object.defineProperty(re2, "flags", {value: ""}); 21 assertEq(IsOptimizableRegExpObject(re2), false); 22 23 // Other own properties. 24 var re3 = /.+/gi; 25 assertEq(IsOptimizableRegExpObject(re3), true); 26 re3.foobar = 1; 27 assertEq(IsOptimizableRegExpObject(re3), false); 28 } 29 30 for (var i = 0; i < 20; i++) { 31 if (i === 13) { 32 // This pops the fuse! 33 RegExp.prototype.exec = function() {}; 34 } 35 36 assertEq(IsRegExpPrototypeOptimizable(), i < 13); 37 assertEq(IsOptimizableRegExpObject(/abc.*/), i < 13); 38 39 var re = /abc/; 40 Object.setPrototypeOf(re, Object.create(RegExp.prototype)); 41 assertEq(IsOptimizableRegExpObject(re), false); 42 } 43 } 44 test();