summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/regexp/lastIndex-non-writable.js
blob: 74839762f56eaaf35c91d60b7560ac9bdc347020 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function testGlobalExec() {
    var re = /abc.+de/g;
    var c = 0;
    for (var i = 0; i < 100; i++) {
        re.lastIndex = 0;
        if (i === 60) {
            Object.freeze(re);
        }
        try {
            re.exec("abcXdef");
        } catch (e) {
            assertEq(e.toString().includes("lastIndex"), true);
            c++;
        }
        assertEq(re.lastIndex, i >= 60 ? 0 : 6);
    }
    assertEq(c, 40);
}
testGlobalExec();

function testStickyTest() {
    var re = /abc.+de/y;
    var c = 0;
    for (var i = 0; i < 100; i++) {
        re.lastIndex = 0;
        if (i === 60) {
            Object.freeze(re);
        }
        try {
            re.test("abcXdef");
        } catch (e) {
            assertEq(e.toString().includes("lastIndex"), true);
            c++;
        }
        assertEq(re.lastIndex, i >= 60 ? 0 : 6);
    }
    assertEq(c, 40);
}
testStickyTest();

// Must not reset too-large .lastIndex to 0 if non-writable.
function testLastIndexOutOfRange() {
    var re = /abc.+de/g;
    re.lastIndex = 123;
    Object.freeze(re);
    for (var i = 0; i < 100; i++) {
        var ex = null;
        try {
            re.exec("abcXdef");
        } catch (e) {
            ex = e;
        }
        assertEq(ex.toString().includes("lastIndex"), true);
        assertEq(re.lastIndex, 123);
    }
}
testLastIndexOutOfRange();

// .lastIndex is ignored for non-global/non-sticky regexps.
function testPlainExec() {
    var re = /abc.+de/;
    re.lastIndex = 1234;
    for (var i = 0; i < 100; i++) {
        if (i === 60) {
            Object.freeze(re);
        }
        assertEq(re.exec("abcXdef")[0], "abcXde");
        assertEq(re.lastIndex, 1234);
    }
}
testPlainExec();