Source code

Revision control

Copy as Markdown

Other Tools

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