summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/cacheir/add-function-prototype.js
blob: e5a77d75dfc015ae1f7ff3c00cea3770d1b5b6e7 (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
function checkPrototype(fun, proto, resolvesPrototype) {
    var desc = Object.getOwnPropertyDescriptor(fun, "prototype");
    assertEq(desc.value, proto);
    assertEq(desc.configurable, !resolvesPrototype);
    assertEq(desc.enumerable, !resolvesPrototype);
    assertEq(desc.writable, true);
}
function addPrototype(fun, proto, resolvesPrototype) {
    fun.prototype = proto;
    checkPrototype(fun, proto, resolvesPrototype);
}
function test() {
    for (var i=0; i<50; i++) {
        addPrototype(function() {}, i, true);
        addPrototype(function*() {}, i, true);
        addPrototype(function async() {}, i, true);
        // Builtins, arrow functions, bound functions don't have a default
        // prototype property.
        addPrototype(Math.abs, i, false);
        addPrototype(Array.prototype.map, i, false);
        addPrototype(() => 1, i, false);
        addPrototype((function() {}).bind(null), i, false);
    }

    // Now test this with a different IC for each function type.
    for (var i=0; i<50; i++) {
        var f = function() {};
        f.prototype = i;
        checkPrototype(f, i, true);

        f = function*() {};
        f.prototype = i;
        checkPrototype(f, i, true);

        f = function async() {};
        f.prototype = i;
        checkPrototype(f, i, true);

        Math.sin.prototype = i;
        checkPrototype(Math.sin, i, false);

        Array.prototype.filter.prototype = i;
        checkPrototype(Array.prototype.filter, i, false);

        f = () => 1;
        f.prototype = i;
        checkPrototype(f, i, false);

        f = (function() {}).bind(null);
        f.prototype = i;
        checkPrototype(f, i, false);
    }

}
test();