lastIndex-non-writable.js (1714B)
1 function testGlobalExec() { 2 var re = /abc.+de/g; 3 var c = 0; 4 for (var i = 0; i < 100; i++) { 5 re.lastIndex = 0; 6 if (i === 60) { 7 Object.freeze(re); 8 } 9 try { 10 re.exec("abcXdef"); 11 } catch (e) { 12 assertEq(e.toString().includes("lastIndex"), true); 13 c++; 14 } 15 assertEq(re.lastIndex, i >= 60 ? 0 : 6); 16 } 17 assertEq(c, 40); 18 } 19 testGlobalExec(); 20 21 function testStickyTest() { 22 var re = /abc.+de/y; 23 var c = 0; 24 for (var i = 0; i < 100; i++) { 25 re.lastIndex = 0; 26 if (i === 60) { 27 Object.freeze(re); 28 } 29 try { 30 re.test("abcXdef"); 31 } catch (e) { 32 assertEq(e.toString().includes("lastIndex"), true); 33 c++; 34 } 35 assertEq(re.lastIndex, i >= 60 ? 0 : 6); 36 } 37 assertEq(c, 40); 38 } 39 testStickyTest(); 40 41 // Must not reset too-large .lastIndex to 0 if non-writable. 42 function testLastIndexOutOfRange() { 43 var re = /abc.+de/g; 44 re.lastIndex = 123; 45 Object.freeze(re); 46 for (var i = 0; i < 100; i++) { 47 var ex = null; 48 try { 49 re.exec("abcXdef"); 50 } catch (e) { 51 ex = e; 52 } 53 assertEq(ex.toString().includes("lastIndex"), true); 54 assertEq(re.lastIndex, 123); 55 } 56 } 57 testLastIndexOutOfRange(); 58 59 // .lastIndex is ignored for non-global/non-sticky regexps. 60 function testPlainExec() { 61 var re = /abc.+de/; 62 re.lastIndex = 1234; 63 for (var i = 0; i < 100; i++) { 64 if (i === 60) { 65 Object.freeze(re); 66 } 67 assertEq(re.exec("abcXdef")[0], "abcXde"); 68 assertEq(re.lastIndex, 1234); 69 } 70 } 71 testPlainExec();