MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1function assert(condition, message) {
2 if (!condition) throw new Error(message);
3}
4
5function assertEq(actual, expected, message) {
6 if (actual !== expected) {
7 throw new Error(`${message}: expected ${expected}, got ${actual}`);
8 }
9}
10
11function runNewTargetHot() {
12 function readNewTarget() {
13 return new.target;
14 }
15
16 let last = null;
17 for (let i = 0; i < 600; i++) {
18 last = readNewTarget();
19 }
20 return last;
21}
22
23class BaseBox {
24 static value = 7;
25}
26
27class DerivedBox extends BaseBox {
28 static readSuperValue() {
29 return super.value;
30 }
31}
32
33const superReader = DerivedBox.readSuperValue;
34
35const staticValueSymbol = Symbol("static-value");
36
37class SymbolBaseBox {
38 static [staticValueSymbol] = 11;
39}
40
41class SymbolDerivedBox extends SymbolBaseBox {
42 static readSuperSymbol() {
43 return super[staticValueSymbol];
44 }
45}
46
47const superSymbolReader = SymbolDerivedBox.readSuperSymbol;
48
49class ConstructorBase {
50 get value() {
51 return this.tag;
52 }
53}
54
55class ConstructorDerived extends ConstructorBase {
56 constructor() {
57 super();
58 this.tag = "ctor-super";
59 this.fromCtor = super.value;
60 }
61}
62
63function runSuperHot() {
64 let last = 0;
65 for (let i = 0; i < 600; i++) {
66 last = superReader();
67 }
68 return last;
69}
70
71function runSuperSymbolHot() {
72 let last = 0;
73 for (let i = 0; i < 600; i++) {
74 last = superSymbolReader();
75 }
76 return last;
77}
78
79const isAnt = typeof process === "object"
80 && process !== null
81 && typeof process.versions === "object"
82 && process.versions !== null
83 && typeof process.versions.ant === "string";
84
85assertEq(runNewTargetHot(), undefined, "hot inline helper preserves new.target");
86assertEq(superReader(), 7, "extracted static super value lookup");
87assertEq(runSuperHot(), 7, "hot direct call preserves super value lookup");
88assertEq(superSymbolReader(), 11, "extracted static super symbol lookup");
89assertEq(runSuperSymbolHot(), 11, "hot direct call preserves super symbol lookup");
90assertEq(new ConstructorDerived().fromCtor, "ctor-super", "constructor super getter lookup");
91
92if (isAnt) {
93 const antOnly = await import("./test_jit_inline_special_obj_import.mjs");
94 await antOnly.verifyImportBinding(assert, assertEq);
95}
96
97console.log("OK: test_jit_inline_special_obj");