edict-lang 1.2.0 → 1.5.0

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 (141) hide show
  1. package/dist/ast/nodes.d.ts +3 -3
  2. package/dist/ast/nodes.d.ts.map +1 -1
  3. package/dist/ast/nodes.js +1 -0
  4. package/dist/ast/nodes.js.map +1 -1
  5. package/dist/ast/type-constants.d.ts +12 -0
  6. package/dist/ast/type-constants.d.ts.map +1 -0
  7. package/dist/ast/type-constants.js +16 -0
  8. package/dist/ast/type-constants.js.map +1 -0
  9. package/dist/ast/types.d.ts +1 -1
  10. package/dist/ast/types.d.ts.map +1 -1
  11. package/dist/builtins/builtin-enums.d.ts +12 -0
  12. package/dist/builtins/builtin-enums.d.ts.map +1 -0
  13. package/dist/builtins/builtin-enums.js +45 -0
  14. package/dist/builtins/builtin-enums.js.map +1 -0
  15. package/dist/builtins/builtins.d.ts +24 -0
  16. package/dist/builtins/builtins.d.ts.map +1 -0
  17. package/dist/builtins/builtins.js +691 -0
  18. package/dist/builtins/builtins.js.map +1 -0
  19. package/dist/checker/check.d.ts.map +1 -1
  20. package/dist/checker/check.js +81 -38
  21. package/dist/checker/check.js.map +1 -1
  22. package/dist/checker/type-env.d.ts +2 -0
  23. package/dist/checker/type-env.d.ts.map +1 -1
  24. package/dist/checker/type-env.js +9 -0
  25. package/dist/checker/type-env.js.map +1 -1
  26. package/dist/codegen/browser-host-adapter.d.ts +29 -0
  27. package/dist/codegen/browser-host-adapter.d.ts.map +1 -0
  28. package/dist/codegen/browser-host-adapter.js +51 -0
  29. package/dist/codegen/browser-host-adapter.js.map +1 -0
  30. package/dist/codegen/builtins.d.ts +2 -26
  31. package/dist/codegen/builtins.d.ts.map +1 -1
  32. package/dist/codegen/builtins.js +2 -341
  33. package/dist/codegen/builtins.js.map +1 -1
  34. package/dist/codegen/closures.d.ts +17 -0
  35. package/dist/codegen/closures.d.ts.map +1 -0
  36. package/dist/codegen/closures.js +140 -0
  37. package/dist/codegen/closures.js.map +1 -0
  38. package/dist/codegen/codegen.d.ts +11 -30
  39. package/dist/codegen/codegen.d.ts.map +1 -1
  40. package/dist/codegen/codegen.js +154 -982
  41. package/dist/codegen/codegen.js.map +1 -1
  42. package/dist/codegen/collect-strings.d.ts +4 -0
  43. package/dist/codegen/collect-strings.d.ts.map +1 -0
  44. package/dist/codegen/collect-strings.js +76 -0
  45. package/dist/codegen/collect-strings.js.map +1 -0
  46. package/dist/codegen/compile-calls.d.ts +10 -0
  47. package/dist/codegen/compile-calls.d.ts.map +1 -0
  48. package/dist/codegen/compile-calls.js +344 -0
  49. package/dist/codegen/compile-calls.js.map +1 -0
  50. package/dist/codegen/compile-data.d.ts +22 -0
  51. package/dist/codegen/compile-data.d.ts.map +1 -0
  52. package/dist/codegen/compile-data.js +243 -0
  53. package/dist/codegen/compile-data.js.map +1 -0
  54. package/dist/codegen/compile-match.d.ts +7 -0
  55. package/dist/codegen/compile-match.d.ts.map +1 -0
  56. package/dist/codegen/compile-match.js +195 -0
  57. package/dist/codegen/compile-match.js.map +1 -0
  58. package/dist/codegen/compile-scalars.d.ts +25 -0
  59. package/dist/codegen/compile-scalars.d.ts.map +1 -0
  60. package/dist/codegen/compile-scalars.js +210 -0
  61. package/dist/codegen/compile-scalars.js.map +1 -0
  62. package/dist/codegen/hof-generators.d.ts +39 -0
  63. package/dist/codegen/hof-generators.d.ts.map +1 -0
  64. package/dist/codegen/hof-generators.js +336 -0
  65. package/dist/codegen/hof-generators.js.map +1 -0
  66. package/dist/codegen/host-adapter.d.ts +44 -0
  67. package/dist/codegen/host-adapter.d.ts.map +1 -0
  68. package/dist/codegen/host-adapter.js +9 -0
  69. package/dist/codegen/host-adapter.js.map +1 -0
  70. package/dist/codegen/host-functions.d.ts +35 -0
  71. package/dist/codegen/host-functions.d.ts.map +1 -0
  72. package/dist/codegen/host-functions.js +680 -0
  73. package/dist/codegen/host-functions.js.map +1 -0
  74. package/dist/codegen/imports.d.ts +12 -0
  75. package/dist/codegen/imports.d.ts.map +1 -0
  76. package/dist/codegen/imports.js +162 -0
  77. package/dist/codegen/imports.js.map +1 -0
  78. package/dist/codegen/node-host-adapter.d.ts +35 -0
  79. package/dist/codegen/node-host-adapter.d.ts.map +1 -0
  80. package/dist/codegen/node-host-adapter.js +155 -0
  81. package/dist/codegen/node-host-adapter.js.map +1 -0
  82. package/dist/codegen/runner.d.ts +36 -2
  83. package/dist/codegen/runner.d.ts.map +1 -1
  84. package/dist/codegen/runner.js +146 -271
  85. package/dist/codegen/runner.js.map +1 -1
  86. package/dist/codegen/types.d.ts +91 -0
  87. package/dist/codegen/types.d.ts.map +1 -0
  88. package/dist/codegen/types.js +63 -0
  89. package/dist/codegen/types.js.map +1 -0
  90. package/dist/compact/expand.d.ts +25 -0
  91. package/dist/compact/expand.d.ts.map +1 -0
  92. package/dist/compact/expand.js +198 -0
  93. package/dist/compact/expand.js.map +1 -0
  94. package/dist/compile.d.ts +2 -1
  95. package/dist/compile.d.ts.map +1 -1
  96. package/dist/compile.js +1 -1
  97. package/dist/compile.js.map +1 -1
  98. package/dist/contracts/translate.js.map +1 -1
  99. package/dist/effects/call-graph.d.ts.map +1 -1
  100. package/dist/effects/call-graph.js +6 -2
  101. package/dist/effects/call-graph.js.map +1 -1
  102. package/dist/errors/error-catalog.d.ts +1 -1
  103. package/dist/errors/error-catalog.d.ts.map +1 -1
  104. package/dist/errors/error-catalog.js +119 -0
  105. package/dist/errors/error-catalog.js.map +1 -1
  106. package/dist/errors/structured-errors.d.ts +6 -1
  107. package/dist/errors/structured-errors.d.ts.map +1 -1
  108. package/dist/errors/structured-errors.js +3 -0
  109. package/dist/errors/structured-errors.js.map +1 -1
  110. package/dist/index.d.ts +17 -9
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +24 -10
  113. package/dist/index.js.map +1 -1
  114. package/dist/lint/lint.d.ts +9 -0
  115. package/dist/lint/lint.d.ts.map +1 -0
  116. package/dist/lint/lint.js +354 -0
  117. package/dist/lint/lint.js.map +1 -0
  118. package/dist/lint/warnings.d.ts +54 -0
  119. package/dist/lint/warnings.d.ts.map +1 -0
  120. package/dist/lint/warnings.js +39 -0
  121. package/dist/lint/warnings.js.map +1 -0
  122. package/dist/mcp/create-server.d.ts.map +1 -1
  123. package/dist/mcp/create-server.js +66 -5
  124. package/dist/mcp/create-server.js.map +1 -1
  125. package/dist/mcp/handlers.d.ts +18 -4
  126. package/dist/mcp/handlers.d.ts.map +1 -1
  127. package/dist/mcp/handlers.js +54 -12
  128. package/dist/mcp/handlers.js.map +1 -1
  129. package/dist/mcp/prompts.d.ts +17 -0
  130. package/dist/mcp/prompts.d.ts.map +1 -0
  131. package/dist/mcp/prompts.js +181 -0
  132. package/dist/mcp/prompts.js.map +1 -0
  133. package/dist/mcp/server.js +1 -4
  134. package/dist/mcp/server.js.map +1 -1
  135. package/dist/resolver/resolve.d.ts.map +1 -1
  136. package/dist/resolver/resolve.js +22 -8
  137. package/dist/resolver/resolve.js.map +1 -1
  138. package/dist/validator/node-validators.d.ts.map +1 -1
  139. package/dist/validator/node-validators.js +34 -5
  140. package/dist/validator/node-validators.js.map +1 -1
  141. package/package.json +4 -2
