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);
}
}
|