Files
Chris Tate cac0a658f6 Compile JavaScript overrides that ignore trailing arguments
- 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.
2026-09-28 01:34:20 -05:00

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