@@ -1,342 +1,3 @@
1
- // =============================================================================
2
- // Builtins Built-in functions available to all Edict programs
3
- // =============================================================================
4
- // These are not defined in user code. The resolver and type checker
5
- // register them automatically. The codegen imports them from the host.
6
- const STRING_TYPE = { kind: "basic", name: "String" };
7
- const INT_TYPE = { kind: "basic", name: "Int" };
8
- const FLOAT_TYPE = { kind: "basic", name: "Float" };
9
- const BOOL_TYPE = { kind: "basic", name: "Bool" };
10
- const ARRAY_INT_TYPE = { kind: "array", element: INT_TYPE };
11
- /**
12
- * All built-in functions.
13
- *
14
- * `print` takes a String and returns a String (the value printed).
15
- * At the WASM level, it's imported as host.print(ptr, len) → ptr
16
- * (returns the same pointer for passthrough).
17
- */
18
- export const BUILTIN_FUNCTIONS = new Map([
19
- [
20
- "print",
21
- {
22
- type: {
23
- kind: "fn_type",
24
- params: [STRING_TYPE],
25
- effects: ["io"],
26
- returnType: STRING_TYPE,
27
- },
28
- effects: ["io"],
29
- wasmImport: ["host", "print"],
30
- },
31
- ],
32
- [
33
- "string_replace",
34
- {
35
- type: {
36
- kind: "fn_type",
37
- params: [STRING_TYPE, STRING_TYPE, STRING_TYPE],
38
- effects: ["pure"],
39
- returnType: STRING_TYPE,
40
- },
41
- effects: ["pure"],
42
- wasmImport: ["host", "string_replace"],
43
- },
44
- ],
45
- // =========================================================================
46
- // String builtins — pure, string handling needed
47
- // =========================================================================
48
- [
49
- "string_length",
50
- {
51
- type: { kind: "fn_type", params: [STRING_TYPE], effects: ["pure"], returnType: INT_TYPE },
52
- effects: ["pure"],
53
- wasmImport: ["host", "string_length"],
54
- },
55
- ],
56
- [
57
- "substring",
58
- {
59
- type: { kind: "fn_type", params: [STRING_TYPE, INT_TYPE, INT_TYPE], effects: ["pure"], returnType: STRING_TYPE },
60
- effects: ["pure"],
61
- wasmImport: ["host", "substring"],
62
- },
63
- ],
64
- [
65
- "string_concat",
66
- {
67
- type: { kind: "fn_type", params: [STRING_TYPE, STRING_TYPE], effects: ["pure"], returnType: STRING_TYPE },
68
- effects: ["pure"],
69
- wasmImport: ["host", "string_concat"],
70
- },
71
- ],
72
- [
73
- "string_indexOf",
74
- {
75
- type: { kind: "fn_type", params: [STRING_TYPE, STRING_TYPE], effects: ["pure"], returnType: INT_TYPE },
76
- effects: ["pure"],
77
- wasmImport: ["host", "string_indexOf"],
78
- },
79
- ],
80
- [
81
- "toUpperCase",
82
- {
83
- type: { kind: "fn_type", params: [STRING_TYPE], effects: ["pure"], returnType: STRING_TYPE },
84
- effects: ["pure"],
85
- wasmImport: ["host", "toUpperCase"],
86
- },
87
- ],
88
- [
89
- "toLowerCase",
90
- {
91
- type: { kind: "fn_type", params: [STRING_TYPE], effects: ["pure"], returnType: STRING_TYPE },
92
- effects: ["pure"],
93
- wasmImport: ["host", "toLowerCase"],
94
- },
95
- ],
96
- [
97
- "string_trim",
98
- {
99
- type: { kind: "fn_type", params: [STRING_TYPE], effects: ["pure"], returnType: STRING_TYPE },
100
- effects: ["pure"],
101
- wasmImport: ["host", "string_trim"],
102
- },
103
- ],
104
- [
105
- "string_startsWith",
106
- {
107
- type: { kind: "fn_type", params: [STRING_TYPE, STRING_TYPE], effects: ["pure"], returnType: BOOL_TYPE },
108
- effects: ["pure"],
109
- wasmImport: ["host", "string_startsWith"],
110
- },
111
- ],
112
- [
113
- "string_endsWith",
114
- {
115
- type: { kind: "fn_type", params: [STRING_TYPE, STRING_TYPE], effects: ["pure"], returnType: BOOL_TYPE },
116
- effects: ["pure"],
117
- wasmImport: ["host", "string_endsWith"],
118
- },
119
- ],
120
- [
121
- "string_contains",
122
- {
123
- type: { kind: "fn_type", params: [STRING_TYPE, STRING_TYPE], effects: ["pure"], returnType: BOOL_TYPE },
124
- effects: ["pure"],
125
- wasmImport: ["host", "string_contains"],
126
- },
127
- ],
128
- [
129
- "string_repeat",
130
- {
131
- type: { kind: "fn_type", params: [STRING_TYPE, INT_TYPE], effects: ["pure"], returnType: STRING_TYPE },
132
- effects: ["pure"],
133
- wasmImport: ["host", "string_repeat"],
134
- },
135
- ],
136
- // =========================================================================
137
- // Math builtins — pure, no string handling needed
138
- // =========================================================================
139
- [
140
- "abs",
141
- {
142
- type: { kind: "fn_type", params: [INT_TYPE], effects: ["pure"], returnType: INT_TYPE },
143
- effects: ["pure"],
144
- wasmImport: ["host", "abs"],
145
- },
146
- ],
147
- [
148
- "min",
149
- {
150
- type: { kind: "fn_type", params: [INT_TYPE, INT_TYPE], effects: ["pure"], returnType: INT_TYPE },
151
- effects: ["pure"],
152
- wasmImport: ["host", "min"],
153
- },
154
- ],
155
- [
156
- "max",
157
- {
158
- type: { kind: "fn_type", params: [INT_TYPE, INT_TYPE], effects: ["pure"], returnType: INT_TYPE },
159
- effects: ["pure"],
160
- wasmImport: ["host", "max"],
161
- },
162
- ],
163
- [
164
- "pow",
165
- {
166
- type: { kind: "fn_type", params: [INT_TYPE, INT_TYPE], effects: ["pure"], returnType: INT_TYPE },
167
- effects: ["pure"],
168
- wasmImport: ["host", "pow"],
169
- },
170
- ],
171
- [
172
- "sqrt",
173
- {
174
- type: { kind: "fn_type", params: [FLOAT_TYPE], effects: ["pure"], returnType: FLOAT_TYPE },
175
- effects: ["pure"],
176
- wasmImport: ["host", "sqrt"],
177
- },
178
- ],
179
- [
180
- "floor",
181
- {
182
- type: { kind: "fn_type", params: [FLOAT_TYPE], effects: ["pure"], returnType: INT_TYPE },
183
- effects: ["pure"],
184
- wasmImport: ["host", "floor"],
185
- },
186
- ],
187
- [
188
- "ceil",
189
- {
190
- type: { kind: "fn_type", params: [FLOAT_TYPE], effects: ["pure"], returnType: INT_TYPE },
191
- effects: ["pure"],
192
- wasmImport: ["host", "ceil"],
193
- },
194
- ],
195
- [
196
- "round",
197
- {
198
- type: { kind: "fn_type", params: [FLOAT_TYPE], effects: ["pure"], returnType: INT_TYPE },
199
- effects: ["pure"],
200
- wasmImport: ["host", "round"],
201
- },
202
- ],
203
- // =========================================================================
204
- // Type conversion builtins — pure, cross-type conversion
205
- // =========================================================================
206
- [
207
- "intToString",
208
- {
209
- type: { kind: "fn_type", params: [INT_TYPE], effects: ["pure"], returnType: STRING_TYPE },
210
- effects: ["pure"],
211
- wasmImport: ["host", "intToString"],
212
- },
213
- ],
214
- [
215
- "floatToString",
216
- {
217
- type: { kind: "fn_type", params: [FLOAT_TYPE], effects: ["pure"], returnType: STRING_TYPE },
218
- effects: ["pure"],
219
- wasmImport: ["host", "floatToString"],
220
- },
221
- ],
222
- [
223
- "boolToString",
224
- {
225
- type: { kind: "fn_type", params: [BOOL_TYPE], effects: ["pure"], returnType: STRING_TYPE },
226
- effects: ["pure"],
227
- wasmImport: ["host", "boolToString"],
228
- },
229
- ],
230
- [
231
- "floatToInt",
232
- {
233
- type: { kind: "fn_type", params: [FLOAT_TYPE], effects: ["pure"], returnType: INT_TYPE },
234
- effects: ["pure"],
235
- wasmImport: ["host", "floatToInt"],
236
- },
237
- ],
238
- [
239
- "intToFloat",
240
- {
241
- type: { kind: "fn_type", params: [INT_TYPE], effects: ["pure"], returnType: FLOAT_TYPE },
242
- effects: ["pure"],
243
- wasmImport: ["host", "intToFloat"],
244
- },
245
- ],
246
- // =========================================================================
247
- // Array builtins — pure, operate on heap-allocated [length][elem0][elem1]...
248
- // =========================================================================
249
- [
250
- "array_length",
251
- {
252
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE], effects: ["pure"], returnType: INT_TYPE },
253
- effects: ["pure"],
254
- wasmImport: ["host", "array_length"],
255
- },
256
- ],
257
- [
258
- "array_get",
259
- {
260
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE, INT_TYPE], effects: ["pure"], returnType: INT_TYPE },
261
- effects: ["pure"],
262
- wasmImport: ["host", "array_get"],
263
- },
264
- ],
265
- [
266
- "array_set",
267
- {
268
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE, INT_TYPE, INT_TYPE], effects: ["pure"], returnType: ARRAY_INT_TYPE },
269
- effects: ["pure"],
270
- wasmImport: ["host", "array_set"],
271
- },
272
- ],
273
- [
274
- "array_push",
275
- {
276
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE, INT_TYPE], effects: ["pure"], returnType: ARRAY_INT_TYPE },
277
- effects: ["pure"],
278
- wasmImport: ["host", "array_push"],
279
- },
280
- ],
281
- [
282
- "array_pop",
283
- {
284
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE], effects: ["pure"], returnType: ARRAY_INT_TYPE },
285
- effects: ["pure"],
286
- wasmImport: ["host", "array_pop"],
287
- },
288
- ],
289
- [
290
- "array_concat",
291
- {
292
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE, ARRAY_INT_TYPE], effects: ["pure"], returnType: ARRAY_INT_TYPE },
293
- effects: ["pure"],
294
- wasmImport: ["host", "array_concat"],
295
- },
296
- ],
297
- [
298
- "array_slice",
299
- {
300
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE, INT_TYPE, INT_TYPE], effects: ["pure"], returnType: ARRAY_INT_TYPE },
301
- effects: ["pure"],
302
- wasmImport: ["host", "array_slice"],
303
- },
304
- ],
305
- [
306
- "array_isEmpty",
307
- {
308
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE], effects: ["pure"], returnType: BOOL_TYPE },
309
- effects: ["pure"],
310
- wasmImport: ["host", "array_isEmpty"],
311
- },
312
- ],
313
- [
314
- "array_contains",
315
- {
316
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE, INT_TYPE], effects: ["pure"], returnType: BOOL_TYPE },
317
- effects: ["pure"],
318
- wasmImport: ["host", "array_contains"],
319
- },
320
- ],
321
- [
322
- "array_reverse",
323
- {
324
- type: { kind: "fn_type", params: [ARRAY_INT_TYPE], effects: ["pure"], returnType: ARRAY_INT_TYPE },
325
- effects: ["pure"],
326
- wasmImport: ["host", "array_reverse"],
327
- },
328
- ],
329
- ]);
330
- /**
331
- * Check if a name refers to a built-in function.
332
- */
333
- export function isBuiltin(name) {
334
- return BUILTIN_FUNCTIONS.has(name);
335
- }
336
- /**
337
- * Get the built-in function definition, or undefined.
338
- */
339
- export function getBuiltin(name) {
340
- return BUILTIN_FUNCTIONS.get(name);
341
- }
1
+ // Re-export from canonical location for backwards compatibility
2
+ export { BUILTIN_FUNCTIONS, isBuiltin, getBuiltin } from "../builtins/builtins.js";
342
3
  //# sourceMappingURL=builtins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/codegen/builtins.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gEAAgE;AAChE,gFAAgF;AAChF,oEAAoE;AACpE,uEAAuE;AAcvE,MAAM,WAAW,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChE,MAAM,QAAQ,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC1D,MAAM,UAAU,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC9D,MAAM,SAAS,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D,MAAM,cAAc,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAyC,IAAI,GAAG,CAAC;IAC3E;QACI,OAAO;QACP;YACI,IAAI,EAAE;gBACF,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,CAAC,WAAW,CAAC;gBACrB,OAAO,EAAE,CAAC,IAAI,CAAC;gBACf,UAAU,EAAE,WAAW;aAC1B;YACD,OAAO,EAAE,CAAC,IAAI,CAAC;YACf,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SAChC;KACJ;IACD;QACI,gBAAgB;QAChB;YACI,IAAI,EAAE;gBACF,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;gBAC/C,OAAO,EAAE,CAAC,MAAM,CAAC;gBACjB,UAAU,EAAE,WAAW;aAC1B;YACD,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACzC;KACJ;IACD,4EAA4E;IAC5E,iDAAiD;IACjD,4EAA4E;IAC5E;QACI,eAAe;QACf;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACzF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;SACxC;KACJ;IACD;QACI,WAAW;QACX;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAChH,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;SACpC;KACJ;IACD;QACI,eAAe;QACf;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YACzG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;SACxC;KACJ;IACD;QACI,gBAAgB;QAChB;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACtG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACzC;KACJ;IACD;QACI,aAAa;QACb;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAC5F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;SACtC;KACJ;IACD;QACI,aAAa;QACb;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAC5F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;SACtC;KACJ;IACD;QACI,aAAa;QACb;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAC5F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;SACtC;KACJ;IACD;QACI,mBAAmB;QACnB;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE;YACvG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC;SAC5C;KACJ;IACD;QACI,iBAAiB;QACjB;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE;YACvG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC;SAC1C;KACJ;IACD;QACI,iBAAiB;QACjB;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE;YACvG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC;SAC1C;KACJ;IACD;QACI,eAAe;QACf;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YACtG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;SACxC;KACJ;IACD,4EAA4E;IAC5E,kDAAkD;IAClD,4EAA4E;IAC5E;QACI,KAAK;QACL;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACtF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;SAC9B;KACJ;IACD;QACI,KAAK;QACL;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YAChG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;SAC9B;KACJ;IACD;QACI,KAAK;QACL;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YAChG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;SAC9B;KACJ;IACD;QACI,KAAK;QACL;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YAChG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;SAC9B;KACJ;IACD;QACI,MAAM;QACN;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE;YAC1F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;SAC/B;KACJ;IACD;QACI,OAAO;QACP;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACxF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SAChC;KACJ;IACD;QACI,MAAM;QACN;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACxF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;SAC/B;KACJ;IACD;QACI,OAAO;QACP;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACxF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SAChC;KACJ;IACD,4EAA4E;IAC5E,yDAAyD;IACzD,4EAA4E;IAC5E;QACI,aAAa;QACb;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YACzF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;SACtC;KACJ;IACD;QACI,eAAe;QACf;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAC3F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;SACxC;KACJ;IACD;QACI,cAAc;QACd;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAC1F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC;SACvC;KACJ;IACD;QACI,YAAY;QACZ;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACxF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACrC;KACJ;IACD;QACI,YAAY;QACZ;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE;YACxF,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACrC;KACJ;IACD,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E;QACI,cAAc;QACd;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YAC5F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC;SACvC;KACJ;IACD;QACI,WAAW;QACX;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;YACtG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;SACpC;KACJ;IACD;QACI,WAAW;QACX;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YACtH,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;SACpC;KACJ;IACD;QACI,YAAY;QACZ;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YAC5G,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACrC;KACJ;IACD;QACI,WAAW;QACX;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YAClG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;SACpC;KACJ;IACD;QACI,cAAc;QACd;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YAClH,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC;SACvC;KACJ;IACD;QACI,aAAa;QACb;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YACtH,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;SACtC;KACJ;IACD;QACI,eAAe;QACf;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE;YAC7F,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;SACxC;KACJ;IACD;QACI,gBAAgB;QAChB;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE;YACvG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACzC;KACJ;IACD;QACI,eAAe;QACf;YACI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE;YAClG,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;SACxC;KACJ;CACJ,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACnC,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/codegen/builtins.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import binaryen from "binaryen";
