@scriptc/compiler 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/ambient/package.json +3 -0
- package/ambient/scriptc-node-fallback.d.ts +3001 -0
- package/ambient/scriptc-overrides.d.ts +95 -0
- package/ambient/scriptc.d.ts +74 -0
- package/dist/backend/cc.d.ts +169 -0
- package/dist/backend/cc.js +897 -0
- package/dist/backend/cc.js.map +1 -0
- package/dist/backend/emission/emit-async.d.ts +145 -0
- package/dist/backend/emission/emit-async.js +996 -0
- package/dist/backend/emission/emit-async.js.map +1 -0
- package/dist/backend/emission/emit-exprs.d.ts +3 -0
- package/dist/backend/emission/emit-exprs.js +5947 -0
- package/dist/backend/emission/emit-exprs.js.map +1 -0
- package/dist/backend/emission/emit-island.d.ts +45 -0
- package/dist/backend/emission/emit-island.js +271 -0
- package/dist/backend/emission/emit-island.js.map +1 -0
- package/dist/backend/emission/emit-shapes.d.ts +142 -0
- package/dist/backend/emission/emit-shapes.js +575 -0
- package/dist/backend/emission/emit-shapes.js.map +1 -0
- package/dist/backend/emission/emit-stmts.d.ts +78 -0
- package/dist/backend/emission/emit-stmts.js +960 -0
- package/dist/backend/emission/emit-stmts.js.map +1 -0
- package/dist/backend/emission/emit-types.d.ts +65 -0
- package/dist/backend/emission/emit-types.js +652 -0
- package/dist/backend/emission/emit-types.js.map +1 -0
- package/dist/backend/emission/emit-walkers.d.ts +154 -0
- package/dist/backend/emission/emit-walkers.js +1587 -0
- package/dist/backend/emission/emit-walkers.js.map +1 -0
- package/dist/backend/emission/emitter.d.ts +452 -0
- package/dist/backend/emission/emitter.js +1249 -0
- package/dist/backend/emission/emitter.js.map +1 -0
- package/dist/backend/emission/may-throw.d.ts +15 -0
- package/dist/backend/emission/may-throw.js +250 -0
- package/dist/backend/emission/may-throw.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +21 -0
- package/dist/backend/llvm/blocks.js +68 -0
- package/dist/backend/llvm/blocks.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +84 -0
- package/dist/backend/llvm/classes.js +438 -0
- package/dist/backend/llvm/classes.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +123 -0
- package/dist/backend/llvm/dyn.js +2624 -0
- package/dist/backend/llvm/dyn.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +3 -0
- package/dist/backend/llvm/emitter.js +10087 -0
- package/dist/backend/llvm/emitter.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +78 -0
- package/dist/backend/llvm/shapes.js +754 -0
- package/dist/backend/llvm/shapes.js.map +1 -0
- package/dist/backend/llvm/unsupported.d.ts +6 -0
- package/dist/backend/llvm/unsupported.js +12 -0
- package/dist/backend/llvm/unsupported.js.map +1 -0
- package/dist/backend/llvm/walkers.d.ts +58 -0
- package/dist/backend/llvm/walkers.js +793 -0
- package/dist/backend/llvm/walkers.js.map +1 -0
- package/dist/backend/mangle.d.ts +124 -0
- package/dist/backend/mangle.js +232 -0
- package/dist/backend/mangle.js.map +1 -0
- package/dist/coverage/report.d.ts +64 -0
- package/dist/coverage/report.js +226 -0
- package/dist/coverage/report.js.map +1 -0
- package/dist/diagnostics/diagnostic.d.ts +140 -0
- package/dist/diagnostics/diagnostic.js +458 -0
- package/dist/diagnostics/diagnostic.js.map +1 -0
- package/dist/diagnostics/render.d.ts +11 -0
- package/dist/diagnostics/render.js +58 -0
- package/dist/diagnostics/render.js.map +1 -0
- package/dist/frontend/cjs-lexer.d.ts +20 -0
- package/dist/frontend/cjs-lexer.js +813 -0
- package/dist/frontend/cjs-lexer.js.map +1 -0
- package/dist/frontend/lowering/http2-constants.d.ts +1 -0
- package/dist/frontend/lowering/http2-constants.js +251 -0
- package/dist/frontend/lowering/http2-constants.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +6 -0
- package/dist/frontend/lowering/lib-boundary.js +143 -0
- package/dist/frontend/lowering/lib-boundary.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.d.ts +18 -0
- package/dist/frontend/lowering/lower-assert.js +1269 -0
- package/dist/frontend/lowering/lower-assert.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +511 -0
- package/dist/frontend/lowering/lower-builtins.js +5249 -0
- package/dist/frontend/lowering/lower-builtins.js.map +1 -0
- package/dist/frontend/lowering/lower-calls.d.ts +581 -0
- package/dist/frontend/lowering/lower-calls.js +6281 -0
- package/dist/frontend/lowering/lower-calls.js.map +1 -0
- package/dist/frontend/lowering/lower-classes.d.ts +727 -0
- package/dist/frontend/lowering/lower-classes.js +4701 -0
- package/dist/frontend/lowering/lower-classes.js.map +1 -0
- package/dist/frontend/lowering/lower-comptime.d.ts +53 -0
- package/dist/frontend/lowering/lower-comptime.js +244 -0
- package/dist/frontend/lowering/lower-comptime.js.map +1 -0
- package/dist/frontend/lowering/lower-containers.d.ts +483 -0
- package/dist/frontend/lowering/lower-containers.js +6281 -0
- package/dist/frontend/lowering/lower-containers.js.map +1 -0
- package/dist/frontend/lowering/lower-dgram.d.ts +20 -0
- package/dist/frontend/lowering/lower-dgram.js +319 -0
- package/dist/frontend/lowering/lower-dgram.js.map +1 -0
- package/dist/frontend/lowering/lower-emitter.d.ts +10 -0
- package/dist/frontend/lowering/lower-emitter.js +688 -0
- package/dist/frontend/lowering/lower-emitter.js.map +1 -0
- package/dist/frontend/lowering/lower-enums.d.ts +22 -0
- package/dist/frontend/lowering/lower-enums.js +235 -0
- package/dist/frontend/lowering/lower-enums.js.map +1 -0
- package/dist/frontend/lowering/lower-expando.d.ts +35 -0
- package/dist/frontend/lowering/lower-expando.js +276 -0
- package/dist/frontend/lowering/lower-expando.js.map +1 -0
- package/dist/frontend/lowering/lower-exprs.d.ts +524 -0
- package/dist/frontend/lowering/lower-exprs.js +8099 -0
- package/dist/frontend/lowering/lower-exprs.js.map +1 -0
- package/dist/frontend/lowering/lower-generators.d.ts +50 -0
- package/dist/frontend/lowering/lower-generators.js +421 -0
- package/dist/frontend/lowering/lower-generators.js.map +1 -0
- package/dist/frontend/lowering/lower-inspect.d.ts +20 -0
- package/dist/frontend/lowering/lower-inspect.js +1069 -0
- package/dist/frontend/lowering/lower-inspect.js.map +1 -0
- package/dist/frontend/lowering/lower-island.d.ts +108 -0
- package/dist/frontend/lowering/lower-island.js +650 -0
- package/dist/frontend/lowering/lower-island.js.map +1 -0
- package/dist/frontend/lowering/lower-mixins.d.ts +96 -0
- package/dist/frontend/lowering/lower-mixins.js +534 -0
- package/dist/frontend/lowering/lower-mixins.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.d.ts +135 -0
- package/dist/frontend/lowering/lower-modules.js +1613 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -0
- package/dist/frontend/lowering/lower-namespaces.d.ts +168 -0
- package/dist/frontend/lowering/lower-namespaces.js +706 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -0
- package/dist/frontend/lowering/lower-server.d.ts +90 -0
- package/dist/frontend/lowering/lower-server.js +3471 -0
- package/dist/frontend/lowering/lower-server.js.map +1 -0
- package/dist/frontend/lowering/lower-stmts.d.ts +361 -0
- package/dist/frontend/lowering/lower-stmts.js +5341 -0
- package/dist/frontend/lowering/lower-stmts.js.map +1 -0
- package/dist/frontend/lowering/lower-stream.d.ts +88 -0
- package/dist/frontend/lowering/lower-stream.js +1533 -0
- package/dist/frontend/lowering/lower-stream.js.map +1 -0
- package/dist/frontend/lowering/lower-test.d.ts +27 -0
- package/dist/frontend/lowering/lower-test.js +353 -0
- package/dist/frontend/lowering/lower-test.js.map +1 -0
- package/dist/frontend/lowering/lowerer.d.ts +1748 -0
- package/dist/frontend/lowering/lowerer.js +6256 -0
- package/dist/frontend/lowering/lowerer.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +272 -0
- package/dist/frontend/lowering/surfaces.js +1096 -0
- package/dist/frontend/lowering/surfaces.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +55 -0
- package/dist/frontend/npm-static.js +300 -0
- package/dist/frontend/npm-static.js.map +1 -0
- package/dist/frontend/npm.d.ts +330 -0
- package/dist/frontend/npm.js +1259 -0
- package/dist/frontend/npm.js.map +1 -0
- package/dist/frontend/program.d.ts +186 -0
- package/dist/frontend/program.js +2172 -0
- package/dist/frontend/program.js.map +1 -0
- package/dist/frontend/provenance-registry.d.ts +48 -0
- package/dist/frontend/provenance-registry.js +87 -0
- package/dist/frontend/provenance-registry.js.map +1 -0
- package/dist/frontend/provenance.d.ts +6 -0
- package/dist/frontend/provenance.js +459 -0
- package/dist/frontend/provenance.js.map +1 -0
- package/dist/frontend/resolve.d.ts +56 -0
- package/dist/frontend/resolve.js +682 -0
- package/dist/frontend/resolve.js.map +1 -0
- package/dist/frontend/shared.d.ts +60 -0
- package/dist/frontend/shared.js +232 -0
- package/dist/frontend/shared.js.map +1 -0
- package/dist/frontend/ts7/adapter.d.ts +7 -0
- package/dist/frontend/ts7/adapter.js +54 -0
- package/dist/frontend/ts7/adapter.js.map +1 -0
- package/dist/frontend/ts7/ast.d.ts +50 -0
- package/dist/frontend/ts7/ast.js +211 -0
- package/dist/frontend/ts7/ast.js.map +1 -0
- package/dist/frontend/ts7/census-check.d.ts +1 -0
- package/dist/frontend/ts7/census-check.js +12 -0
- package/dist/frontend/ts7/census-check.js.map +1 -0
- package/dist/frontend/ts7/checker.d.ts +140 -0
- package/dist/frontend/ts7/checker.js +544 -0
- package/dist/frontend/ts7/checker.js.map +1 -0
- package/dist/frontend/ts7/enums.d.ts +18 -0
- package/dist/frontend/ts7/enums.js +43 -0
- package/dist/frontend/ts7/enums.js.map +1 -0
- package/dist/frontend/ts7/program.d.ts +99 -0
- package/dist/frontend/ts7/program.js +278 -0
- package/dist/frontend/ts7/program.js.map +1 -0
- package/dist/frontend/ts7/world-check.d.ts +3 -0
- package/dist/frontend/ts7/world-check.js +34 -0
- package/dist/frontend/ts7/world-check.js.map +1 -0
- package/dist/frontend/types.d.ts +205 -0
- package/dist/frontend/types.js +2485 -0
- package/dist/frontend/types.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +424 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/nodes.d.ts +4334 -0
- package/dist/ir/nodes.js +1906 -0
- package/dist/ir/nodes.js.map +1 -0
- package/dist/ir/serialize.d.ts +4 -0
- package/dist/ir/serialize.js +34 -0
- package/dist/ir/serialize.js.map +1 -0
- package/dist/ir/validate.d.ts +36 -0
- package/dist/ir/validate.js +4884 -0
- package/dist/ir/validate.js.map +1 -0
- package/package.json +30 -6
- package/README.md +0 -3
- package/index.js +0 -2
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { isRefCounted, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES } from "../../ir/nodes.js";
|
|
2
|
+
import { mangleClassGcFree, mangleClassNew, mangleClassObj, mangleClassRelease, mangleClassReleaseDirect, mangleClassRetain, mangleClassStruct, mangleClassTrace, mangleCtorThunk, mangleFunction, mangleVtInstance, mangleVtStruct, } from "../mangle.js";
|
|
3
|
+
import { FN_ATTRS, llFieldType, releaseSym, traceAdapter } from "./shapes.js";
|
|
4
|
+
/** The class graph: link base/children, number the forest in preorder
|
|
5
|
+
* (roots and children in module class order — the SAME numbering the C
|
|
6
|
+
* backend computes, so instanceof agrees between backends and with the
|
|
7
|
+
* runtime's stamped error vtables), and compute each hierarchy's virtual
|
|
8
|
+
* slots — a class's method gets a slot iff no ancestor declares it AND some
|
|
9
|
+
* strict descendant redeclares it (whole-program devirtualization).
|
|
10
|
+
* Ported from the CEmitter constructor. */
|
|
11
|
+
export function buildClassGraph(mod, fnByName) {
|
|
12
|
+
const metaMap = new Map();
|
|
13
|
+
for (const cls of mod.classes ?? []) {
|
|
14
|
+
metaMap.set(cls.name, {
|
|
15
|
+
def: cls,
|
|
16
|
+
base: null,
|
|
17
|
+
children: [],
|
|
18
|
+
root: undefined,
|
|
19
|
+
pre: 0,
|
|
20
|
+
post: 0,
|
|
21
|
+
hierarchy: false,
|
|
22
|
+
slots: [],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
for (const meta of metaMap.values()) {
|
|
26
|
+
if (meta.def.base === undefined)
|
|
27
|
+
continue;
|
|
28
|
+
const base = metaMap.get(meta.def.base);
|
|
29
|
+
if (!base)
|
|
30
|
+
throw new Error(`llvm emitter bug: undeclared base class ${meta.def.base}`);
|
|
31
|
+
meta.base = base;
|
|
32
|
+
base.children.push(meta);
|
|
33
|
+
}
|
|
34
|
+
let preCounter = 0;
|
|
35
|
+
const number = (meta, root) => {
|
|
36
|
+
meta.root = root;
|
|
37
|
+
meta.pre = preCounter++;
|
|
38
|
+
for (const c of meta.children)
|
|
39
|
+
number(c, root);
|
|
40
|
+
meta.post = preCounter - 1;
|
|
41
|
+
};
|
|
42
|
+
for (const meta of metaMap.values()) {
|
|
43
|
+
if (meta.base === null)
|
|
44
|
+
number(meta, meta);
|
|
45
|
+
meta.hierarchy = meta.base !== null || meta.children.length > 0;
|
|
46
|
+
}
|
|
47
|
+
const declares = (m, method) => m.def.methods?.includes(method) ?? false;
|
|
48
|
+
const declaredBelow = (m, method) => m.children.some((c) => declares(c, method) || declaredBelow(c, method));
|
|
49
|
+
const collectSlots = (m, root) => {
|
|
50
|
+
for (const method of m.def.methods ?? []) {
|
|
51
|
+
let inherited = false;
|
|
52
|
+
for (let a = m.base; a; a = a.base)
|
|
53
|
+
inherited ||= declares(a, method);
|
|
54
|
+
if (!inherited && declaredBelow(m, method)) {
|
|
55
|
+
let fn = fnByName.get(`%${m.def.name}.${method}`);
|
|
56
|
+
if (!fn && m.def.abstractMethods?.includes(method)) {
|
|
57
|
+
// Abstract declarer: the slot ABI comes from any concrete
|
|
58
|
+
// descendant implementation; none anywhere means the slot can
|
|
59
|
+
// never dispatch (only abstract classes declare it) — skip.
|
|
60
|
+
const findImpl = (c) => {
|
|
61
|
+
for (const child of c.children) {
|
|
62
|
+
const f = declares(child, method) && !child.def.abstractMethods?.includes(method)
|
|
63
|
+
? fnByName.get(`%${child.def.name}.${method}`)
|
|
64
|
+
: undefined;
|
|
65
|
+
const found = f ?? findImpl(child);
|
|
66
|
+
if (found)
|
|
67
|
+
return found;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
};
|
|
71
|
+
fn = findImpl(m);
|
|
72
|
+
if (!fn)
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (!fn)
|
|
76
|
+
throw new Error(`llvm emitter bug: missing method function %${m.def.name}.${method}`);
|
|
77
|
+
root.slots.push({ method, declarer: m, fn });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const c of m.children)
|
|
81
|
+
collectSlots(c, root);
|
|
82
|
+
};
|
|
83
|
+
for (const meta of metaMap.values()) {
|
|
84
|
+
if (meta.base === null && meta.hierarchy)
|
|
85
|
+
collectSlots(meta, meta);
|
|
86
|
+
}
|
|
87
|
+
return metaMap;
|
|
88
|
+
}
|
|
89
|
+
/** The root's slot list as seen by one class: the implementation the class
|
|
90
|
+
* dispatches to, or null outside the slot's declaring subtree / on a
|
|
91
|
+
* fully-abstract chain (vtEntriesFor, ported). */
|
|
92
|
+
export function vtEntriesFor(meta) {
|
|
93
|
+
return meta.root.slots.map((slot) => {
|
|
94
|
+
if (!(slot.declarer.pre <= meta.pre && meta.pre <= slot.declarer.post)) {
|
|
95
|
+
return { slot, impl: null };
|
|
96
|
+
}
|
|
97
|
+
for (let c = meta; c; c = c.base) {
|
|
98
|
+
if (c.def.methods?.includes(slot.method) && !c.def.abstractMethods?.includes(slot.method)) {
|
|
99
|
+
return { slot, impl: c };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (meta.def.abstract === true)
|
|
103
|
+
return { slot, impl: null };
|
|
104
|
+
throw new Error(`llvm emitter bug: no implementation of ${slot.method} for ${meta.def.name}`);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** The LLVM struct type name a class's instances GEP through: the runtime
|
|
108
|
+
* error classes share the runtime's ScrError layout (emitted subclasses
|
|
109
|
+
* embed it as their prefix); every emitted class has its own %sc_o_*. */
|
|
110
|
+
export function classStructSym(className) {
|
|
111
|
+
if (RUNTIME_ERROR_CLASSES.has(className))
|
|
112
|
+
return "ScrError";
|
|
113
|
+
if (className === RUNTIME_EMITTER_CLASS)
|
|
114
|
+
return "ScrEmitter";
|
|
115
|
+
if (RUNTIME_STREAM_CLASSES.has(className))
|
|
116
|
+
return "ScrStream";
|
|
117
|
+
return mangleClassStruct(className);
|
|
118
|
+
}
|
|
119
|
+
/** True when the class descends from the runtime emitter class: its
|
|
120
|
+
* struct embeds ScrEmitter's remaining prefix (the registry pointer and
|
|
121
|
+
* the display-name slot) after the vtable word, so an upcast to
|
|
122
|
+
* ScrEmitter* is the usual pointer reinterpret (emit-shapes.ts's rule). */
|
|
123
|
+
export function emitterRooted(meta) {
|
|
124
|
+
return meta.root.def.name === RUNTIME_EMITTER_CLASS;
|
|
125
|
+
}
|
|
126
|
+
/** True when the class descends from a runtime STREAM class: its struct
|
|
127
|
+
* embeds the FULL ScrStream prefix (registry, display name, state
|
|
128
|
+
* pointer) and its RC/trace helpers delegate the state block to
|
|
129
|
+
* scr_stream_st_* (emit-shapes.ts's streamRooted). */
|
|
130
|
+
export function streamRooted(meta) {
|
|
131
|
+
for (let m = meta.base; m; m = m.base) {
|
|
132
|
+
if (RUNTIME_STREAM_CLASSES.has(m.def.name))
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
/** The GEP index where a class's own fields start: rc at 0, the vtable
|
|
138
|
+
* word at 1 on hierarchy members, then the emitter prefix (registry +
|
|
139
|
+
* display name) on emitter-rooted classes, then the stream-state slot on
|
|
140
|
+
* stream-rooted ones. */
|
|
141
|
+
function fieldBase(meta) {
|
|
142
|
+
if (!meta.hierarchy)
|
|
143
|
+
return 1;
|
|
144
|
+
if (streamRooted(meta))
|
|
145
|
+
return 5;
|
|
146
|
+
return emitterRooted(meta) ? 4 : 2;
|
|
147
|
+
}
|
|
148
|
+
/** A field's GEP index inside its class struct: rc at 0, the vtable word
|
|
149
|
+
* at 1 on hierarchy members, then the flattened field list. */
|
|
150
|
+
export function classFieldIndex(meta, field) {
|
|
151
|
+
const idx = meta.def.fields.findIndex((f) => f.name === field);
|
|
152
|
+
if (idx < 0)
|
|
153
|
+
throw new Error(`llvm emitter bug: unknown field ${field} on class ${meta.def.name}`);
|
|
154
|
+
return { index: fieldBase(meta) + idx, type: meta.def.fields[idx].type };
|
|
155
|
+
}
|
|
156
|
+
/** The newFn initialization stores for fields whose type ADMITS undefined
|
|
157
|
+
* (undefFieldInitLineC's LLVM twin): undefined-armed union fields start
|
|
158
|
+
* at the interned unit instance; jsval fields (an `any` class field under
|
|
159
|
+
* --dynamic) start at the engine's undefined cell. */
|
|
160
|
+
function undefFieldInits(host, meta) {
|
|
161
|
+
const out = [];
|
|
162
|
+
meta.def.fields.forEach((f, i) => {
|
|
163
|
+
const { index } = classFieldIndex(meta, f.name);
|
|
164
|
+
if (f.type.kind === "jsval") {
|
|
165
|
+
host.declare(`declare ptr @scr_jsval_undefined()`);
|
|
166
|
+
out.push(` %ufv${i} = call ptr @scr_jsval_undefined()`, ` %uf${i} = getelementptr inbounds %${mangleClassStruct(meta.def.name)}, ptr %o, i64 0, i32 ${index}`, ` store ptr %ufv${i}, ptr %uf${i} ; ${f.name} starts undefined`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (f.type.kind !== "union")
|
|
170
|
+
return;
|
|
171
|
+
const tag = host.undefinedArmTag(f.type);
|
|
172
|
+
if (tag < 0)
|
|
173
|
+
return;
|
|
174
|
+
out.push(` %uf${i} = getelementptr inbounds %${mangleClassStruct(meta.def.name)}, ptr %o, i64 0, i32 ${index}`, ` store ptr ${host.unitInstanceRef(f.type.unionId, tag)}, ptr %uf${i} ; ${f.name} starts undefined`);
|
|
175
|
+
});
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
/** Per-class LLVM emission for every non-runtime class: the struct types
|
|
179
|
+
* (`typeDefs`), the vtable struct types + per-class constant instances,
|
|
180
|
+
* and the new/retain/release (+releaseDirect for hierarchy members,
|
|
181
|
+
* +trace/gcFree for cycle-capable shapes) definitions (`defs`). Mirrors
|
|
182
|
+
* emitStructDefs + emitHierarchyClassHelpers. */
|
|
183
|
+
export function emitClassShapes(host, mod, metaMap) {
|
|
184
|
+
const typeDefs = [];
|
|
185
|
+
const defs = [];
|
|
186
|
+
const emitted = (mod.classes ?? []).filter((c) => !c.runtime);
|
|
187
|
+
if (emitted.length === 0)
|
|
188
|
+
return { typeDefs, defs };
|
|
189
|
+
host.declare(`declare void @scr_obj_alloc_note()`);
|
|
190
|
+
host.declare(`declare void @scr_obj_free_note()`);
|
|
191
|
+
for (const cls of emitted) {
|
|
192
|
+
const meta = metaMap.get(cls.name);
|
|
193
|
+
const fieldTys = cls.fields.map((f) => llFieldType(f.type));
|
|
194
|
+
// Emitter subclasses embed ScrEmitter's remaining prefix (the registry
|
|
195
|
+
// and display-name slots) between the vtable word and the field list;
|
|
196
|
+
// stream subclasses add the state pointer — upcasts to ScrEmitter* /
|
|
197
|
+
// ScrStream* are the usual pointer reinterprets.
|
|
198
|
+
const prefix = meta.hierarchy
|
|
199
|
+
? streamRooted(meta) ? ["ptr", "ptr", "ptr", "ptr"]
|
|
200
|
+
: emitterRooted(meta) ? ["ptr", "ptr", "ptr"]
|
|
201
|
+
: ["ptr"]
|
|
202
|
+
: [];
|
|
203
|
+
const members = [...prefix, ...fieldTys];
|
|
204
|
+
typeDefs.push(`%${mangleClassStruct(cls.name)} = type { i64${members.length ? ", " + members.join(", ") : ""} } ` +
|
|
205
|
+
`; class ${cls.name}${meta.hierarchy ? " (vt at 1)" : ""}${streamRooted(meta) ? " (ScrStream prefix at 2)" : emitterRooted(meta) ? " (ScrEmitter prefix at 2)" : ""} { ${cls.fields.map((f) => f.name).join("; ")} }`);
|
|
206
|
+
}
|
|
207
|
+
// Vtable struct types, one per ROOT of the emitted hierarchy classes (a
|
|
208
|
+
// runtime root — %Error — counts exactly when an emitted subclass needs
|
|
209
|
+
// its type): a ScrVt head plus one ptr per slot. All slots are `ptr`, so
|
|
210
|
+
// the type is layout-only.
|
|
211
|
+
const roots = [...new Set(emitted.map((c) => metaMap.get(c.name)).filter((m) => m.hierarchy).map((m) => m.root))];
|
|
212
|
+
for (const root of roots) {
|
|
213
|
+
const slotPtrs = root.slots.map(() => "ptr").join(", ");
|
|
214
|
+
typeDefs.push(`%${mangleVtStruct(root.def.name)} = type { %ScrVt${root.slots.length ? ", " + slotPtrs : ""} } ` +
|
|
215
|
+
`; vtable: hierarchy rooted at ${root.def.name}${root.slots.length ? ` [${root.slots.map((s) => s.method).join(", ")}]` : ""}`);
|
|
216
|
+
}
|
|
217
|
+
// One constant vtable instance per emitted hierarchy class: interval,
|
|
218
|
+
// direct release, and the class's dispatch entry for every slot — the
|
|
219
|
+
// method functions THEMSELVES (no adapters; see the header comment).
|
|
220
|
+
for (const cls of emitted) {
|
|
221
|
+
const meta = metaMap.get(cls.name);
|
|
222
|
+
if (!meta.hierarchy)
|
|
223
|
+
continue;
|
|
224
|
+
const entries = vtEntriesFor(meta).map(({ slot, impl }) => impl === null
|
|
225
|
+
? `ptr null` // outside the declaring subtree / fully-abstract chain
|
|
226
|
+
: `ptr @${mangleFunction(`%${impl.def.name}.${slot.method}`)}`);
|
|
227
|
+
const head = `%ScrVt { i64 ${meta.pre}, i64 ${meta.post}, ptr @${mangleClassReleaseDirect(cls.name)} }`;
|
|
228
|
+
defs.push(`@${mangleVtInstance(cls.name)} = internal constant %${mangleVtStruct(meta.root.def.name)} ` +
|
|
229
|
+
`{ ${[head, ...entries].join(", ")} } ; class ${cls.name}`, ``);
|
|
230
|
+
}
|
|
231
|
+
for (const cls of emitted) {
|
|
232
|
+
const meta = metaMap.get(cls.name);
|
|
233
|
+
const struct = mangleClassStruct(cls.name);
|
|
234
|
+
const traced = host.tracedShapes.has(`object:${cls.name}`);
|
|
235
|
+
const isEmitterRooted = emitterRooted(meta);
|
|
236
|
+
const isStreamRooted = streamRooted(meta);
|
|
237
|
+
const fieldIndex = (i) => fieldBase(meta) + i;
|
|
238
|
+
const refFields = cls.fields
|
|
239
|
+
.map((f, i) => ({ ...f, index: fieldIndex(i) }))
|
|
240
|
+
.filter((f) => isRefCounted(f.type));
|
|
241
|
+
const sizeOf = `ptrtoint (ptr getelementptr (%${struct}, ptr null, i32 1) to i64)`;
|
|
242
|
+
// An embedded prefix slot (the emitter registry at 2, the stream
|
|
243
|
+
// state at 4) handed to one of the runtime's prefix helpers —
|
|
244
|
+
// teardown/trace/collector.
|
|
245
|
+
const prefixCall = (tag, slot, entry, tail, what) => {
|
|
246
|
+
host.declare(`declare void @${entry}(ptr${tail ? ", ptr, ptr" : ""})`);
|
|
247
|
+
return [
|
|
248
|
+
` %${tag}p = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${slot}`,
|
|
249
|
+
` %${tag}v = load ptr, ptr %${tag}p`,
|
|
250
|
+
` call void @${entry}(ptr %${tag}v${tail}) ; ${what}`,
|
|
251
|
+
];
|
|
252
|
+
};
|
|
253
|
+
const regCall = (tag, entry, tail) => prefixCall(tag, 2, entry, tail, "EventEmitter prefix");
|
|
254
|
+
const stCall = (tag, entry, tail) => prefixCall(tag, 4, entry, tail, "stream state (ScrStream prefix)");
|
|
255
|
+
// retain: NULL-tolerant, immortal-skip, mark-live on traced shapes —
|
|
256
|
+
// layout-generic (rc at 0), so hierarchy members need no dispatch.
|
|
257
|
+
defs.push(`define internal ptr @${mangleClassRetain(cls.name)}(ptr %o) ${FN_ATTRS} { ; retain ${cls.name}`, `entry:`, ` %isnull = icmp eq ptr %o, null`, ` br i1 %isnull, label %done, label %check`, `check:`, ` %rc = load i64, ptr %o`, ` %imm = icmp eq i64 %rc, -1`, ` br i1 %imm, label %done, label %inc`, `inc:`, ` %n = add i64 %rc, 1`, ` store i64 %n, ptr %o`, ...(traced
|
|
258
|
+
? [` %colorp = getelementptr i8, ptr %o, i64 -16`, ` store i32 0, ptr %colorp ; mark live`]
|
|
259
|
+
: []), ` br label %done`, `done:`, ` ret ptr %o`, `}`, ``);
|
|
260
|
+
// The field-releasing teardown body shared by both release shapes
|
|
261
|
+
// (the public one on standalone classes, the DIRECT one on hierarchy
|
|
262
|
+
// members). Runs at rc == 0.
|
|
263
|
+
const teardown = (lines) => {
|
|
264
|
+
if (traced) {
|
|
265
|
+
host.declare(`declare void @scr_cyc_on_dead(ptr)`);
|
|
266
|
+
lines.push(` call void @scr_cyc_on_dead(ptr %o)`);
|
|
267
|
+
}
|
|
268
|
+
refFields.forEach((f, t) => {
|
|
269
|
+
lines.push(` %f${t} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${f.index}`, ` %v${t} = load ptr, ptr %f${t}`, ` call void ${releaseSym(host, f.type)}(ptr %v${t}) ; ${f.name}`);
|
|
270
|
+
});
|
|
271
|
+
if (isEmitterRooted)
|
|
272
|
+
lines.push(...regCall("td", "scr_emitter_reg_drop", ""));
|
|
273
|
+
if (isStreamRooted)
|
|
274
|
+
lines.push(...stCall("tds", "scr_stream_st_release", ""));
|
|
275
|
+
lines.push(` call void @scr_obj_free_note()`);
|
|
276
|
+
if (traced) {
|
|
277
|
+
host.declare(`declare void @scr_cyc_free(ptr)`);
|
|
278
|
+
lines.push(` call void @scr_cyc_free(ptr %o)`);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
host.declare(`declare void @free(ptr)`);
|
|
282
|
+
lines.push(` call void @free(ptr %o)`);
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
if (meta.hierarchy) {
|
|
286
|
+
// Public release: NULL/immortal checks, then dispatch through the
|
|
287
|
+
// object's vtable so a base-typed release tears down the DERIVED
|
|
288
|
+
// object (scr_error_release's contract exactly).
|
|
289
|
+
defs.push(`define internal void @${mangleClassRelease(cls.name)}(ptr %o) ${FN_ATTRS} { ; release ${cls.name} (dispatches)`, `entry:`, ` %isnull = icmp eq ptr %o, null`, ` br i1 %isnull, label %done, label %check`, `check:`, ` %rc = load i64, ptr %o`, ` %imm = icmp eq i64 %rc, -1`, ` br i1 %imm, label %done, label %disp`, `disp:`, ` %vtp = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 1`, ` %vt = load ptr, ptr %vtp`, ` %relp = getelementptr inbounds %ScrVt, ptr %vt, i64 0, i32 2`, ` %rel = load ptr, ptr %relp`, ` call void %rel(ptr %o) ; the DYNAMIC class's teardown`, ` br label %done`, `done:`, ` ret void`, `}`, ``);
|
|
290
|
+
// Direct release (the vtable entry): the class's own teardown. The
|
|
291
|
+
// caller already handled NULL/immortal.
|
|
292
|
+
const reld = [
|
|
293
|
+
`define internal void @${mangleClassReleaseDirect(cls.name)}(ptr %o) ${FN_ATTRS} { ; direct release ${cls.name}`,
|
|
294
|
+
`entry:`,
|
|
295
|
+
` %rc = load i64, ptr %o`,
|
|
296
|
+
` %n = sub i64 %rc, 1`,
|
|
297
|
+
` store i64 %n, ptr %o`,
|
|
298
|
+
` %dead = icmp eq i64 %n, 0`,
|
|
299
|
+
` br i1 %dead, label %free, label %${traced ? "root" : "done"}`,
|
|
300
|
+
`free:`,
|
|
301
|
+
];
|
|
302
|
+
teardown(reld);
|
|
303
|
+
reld.push(` br label %done`);
|
|
304
|
+
if (traced) {
|
|
305
|
+
host.declare(`declare void @scr_cyc_on_release(ptr)`);
|
|
306
|
+
reld.push(`root:`, ` call void @scr_cyc_on_release(ptr %o) ; possible cycle root; may collect`, ` br label %done`);
|
|
307
|
+
}
|
|
308
|
+
reld.push(`done:`, ` ret void`, `}`, ``);
|
|
309
|
+
defs.push(...reld);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
const rel = [
|
|
313
|
+
`define internal void @${mangleClassRelease(cls.name)}(ptr %o) ${FN_ATTRS} { ; release ${cls.name}`,
|
|
314
|
+
`entry:`,
|
|
315
|
+
` %isnull = icmp eq ptr %o, null`,
|
|
316
|
+
` br i1 %isnull, label %done, label %check`,
|
|
317
|
+
`check:`,
|
|
318
|
+
` %rc = load i64, ptr %o`,
|
|
319
|
+
` %imm = icmp eq i64 %rc, -1`,
|
|
320
|
+
` br i1 %imm, label %done, label %dec`,
|
|
321
|
+
`dec:`,
|
|
322
|
+
` %n = sub i64 %rc, 1`,
|
|
323
|
+
` store i64 %n, ptr %o`,
|
|
324
|
+
` %dead = icmp eq i64 %n, 0`,
|
|
325
|
+
` br i1 %dead, label %free, label %${traced ? "root" : "done"}`,
|
|
326
|
+
`free:`,
|
|
327
|
+
];
|
|
328
|
+
teardown(rel);
|
|
329
|
+
rel.push(` br label %done`);
|
|
330
|
+
if (traced) {
|
|
331
|
+
host.declare(`declare void @scr_cyc_on_release(ptr)`);
|
|
332
|
+
rel.push(`root:`, ` call void @scr_cyc_on_release(ptr %o) ; possible cycle root; may collect`, ` br label %done`);
|
|
333
|
+
}
|
|
334
|
+
rel.push(`done:`, ` ret void`, `}`, ``);
|
|
335
|
+
defs.push(...rel);
|
|
336
|
+
}
|
|
337
|
+
// new: zeroed allocation, rc = 1, the vtable word on hierarchy
|
|
338
|
+
// members, undefined-admitting union fields at the interned unit
|
|
339
|
+
// instance, alloc note. Traced shapes allocate with the collector
|
|
340
|
+
// header (scr_cyc_alloc zeroes and aborts on OOM itself).
|
|
341
|
+
const nw = [
|
|
342
|
+
`define internal ptr @${mangleClassNew(cls.name)}() ${FN_ATTRS} { ; new ${cls.name}`,
|
|
343
|
+
`entry:`,
|
|
344
|
+
];
|
|
345
|
+
if (traced) {
|
|
346
|
+
host.declare(`declare ptr @scr_cyc_alloc(i64, ptr, ptr)`);
|
|
347
|
+
nw.push(` %o = call ptr @scr_cyc_alloc(i64 ${sizeOf}, ptr @${mangleClassTrace(cls.name)}, ptr @${mangleClassGcFree(cls.name)})`);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
host.declare(`declare ptr @calloc(i64, i64)`);
|
|
351
|
+
host.needOom();
|
|
352
|
+
nw.push(` %o = call ptr @calloc(i64 1, i64 ${sizeOf})`, ` %isnull = icmp eq ptr %o, null`, ` br i1 %isnull, label %oom, label %ok`, `oom:`, ` call void @sc_oom()`, ` unreachable`, `ok:`);
|
|
353
|
+
}
|
|
354
|
+
nw.push(` store i64 1, ptr %o`);
|
|
355
|
+
if (meta.hierarchy) {
|
|
356
|
+
nw.push(` %vtp = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 1`, ` store ptr @${mangleVtInstance(cls.name)}, ptr %vtp`);
|
|
357
|
+
}
|
|
358
|
+
if (isEmitterRooted) {
|
|
359
|
+
// The ScrEmitter prefix: registry stays NULL (zeroed allocation);
|
|
360
|
+
// the display name Node's leak warning prints ([My]) is the source
|
|
361
|
+
// class name, without the module qualifier (emit-shapes.ts's rule).
|
|
362
|
+
const displayName = cls.name.includes(".")
|
|
363
|
+
? cls.name.slice(cls.name.lastIndexOf(".") + 1)
|
|
364
|
+
: cls.name;
|
|
365
|
+
nw.push(` %clsp = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 3`, ` store ptr ${host.cstr(displayName)}, ptr %clsp ; EventEmitter prefix display name`);
|
|
366
|
+
}
|
|
367
|
+
nw.push(...undefFieldInits(host, meta));
|
|
368
|
+
nw.push(` call void @scr_obj_alloc_note()`, ` ret ptr %o`, `}`, ``);
|
|
369
|
+
defs.push(...nw);
|
|
370
|
+
if (traced) {
|
|
371
|
+
// trace: visit exactly the cycle-capable fields; gcFree: release
|
|
372
|
+
// exactly the complement, then free (the trace/teardown complement
|
|
373
|
+
// contract in scr_runtime.h).
|
|
374
|
+
const indexed = cls.fields.map((f, i) => ({ ...f, index: fieldIndex(i) }));
|
|
375
|
+
const tracedFields = indexed.filter((f) => traceAdapter(host, f.type) !== null);
|
|
376
|
+
const untracedRefFields = indexed.filter((f) => isRefCounted(f.type) && traceAdapter(host, f.type) === null);
|
|
377
|
+
const tr = [
|
|
378
|
+
`define internal void @${mangleClassTrace(cls.name)}(ptr %o, ptr %visit, ptr %ctx) ${FN_ATTRS} { ; trace ${cls.name}`,
|
|
379
|
+
`entry:`,
|
|
380
|
+
];
|
|
381
|
+
if (isEmitterRooted)
|
|
382
|
+
tr.push(...regCall("tr", "scr_emitter_reg_trace", ", ptr %visit, ptr %ctx"));
|
|
383
|
+
if (isStreamRooted)
|
|
384
|
+
tr.push(...stCall("trs", "scr_stream_st_trace", ", ptr %visit, ptr %ctx"));
|
|
385
|
+
tracedFields.forEach((f, i) => {
|
|
386
|
+
tr.push(` %f${i} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${f.index}`, ` %v${i} = load ptr, ptr %f${i}`, ` call void %visit(ptr %v${i}, ptr %ctx) ; ${f.name}`);
|
|
387
|
+
});
|
|
388
|
+
tr.push(` ret void`, `}`, ``);
|
|
389
|
+
defs.push(...tr);
|
|
390
|
+
const gf = [
|
|
391
|
+
`define internal void @${mangleClassGcFree(cls.name)}(ptr %o) ${FN_ATTRS} { ; gcFree ${cls.name}`,
|
|
392
|
+
`entry:`,
|
|
393
|
+
];
|
|
394
|
+
if (isEmitterRooted)
|
|
395
|
+
gf.push(...regCall("gf", "scr_emitter_reg_gcfree", ""));
|
|
396
|
+
if (isStreamRooted)
|
|
397
|
+
gf.push(...stCall("gfs", "scr_stream_st_gcfree", ""));
|
|
398
|
+
untracedRefFields.forEach((f, i) => {
|
|
399
|
+
gf.push(` %f${i} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${f.index}`, ` %v${i} = load ptr, ptr %f${i}`, ` call void ${releaseSym(host, f.type)}(ptr %v${i}) ; ${f.name} (acyclic)`);
|
|
400
|
+
});
|
|
401
|
+
host.declare(`declare void @scr_cyc_free(ptr)`);
|
|
402
|
+
gf.push(` call void @scr_obj_free_note()`, ` call void @scr_cyc_free(ptr %o)`, ` ret void`, `}`, ``);
|
|
403
|
+
defs.push(...gf);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return { typeDefs, defs };
|
|
407
|
+
}
|
|
408
|
+
/** Class objects (classes as first-class values): the immortal ScrClassObj
|
|
409
|
+
* statics plus their construct thunks — allocate, run the constructor over
|
|
410
|
+
* a +1 `this`, hand the remaining +1 out (the C emitCtorThunkDefs, minus
|
|
411
|
+
* the pending check: in-tier constructors are throw-free by construction).
|
|
412
|
+
* `classObjs` maps className → { nameSym } registered during body emission
|
|
413
|
+
* (the literal interned while the table was open). */
|
|
414
|
+
export function emitClassObjDefs(host, metaMap, classObjs, fnByName, llType) {
|
|
415
|
+
const out = [];
|
|
416
|
+
for (const [className, { nameSym }] of classObjs) {
|
|
417
|
+
const meta = metaMap.get(className);
|
|
418
|
+
if (!meta)
|
|
419
|
+
throw new Error(`llvm emitter bug: class object for unknown class ${className}`);
|
|
420
|
+
// A generic instantiation's class object carries its FAMILY's interval
|
|
421
|
+
// (JS has ONE `Box` at runtime); construction still dispatches the
|
|
422
|
+
// instantiation's own thunk.
|
|
423
|
+
const intervalMeta = meta.def.genericOf !== undefined ? metaMap.get(meta.def.genericOf) : meta;
|
|
424
|
+
if (!intervalMeta) {
|
|
425
|
+
throw new Error(`llvm emitter bug: class object for ${className} names unknown family ${meta.def.genericOf ?? ""}`);
|
|
426
|
+
}
|
|
427
|
+
const ctor = fnByName.get(`%${className}.constructor`);
|
|
428
|
+
if (!ctor)
|
|
429
|
+
throw new Error(`llvm emitter bug: class object for ${className} without a constructor`);
|
|
430
|
+
const params = ctor.params.slice(1);
|
|
431
|
+
const paramDecls = params.map((p, i) => `${llType(p.type)} %a${i}`).join(", ");
|
|
432
|
+
const ctorArgs = params.map((p, i) => `${llType(p.type)} %a${i}`);
|
|
433
|
+
out.push(`define internal ptr @${mangleCtorThunk(className)}(${paramDecls}) ${FN_ATTRS} { ; construct thunk ${className}`, `entry:`, ` %o = call ptr @${mangleClassNew(className)}()`, ` %r = call ptr @${mangleClassRetain(className)}(ptr %o)`, ` call void @${mangleFunction(`%${className}.constructor`)}(${[`ptr %r`, ...ctorArgs].join(", ")})`, ` ret ptr %o`, `}`, `@${mangleClassObj(className)} = internal global %ScrClassObj ` +
|
|
434
|
+
`{ i64 -1, i64 ${intervalMeta.pre}, i64 ${intervalMeta.post}, ptr @${mangleCtorThunk(className)}, ptr ${nameSym} } ; class ${className}`, ``);
|
|
435
|
+
}
|
|
436
|
+
return out;
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classes.js","sourceRoot":"","sources":["../../../src/backend/llvm/classes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { IrType } from "../../ir/nodes.js";
|
|
2
|
+
import type { WalkerHost } from "./walkers.js";
|
|
3
|
+
/** ScrDynKind values (scr_runtime.h). */
|
|
4
|
+
/** ScrDynHandleTag numeric values (scr_runtime.h's enum order). */
|
|
5
|
+
export declare const DYN_HANDLE_TAG_NUM: Record<string, number>;
|
|
6
|
+
export declare const DK: {
|
|
7
|
+
readonly NULL: 0;
|
|
8
|
+
readonly BOOL: 1;
|
|
9
|
+
readonly NUM: 2;
|
|
10
|
+
readonly STR: 3;
|
|
11
|
+
readonly ARR: 4;
|
|
12
|
+
readonly OBJ: 5;
|
|
13
|
+
readonly UNDEF: 6;
|
|
14
|
+
readonly BYTES: 7;
|
|
15
|
+
readonly FUNC: 8;
|
|
16
|
+
readonly HANDLE: 9;
|
|
17
|
+
readonly PROMISE: 10;
|
|
18
|
+
};
|
|
19
|
+
/** What the dyn helpers need beyond the walker host: interned immortal
|
|
20
|
+
* unit instances (undefined-armed dynCheck targets build them). */
|
|
21
|
+
export interface DynHost extends WalkerHost {
|
|
22
|
+
unitInstanceRef(unionId: string, tag: number): string;
|
|
23
|
+
}
|
|
24
|
+
export declare class LlDyn {
|
|
25
|
+
private readonly host;
|
|
26
|
+
private readonly dynMatchers;
|
|
27
|
+
private readonly dynBuilders;
|
|
28
|
+
private readonly toDynFns;
|
|
29
|
+
private readonly dynFuncThunks;
|
|
30
|
+
private readonly dynFuncBoxes;
|
|
31
|
+
private readonly dynFuncAdapters;
|
|
32
|
+
private readonly promiseDynAdapters;
|
|
33
|
+
private dynToStrFn;
|
|
34
|
+
private caughtToDynFn;
|
|
35
|
+
/** Emitted function definitions, in interning order. */
|
|
36
|
+
readonly defs: string[];
|
|
37
|
+
constructor(host: DynHost);
|
|
38
|
+
/** The value LLVM type of a dynCheck result / toDyn operand for `t`. */
|
|
39
|
+
private valTy;
|
|
40
|
+
/** Loads a DOM node's kind tag (i32 at +8). */
|
|
41
|
+
private kindOf;
|
|
42
|
+
/** Loads the 8-byte payload slot at +16 as the given LLVM type. */
|
|
43
|
+
private payloadOf;
|
|
44
|
+
/** Loads v.b (i8 at +16) as i1. */
|
|
45
|
+
private boolOf;
|
|
46
|
+
/** Loads v.arr/v.obj length (i64 at +16). */
|
|
47
|
+
private lenOf;
|
|
48
|
+
/** Loads v.arr.items / v.obj.entries (ptr at +32). */
|
|
49
|
+
private itemsOf;
|
|
50
|
+
/** Loads items[i] (borrowed ScrDyn *). */
|
|
51
|
+
private itemAt;
|
|
52
|
+
/** Object entry field addresses: entries + i*24 (+0 key, +8 key_len,
|
|
53
|
+
* +16 value). */
|
|
54
|
+
private entryAt;
|
|
55
|
+
/** An ScrStr's (len, data) pair — len via the %ScrStr header, data the
|
|
56
|
+
* flexible tail at +24. */
|
|
57
|
+
private strParts;
|
|
58
|
+
/** `call ptr @scr_dyn_retain_v(x)` (+1; immortals skip). */
|
|
59
|
+
private retainDyn;
|
|
60
|
+
/** THE immortal undefined DOM value (borrowed — retain to own). */
|
|
61
|
+
private undef;
|
|
62
|
+
/** scr_dyn_obj_get with a compile-time key: borrowed member or null. */
|
|
63
|
+
private objGetLit;
|
|
64
|
+
/** Appends an ScrStr's bytes into a ScrJsonBuf (walkers' putScrStr). */
|
|
65
|
+
private putScrStr;
|
|
66
|
+
private puts;
|
|
67
|
+
/** An i64 counting loop: emits header/body, calls `body(i)`, closes.
|
|
68
|
+
* The body must not terminate its final block. */
|
|
69
|
+
private i64Loop;
|
|
70
|
+
/** Emit the standard in-helper pending check: on a pending exception
|
|
71
|
+
* run `cleanup` and return `dummy`. */
|
|
72
|
+
private pendingBail;
|
|
73
|
+
/** Short human description of a dynCheck target for error messages. */
|
|
74
|
+
dynDesc(t: IrType): string;
|
|
75
|
+
/** `sc_dm_<n>(ptr d) -> i1` — does this DOM fit T? Never throws. */
|
|
76
|
+
dynMatchHelper(t: IrType): string;
|
|
77
|
+
/** `sc_dc_<n>(ptr d, ptr path) -> T` — validate the DOM against T and
|
|
78
|
+
* BUILD the typed value (+1), or throw the catchable path-annotated
|
|
79
|
+
* TypeError and return a dummy with the pending flag set. */
|
|
80
|
+
dynCheckHelper(t: IrType): string;
|
|
81
|
+
/** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn DOM value from a
|
|
82
|
+
* static one (+1), DEEP-COPYING composites. Borrows the operand.
|
|
83
|
+
* Never throws. */
|
|
84
|
+
toDynHelper(t: IrType): string;
|
|
85
|
+
/** The DOM-promise settle adapter for one fulfillment payload type —
|
|
86
|
+
* promiseDynAdapterHelper (emit-walkers.ts), ported:
|
|
87
|
+
* `void sc_pda_<n>(ptr %dst, ptr %src)` reads src's fulfilled payload
|
|
88
|
+
* by its compile-time kind, converts it to a DOM value, and fulfills
|
|
89
|
+
* dst with it (scr_dyn_new_promise_adapting's callback; rejections
|
|
90
|
+
* never reach an adapter — the runtime copies them raw). Interned per
|
|
91
|
+
* inner typeKey. */
|
|
92
|
+
private promiseDynAdapterHelper;
|
|
93
|
+
/** Node's String() over a DOM value — sc_ds (+1 result) over the
|
|
94
|
+
* recursive sc_ds_buf walker. Borrowed operand; never throws. */
|
|
95
|
+
dynToStrHelper(): string;
|
|
96
|
+
/** A catch binding flowing into an `unknown` slot: the typed→unknown
|
|
97
|
+
* deep-copy stance over the exception snapshot's runtime kind. */
|
|
98
|
+
caughtToDynHelper(): string;
|
|
99
|
+
/** `sc_dyn_key_get(ptr d, ptr k, i1 opt) -> ptr` — d[k] on a DOM value.
|
|
100
|
+
* Result +1; throws on non-optional nullish receivers. */
|
|
101
|
+
dynKeyGetHelper(): string;
|
|
102
|
+
dynDestrCheckHelper(): string;
|
|
103
|
+
dynIterNHelper(): string;
|
|
104
|
+
/** The dyn argument spelling of one static value: dyn passes through
|
|
105
|
+
* (+1), funcs box anonymously, everything else rides toDyn. `expr` is
|
|
106
|
+
* BORROWED in every arm. Emits into the given builder. */
|
|
107
|
+
private toDynExpr;
|
|
108
|
+
/** The call thunk for one closure signature: validate each dyn arg
|
|
109
|
+
* into the declared param type, call through the closure, convert the
|
|
110
|
+
* result back to a DOM value (+1). */
|
|
111
|
+
dynFuncThunkHelper(t: IrType & {
|
|
112
|
+
kind: "func";
|
|
113
|
+
}): string;
|
|
114
|
+
/** The box builder dynFrom emits for one closure signature. */
|
|
115
|
+
dynFuncBoxHelper(t: IrType & {
|
|
116
|
+
kind: "func";
|
|
117
|
+
}): string;
|
|
118
|
+
/** The adapter closure body for one TARGET signature: caps[0] is an
|
|
119
|
+
* untraced obj-box owning the dyn function value. */
|
|
120
|
+
dynFuncAdapterHelper(t: IrType & {
|
|
121
|
+
kind: "func";
|
|
122
|
+
}): string;
|
|
123
|
+
}
|