@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.
Files changed (206) hide show
  1. package/LICENSE +202 -0
  2. package/ambient/package.json +3 -0
  3. package/ambient/scriptc-node-fallback.d.ts +3001 -0
  4. package/ambient/scriptc-overrides.d.ts +95 -0
  5. package/ambient/scriptc.d.ts +74 -0
  6. package/dist/backend/cc.d.ts +169 -0
  7. package/dist/backend/cc.js +897 -0
  8. package/dist/backend/cc.js.map +1 -0
  9. package/dist/backend/emission/emit-async.d.ts +145 -0
  10. package/dist/backend/emission/emit-async.js +996 -0
  11. package/dist/backend/emission/emit-async.js.map +1 -0
  12. package/dist/backend/emission/emit-exprs.d.ts +3 -0
  13. package/dist/backend/emission/emit-exprs.js +5947 -0
  14. package/dist/backend/emission/emit-exprs.js.map +1 -0
  15. package/dist/backend/emission/emit-island.d.ts +45 -0
  16. package/dist/backend/emission/emit-island.js +271 -0
  17. package/dist/backend/emission/emit-island.js.map +1 -0
  18. package/dist/backend/emission/emit-shapes.d.ts +142 -0
  19. package/dist/backend/emission/emit-shapes.js +575 -0
  20. package/dist/backend/emission/emit-shapes.js.map +1 -0
  21. package/dist/backend/emission/emit-stmts.d.ts +78 -0
  22. package/dist/backend/emission/emit-stmts.js +960 -0
  23. package/dist/backend/emission/emit-stmts.js.map +1 -0
  24. package/dist/backend/emission/emit-types.d.ts +65 -0
  25. package/dist/backend/emission/emit-types.js +652 -0
  26. package/dist/backend/emission/emit-types.js.map +1 -0
  27. package/dist/backend/emission/emit-walkers.d.ts +154 -0
  28. package/dist/backend/emission/emit-walkers.js +1587 -0
  29. package/dist/backend/emission/emit-walkers.js.map +1 -0
  30. package/dist/backend/emission/emitter.d.ts +452 -0
  31. package/dist/backend/emission/emitter.js +1249 -0
  32. package/dist/backend/emission/emitter.js.map +1 -0
  33. package/dist/backend/emission/may-throw.d.ts +15 -0
  34. package/dist/backend/emission/may-throw.js +250 -0
  35. package/dist/backend/emission/may-throw.js.map +1 -0
  36. package/dist/backend/llvm/blocks.d.ts +21 -0
  37. package/dist/backend/llvm/blocks.js +68 -0
  38. package/dist/backend/llvm/blocks.js.map +1 -0
  39. package/dist/backend/llvm/classes.d.ts +84 -0
  40. package/dist/backend/llvm/classes.js +438 -0
  41. package/dist/backend/llvm/classes.js.map +1 -0
  42. package/dist/backend/llvm/dyn.d.ts +123 -0
  43. package/dist/backend/llvm/dyn.js +2624 -0
  44. package/dist/backend/llvm/dyn.js.map +1 -0
  45. package/dist/backend/llvm/emitter.d.ts +3 -0
  46. package/dist/backend/llvm/emitter.js +10087 -0
  47. package/dist/backend/llvm/emitter.js.map +1 -0
  48. package/dist/backend/llvm/shapes.d.ts +78 -0
  49. package/dist/backend/llvm/shapes.js +754 -0
  50. package/dist/backend/llvm/shapes.js.map +1 -0
  51. package/dist/backend/llvm/unsupported.d.ts +6 -0
  52. package/dist/backend/llvm/unsupported.js +12 -0
  53. package/dist/backend/llvm/unsupported.js.map +1 -0
  54. package/dist/backend/llvm/walkers.d.ts +58 -0
  55. package/dist/backend/llvm/walkers.js +793 -0
  56. package/dist/backend/llvm/walkers.js.map +1 -0
  57. package/dist/backend/mangle.d.ts +124 -0
  58. package/dist/backend/mangle.js +232 -0
  59. package/dist/backend/mangle.js.map +1 -0
  60. package/dist/coverage/report.d.ts +64 -0
  61. package/dist/coverage/report.js +226 -0
  62. package/dist/coverage/report.js.map +1 -0
  63. package/dist/diagnostics/diagnostic.d.ts +140 -0
  64. package/dist/diagnostics/diagnostic.js +458 -0
  65. package/dist/diagnostics/diagnostic.js.map +1 -0
  66. package/dist/diagnostics/render.d.ts +11 -0
  67. package/dist/diagnostics/render.js +58 -0
  68. package/dist/diagnostics/render.js.map +1 -0
  69. package/dist/frontend/cjs-lexer.d.ts +20 -0
  70. package/dist/frontend/cjs-lexer.js +813 -0
  71. package/dist/frontend/cjs-lexer.js.map +1 -0
  72. package/dist/frontend/lowering/http2-constants.d.ts +1 -0
  73. package/dist/frontend/lowering/http2-constants.js +251 -0
  74. package/dist/frontend/lowering/http2-constants.js.map +1 -0
  75. package/dist/frontend/lowering/lib-boundary.d.ts +6 -0
  76. package/dist/frontend/lowering/lib-boundary.js +143 -0
  77. package/dist/frontend/lowering/lib-boundary.js.map +1 -0
  78. package/dist/frontend/lowering/lower-assert.d.ts +18 -0
  79. package/dist/frontend/lowering/lower-assert.js +1269 -0
  80. package/dist/frontend/lowering/lower-assert.js.map +1 -0
  81. package/dist/frontend/lowering/lower-builtins.d.ts +511 -0
  82. package/dist/frontend/lowering/lower-builtins.js +5249 -0
  83. package/dist/frontend/lowering/lower-builtins.js.map +1 -0
  84. package/dist/frontend/lowering/lower-calls.d.ts +581 -0
  85. package/dist/frontend/lowering/lower-calls.js +6281 -0
  86. package/dist/frontend/lowering/lower-calls.js.map +1 -0
  87. package/dist/frontend/lowering/lower-classes.d.ts +727 -0
  88. package/dist/frontend/lowering/lower-classes.js +4701 -0
  89. package/dist/frontend/lowering/lower-classes.js.map +1 -0
  90. package/dist/frontend/lowering/lower-comptime.d.ts +53 -0
  91. package/dist/frontend/lowering/lower-comptime.js +244 -0
  92. package/dist/frontend/lowering/lower-comptime.js.map +1 -0
  93. package/dist/frontend/lowering/lower-containers.d.ts +483 -0
  94. package/dist/frontend/lowering/lower-containers.js +6281 -0
  95. package/dist/frontend/lowering/lower-containers.js.map +1 -0
  96. package/dist/frontend/lowering/lower-dgram.d.ts +20 -0
  97. package/dist/frontend/lowering/lower-dgram.js +319 -0
  98. package/dist/frontend/lowering/lower-dgram.js.map +1 -0
  99. package/dist/frontend/lowering/lower-emitter.d.ts +10 -0
  100. package/dist/frontend/lowering/lower-emitter.js +688 -0
  101. package/dist/frontend/lowering/lower-emitter.js.map +1 -0
  102. package/dist/frontend/lowering/lower-enums.d.ts +22 -0
  103. package/dist/frontend/lowering/lower-enums.js +235 -0
  104. package/dist/frontend/lowering/lower-enums.js.map +1 -0
  105. package/dist/frontend/lowering/lower-expando.d.ts +35 -0
  106. package/dist/frontend/lowering/lower-expando.js +276 -0
  107. package/dist/frontend/lowering/lower-expando.js.map +1 -0
  108. package/dist/frontend/lowering/lower-exprs.d.ts +524 -0
  109. package/dist/frontend/lowering/lower-exprs.js +8099 -0
  110. package/dist/frontend/lowering/lower-exprs.js.map +1 -0
  111. package/dist/frontend/lowering/lower-generators.d.ts +50 -0
  112. package/dist/frontend/lowering/lower-generators.js +421 -0
  113. package/dist/frontend/lowering/lower-generators.js.map +1 -0
  114. package/dist/frontend/lowering/lower-inspect.d.ts +20 -0
  115. package/dist/frontend/lowering/lower-inspect.js +1069 -0
  116. package/dist/frontend/lowering/lower-inspect.js.map +1 -0
  117. package/dist/frontend/lowering/lower-island.d.ts +108 -0
  118. package/dist/frontend/lowering/lower-island.js +650 -0
  119. package/dist/frontend/lowering/lower-island.js.map +1 -0
  120. package/dist/frontend/lowering/lower-mixins.d.ts +96 -0
  121. package/dist/frontend/lowering/lower-mixins.js +534 -0
  122. package/dist/frontend/lowering/lower-mixins.js.map +1 -0
  123. package/dist/frontend/lowering/lower-modules.d.ts +135 -0
  124. package/dist/frontend/lowering/lower-modules.js +1613 -0
  125. package/dist/frontend/lowering/lower-modules.js.map +1 -0
  126. package/dist/frontend/lowering/lower-namespaces.d.ts +168 -0
  127. package/dist/frontend/lowering/lower-namespaces.js +706 -0
  128. package/dist/frontend/lowering/lower-namespaces.js.map +1 -0
  129. package/dist/frontend/lowering/lower-server.d.ts +90 -0
  130. package/dist/frontend/lowering/lower-server.js +3471 -0
  131. package/dist/frontend/lowering/lower-server.js.map +1 -0
  132. package/dist/frontend/lowering/lower-stmts.d.ts +361 -0
  133. package/dist/frontend/lowering/lower-stmts.js +5341 -0
  134. package/dist/frontend/lowering/lower-stmts.js.map +1 -0
  135. package/dist/frontend/lowering/lower-stream.d.ts +88 -0
  136. package/dist/frontend/lowering/lower-stream.js +1533 -0
  137. package/dist/frontend/lowering/lower-stream.js.map +1 -0
  138. package/dist/frontend/lowering/lower-test.d.ts +27 -0
  139. package/dist/frontend/lowering/lower-test.js +353 -0
  140. package/dist/frontend/lowering/lower-test.js.map +1 -0
  141. package/dist/frontend/lowering/lowerer.d.ts +1748 -0
  142. package/dist/frontend/lowering/lowerer.js +6256 -0
  143. package/dist/frontend/lowering/lowerer.js.map +1 -0
  144. package/dist/frontend/lowering/surfaces.d.ts +272 -0
  145. package/dist/frontend/lowering/surfaces.js +1096 -0
  146. package/dist/frontend/lowering/surfaces.js.map +1 -0
  147. package/dist/frontend/npm-static.d.ts +55 -0
  148. package/dist/frontend/npm-static.js +300 -0
  149. package/dist/frontend/npm-static.js.map +1 -0
  150. package/dist/frontend/npm.d.ts +330 -0
  151. package/dist/frontend/npm.js +1259 -0
  152. package/dist/frontend/npm.js.map +1 -0
  153. package/dist/frontend/program.d.ts +186 -0
  154. package/dist/frontend/program.js +2172 -0
  155. package/dist/frontend/program.js.map +1 -0
  156. package/dist/frontend/provenance-registry.d.ts +48 -0
  157. package/dist/frontend/provenance-registry.js +87 -0
  158. package/dist/frontend/provenance-registry.js.map +1 -0
  159. package/dist/frontend/provenance.d.ts +6 -0
  160. package/dist/frontend/provenance.js +459 -0
  161. package/dist/frontend/provenance.js.map +1 -0
  162. package/dist/frontend/resolve.d.ts +56 -0
  163. package/dist/frontend/resolve.js +682 -0
  164. package/dist/frontend/resolve.js.map +1 -0
  165. package/dist/frontend/shared.d.ts +60 -0
  166. package/dist/frontend/shared.js +232 -0
  167. package/dist/frontend/shared.js.map +1 -0
  168. package/dist/frontend/ts7/adapter.d.ts +7 -0
  169. package/dist/frontend/ts7/adapter.js +54 -0
  170. package/dist/frontend/ts7/adapter.js.map +1 -0
  171. package/dist/frontend/ts7/ast.d.ts +50 -0
  172. package/dist/frontend/ts7/ast.js +211 -0
  173. package/dist/frontend/ts7/ast.js.map +1 -0
  174. package/dist/frontend/ts7/census-check.d.ts +1 -0
  175. package/dist/frontend/ts7/census-check.js +12 -0
  176. package/dist/frontend/ts7/census-check.js.map +1 -0
  177. package/dist/frontend/ts7/checker.d.ts +140 -0
  178. package/dist/frontend/ts7/checker.js +544 -0
  179. package/dist/frontend/ts7/checker.js.map +1 -0
  180. package/dist/frontend/ts7/enums.d.ts +18 -0
  181. package/dist/frontend/ts7/enums.js +43 -0
  182. package/dist/frontend/ts7/enums.js.map +1 -0
  183. package/dist/frontend/ts7/program.d.ts +99 -0
  184. package/dist/frontend/ts7/program.js +278 -0
  185. package/dist/frontend/ts7/program.js.map +1 -0
  186. package/dist/frontend/ts7/world-check.d.ts +3 -0
  187. package/dist/frontend/ts7/world-check.js +34 -0
  188. package/dist/frontend/ts7/world-check.js.map +1 -0
  189. package/dist/frontend/types.d.ts +205 -0
  190. package/dist/frontend/types.js +2485 -0
  191. package/dist/frontend/types.js.map +1 -0
  192. package/dist/index.d.ts +85 -0
  193. package/dist/index.js +424 -0
  194. package/dist/index.js.map +1 -0
  195. package/dist/ir/nodes.d.ts +4334 -0
  196. package/dist/ir/nodes.js +1906 -0
  197. package/dist/ir/nodes.js.map +1 -0
  198. package/dist/ir/serialize.d.ts +4 -0
  199. package/dist/ir/serialize.js +34 -0
  200. package/dist/ir/serialize.js.map +1 -0
  201. package/dist/ir/validate.d.ts +36 -0
  202. package/dist/ir/validate.js +4884 -0
  203. package/dist/ir/validate.js.map +1 -0
  204. package/package.json +30 -6
  205. package/README.md +0 -3
  206. 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
+ }