mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-01 07:33:12 +08:00
- Preserve native virtual dispatch when an override omits trailing checked-value parameters. - Keep argument side effects and subclass defaults correct across direct, inherited, and super calls.
53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
import { Base as ImportedBase, ArityBase, arityCounts } from "./base.js";
|
|
|
|
class Middle extends ImportedBase {}
|
|
class Derived extends Middle {
|
|
render(value) { console.log("derived", value); }
|
|
}
|
|
const Expression = class extends ImportedBase {
|
|
render(value) { console.log("expression", value); }
|
|
};
|
|
class Leaf extends Derived {
|
|
render(value) { super.render(value); console.log("leaf", value); }
|
|
}
|
|
|
|
function dispatch(receiver, value) { receiver.render(value); }
|
|
|
|
// An unrelated method with the same name still specializes its argument.
|
|
class Standalone {
|
|
render(point) { console.log("standalone", point.x + point.y); }
|
|
}
|
|
|
|
class Short extends ArityBase {
|
|
render(value) { console.log("short", value); }
|
|
defaulted(value) { console.log("short default", value); }
|
|
forward(value) { this.render(value); }
|
|
}
|
|
class Empty extends Short {
|
|
render() { console.log("empty"); }
|
|
}
|
|
class LongAgain extends Short {
|
|
render(value, time) { super.render(value); console.log("long again", value, time); }
|
|
}
|
|
|
|
export function exercise() {
|
|
new ImportedBase().dispatch("base call");
|
|
new Derived().dispatch(7);
|
|
new Leaf().dispatch("leaf call");
|
|
new Expression().dispatch("expression call");
|
|
dispatch(new Derived(), "helper call");
|
|
new Standalone().render({ x: 2, y: 3 });
|
|
new ArityBase().dispatch("base");
|
|
new Short().dispatch("short");
|
|
new Empty().dispatch("empty");
|
|
new LongAgain().dispatch("long");
|
|
new Short().render("direct");
|
|
new Empty().render();
|
|
new LongAgain().render("direct", 9);
|
|
new LongAgain().forward("omitted");
|
|
new ArityBase().dispatchDefault("base");
|
|
new Short().dispatchDefault("derived");
|
|
new Short().defaulted("direct");
|
|
arityCounts();
|
|
}
|