summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/ion/getprop-primitive.js
blob: d85ba11f106a56d88386a3daed105c561519fba3 (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
// |jit-test| --ion-warmup-threshold=50
setJitCompilerOption("offthread-compilation.enable", 0);
gcPreserveCode();

var testSet1 = [1, "", Symbol("a"), true];
var testSet2 = [1, "", Symbol("a"), true, { bar: 5 }];

Number.prototype.bar = 1;
String.prototype.bar = 2;
Symbol.prototype.bar = 3;
Boolean.prototype.bar = 4;

function assertEqIf(prev, curr, expected) {
    // Branch pruning absolutely want to get rid of the next branch
    // which causes bailouts, so we forbid inlining of this function.
    with({}){}
    if (prev) {
        assertEq(curr, expected);
        return false;
    }
    return true;
}

var f;
var template = function (set) {
    var lastX = 0, x = 0, i = 0, y = 0;
    var cont = true;
    while (cont) { // OSR here.
        for (var i = 0; i < set.length; i++) {
            x = x + (inIon() ? 1 : 0);
            if (set[i].placeholder != set[(i + 1) % set.length].placeholder)
                y += 1;
        }

        // If we bailout in the inner loop, then x will have a smaller value
        // than the number of iterations.
        cont = assertEqIf(lastX > 0, x, set.length);
        if (inIon())
            lastX = x;
        x = 0;
    }
    return y;
}

// Set 1, Non existing properties.
f = eval(`(${template})`.replace(".placeholder", ".foo"));
f(testSet1);

// Set 2, Non existing properties.
f = eval(`(${template})`.replace(".placeholder", ".foo"));
f(testSet2);

// Set 1, Existing properties.
f = eval(`(${template})`.replace(".placeholder", ".bar"));
f(testSet1);

// Set 2, Existing properties.
f = eval(`(${template})`.replace(".placeholder", ".bar"));
f(testSet2);