2
+ import type { Expression } from "../ast/nodes.js";
3
+ import { type FunctionSig, FunctionContext } from "./types.js";
4
+ /**
5
+ * Walk a lambda body and collect identifiers that reference variables from
6
+ * the enclosing scope ("free variables"). These are the values that must be
7
+ * stored in a closure environment record.
8
+ */
9
+ export declare function collectFreeVariables(body: Expression[], paramNames: Set<string>, constGlobals: Map<string, binaryen.Type>, fnSigs: Map<string, FunctionSig>): Map<string, {
10
+ wasmType: binaryen.Type;
11
+ }>;
12
+ /**
13
+ * Allocate a closure pair on the heap: [table_index: i32, env_ptr: i32].
14
+ * Returns a block expression that evaluates to the pair's heap pointer.
15
+ */
16
+ export declare function allocClosurePair(mod: binaryen.Module, ctx: FunctionContext, tableIndexExpr: binaryen.ExpressionRef, envPtrExpr: binaryen.ExpressionRef, uniqueId: string): binaryen.ExpressionRef;
17
+ //# sourceMappingURL=closures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closures.d.ts","sourceRoot":"","sources":["../../src/codegen/closures.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,KAAK,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAM/D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,UAAU,EAAE,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EACxC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACjC,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAA;CAAE,CAAC,CAqG1C;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC5B,GAAG,EAAE,QAAQ,CAAC,MAAM,EACpB,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,QAAQ,CAAC,aAAa,EACtC,UAAU,EAAE,QAAQ,CAAC,aAAa,EAClC,QAAQ,EAAE,MAAM,GACjB,QAAQ,CAAC,aAAa,CA2BxB"}
@@ -0,0 +1,140 @@
1
+ // =============================================================================
2
+ // Closure Helpers — free variable collection and closure pair allocation
3
+ // =============================================================================
4
+ // Extracted from codegen.ts for modularity.
5
+ import binaryen from "binaryen";
6
+ import { BUILTIN_FUNCTIONS } from "../builtins/builtins.js";
7
+ // =============================================================================
8
+ // Free variable collection
9
+ // =============================================================================
10
+ /**
11
+ * Walk a lambda body and collect identifiers that reference variables from
12
+ * the enclosing scope ("free variables"). These are the values that must be
13
+ * stored in a closure environment record.
14
+ */
15
+ export function collectFreeVariables(body, paramNames, constGlobals, fnSigs) {
16
+ const free = new Map();
17
+ const locallyDefined = new Set();
18
+ function walk(expr) {
19
+ switch (expr.kind) {
20
+ case "ident":
21
+ if (!paramNames.has(expr.name) &&
22
+ !constGlobals.has(expr.name) &&
23
+ !fnSigs.has(expr.name) &&
24
+ !BUILTIN_FUNCTIONS.has(expr.name) &&
25
+ !locallyDefined.has(expr.name) &&
26
+ !free.has(expr.name)) {
27
+ // This is a free variable — we'll determine its WASM type later
28
+ // during compilation when we have access to the enclosing context.
29
+ free.set(expr.name, { wasmType: binaryen.i32 }); // placeholder
30
+ }
31
+ break;
32
+ case "let":
33
+ walk(expr.value);
34
+ locallyDefined.add(expr.name);
35
+ break;
36
+ case "binop":
37
+ walk(expr.left);
38
+ walk(expr.right);
39
+ break;
40
+ case "unop":
41
+ walk(expr.operand);
42
+ break;
43
+ case "call":
44
+ walk(expr.fn);
45
+ for (const a of expr.args)
46
+ walk(a);
47
+ break;
48
+ case "if":
49
+ walk(expr.condition);
50
+ for (const e of expr.then)
51
+ walk(e);
52
+ if (expr.else)
53
+ for (const e of expr.else)
54
+ walk(e);
55
+ break;
56
+ case "block":
57
+ for (const e of expr.body)
58
+ walk(e);
59
+ break;
60
+ case "match":
61
+ walk(expr.target);
62
+ for (const arm of expr.arms) {
63
+ for (const e of arm.body)
64
+ walk(e);
65
+ }
66
+ break;
67
+ case "lambda":
68
+ // Nested lambda — its params shadow, but we still walk its body
69
+ // to find free variables from OUR scope
70
+ {
71
+ const innerParams = new Set(expr.params.map(p => p.name));
72
+ const innerFree = collectFreeVariables(expr.body, innerParams, constGlobals, fnSigs);
73
+ // Any free var from the inner lambda that isn't our param
74
+ // or locally defined is also free in our scope
75
+ for (const [name, info] of innerFree) {
76
+ if (!paramNames.has(name) &&
77
+ !locallyDefined.has(name) &&
78
+ !constGlobals.has(name) &&
79
+ !fnSigs.has(name) &&
80
+ !BUILTIN_FUNCTIONS.has(name) &&
81
+ !free.has(name)) {
82
+ free.set(name, info);
83
+ }
84
+ }
85
+ }
86
+ break;
87
+ case "array":
88
+ for (const e of expr.elements)
89
+ walk(e);
90
+ break;
91
+ case "tuple_expr":
92
+ for (const e of expr.elements)
93
+ walk(e);
94
+ break;
95
+ case "record_expr":
96
+ for (const f of expr.fields)
97
+ walk(f.value);
98
+ break;
99
+ case "enum_constructor":
100
+ for (const f of expr.fields)
101
+ walk(f.value);
102
+ break;
103
+ case "access":
104
+ walk(expr.target);
105
+ break;
106
+ case "string_interp":
107
+ for (const p of expr.parts)
108
+ walk(p);
109
+ break;
110
+ case "literal":
111
+ break;
112
+ }
113
+ }
114
+ for (const expr of body)
115
+ walk(expr);
116
+ return free;
117
+ }
118
+ // =============================================================================
119
+ // Closure pair allocation
120
+ // =============================================================================
121
+ /**
122
+ * Allocate a closure pair on the heap: [table_index: i32, env_ptr: i32].
123
+ * Returns a block expression that evaluates to the pair's heap pointer.
124
+ */
125
+ export function allocClosurePair(mod, ctx, tableIndexExpr, envPtrExpr, uniqueId) {
126
+ const ptrIndex = ctx.addLocal(`__closure_ptr_${uniqueId}`, binaryen.i32);
127
+ return mod.block(null, [
128
+ // ptr = __heap_ptr
129
+ mod.local.set(ptrIndex, mod.global.get("__heap_ptr", binaryen.i32)),
130
+ // __heap_ptr += 8
131
+ mod.global.set("__heap_ptr", mod.i32.add(mod.local.get(ptrIndex, binaryen.i32), mod.i32.const(8))),
132
+ // store table_index at offset 0
133
+ mod.i32.store(0, 0, mod.local.get(ptrIndex, binaryen.i32), tableIndexExpr),
134
+ // store env_ptr at offset 4
135
+ mod.i32.store(4, 0, mod.local.get(ptrIndex, binaryen.i32), envPtrExpr),
136
+ // return the pair pointer
137
+ mod.local.get(ptrIndex, binaryen.i32),
138
+ ], binaryen.i32);
139
+ }
140
+ //# sourceMappingURL=closures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closures.js","sourceRoot":"","sources":["../../src/codegen/closures.ts"],"names":[],"mappings":"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"}
@@ -1,32 +1,13 @@
1
1
  import binaryen from "binaryen";
