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
@@ -3,280 +3,138 @@
3
3
  // =============================================================================
4
4
  // Instantiates WASM via Node's WebAssembly API, provides host imports
5
5
  // (e.g. print), captures output, and returns the result.
6
+ //
7
+ // Execution model:
8
+ // run() → spawns worker thread, enforces timeout, returns RunResult
9
+ // runDirect() → synchronous execution (used by worker and tests)
10
+ import { Worker } from "node:worker_threads";
11
+ import { createHostImports, EdictOomError } from "./host-functions.js";
6
12
  /**
7
- * Run a compiled Edict WASM binary.
13
+ * Run a compiled Edict WASM binary with sandbox limits.
14
+ *
15
+ * Spawns a worker thread and enforces a timeout. If execution exceeds
16
+ * the timeout, the worker is terminated and a structured error is returned.
8
17
  *
9
18
  * @param wasm - The WASM binary (Uint8Array from codegen)
10
19
  * @param entryFn - Name of the function to call (default: "main")
20
+ * @param limits - Optional execution limits (timeout, memory)
11
21
  */
12
- export async function run(wasm, entryFn = "main") {
13
- const outputParts = [];
14
- // Late-bound references set after instantiation
15
- let instance;
16
- /**
17
- * Write a string result into WASM memory at __heap_ptr,
18
- * advance __heap_ptr (8-byte aligned), set __str_ret_len, and return ptr.
19
- */
20
- function writeStringResult(str, encoder) {
21
- const encoded = encoder.encode(str);
22
- const memoryBuffer = instance.exports.memory.buffer;
23
- const getHeapPtr = instance.exports.__get_heap_ptr;
24
- const setHeapPtr = instance.exports.__set_heap_ptr;
25
- const setStrRetLen = instance.exports.__set_str_ret_len;
26
- const resultPtr = getHeapPtr();
27
- const dest = new Uint8Array(memoryBuffer, resultPtr, encoded.length);
28
- dest.set(encoded);
29
- setHeapPtr(resultPtr + Math.ceil(encoded.length / 8) * 8);
30
- setStrRetLen(encoded.length);
31
- return resultPtr;
32
- }
33
- /**
34
- * Allocate a new array on the WASM heap: [length: i32][elem0: i32]...
35
- * Advances __heap_ptr (8-byte aligned) and returns the new array pointer.
36
- */
37
- function writeArrayResult(elements) {
38
- const memoryBuffer = instance.exports.memory.buffer;
39
- const getHeapPtr = instance.exports.__get_heap_ptr;
40
- const setHeapPtr = instance.exports.__set_heap_ptr;
41
- const totalSize = 4 + elements.length * 4; // header + elements
42
- const resultPtr = getHeapPtr();
43
- const view = new DataView(memoryBuffer);
44
- view.setInt32(resultPtr, elements.length, true); // write length
45
- for (let i = 0; i < elements.length; i++) {
46
- view.setInt32(resultPtr + 4 + i * 4, elements[i], true);
22
+ export async function run(wasm, entryFn = "main", limits = {}) {
23
+ const timeoutMs = Math.max(100, limits.timeoutMs ?? 5000);
24
+ return new Promise((resolvePromise) => {
25
+ // import.meta.url is the URL of this module (runner.ts in dev, runner.js in prod).
26
+ // The worker dynamically imports this same module to call runDirect().
27
+ const runnerModuleUrl = import.meta.url;
28
+ let timer = null;
29
+ let settled = false;
30
+ // Inline ESM worker script. Since package.json has "type": "module",
31
+ // eval workers run in ESM mode — we use import rather than require.
32
+ // For dev/vitest (.ts files), we register the tsx ESM loader first.
33
+ const workerScript = `
34
+ import { workerData, parentPort } from "node:worker_threads";
35
+
36
+ const url = workerData.runnerModuleUrl;
37
+
38
+ // In dev/vitest, module URL ends in .ts — register tsx ESM loader
39
+ if (url.endsWith(".ts")) {
40
+ const { register } = await import("tsx/esm/api");
41
+ register();
42
+ }
43
+
44
+ try {
45
+ const runner = await import(url);
46
+ const wasmBytes = new Uint8Array(workerData.wasm);
47
+ const result = await runner.runDirect(wasmBytes, workerData.entryFn, { sandboxDir: workerData.sandboxDir });
48
+ parentPort.postMessage({ type: "result", data: result });
49
+ } catch (e) {
50
+ parentPort.postMessage({
51
+ type: "error",
52
+ message: e instanceof Error ? e.message : String(e),
53
+ });
54
+ }
55
+ `;
56
+ const worker = new Worker(workerScript, {
57
+ eval: true,
58
+ workerData: {
59
+ wasm: Buffer.from(wasm),
60
+ entryFn,
61
+ runnerModuleUrl,
62
+ sandboxDir: limits.sandboxDir,
63
+ },
64
+ // Register tsx ESM loader so the worker can import .ts files (vitest/dev)
65
+ execArgv: ["--import", "tsx"],
66
+ });
67
+ function settle(result) {
68
+ if (settled)
69
+ return;
70
+ settled = true;
71
+ if (timer)
72
+ clearTimeout(timer);
73
+ resolvePromise(result);
47
74
  }
48
- setHeapPtr(resultPtr + Math.ceil(totalSize / 8) * 8);
49
- return resultPtr;
50
- }
51
- const importObject = {
52
- host: {
53
- /**
54
- * print(ptr: i32, len: i32) → i32
55
- * Reads `len` bytes from WASM memory at `ptr`, decodes as UTF-8,
56
- * appends to output, and returns the pointer for passthrough.
57
- */
58
- print: (ptr, len) => {
59
- const memoryBuffer = instance.exports.memory.buffer;
60
- const bytes = new Uint8Array(memoryBuffer, ptr, len);
61
- const text = new TextDecoder().decode(bytes);
62
- outputParts.push(text);
63
- return ptr;
64
- },
65
- /**
66
- * string_replace(hayPtr, hayLen, needlePtr, needleLen, replPtr, replLen) → i32
67
- * Reads three strings from WASM memory, performs replaceAll,
68
- * writes the result into WASM memory at __heap_ptr,
69
- * advances __heap_ptr, sets __str_ret_len, and returns result ptr.
70
- */
71
- string_replace: (hayPtr, hayLen, needlePtr, needleLen, replPtr, replLen) => {
72
- const memoryBuffer = instance.exports.memory.buffer;
73
- const decoder = new TextDecoder();
74
- const encoder = new TextEncoder();
75
- const haystack = decoder.decode(new Uint8Array(memoryBuffer, hayPtr, hayLen));
76
- const needle = decoder.decode(new Uint8Array(memoryBuffer, needlePtr, needleLen));
77
- const replacement = decoder.decode(new Uint8Array(memoryBuffer, replPtr, replLen));
78
- const result = haystack.replaceAll(needle, replacement);
79
- return writeStringResult(result, encoder);
80
- },
81
- // =================================================================
82
- // String builtins
83
- // =================================================================
84
- string_length: (ptr, len) => {
85
- const memoryBuffer = instance.exports.memory.buffer;
86
- const str = new TextDecoder().decode(new Uint8Array(memoryBuffer, ptr, len));
87
- return str.length;
88
- },
89
- substring: (ptr, len, start, end) => {
90
- const memoryBuffer = instance.exports.memory.buffer;
91
- const str = new TextDecoder().decode(new Uint8Array(memoryBuffer, ptr, len));
92
- const result = str.substring(start, end);
93
- return writeStringResult(result, new TextEncoder());
94
- },
95
- string_concat: (aPtr, aLen, bPtr, bLen) => {
96
- const memoryBuffer = instance.exports.memory.buffer;
97
- const decoder = new TextDecoder();
98
- const a = decoder.decode(new Uint8Array(memoryBuffer, aPtr, aLen));
99
- const b = decoder.decode(new Uint8Array(memoryBuffer, bPtr, bLen));
100
- return writeStringResult(a + b, new TextEncoder());
101
- },
102
- string_indexOf: (hayPtr, hayLen, needlePtr, needleLen) => {
103
- const memoryBuffer = instance.exports.memory.buffer;
104
- const decoder = new TextDecoder();
105
- const haystack = decoder.decode(new Uint8Array(memoryBuffer, hayPtr, hayLen));
106
- const needle = decoder.decode(new Uint8Array(memoryBuffer, needlePtr, needleLen));
107
- return haystack.indexOf(needle);
108
- },
109
- toUpperCase: (ptr, len) => {
110
- const memoryBuffer = instance.exports.memory.buffer;
111
- const str = new TextDecoder().decode(new Uint8Array(memoryBuffer, ptr, len));
112
- return writeStringResult(str.toUpperCase(), new TextEncoder());
113
- },
114
- toLowerCase: (ptr, len) => {
115
- const memoryBuffer = instance.exports.memory.buffer;
116
- const str = new TextDecoder().decode(new Uint8Array(memoryBuffer, ptr, len));
117
- return writeStringResult(str.toLowerCase(), new TextEncoder());
118
- },
119
- string_trim: (ptr, len) => {
120
- const memoryBuffer = instance.exports.memory.buffer;
121
- const str = new TextDecoder().decode(new Uint8Array(memoryBuffer, ptr, len));
122
- return writeStringResult(str.trim(), new TextEncoder());
123
- },
124
- string_startsWith: (strPtr, strLen, prefixPtr, prefixLen) => {
125
- const memoryBuffer = instance.exports.memory.buffer;
126
- const decoder = new TextDecoder();
127
- const str = decoder.decode(new Uint8Array(memoryBuffer, strPtr, strLen));
128
- const prefix = decoder.decode(new Uint8Array(memoryBuffer, prefixPtr, prefixLen));
129
- return str.startsWith(prefix) ? 1 : 0;
130
- },
131
- string_endsWith: (strPtr, strLen, suffixPtr, suffixLen) => {
132
- const memoryBuffer = instance.exports.memory.buffer;
133
- const decoder = new TextDecoder();
134
- const str = decoder.decode(new Uint8Array(memoryBuffer, strPtr, strLen));
135
- const suffix = decoder.decode(new Uint8Array(memoryBuffer, suffixPtr, suffixLen));
136
- return str.endsWith(suffix) ? 1 : 0;
137
- },
138
- string_contains: (hayPtr, hayLen, needlePtr, needleLen) => {
139
- const memoryBuffer = instance.exports.memory.buffer;
140
- const decoder = new TextDecoder();
141
- const haystack = decoder.decode(new Uint8Array(memoryBuffer, hayPtr, hayLen));
142
- const needle = decoder.decode(new Uint8Array(memoryBuffer, needlePtr, needleLen));
143
- return haystack.includes(needle) ? 1 : 0;
144
- },
145
- string_repeat: (ptr, len, count) => {
146
- const memoryBuffer = instance.exports.memory.buffer;
147
- const str = new TextDecoder().decode(new Uint8Array(memoryBuffer, ptr, len));
148
- return writeStringResult(str.repeat(count), new TextEncoder());
149
- },
150
- // =================================================================
151
- // Math builtins
152
- // =================================================================
153
- abs: (x) => Math.abs(x),
154
- min: (a, b) => Math.min(a, b),
155
- max: (a, b) => Math.max(a, b),
156
- pow: (base, exp) => (Math.pow(base, exp) | 0),
157
- sqrt: (x) => Math.sqrt(x),
158
- floor: (x) => (Math.floor(x) | 0),
159
- ceil: (x) => (Math.ceil(x) | 0),
160
- round: (x) => (Math.round(x) | 0),
161
- // =================================================================
162
- // Type conversion builtins
163
- // =================================================================
164
- intToString: (value) => {
165
- return writeStringResult(String(value), new TextEncoder());
166
- },
167
- floatToString: (value) => {
168
- return writeStringResult(String(value), new TextEncoder());
169
- },
170
- boolToString: (value) => {
171
- return writeStringResult(value ? "true" : "false", new TextEncoder());
172
- },
173
- floatToInt: (value) => (Math.trunc(value) | 0),
174
- intToFloat: (value) => value,
175
- // =================================================================
176
- // Array builtins — operate on [length: i32][elem0: i32][elem1: i32]...
177
- // =================================================================
178
- array_length: (arrPtr) => {
179
- const memoryBuffer = instance.exports.memory.buffer;
180
- const view = new DataView(memoryBuffer);
181
- return view.getInt32(arrPtr, true);
182
- },
183
- array_get: (arrPtr, index) => {
184
- const memoryBuffer = instance.exports.memory.buffer;
185
- const view = new DataView(memoryBuffer);
186
- const length = view.getInt32(arrPtr, true);
187
- if (index < 0 || index >= length)
188
- return 0; // safe default for OOB
189
- return view.getInt32(arrPtr + 4 + index * 4, true);
190
- },
191
- array_set: (arrPtr, index, value) => {
192
- const memoryBuffer = instance.exports.memory.buffer;
193
- const view = new DataView(memoryBuffer);
194
- const length = view.getInt32(arrPtr, true);
195
- // Copy all elements into a new array with the updated value
196
- const elems = [];
197
- for (let i = 0; i < length; i++) {
198
- elems.push(i === index ? value : view.getInt32(arrPtr + 4 + i * 4, true));
199
- }
200
- return writeArrayResult(elems);
201
- },
202
- array_push: (arrPtr, value) => {
203
- const memoryBuffer = instance.exports.memory.buffer;
204
- const view = new DataView(memoryBuffer);
205
- const length = view.getInt32(arrPtr, true);
206
- const elems = [];
207
- for (let i = 0; i < length; i++) {
208
- elems.push(view.getInt32(arrPtr + 4 + i * 4, true));
209
- }
210
- elems.push(value);
211
- return writeArrayResult(elems);
212
- },
213
- array_pop: (arrPtr) => {
214
- const memoryBuffer = instance.exports.memory.buffer;
215
- const view = new DataView(memoryBuffer);
216
- const length = view.getInt32(arrPtr, true);
217
- if (length === 0)
218
- return writeArrayResult([]);
219
- const elems = [];
220
- for (let i = 0; i < length - 1; i++) {
221
- elems.push(view.getInt32(arrPtr + 4 + i * 4, true));
222
- }
223
- return writeArrayResult(elems);
224
- },
225
- array_concat: (aPtr, bPtr) => {
226
- const memoryBuffer = instance.exports.memory.buffer;
227
- const view = new DataView(memoryBuffer);
228
- const aLen = view.getInt32(aPtr, true);
229
- const bLen = view.getInt32(bPtr, true);
230
- const elems = [];
231
- for (let i = 0; i < aLen; i++) {
232
- elems.push(view.getInt32(aPtr + 4 + i * 4, true));
233
- }
234
- for (let i = 0; i < bLen; i++) {
235
- elems.push(view.getInt32(bPtr + 4 + i * 4, true));
236
- }
237
- return writeArrayResult(elems);
238
- },
239
- array_slice: (arrPtr, start, end) => {
240
- const memoryBuffer = instance.exports.memory.buffer;
241
- const view = new DataView(memoryBuffer);
242
- const length = view.getInt32(arrPtr, true);
243
- // Clamp indices to [0, length]
244
- const s = Math.max(0, Math.min(start, length));
245
- const e = Math.max(s, Math.min(end, length));
246
- const elems = [];
247
- for (let i = s; i < e; i++) {
248
- elems.push(view.getInt32(arrPtr + 4 + i * 4, true));
249
- }
250
- return writeArrayResult(elems);
251
- },
252
- array_isEmpty: (arrPtr) => {
253
- const memoryBuffer = instance.exports.memory.buffer;
254
- const view = new DataView(memoryBuffer);
255
- return view.getInt32(arrPtr, true) === 0 ? 1 : 0;
256
- },
257
- array_contains: (arrPtr, value) => {
258
- const memoryBuffer = instance.exports.memory.buffer;
259
- const view = new DataView(memoryBuffer);
260
- const length = view.getInt32(arrPtr, true);
261
- for (let i = 0; i < length; i++) {
262
- if (view.getInt32(arrPtr + 4 + i * 4, true) === value)
263
- return 1;
264
- }
265
- return 0;
266
- },
267
- array_reverse: (arrPtr) => {
268
- const memoryBuffer = instance.exports.memory.buffer;
269
- const view = new DataView(memoryBuffer);
270
- const length = view.getInt32(arrPtr, true);
271
- const elems = [];
272
- for (let i = length - 1; i >= 0; i--) {
273
- elems.push(view.getInt32(arrPtr + 4 + i * 4, true));
274
- }
275
- return writeArrayResult(elems);
276
- },
277
- },
278
- };
279
- ({ instance } = await WebAssembly.instantiate(wasm, importObject));
75
+ // Timeout kill the worker
76
+ timer = setTimeout(() => {
77
+ worker.terminate().then(() => {
78
+ settle({
79
+ output: "",
80
+ exitCode: 1,
81
+ error: "execution_timeout",
82
+ limitInfo: { timeoutMs },
83
+ });
84
+ });
85
+ }, timeoutMs);
86
+ // Worker completed successfully
87
+ worker.on("message", (msg) => {
88
+ if (msg.type === "result" && msg.data) {
89
+ settle(msg.data);
90
+ }
91
+ else if (msg.type === "error") {
92
+ settle({
93
+ output: msg.message ?? "Worker execution error",
94
+ exitCode: 1,
95
+ });
96
+ }
97
+ });
98
+ // Worker crashed (OOM, etc.)
99
+ worker.on("error", (err) => {
100
+ const isOom = err.message?.includes("out of memory") ||
101
+ err.message?.includes("memory access") ||
102
+ err.message?.includes("grow");
103
+ settle({
104
+ output: `Runtime error: ${err.message}`,
105
+ exitCode: 1,
106
+ error: isOom ? "execution_oom" : undefined,
107
+ limitInfo: isOom ? { maxMemoryMb: limits.maxMemoryMb ?? 1 } : undefined,
108
+ });
109
+ });
110
+ // Worker exited unexpectedly
111
+ worker.on("exit", (code) => {
112
+ if (code !== 0) {
113
+ settle({
114
+ output: "",
115
+ exitCode: code,
116
+ error: "execution_timeout",
117
+ limitInfo: { timeoutMs },
118
+ });
119
+ }
120
+ });
121
+ });
122
+ }
123
+ /**
124
+ * Direct (in-process) WASM execution — no worker thread, no timeout.
125
+ *
126
+ * Used by the worker thread internally and available for tests
127
+ * that don't need sandbox limits.
128
+ *
129
+ * @param wasm - The WASM binary (Uint8Array from codegen)
130
+ * @param entryFn - Name of the function to call (default: "main")
131
+ * @param limits - Optional execution limits (sandboxDir for file IO)
132
+ */
133
+ export async function runDirect(wasm, entryFn = "main", limits = {}) {
134
+ const state = { outputParts: [], instance: null, sandboxDir: limits.sandboxDir };
135
+ const importObject = createHostImports(state, limits.adapter);
136
+ const { instance } = await WebAssembly.instantiate(wasm, importObject);
137
+ state.instance = instance;
280
138
  let returnValue;
281
139
  let exitCode = 0;
282
140
  try {
@@ -290,11 +148,28 @@ export async function run(wasm, entryFn = "main") {
290
148
  returnValue = mainFn();
291
149
  }
292
150
  catch (e) {
293
- outputParts.push(`Runtime error: ${e instanceof Error ? e.message : String(e)}`);
294
- exitCode = 1;
151
+ // Heap bounds check failed structured OOM error
152
+ if (e instanceof EdictOomError) {
153
+ return {
154
+ output: state.outputParts.join(""),
155
+ exitCode: 1,
156
+ error: "execution_oom",
157
+ limitInfo: { maxMemoryMb: Math.round(e.heapLimit / 1048576) },
158
+ };
159
+ }
160
+ const msg = e instanceof Error ? e.message : String(e);
161
+ // Handle edict_exit:N — clean process exit, not an error
162
+ const exitMatch = msg.match(/^edict_exit:(\d+)$/);
163
+ if (exitMatch) {
164
+ exitCode = parseInt(exitMatch[1], 10);
165
+ }
166
+ else {
167
+ state.outputParts.push(`Runtime error: ${msg}`);
168
+ exitCode = 1;
169
+ }
295
170
  }
296
171
  return {
297
- output: outputParts.join(""),
172
+ output: state.outputParts.join(""),
298
173
  exitCode,
299
174
  returnValue,
300
175
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/codegen/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/codegen/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import binaryen from "binaryen";
2
+ import type { StructuredError } from "../errors/structured-errors.js";
3
+ import type { StringTable } from "./string-table.js";
4
+ import type { TypeExpr } from "../ast/types.js";
5
+ export declare function edictTypeToWasm(type: TypeExpr): binaryen.Type;
6
+ /**
7
+ * Bundles the compile-wide state shared across all expression compilers.
8
+ * Created once per `compile()` call. `FunctionContext` is separate because
9
+ * it changes per function/lambda scope.
10
+ *
11
+ * `lambdaCounter` is scoped here (not module-global) so multiple
12
+ * `compile()` calls in the same process don't leak state.
13
+ */
14
+ export interface CompilationContext {
15
+ readonly mod: binaryen.Module;
16
+ readonly strings: StringTable;
17
+ readonly fnSigs: Map<string, FunctionSig>;
18
+ readonly errors: StructuredError[];
19
+ readonly constGlobals: Map<string, binaryen.Type>;
20
+ readonly recordLayouts: Map<string, RecordLayout>;
21
+ readonly enumLayouts: Map<string, EnumLayout>;
22
+ readonly fnTableIndices: Map<string, number>;
23
+ readonly tableFunctions: string[];
24
+ lambdaCounter: number;
25
+ }
26
+ export interface CompileSuccess {
27
+ ok: true;
28
+ wasm: Uint8Array;
29
+ wat?: string;
30
+ }
31
+ export interface CompileFailure {
32
+ ok: false;
33
+ errors: StructuredError[];
34
+ }
35
+ export type CompileResult = CompileSuccess | CompileFailure;
36
+ /** Options for WASM code generation */
37
+ export interface CompileOptions {
38
+ /** Maximum WASM memory pages (64KB each). Default: 16 (= 1MB) */
39
+ maxMemoryPages?: number;
40
+ /** Emit WAT text alongside binary. Default: false */
41
+ emitWat?: boolean;
42
+ }
43
+ export interface FunctionSig {
44
+ returnType: binaryen.Type;
45
+ paramTypes?: binaryen.Type[];
46
+ /** Tracks which Edict-level params are Strings (need ptr+len expansion).
47
+ * Index 0 = __env (always "other"), subsequent entries map to Edict params.
48
+ * Only present for user-defined functions. */
49
+ edictParamTypes?: ("String" | "other")[];
50
+ }
51
+ export interface LocalEntry {
52
+ index: number;
53
+ type: binaryen.Type;
54
+ edictTypeName?: string;
55
+ }
56
+ export interface FieldLayout {
57
+ name: string;
58
+ offset: number;
59
+ wasmType: binaryen.Type;
60
+ }
61
+ export interface EnumVariantLayout {
62
+ name: string;
63
+ tag: number;
64
+ fields: FieldLayout[];
65
+ totalSize: number;
66
+ }
67
+ export interface EnumLayout {
68
+ variants: EnumVariantLayout[];
69
+ }
70
+ export interface RecordLayout {
71
+ fields: FieldLayout[];
72
+ totalSize: number;
73
+ }
74
+ /**
75
+ * Manages per-function local variables and their WASM indices.
76
+ * Compile-wide state (layouts, globals, table indices) lives in
77
+ * `CompilationContext` — not here.
78
+ */
79
+ export declare class FunctionContext {
80
+ private nextIndex;
81
+ private locals;
82
+ readonly varTypes: binaryen.Type[];
83
+ constructor(params: {
84
+ name: string;
85
+ wasmType: binaryen.Type;
86
+ edictTypeName?: string;
87
+ }[]);
88
+ getLocal(name: string): LocalEntry | undefined;
89
+ addLocal(name: string, type: binaryen.Type, edictTypeName?: string): number;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/codegen/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ // =============================================================================
2
+ // Codegen Types — Shared types for the WASM code generator
3
+ // =============================================================================
4
+ // Extracted from codegen.ts for modularity.
5
+ import binaryen from "binaryen";
6
+ // =============================================================================
7
+ // Edict → WASM type mapping
8
+ // =============================================================================
9
+ export function edictTypeToWasm(type) {
10
+ if (type.kind === "basic") {
11
+ switch (type.name) {
12
+ case "Int":
13
+ return binaryen.i32;
14
+ case "Int64":
15
+ return binaryen.i64;
16
+ case "Float":
17
+ return binaryen.f64;
18
+ case "Bool":
19
+ return binaryen.i32;
20
+ case "String":
21
+ // Strings are (ptr, len) → we use i32 for the pointer.
22
+ return binaryen.i32;
23
+ }
24
+ }
25
+ if (type.kind === "option") {
26
+ return binaryen.i32; // heap pointer to tagged union
27
+ }
28
+ if (type.kind === "unit_type") {
29
+ return binaryen.none;
30
+ }
31
+ // Fallback for anything else
32
+ return binaryen.i32;
33
+ }
34
+ // =============================================================================
35
+ // Function context (per-function local variable scope)
36
+ // =============================================================================
37
+ /**
38
+ * Manages per-function local variables and their WASM indices.
39
+ * Compile-wide state (layouts, globals, table indices) lives in
40
+ * `CompilationContext` — not here.
41
+ */
42
+ export class FunctionContext {
43
+ nextIndex;
44
+ locals = new Map();
45
+ varTypes = [];
46
+ constructor(params) {
47
+ this.nextIndex = 0;
48
+ for (const p of params) {
49
+ this.locals.set(p.name, { index: this.nextIndex, type: p.wasmType, edictTypeName: p.edictTypeName });
50
+ this.nextIndex++;
51
+ }
52
+ }
53
+ getLocal(name) {
54
+ return this.locals.get(name);
55
+ }
56
+ addLocal(name, type, edictTypeName) {
57
+ const index = this.nextIndex++;
58
+ this.locals.set(name, { index, type, edictTypeName });
59
+ this.varTypes.push(type);
60
+ return index;
61
+ }
62
+ }
63
+ //# sourceMappingURL=types.js.map