summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/ion/super-prop.js
blob: 004284730f0da0a64fadc738aa0e45b70132b04c (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
class Y {
    a() {
        assertEq(this.__proto__, X.prototype);
        return 1;
    }
    b() {
        assertEq(this.__proto__, X.prototype);
        return 2;
    }
}

class X extends Y {
    a() { throw "not invoked"; }
    b() {
        return super.a() + super.b();
    }
    c(i) {
        var a, b;

        if (i % 2) {
            a = "a";
            b = "b"
        } else {
            a = "b";
            b = "a";
        }

        return super[a]() + super[b]();
    }
}

function simple() {
    var x = new X();
    assertEq(x.b(), 3);
    assertEq(x.c(), 3);
}

class A {
    b() { return 1;}
}
class B extends A {
    a() {
        assertEq(super.b(), 1);
    }
}

function nullHomeObjectSuperBase(i) {
    var b = new B();
    if (i == 500) {
        Object.setPrototypeOf(B.prototype, null);
        // Don't crash
    }
    b.a();
}

class SArray extends Array {
    constructor() {
        super("a", "b");
    }

    a() {
        assertEq(super.length, 0);
        assertEq(this.length, 2);

        assertEq(this[0], "a");
        assertEq(this[1], "b");

        assertEq(super[0], undefined);
        assertEq(super[1], undefined);
    }
}

function array() {
    var s = new SArray();
    s.a();
}

for (var i = 0; i < 1e4; i++) {
    simple();
    array();

    try {
        nullHomeObjectSuperBase(i);
    } catch (e) {
        assertEq(i >= 500, true);
    }
}