blob: 7694ae852381f90c4ba11527e397ead357790e35 [file] [log] [blame]
// This is super weird. A super property reference in the spec contains two
// things. The first is the object to do the lookup on, the super base. This
// should be unchanged, no matter what's going on: I can move the method to
// another object. I can pull it out as its own function. I can put it on my
// head and run around the front yard. No changes. The other half, the |this|
// for invoked calls, is the this at the time of referencing the property, which
// means it's gonna vary wildly as stuff gets moved around.
class base {
constructor() { }
test(expectedThis) { assertEq(this, expectedThis); }
}
class derived extends base {
constructor() { super(); }
test(expected) { super.test(expected); }
testArrow() { return (() => super.test(this)); }
["testCPN"](expected) { super.test(expected); }
}
let derivedInstance = new derived();
derivedInstance.test(derivedInstance);
derivedInstance.testCPN(derivedInstance);
let obj = { test: derivedInstance.test };
obj.test(obj);
let testSolo = derivedInstance.test;
// Hah! The engine is not prepared for non-object receivers, since this couldn't
// happen before. Hope Waldo fixes this soon as he claims he will :)
assertThrowsInstanceOf(() =>testSolo(undefined), TypeError);
let anotherObject = { };
derivedInstance.test.call(anotherObject, anotherObject);
let strThis = "this is not an object!";
derivedInstance.test.call(strThis, strThis);
// You can take the arrow function out of the super, ... or something like that
let arrowTest = derivedInstance.testArrow();
arrowTest();
// There's no magic "super script index" per code location.
class base1 {
constructor() { }
test() { return "llama"; }
}
class base2 {
constructor() { }
test() { return "alpaca"; }
}
let animals = [];
for (let exprBase of [base1, base2])
new class extends exprBase {
constructor() { super(); }
test() { animals.push(super["test"]()); }
}().test();
assertDeepEq(animals, ["llama", "alpaca"]);
if (typeof reportCompare === 'function')
reportCompare(0,0,"OK");