2
- import type { EdictModule } from "../ast/nodes.js";
3
- export interface CompileSuccess {
4
- ok: true;
5
- wasm: Uint8Array;
6
- wat: string;
7
- }
8
- export interface CompileFailure {
9
- ok: false;
10
- errors: string[];
11
- }
12
- export type CompileResult = CompileSuccess | CompileFailure;
13
- export interface FieldLayout {
14
- name: string;
15
- offset: number;
16
- wasmType: binaryen.Type;
17
- }
18
- export interface EnumVariantLayout {
19
- name: string;
20
- tag: number;
21
- fields: FieldLayout[];
22
- totalSize: number;
23
- }
24
- export interface EnumLayout {
25
- variants: EnumVariantLayout[];
26
- }
27
- export interface RecordLayout {
28
- fields: FieldLayout[];
29
- totalSize: number;
30
- }
31
- export declare function compile(module: EdictModule): CompileResult;
2
+ import type { EdictModule, Expression } from "../ast/nodes.js";
3
+ import { type CompilationContext, type CompileResult, type CompileSuccess, type CompileFailure, type CompileOptions, type FieldLayout, type EnumVariantLayout, type EnumLayout, type RecordLayout, FunctionContext } from "./types.js";
4
+ export type { CompileResult, CompileSuccess, CompileFailure, CompileOptions };
5
+ export type { FieldLayout, EnumVariantLayout, EnumLayout, RecordLayout };
6
+ /**
7
+ * Infer the WASM type an expression will produce at runtime.
8
+ * Used to dispatch i32 vs f64 instructions in binops, unops, and block types.
9
+ */
10
+ export declare function inferExprWasmType(expr: Expression, cc: CompilationContext, ctx: FunctionContext): binaryen.Type;
11
+ export declare function compile(module: EdictModule, options?: CompileOptions): CompileResult;
12
+ export declare function compileExpr(expr: Expression, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
32
13
  //# sourceMappingURL=codegen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/codegen/codegen.ts"],"names":[],"mappings":"AAOA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EACR,WAAW,EAId,MAAM,iBAAiB,CAAC;AASzB,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAiJ5D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACrB;AA0CD,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAkN1D"}
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/codegen/codegen.ts"],"names":[],"mappings":"AAOA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EACR,WAAW,EAEX,UAAU,EACb,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,eAAe,EAElB,MAAM,YAAY,CAAC;AAQpB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC9E,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAOzE;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,IAAI,CAkFf;AAOD,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAuSpF;AA0ED,wBAAgB,WAAW,CACvB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CAsDxB"}