edict-lang 1.2.0 → 1.6.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.
- package/README.md +39 -13
- package/dist/ast/nodes.d.ts +4 -3
- package/dist/ast/nodes.d.ts.map +1 -1
- package/dist/ast/nodes.js +1 -0
- package/dist/ast/nodes.js.map +1 -1
- package/dist/ast/type-constants.d.ts +12 -0
- package/dist/ast/type-constants.d.ts.map +1 -0
- package/dist/ast/type-constants.js +16 -0
- package/dist/ast/type-constants.js.map +1 -0
- package/dist/ast/types.d.ts +1 -1
- package/dist/ast/types.d.ts.map +1 -1
- package/dist/builtins/builtin-enums.d.ts +12 -0
- package/dist/builtins/builtin-enums.d.ts.map +1 -0
- package/dist/builtins/builtin-enums.js +45 -0
- package/dist/builtins/builtin-enums.js.map +1 -0
- package/dist/builtins/builtin-types.d.ts +20 -0
- package/dist/builtins/builtin-types.d.ts.map +1 -0
- package/dist/builtins/builtin-types.js +6 -0
- package/dist/builtins/builtin-types.js.map +1 -0
- package/dist/builtins/builtins.d.ts +3 -0
- package/dist/builtins/builtins.d.ts.map +1 -0
- package/dist/builtins/builtins.js +3 -0
- package/dist/builtins/builtins.js.map +1 -0
- package/dist/builtins/domains/array.d.ts +3 -0
- package/dist/builtins/domains/array.d.ts.map +1 -0
- package/dist/builtins/domains/array.js +236 -0
- package/dist/builtins/domains/array.js.map +1 -0
- package/dist/builtins/domains/core.d.ts +3 -0
- package/dist/builtins/domains/core.d.ts.map +1 -0
- package/dist/builtins/domains/core.js +45 -0
- package/dist/builtins/domains/core.js.map +1 -0
- package/dist/builtins/domains/crypto.d.ts +3 -0
- package/dist/builtins/domains/crypto.d.ts.map +1 -0
- package/dist/builtins/domains/crypto.js +49 -0
- package/dist/builtins/domains/crypto.js.map +1 -0
- package/dist/builtins/domains/datetime.d.ts +3 -0
- package/dist/builtins/domains/datetime.d.ts.map +1 -0
- package/dist/builtins/domains/datetime.js +45 -0
- package/dist/builtins/domains/datetime.js.map +1 -0
- package/dist/builtins/domains/http.d.ts +3 -0
- package/dist/builtins/domains/http.d.ts.map +1 -0
- package/dist/builtins/domains/http.js +55 -0
- package/dist/builtins/domains/http.js.map +1 -0
- package/dist/builtins/domains/int64.d.ts +3 -0
- package/dist/builtins/domains/int64.d.ts.map +1 -0
- package/dist/builtins/domains/int64.js +31 -0
- package/dist/builtins/domains/int64.js.map +1 -0
- package/dist/builtins/domains/io.d.ts +3 -0
- package/dist/builtins/domains/io.d.ts.map +1 -0
- package/dist/builtins/domains/io.js +79 -0
- package/dist/builtins/domains/io.js.map +1 -0
- package/dist/builtins/domains/json.d.ts +3 -0
- package/dist/builtins/domains/json.d.ts.map +1 -0
- package/dist/builtins/domains/json.js +47 -0
- package/dist/builtins/domains/json.js.map +1 -0
- package/dist/builtins/domains/math.d.ts +3 -0
- package/dist/builtins/domains/math.d.ts.map +1 -0
- package/dist/builtins/domains/math.js +47 -0
- package/dist/builtins/domains/math.js.map +1 -0
- package/dist/builtins/domains/option.d.ts +3 -0
- package/dist/builtins/domains/option.d.ts.map +1 -0
- package/dist/builtins/domains/option.js +56 -0
- package/dist/builtins/domains/option.js.map +1 -0
- package/dist/builtins/domains/random.d.ts +3 -0
- package/dist/builtins/domains/random.d.ts.map +1 -0
- package/dist/builtins/domains/random.js +50 -0
- package/dist/builtins/domains/random.js.map +1 -0
- package/dist/builtins/domains/regex.d.ts +3 -0
- package/dist/builtins/domains/regex.d.ts.map +1 -0
- package/dist/builtins/domains/regex.js +69 -0
- package/dist/builtins/domains/regex.js.map +1 -0
- package/dist/builtins/domains/result.d.ts +3 -0
- package/dist/builtins/domains/result.d.ts.map +1 -0
- package/dist/builtins/domains/result.js +84 -0
- package/dist/builtins/domains/result.js.map +1 -0
- package/dist/builtins/domains/string.d.ts +3 -0
- package/dist/builtins/domains/string.d.ts.map +1 -0
- package/dist/builtins/domains/string.js +139 -0
- package/dist/builtins/domains/string.js.map +1 -0
- package/dist/builtins/domains/type-conversion.d.ts +3 -0
- package/dist/builtins/domains/type-conversion.d.ts.map +1 -0
- package/dist/builtins/domains/type-conversion.js +42 -0
- package/dist/builtins/domains/type-conversion.js.map +1 -0
- package/dist/builtins/host-helpers.d.ts +66 -0
- package/dist/builtins/host-helpers.d.ts.map +1 -0
- package/dist/builtins/host-helpers.js +127 -0
- package/dist/builtins/host-helpers.js.map +1 -0
- package/dist/builtins/registry.d.ts +48 -0
- package/dist/builtins/registry.d.ts.map +1 -0
- package/dist/builtins/registry.js +118 -0
- package/dist/builtins/registry.js.map +1 -0
- package/dist/check.d.ts +9 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +30 -9
- package/dist/check.js.map +1 -1
- package/dist/checker/check.d.ts +18 -1
- package/dist/checker/check.d.ts.map +1 -1
- package/dist/checker/check.js +157 -108
- package/dist/checker/check.js.map +1 -1
- package/dist/checker/type-env.d.ts +2 -0
- package/dist/checker/type-env.d.ts.map +1 -1
- package/dist/checker/type-env.js +9 -0
- package/dist/checker/type-env.js.map +1 -1
- package/dist/codegen/browser-host-adapter.d.ts +29 -0
- package/dist/codegen/browser-host-adapter.d.ts.map +1 -0
- package/dist/codegen/browser-host-adapter.js +51 -0
- package/dist/codegen/browser-host-adapter.js.map +1 -0
- package/dist/codegen/builtins.d.ts +2 -26
- package/dist/codegen/builtins.d.ts.map +1 -1
- package/dist/codegen/builtins.js +2 -341
- package/dist/codegen/builtins.js.map +1 -1
- package/dist/codegen/closures.d.ts +17 -0
- package/dist/codegen/closures.d.ts.map +1 -0
- package/dist/codegen/closures.js +140 -0
- package/dist/codegen/closures.js.map +1 -0
- package/dist/codegen/codegen.d.ts +6 -30
- package/dist/codegen/codegen.d.ts.map +1 -1
- package/dist/codegen/codegen.js +154 -1103
- package/dist/codegen/codegen.js.map +1 -1
- package/dist/codegen/collect-strings.d.ts +4 -0
- package/dist/codegen/collect-strings.d.ts.map +1 -0
- package/dist/codegen/collect-strings.js +76 -0
- package/dist/codegen/collect-strings.js.map +1 -0
- package/dist/codegen/compile-calls.d.ts +10 -0
- package/dist/codegen/compile-calls.d.ts.map +1 -0
- package/dist/codegen/compile-calls.js +374 -0
- package/dist/codegen/compile-calls.js.map +1 -0
- package/dist/codegen/compile-data.d.ts +22 -0
- package/dist/codegen/compile-data.d.ts.map +1 -0
- package/dist/codegen/compile-data.js +243 -0
- package/dist/codegen/compile-data.js.map +1 -0
- package/dist/codegen/compile-expr.d.ts +10 -0
- package/dist/codegen/compile-expr.d.ts.map +1 -0
- package/dist/codegen/compile-expr.js +156 -0
- package/dist/codegen/compile-expr.js.map +1 -0
- package/dist/codegen/compile-match.d.ts +7 -0
- package/dist/codegen/compile-match.d.ts.map +1 -0
- package/dist/codegen/compile-match.js +195 -0
- package/dist/codegen/compile-match.js.map +1 -0
- package/dist/codegen/compile-scalars.d.ts +25 -0
- package/dist/codegen/compile-scalars.d.ts.map +1 -0
- package/dist/codegen/compile-scalars.js +211 -0
- package/dist/codegen/compile-scalars.js.map +1 -0
- package/dist/codegen/hof-generators.d.ts +39 -0
- package/dist/codegen/hof-generators.d.ts.map +1 -0
- package/dist/codegen/hof-generators.js +336 -0
- package/dist/codegen/hof-generators.js.map +1 -0
- package/dist/codegen/host-adapter.d.ts +44 -0
- package/dist/codegen/host-adapter.d.ts.map +1 -0
- package/dist/codegen/host-adapter.js +9 -0
- package/dist/codegen/host-adapter.js.map +1 -0
- package/dist/codegen/imports.d.ts +15 -0
- package/dist/codegen/imports.d.ts.map +1 -0
- package/dist/codegen/imports.js +165 -0
- package/dist/codegen/imports.js.map +1 -0
- package/dist/codegen/node-host-adapter.d.ts +35 -0
- package/dist/codegen/node-host-adapter.d.ts.map +1 -0
- package/dist/codegen/node-host-adapter.js +155 -0
- package/dist/codegen/node-host-adapter.js.map +1 -0
- package/dist/codegen/runner.d.ts +36 -2
- package/dist/codegen/runner.d.ts.map +1 -1
- package/dist/codegen/runner.js +147 -271
- package/dist/codegen/runner.js.map +1 -1
- package/dist/codegen/types.d.ts +96 -0
- package/dist/codegen/types.d.ts.map +1 -0
- package/dist/codegen/types.js +63 -0
- package/dist/codegen/types.js.map +1 -0
- package/dist/compact/expand.d.ts +25 -0
- package/dist/compact/expand.d.ts.map +1 -0
- package/dist/compact/expand.js +199 -0
- package/dist/compact/expand.js.map +1 -0
- package/dist/compile.d.ts +2 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +2 -2
- package/dist/compile.js.map +1 -1
- package/dist/contracts/translate.js.map +1 -1
- package/dist/contracts/verify.d.ts +10 -2
- package/dist/contracts/verify.d.ts.map +1 -1
- package/dist/contracts/verify.js +26 -21
- package/dist/contracts/verify.js.map +1 -1
- package/dist/effects/call-graph.d.ts.map +1 -1
- package/dist/effects/call-graph.js +27 -4
- package/dist/effects/call-graph.js.map +1 -1
- package/dist/effects/effect-check.d.ts +10 -2
- package/dist/effects/effect-check.d.ts.map +1 -1
- package/dist/effects/effect-check.js +12 -7
- package/dist/effects/effect-check.js.map +1 -1
- package/dist/errors/error-catalog.d.ts +1 -1
- package/dist/errors/error-catalog.d.ts.map +1 -1
- package/dist/errors/error-catalog.js +119 -0
- package/dist/errors/error-catalog.js.map +1 -1
- package/dist/errors/structured-errors.d.ts +28 -1
- package/dist/errors/structured-errors.d.ts.map +1 -1
- package/dist/errors/structured-errors.js +9 -0
- package/dist/errors/structured-errors.js.map +1 -1
- package/dist/index.d.ts +20 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -10
- package/dist/index.js.map +1 -1
- package/dist/lint/lint.d.ts +9 -0
- package/dist/lint/lint.d.ts.map +1 -0
- package/dist/lint/lint.js +354 -0
- package/dist/lint/lint.js.map +1 -0
- package/dist/lint/warnings.d.ts +54 -0
- package/dist/lint/warnings.d.ts.map +1 -0
- package/dist/lint/warnings.js +39 -0
- package/dist/lint/warnings.js.map +1 -0
- package/dist/mcp/create-server.d.ts.map +1 -1
- package/dist/mcp/create-server.js +66 -5
- package/dist/mcp/create-server.js.map +1 -1
- package/dist/mcp/handlers.d.ts +21 -5
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +65 -15
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/prompts.d.ts +17 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +181 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/server.js +1 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/resolver/resolve.d.ts.map +1 -1
- package/dist/resolver/resolve.js +62 -16
- package/dist/resolver/resolve.js.map +1 -1
- package/dist/validator/node-validators.d.ts.map +1 -1
- package/dist/validator/node-validators.js +60 -5
- package/dist/validator/node-validators.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// HOF Array Builtin WASM Generation
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// These builtins need call_indirect to invoke closure arguments, so they
|
|
5
|
+
// are generated as internal WASM functions rather than host imports.
|
|
6
|
+
//
|
|
7
|
+
// Array layout: [length:i32][elem0:i32][elem1:i32]...
|
|
8
|
+
// Closure pair: [table_index:i32][env_ptr:i32]
|
|
9
|
+
// Closure calling convention: call_indirect(table, idx, [env_ptr, ...args])
|
|
10
|
+
import binaryen from "binaryen";
|
|
11
|
+
/**
|
|
12
|
+
* Generate array_map(arrPtr: i32, closurePtr: i32) → i32
|
|
13
|
+
*
|
|
14
|
+
* Allocates a new array, maps each element through the closure, returns result ptr.
|
|
15
|
+
*/
|
|
16
|
+
export function generateArrayMap(mod) {
|
|
17
|
+
// Params: arrPtr=0, closurePtr=1
|
|
18
|
+
// Locals: length=2, tableIdx=3, envPtr=4, resultPtr=5, i=6
|
|
19
|
+
const paramType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
20
|
+
const vars = [
|
|
21
|
+
binaryen.i32, // length
|
|
22
|
+
binaryen.i32, // tableIdx
|
|
23
|
+
binaryen.i32, // envPtr
|
|
24
|
+
binaryen.i32, // resultPtr
|
|
25
|
+
binaryen.i32, // i
|
|
26
|
+
];
|
|
27
|
+
const arrPtr = 0, closurePtr = 1, length = 2, tableIdx = 3, envPtr = 4, resultPtr = 5, idx = 6;
|
|
28
|
+
// callbackType: (env:i32, elem:i32) → i32
|
|
29
|
+
const callbackParamType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
30
|
+
const body = mod.block(null, [
|
|
31
|
+
// length = i32.load(arrPtr, 0)
|
|
32
|
+
mod.local.set(length, mod.i32.load(0, 0, mod.local.get(arrPtr, binaryen.i32))),
|
|
33
|
+
// tableIdx = i32.load(closurePtr, 0)
|
|
34
|
+
mod.local.set(tableIdx, mod.i32.load(0, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
35
|
+
// envPtr = i32.load(closurePtr, 4)
|
|
36
|
+
mod.local.set(envPtr, mod.i32.load(4, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
37
|
+
// resultPtr = __heap_ptr
|
|
38
|
+
mod.local.set(resultPtr, mod.global.get("__heap_ptr", binaryen.i32)),
|
|
39
|
+
// __heap_ptr += 4 + length * 4
|
|
40
|
+
mod.global.set("__heap_ptr", mod.i32.add(mod.global.get("__heap_ptr", binaryen.i32), mod.i32.add(mod.i32.const(4), mod.i32.mul(mod.local.get(length, binaryen.i32), mod.i32.const(4))))),
|
|
41
|
+
// i32.store(resultPtr, 0, length)
|
|
42
|
+
mod.i32.store(0, 0, mod.local.get(resultPtr, binaryen.i32), mod.local.get(length, binaryen.i32)),
|
|
43
|
+
// i = 0
|
|
44
|
+
mod.local.set(idx, mod.i32.const(0)),
|
|
45
|
+
// loop
|
|
46
|
+
mod.if(mod.i32.gt_s(mod.local.get(length, binaryen.i32), mod.i32.const(0)), mod.loop("map_loop", mod.block(null, [
|
|
47
|
+
// result[i] = call_indirect(tableIdx, [envPtr, arr[i]])
|
|
48
|
+
mod.i32.store(4, 0, // offset 4 + i*4 from resultPtr
|
|
49
|
+
mod.i32.add(mod.local.get(resultPtr, binaryen.i32), mod.i32.mul(mod.local.get(idx, binaryen.i32), mod.i32.const(4))), mod.call_indirect("__fn_table", mod.local.get(tableIdx, binaryen.i32), [
|
|
50
|
+
mod.local.get(envPtr, binaryen.i32),
|
|
51
|
+
// arr[i] = i32.load(arrPtr + 4 + i*4)
|
|
52
|
+
mod.i32.load(4, 0, mod.i32.add(mod.local.get(arrPtr, binaryen.i32), mod.i32.mul(mod.local.get(idx, binaryen.i32), mod.i32.const(4)))),
|
|
53
|
+
], callbackParamType, binaryen.i32)),
|
|
54
|
+
// i++
|
|
55
|
+
mod.local.set(idx, mod.i32.add(mod.local.get(idx, binaryen.i32), mod.i32.const(1))),
|
|
56
|
+
// br_if map_loop (i < length)
|
|
57
|
+
mod.br("map_loop", mod.i32.lt_s(mod.local.get(idx, binaryen.i32), mod.local.get(length, binaryen.i32))),
|
|
58
|
+
], binaryen.none))),
|
|
59
|
+
// return resultPtr
|
|
60
|
+
mod.local.get(resultPtr, binaryen.i32),
|
|
61
|
+
], binaryen.i32);
|
|
62
|
+
mod.addFunction("array_map", paramType, binaryen.i32, vars, body);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate array_filter(arrPtr: i32, closurePtr: i32) → i32
|
|
66
|
+
*
|
|
67
|
+
* Single-pass overalloc: allocates max-length result, filters in one pass,
|
|
68
|
+
* then writes actual count. Tail waste is acceptable (arena allocator).
|
|
69
|
+
*/
|
|
70
|
+
export function generateArrayFilter(mod) {
|
|
71
|
+
// Params: arrPtr=0, closurePtr=1
|
|
72
|
+
// Locals: length=2, tableIdx=3, envPtr=4, resultPtr=5, i=6, count=7, elem=8
|
|
73
|
+
const paramType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
74
|
+
const vars = [
|
|
75
|
+
binaryen.i32, // length
|
|
76
|
+
binaryen.i32, // tableIdx
|
|
77
|
+
binaryen.i32, // envPtr
|
|
78
|
+
binaryen.i32, // resultPtr
|
|
79
|
+
binaryen.i32, // i
|
|
80
|
+
binaryen.i32, // count
|
|
81
|
+
binaryen.i32, // elem
|
|
82
|
+
];
|
|
83
|
+
const arrPtr = 0, closurePtr = 1, length = 2, tableIdx = 3, envPtr = 4, resultPtr = 5, idx = 6, count = 7, elem = 8;
|
|
84
|
+
// callbackType: (env:i32, elem:i32) → i32 (bool)
|
|
85
|
+
const callbackParamType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
86
|
+
const body = mod.block(null, [
|
|
87
|
+
// length = i32.load(arrPtr, 0)
|
|
88
|
+
mod.local.set(length, mod.i32.load(0, 0, mod.local.get(arrPtr, binaryen.i32))),
|
|
89
|
+
// tableIdx = i32.load(closurePtr, 0)
|
|
90
|
+
mod.local.set(tableIdx, mod.i32.load(0, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
91
|
+
// envPtr = i32.load(closurePtr, 4)
|
|
92
|
+
mod.local.set(envPtr, mod.i32.load(4, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
93
|
+
// resultPtr = __heap_ptr (overalloc: 4 + length*4)
|
|
94
|
+
mod.local.set(resultPtr, mod.global.get("__heap_ptr", binaryen.i32)),
|
|
95
|
+
mod.global.set("__heap_ptr", mod.i32.add(mod.global.get("__heap_ptr", binaryen.i32), mod.i32.add(mod.i32.const(4), mod.i32.mul(mod.local.get(length, binaryen.i32), mod.i32.const(4))))),
|
|
96
|
+
// count = 0, i = 0
|
|
97
|
+
mod.local.set(count, mod.i32.const(0)),
|
|
98
|
+
mod.local.set(idx, mod.i32.const(0)),
|
|
99
|
+
// loop
|
|
100
|
+
mod.if(mod.i32.gt_s(mod.local.get(length, binaryen.i32), mod.i32.const(0)), mod.loop("filter_loop", mod.block(null, [
|
|
101
|
+
// elem = arr[i]
|
|
102
|
+
mod.local.set(elem, mod.i32.load(4, 0, mod.i32.add(mod.local.get(arrPtr, binaryen.i32), mod.i32.mul(mod.local.get(idx, binaryen.i32), mod.i32.const(4))))),
|
|
103
|
+
// if call_indirect(tableIdx, [envPtr, elem]) != 0
|
|
104
|
+
mod.if(mod.call_indirect("__fn_table", mod.local.get(tableIdx, binaryen.i32), [
|
|
105
|
+
mod.local.get(envPtr, binaryen.i32),
|
|
106
|
+
mod.local.get(elem, binaryen.i32),
|
|
107
|
+
], callbackParamType, binaryen.i32), mod.block(null, [
|
|
108
|
+
// result[count] = elem
|
|
109
|
+
mod.i32.store(4, 0, mod.i32.add(mod.local.get(resultPtr, binaryen.i32), mod.i32.mul(mod.local.get(count, binaryen.i32), mod.i32.const(4))), mod.local.get(elem, binaryen.i32)),
|
|
110
|
+
// count++
|
|
111
|
+
mod.local.set(count, mod.i32.add(mod.local.get(count, binaryen.i32), mod.i32.const(1))),
|
|
112
|
+
], binaryen.none)),
|
|
113
|
+
// i++
|
|
114
|
+
mod.local.set(idx, mod.i32.add(mod.local.get(idx, binaryen.i32), mod.i32.const(1))),
|
|
115
|
+
// br_if filter_loop (i < length)
|
|
116
|
+
mod.br("filter_loop", mod.i32.lt_s(mod.local.get(idx, binaryen.i32), mod.local.get(length, binaryen.i32))),
|
|
117
|
+
], binaryen.none))),
|
|
118
|
+
// Write actual count as result length
|
|
119
|
+
mod.i32.store(0, 0, mod.local.get(resultPtr, binaryen.i32), mod.local.get(count, binaryen.i32)),
|
|
120
|
+
// return resultPtr
|
|
121
|
+
mod.local.get(resultPtr, binaryen.i32),
|
|
122
|
+
], binaryen.i32);
|
|
123
|
+
mod.addFunction("array_filter", paramType, binaryen.i32, vars, body);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Generate array_reduce(arrPtr: i32, init: i32, closurePtr: i32) → i32
|
|
127
|
+
*
|
|
128
|
+
* Folds array elements into an accumulator via the closure.
|
|
129
|
+
*/
|
|
130
|
+
export function generateArrayReduce(mod) {
|
|
131
|
+
// Params: arrPtr=0, init=1, closurePtr=2
|
|
132
|
+
// Locals: length=3, tableIdx=4, envPtr=5, acc=6, i=7
|
|
133
|
+
const paramType = binaryen.createType([binaryen.i32, binaryen.i32, binaryen.i32]);
|
|
134
|
+
const vars = [
|
|
135
|
+
binaryen.i32, // length
|
|
136
|
+
binaryen.i32, // tableIdx
|
|
137
|
+
binaryen.i32, // envPtr
|
|
138
|
+
binaryen.i32, // acc
|
|
139
|
+
binaryen.i32, // i
|
|
140
|
+
];
|
|
141
|
+
const arrPtr = 0, init = 1, closurePtr = 2, length = 3, tableIdx = 4, envPtr = 5, acc = 6, idx = 7;
|
|
142
|
+
// callbackType: (env:i32, acc:i32, elem:i32) → i32
|
|
143
|
+
const callbackParamType = binaryen.createType([binaryen.i32, binaryen.i32, binaryen.i32]);
|
|
144
|
+
const body = mod.block(null, [
|
|
145
|
+
// length = i32.load(arrPtr, 0)
|
|
146
|
+
mod.local.set(length, mod.i32.load(0, 0, mod.local.get(arrPtr, binaryen.i32))),
|
|
147
|
+
// tableIdx = i32.load(closurePtr, 0)
|
|
148
|
+
mod.local.set(tableIdx, mod.i32.load(0, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
149
|
+
// envPtr = i32.load(closurePtr, 4)
|
|
150
|
+
mod.local.set(envPtr, mod.i32.load(4, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
151
|
+
// acc = init
|
|
152
|
+
mod.local.set(acc, mod.local.get(init, binaryen.i32)),
|
|
153
|
+
// i = 0
|
|
154
|
+
mod.local.set(idx, mod.i32.const(0)),
|
|
155
|
+
// loop
|
|
156
|
+
mod.if(mod.i32.gt_s(mod.local.get(length, binaryen.i32), mod.i32.const(0)), mod.loop("reduce_loop", mod.block(null, [
|
|
157
|
+
// acc = call_indirect(tableIdx, [envPtr, acc, arr[i]])
|
|
158
|
+
mod.local.set(acc, mod.call_indirect("__fn_table", mod.local.get(tableIdx, binaryen.i32), [
|
|
159
|
+
mod.local.get(envPtr, binaryen.i32),
|
|
160
|
+
mod.local.get(acc, binaryen.i32),
|
|
161
|
+
mod.i32.load(4, 0, mod.i32.add(mod.local.get(arrPtr, binaryen.i32), mod.i32.mul(mod.local.get(idx, binaryen.i32), mod.i32.const(4)))),
|
|
162
|
+
], callbackParamType, binaryen.i32)),
|
|
163
|
+
// i++
|
|
164
|
+
mod.local.set(idx, mod.i32.add(mod.local.get(idx, binaryen.i32), mod.i32.const(1))),
|
|
165
|
+
// br_if reduce_loop (i < length)
|
|
166
|
+
mod.br("reduce_loop", mod.i32.lt_s(mod.local.get(idx, binaryen.i32), mod.local.get(length, binaryen.i32))),
|
|
167
|
+
], binaryen.none))),
|
|
168
|
+
// return acc
|
|
169
|
+
mod.local.get(acc, binaryen.i32),
|
|
170
|
+
], binaryen.i32);
|
|
171
|
+
mod.addFunction("array_reduce", paramType, binaryen.i32, vars, body);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generate array_find(arrPtr: i32, closurePtr: i32) → i32
|
|
175
|
+
*
|
|
176
|
+
* Scans array, calls predicate on each element. Returns Option<Int>:
|
|
177
|
+
* - Some(elem): heap-allocated [tag=1][pad(4)][value][pad(4)]
|
|
178
|
+
* - None: heap-allocated [tag=0][pad(4)]
|
|
179
|
+
*
|
|
180
|
+
* Option layout matches the built-in enum: None=tag0/8 bytes, Some=tag1/16 bytes.
|
|
181
|
+
*/
|
|
182
|
+
export function generateArrayFind(mod) {
|
|
183
|
+
// Params: arrPtr=0, closurePtr=1
|
|
184
|
+
// Locals: length=2, tableIdx=3, envPtr=4, i=5, elem=6, resultPtr=7
|
|
185
|
+
const paramType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
186
|
+
const vars = [
|
|
187
|
+
binaryen.i32, // length
|
|
188
|
+
binaryen.i32, // tableIdx
|
|
189
|
+
binaryen.i32, // envPtr
|
|
190
|
+
binaryen.i32, // i
|
|
191
|
+
binaryen.i32, // elem
|
|
192
|
+
binaryen.i32, // resultPtr
|
|
193
|
+
];
|
|
194
|
+
const arrPtr = 0, closurePtr = 1, length = 2, tableIdx = 3, envPtr = 4, idx = 5, elem = 6, resultPtr = 7;
|
|
195
|
+
// callbackType: (env:i32, elem:i32) → i32 (bool)
|
|
196
|
+
const callbackParamType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
197
|
+
// Inner loop block label — we use "find_block" so we can br out on match
|
|
198
|
+
const body = mod.block(null, [
|
|
199
|
+
// length = i32.load(arrPtr, 0)
|
|
200
|
+
mod.local.set(length, mod.i32.load(0, 0, mod.local.get(arrPtr, binaryen.i32))),
|
|
201
|
+
// tableIdx = i32.load(closurePtr, 0)
|
|
202
|
+
mod.local.set(tableIdx, mod.i32.load(0, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
203
|
+
// envPtr = i32.load(closurePtr, 4)
|
|
204
|
+
mod.local.set(envPtr, mod.i32.load(4, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
205
|
+
// i = 0
|
|
206
|
+
mod.local.set(idx, mod.i32.const(0)),
|
|
207
|
+
// Search loop — break out when found
|
|
208
|
+
mod.if(mod.i32.gt_s(mod.local.get(length, binaryen.i32), mod.i32.const(0)), mod.block("find_block", [
|
|
209
|
+
mod.loop("find_loop", mod.block(null, [
|
|
210
|
+
// elem = arr[i]
|
|
211
|
+
mod.local.set(elem, mod.i32.load(4, 0, mod.i32.add(mod.local.get(arrPtr, binaryen.i32), mod.i32.mul(mod.local.get(idx, binaryen.i32), mod.i32.const(4))))),
|
|
212
|
+
// if predicate(elem) → return Some(elem)
|
|
213
|
+
mod.if(mod.call_indirect("__fn_table", mod.local.get(tableIdx, binaryen.i32), [
|
|
214
|
+
mod.local.get(envPtr, binaryen.i32),
|
|
215
|
+
mod.local.get(elem, binaryen.i32),
|
|
216
|
+
], callbackParamType, binaryen.i32), mod.block(null, [
|
|
217
|
+
// Allocate Some(elem): [tag=1][pad][value][pad] = 16 bytes
|
|
218
|
+
mod.local.set(resultPtr, mod.global.get("__heap_ptr", binaryen.i32)),
|
|
219
|
+
mod.global.set("__heap_ptr", mod.i32.add(mod.global.get("__heap_ptr", binaryen.i32), mod.i32.const(16))),
|
|
220
|
+
// Write tag = 1 (Some)
|
|
221
|
+
mod.i32.store(0, 0, mod.local.get(resultPtr, binaryen.i32), mod.i32.const(1)),
|
|
222
|
+
// Write value at offset 8
|
|
223
|
+
mod.i32.store(8, 0, mod.local.get(resultPtr, binaryen.i32), mod.local.get(elem, binaryen.i32)),
|
|
224
|
+
// Break out of search block
|
|
225
|
+
mod.br("find_block"),
|
|
226
|
+
], binaryen.none)),
|
|
227
|
+
// i++
|
|
228
|
+
mod.local.set(idx, mod.i32.add(mod.local.get(idx, binaryen.i32), mod.i32.const(1))),
|
|
229
|
+
// br_if find_loop (i < length)
|
|
230
|
+
mod.br("find_loop", mod.i32.lt_s(mod.local.get(idx, binaryen.i32), mod.local.get(length, binaryen.i32))),
|
|
231
|
+
], binaryen.none)),
|
|
232
|
+
// If we reach here, no match found → allocate None
|
|
233
|
+
mod.local.set(resultPtr, mod.global.get("__heap_ptr", binaryen.i32)),
|
|
234
|
+
mod.global.set("__heap_ptr", mod.i32.add(mod.global.get("__heap_ptr", binaryen.i32), mod.i32.const(8))),
|
|
235
|
+
// Write tag = 0 (None)
|
|
236
|
+
mod.i32.store(0, 0, mod.local.get(resultPtr, binaryen.i32), mod.i32.const(0)),
|
|
237
|
+
], binaryen.none),
|
|
238
|
+
// Empty array → allocate None
|
|
239
|
+
mod.block(null, [
|
|
240
|
+
mod.local.set(resultPtr, mod.global.get("__heap_ptr", binaryen.i32)),
|
|
241
|
+
mod.global.set("__heap_ptr", mod.i32.add(mod.global.get("__heap_ptr", binaryen.i32), mod.i32.const(8))),
|
|
242
|
+
mod.i32.store(0, 0, mod.local.get(resultPtr, binaryen.i32), mod.i32.const(0)),
|
|
243
|
+
], binaryen.none)),
|
|
244
|
+
// return resultPtr
|
|
245
|
+
mod.local.get(resultPtr, binaryen.i32),
|
|
246
|
+
], binaryen.i32);
|
|
247
|
+
mod.addFunction("array_find", paramType, binaryen.i32, vars, body);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Generate array_sort(arrPtr: i32, closurePtr: i32) → i32
|
|
251
|
+
*
|
|
252
|
+
* Copies the input array to a new heap allocation, then sorts in-place
|
|
253
|
+
* using insertion sort. The comparator closure returns:
|
|
254
|
+
* negative if a < b, 0 if a == b, positive if a > b (C qsort convention).
|
|
255
|
+
*/
|
|
256
|
+
export function generateArraySort(mod) {
|
|
257
|
+
// Params: arrPtr=0, closurePtr=1
|
|
258
|
+
// Locals: length=2, tableIdx=3, envPtr=4, resultPtr=5,
|
|
259
|
+
// i=6, j=7, key=8, cmpResult=9
|
|
260
|
+
const paramType = binaryen.createType([binaryen.i32, binaryen.i32]);
|
|
261
|
+
const vars = [
|
|
262
|
+
binaryen.i32, // length
|
|
263
|
+
binaryen.i32, // tableIdx
|
|
264
|
+
binaryen.i32, // envPtr
|
|
265
|
+
binaryen.i32, // resultPtr
|
|
266
|
+
binaryen.i32, // i (outer loop)
|
|
267
|
+
binaryen.i32, // j (inner loop)
|
|
268
|
+
binaryen.i32, // key
|
|
269
|
+
binaryen.i32, // cmpResult
|
|
270
|
+
];
|
|
271
|
+
const arrPtr = 0, closurePtr = 1, length = 2, tableIdx = 3, envPtr = 4, resultPtr = 5, i = 6, j = 7, key = 8;
|
|
272
|
+
// callbackType: (env:i32, a:i32, b:i32) → i32
|
|
273
|
+
const callbackParamType = binaryen.createType([binaryen.i32, binaryen.i32, binaryen.i32]);
|
|
274
|
+
// Helper: result[idx] = i32.load(resultPtr + 4 + idx*4)
|
|
275
|
+
const loadResult = (idxLocal) => mod.i32.load(4, 0, mod.i32.add(mod.local.get(resultPtr, binaryen.i32), mod.i32.mul(mod.local.get(idxLocal, binaryen.i32), mod.i32.const(4))));
|
|
276
|
+
const storeResult = (idxLocal, value) => mod.i32.store(4, 0, mod.i32.add(mod.local.get(resultPtr, binaryen.i32), mod.i32.mul(mod.local.get(idxLocal, binaryen.i32), mod.i32.const(4))), value);
|
|
277
|
+
const body = mod.block(null, [
|
|
278
|
+
// length = i32.load(arrPtr, 0)
|
|
279
|
+
mod.local.set(length, mod.i32.load(0, 0, mod.local.get(arrPtr, binaryen.i32))),
|
|
280
|
+
// tableIdx = i32.load(closurePtr, 0)
|
|
281
|
+
mod.local.set(tableIdx, mod.i32.load(0, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
282
|
+
// envPtr = i32.load(closurePtr, 4)
|
|
283
|
+
mod.local.set(envPtr, mod.i32.load(4, 0, mod.local.get(closurePtr, binaryen.i32))),
|
|
284
|
+
// Allocate result array: [length][elem0]...[elemN-1]
|
|
285
|
+
mod.local.set(resultPtr, mod.global.get("__heap_ptr", binaryen.i32)),
|
|
286
|
+
mod.global.set("__heap_ptr", mod.i32.add(mod.global.get("__heap_ptr", binaryen.i32), mod.i32.add(mod.i32.const(4), mod.i32.mul(mod.local.get(length, binaryen.i32), mod.i32.const(4))))),
|
|
287
|
+
// Write length header
|
|
288
|
+
mod.i32.store(0, 0, mod.local.get(resultPtr, binaryen.i32), mod.local.get(length, binaryen.i32)),
|
|
289
|
+
// Copy elements from input to result
|
|
290
|
+
mod.local.set(i, mod.i32.const(0)),
|
|
291
|
+
mod.if(mod.i32.gt_s(mod.local.get(length, binaryen.i32), mod.i32.const(0)), mod.loop("copy_loop", mod.block(null, [
|
|
292
|
+
storeResult(i, mod.i32.load(4, 0, mod.i32.add(mod.local.get(arrPtr, binaryen.i32), mod.i32.mul(mod.local.get(i, binaryen.i32), mod.i32.const(4))))),
|
|
293
|
+
mod.local.set(i, mod.i32.add(mod.local.get(i, binaryen.i32), mod.i32.const(1))),
|
|
294
|
+
mod.br("copy_loop", mod.i32.lt_s(mod.local.get(i, binaryen.i32), mod.local.get(length, binaryen.i32))),
|
|
295
|
+
], binaryen.none))),
|
|
296
|
+
// Insertion sort: for i = 1 to length-1
|
|
297
|
+
mod.if(mod.i32.gt_s(mod.local.get(length, binaryen.i32), mod.i32.const(1)), mod.block(null, [
|
|
298
|
+
mod.local.set(i, mod.i32.const(1)),
|
|
299
|
+
mod.loop("sort_outer", mod.block(null, [
|
|
300
|
+
// key = result[i]
|
|
301
|
+
mod.local.set(key, loadResult(i)),
|
|
302
|
+
// j = i - 1
|
|
303
|
+
mod.local.set(j, mod.i32.sub(mod.local.get(i, binaryen.i32), mod.i32.const(1))),
|
|
304
|
+
// Inner loop: while j >= 0 && compare(result[j], key) > 0
|
|
305
|
+
mod.block("shift_break", [
|
|
306
|
+
mod.loop("shift_loop", mod.block(null, [
|
|
307
|
+
// if j < 0, break
|
|
308
|
+
mod.br("shift_break", mod.i32.lt_s(mod.local.get(j, binaryen.i32), mod.i32.const(0))),
|
|
309
|
+
// cmp = compare(result[j], key)
|
|
310
|
+
// if cmp <= 0, break
|
|
311
|
+
mod.br("shift_break", mod.i32.le_s(mod.call_indirect("__fn_table", mod.local.get(tableIdx, binaryen.i32), [
|
|
312
|
+
mod.local.get(envPtr, binaryen.i32),
|
|
313
|
+
loadResult(j),
|
|
314
|
+
mod.local.get(key, binaryen.i32),
|
|
315
|
+
], callbackParamType, binaryen.i32), mod.i32.const(0))),
|
|
316
|
+
// result[j+1] = result[j]
|
|
317
|
+
mod.i32.store(4, 0, mod.i32.add(mod.local.get(resultPtr, binaryen.i32), mod.i32.mul(mod.i32.add(mod.local.get(j, binaryen.i32), mod.i32.const(1)), mod.i32.const(4))), loadResult(j)),
|
|
318
|
+
// j--
|
|
319
|
+
mod.local.set(j, mod.i32.sub(mod.local.get(j, binaryen.i32), mod.i32.const(1))),
|
|
320
|
+
mod.br("shift_loop"),
|
|
321
|
+
], binaryen.none)),
|
|
322
|
+
], binaryen.none),
|
|
323
|
+
// result[j+1] = key
|
|
324
|
+
mod.i32.store(4, 0, mod.i32.add(mod.local.get(resultPtr, binaryen.i32), mod.i32.mul(mod.i32.add(mod.local.get(j, binaryen.i32), mod.i32.const(1)), mod.i32.const(4))), mod.local.get(key, binaryen.i32)),
|
|
325
|
+
// i++
|
|
326
|
+
mod.local.set(i, mod.i32.add(mod.local.get(i, binaryen.i32), mod.i32.const(1))),
|
|
327
|
+
// br_if sort_outer (i < length)
|
|
328
|
+
mod.br("sort_outer", mod.i32.lt_s(mod.local.get(i, binaryen.i32), mod.local.get(length, binaryen.i32))),
|
|
329
|
+
], binaryen.none)),
|
|
330
|
+
], binaryen.none)),
|
|
331
|
+
// return resultPtr
|
|
332
|
+
mod.local.get(resultPtr, binaryen.i32),
|
|
333
|
+
], binaryen.i32);
|
|
334
|
+
mod.addFunction("array_sort", paramType, binaryen.i32, vars, body);
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=hof-generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hof-generators.js","sourceRoot":"","sources":["../../src/codegen/hof-generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-specific host operations that vary across runtimes.
|
|
3
|
+
*
|
|
4
|
+
* Implementations exist for:
|
|
5
|
+
* - Node.js (`NodeHostAdapter`) — default, full-featured
|
|
6
|
+
* - Browser (`BrowserHostAdapter`) — stub for portability demonstration
|
|
7
|
+
*
|
|
8
|
+
* All methods operate on plain JS types — no WASM pointers or RuntimeState.
|
|
9
|
+
*/
|
|
10
|
+
export interface EdictHostAdapter {
|
|
11
|
+
/** SHA-256 hash of `data`, returned as hex string. */
|
|
12
|
+
sha256(data: string): string;
|
|
13
|
+
/** MD5 hash of `data`, returned as hex string. */
|
|
14
|
+
md5(data: string): string;
|
|
15
|
+
/** HMAC of `data` using `algo` and `key`, returned as hex string. */
|
|
16
|
+
hmac(algo: string, key: string, data: string): string;
|
|
17
|
+
/** Synchronous HTTP request. Returns ok=true for 2xx, ok=false for errors. */
|
|
18
|
+
fetch(url: string, method: string, body?: string): {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
data: string;
|
|
21
|
+
};
|
|
22
|
+
/** Read a file, returning its content or an error. */
|
|
23
|
+
readFile(path: string): {
|
|
24
|
+
ok: true;
|
|
25
|
+
data: string;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
error: string;
|
|
29
|
+
};
|
|
30
|
+
/** Write content to a file, returning success or an error. */
|
|
31
|
+
writeFile(path: string, content: string): {
|
|
32
|
+
ok: true;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
error: string;
|
|
36
|
+
};
|
|
37
|
+
/** Read an environment variable. Returns "" if not set. */
|
|
38
|
+
env(name: string): string;
|
|
39
|
+
/** Return command-line arguments (excluding runtime and script path). */
|
|
40
|
+
args(): string[];
|
|
41
|
+
/** Terminate execution with the given exit code. */
|
|
42
|
+
exit(code: number): never;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=host-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-adapter.d.ts","sourceRoot":"","sources":["../../src/codegen/host-adapter.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAE7B,sDAAsD;IACtD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,kDAAkD;IAClD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,qEAAqE;IACrE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAGtD,8EAA8E;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAGjF,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,8DAA8D;IAC9D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtF,2DAA2D;IAC3D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,yEAAyE;IACzE,IAAI,IAAI,MAAM,EAAE,CAAC;IACjB,oDAAoD;IACpD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CAC7B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Host Adapter Interface — pluggable platform-specific operations
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Defines the contract that platform-specific adapters must implement.
|
|
5
|
+
// Only operations that require platform-specific APIs are included here.
|
|
6
|
+
// Platform-agnostic operations (string, math, array, etc.) use Web Standard
|
|
7
|
+
// APIs and are handled directly in host-functions.ts.
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=host-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-adapter.js","sourceRoot":"","sources":["../../src/codegen/host-adapter.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kEAAkE;AAClE,gFAAgF;AAChF,uEAAuE;AACvE,yEAAyE;AACzE,4EAA4E;AAC5E,sDAAsD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import binaryen from "binaryen";
|
|
2
|
+
import type { EdictModule } from "../ast/nodes.js";
|
|
3
|
+
export interface ImportSig {
|
|
4
|
+
paramTypes: binaryen.Type[];
|
|
5
|
+
returnType: binaryen.Type;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* FALLBACK: Scan function bodies for calls to imported names and infer WASM types
|
|
9
|
+
* from the function's declared param/return types at call sites.
|
|
10
|
+
*
|
|
11
|
+
* When imports declare typed signatures (Import.types), the codegen uses those
|
|
12
|
+
* directly. This inference is only needed for backwards-compatible untyped imports.
|
|
13
|
+
*/
|
|
14
|
+
export declare function inferImportSignatures(module: EdictModule, importedNames: Set<string>): Map<string, ImportSig>;
|
|
15
|
+
//# sourceMappingURL=imports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/codegen/imports.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,iBAAiB,CAAC;AAO5E,MAAM,WAAW,SAAS;IACtB,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5B,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;CAC7B;AAMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAC3B,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAiBxB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Import Signature Inference — infer WASM types for module-level imports
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Extracted from codegen.ts for modularity.
|
|
5
|
+
import binaryen from "binaryen";
|
|
6
|
+
import { edictTypeToWasm } from "./types.js";
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Public API
|
|
9
|
+
// =============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* FALLBACK: Scan function bodies for calls to imported names and infer WASM types
|
|
12
|
+
* from the function's declared param/return types at call sites.
|
|
13
|
+
*
|
|
14
|
+
* When imports declare typed signatures (Import.types), the codegen uses those
|
|
15
|
+
* directly. This inference is only needed for backwards-compatible untyped imports.
|
|
16
|
+
*/
|
|
17
|
+
export function inferImportSignatures(module, importedNames) {
|
|
18
|
+
const sigs = new Map();
|
|
19
|
+
// Initialize with defaults
|
|
20
|
+
for (const name of importedNames) {
|
|
21
|
+
sigs.set(name, { paramTypes: [], returnType: binaryen.i32 });
|
|
22
|
+
}
|
|
23
|
+
// Multi-pass: run inference until stable (handles ordering deps like pow→sqrt)
|
|
24
|
+
for (let pass = 0; pass < 3; pass++) {
|
|
25
|
+
for (const def of module.definitions) {
|
|
26
|
+
if (def.kind !== "fn")
|
|
27
|
+
continue;
|
|
28
|
+
inferFromExprs(def.body, def, sigs, importedNames);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return sigs;
|
|
32
|
+
}
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Internal helpers
|
|
35
|
+
// =============================================================================
|
|
36
|
+
function inferFromExprs(exprs, enclosingFn, sigs, importedNames) {
|
|
37
|
+
for (const expr of exprs) {
|
|
38
|
+
inferFromExpr(expr, enclosingFn, sigs, importedNames);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function inferFromExpr(expr, enclosingFn, sigs, importedNames) {
|
|
42
|
+
if (expr.kind === "call" && expr.fn.kind === "ident" && importedNames.has(expr.fn.name)) {
|
|
43
|
+
const name = expr.fn.name;
|
|
44
|
+
// Infer param types from arguments
|
|
45
|
+
const paramTypes = expr.args.map(arg => inferTypeFromExpr(arg, enclosingFn, sigs));
|
|
46
|
+
// If any param is f64, promote all i32 numeric params to f64
|
|
47
|
+
// (JSON can't distinguish 2.0 from 2; Edict doesn't mix int/float in one function)
|
|
48
|
+
const hasFloat = paramTypes.some(t => t === binaryen.f64);
|
|
49
|
+
if (hasFloat) {
|
|
50
|
+
for (let j = 0; j < paramTypes.length; j++) {
|
|
51
|
+
if (paramTypes[j] === binaryen.i32 && expr.args[j]?.kind === "literal" &&
|
|
52
|
+
typeof expr.args[j].value === "number") {
|
|
53
|
+
paramTypes[j] = binaryen.f64;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Infer return type from the enclosing function's return type
|
|
58
|
+
// (if this call is the last expression in the function body, it determines the return type)
|
|
59
|
+
const lastExprInBody = enclosingFn.body.length > 0
|
|
60
|
+
? enclosingFn.body[enclosingFn.body.length - 1]
|
|
61
|
+
: null;
|
|
62
|
+
const returnType = isExprOrContains(lastExprInBody, expr) && enclosingFn.returnType
|
|
63
|
+
? edictTypeToWasm(enclosingFn.returnType)
|
|
64
|
+
: binaryen.i32;
|
|
65
|
+
sigs.set(name, { paramTypes, returnType });
|
|
66
|
+
}
|
|
67
|
+
// Recurse into sub-expressions
|
|
68
|
+
switch (expr.kind) {
|
|
69
|
+
case "binop":
|
|
70
|
+
inferFromExpr(expr.left, enclosingFn, sigs, importedNames);
|
|
71
|
+
inferFromExpr(expr.right, enclosingFn, sigs, importedNames);
|
|
72
|
+
break;
|
|
73
|
+
case "unop":
|
|
74
|
+
inferFromExpr(expr.operand, enclosingFn, sigs, importedNames);
|
|
75
|
+
break;
|
|
76
|
+
case "call":
|
|
77
|
+
inferFromExpr(expr.fn, enclosingFn, sigs, importedNames);
|
|
78
|
+
for (const a of expr.args)
|
|
79
|
+
inferFromExpr(a, enclosingFn, sigs, importedNames);
|
|
80
|
+
break;
|
|
81
|
+
case "if":
|
|
82
|
+
inferFromExpr(expr.condition, enclosingFn, sigs, importedNames);
|
|
83
|
+
inferFromExprs(expr.then, enclosingFn, sigs, importedNames);
|
|
84
|
+
if (expr.else)
|
|
85
|
+
inferFromExprs(expr.else, enclosingFn, sigs, importedNames);
|
|
86
|
+
break;
|
|
87
|
+
case "let":
|
|
88
|
+
inferFromExpr(expr.value, enclosingFn, sigs, importedNames);
|
|
89
|
+
break;
|
|
90
|
+
case "block":
|
|
91
|
+
inferFromExprs(expr.body, enclosingFn, sigs, importedNames);
|
|
92
|
+
break;
|
|
93
|
+
case "match":
|
|
94
|
+
inferFromExpr(expr.target, enclosingFn, sigs, importedNames);
|
|
95
|
+
for (const arm of expr.arms)
|
|
96
|
+
inferFromExprs(arm.body, enclosingFn, sigs, importedNames);
|
|
97
|
+
break;
|
|
98
|
+
case "lambda":
|
|
99
|
+
inferFromExprs(expr.body, enclosingFn, sigs, importedNames);
|
|
100
|
+
break;
|
|
101
|
+
case "array":
|
|
102
|
+
for (const el of expr.elements)
|
|
103
|
+
inferFromExpr(el, enclosingFn, sigs, importedNames);
|
|
104
|
+
break;
|
|
105
|
+
case "record_expr":
|
|
106
|
+
for (const f of expr.fields)
|
|
107
|
+
inferFromExpr(f.value, enclosingFn, sigs, importedNames);
|
|
108
|
+
break;
|
|
109
|
+
case "access":
|
|
110
|
+
inferFromExpr(expr.target, enclosingFn, sigs, importedNames);
|
|
111
|
+
break;
|
|
112
|
+
default: break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Infer the WASM type of an expression from its AST structure.
|
|
117
|
+
* Used during import signature inference (before we have a FunctionContext).
|
|
118
|
+
*/
|
|
119
|
+
function inferTypeFromExpr(expr, enclosingFn, sigs) {
|
|
120
|
+
if (expr.kind === "literal") {
|
|
121
|
+
if (expr.type)
|
|
122
|
+
return edictTypeToWasm(expr.type);
|
|
123
|
+
if (typeof expr.value === "number" && !Number.isInteger(expr.value))
|
|
124
|
+
return binaryen.f64;
|
|
125
|
+
return binaryen.i32;
|
|
126
|
+
}
|
|
127
|
+
if (expr.kind === "ident") {
|
|
128
|
+
const param = enclosingFn.params.find(p => p.name === expr.name);
|
|
129
|
+
if (param)
|
|
130
|
+
return edictTypeToWasm(param.type);
|
|
131
|
+
return binaryen.i32;
|
|
132
|
+
}
|
|
133
|
+
if (expr.kind === "binop") {
|
|
134
|
+
// Arithmetic result type follows left operand
|
|
135
|
+
const cmpOps = ["==", "!=", "<", ">", "<=", ">=", "and", "or", "implies"];
|
|
136
|
+
if (cmpOps.includes(expr.op))
|
|
137
|
+
return binaryen.i32;
|
|
138
|
+
return inferTypeFromExpr(expr.left, enclosingFn, sigs);
|
|
139
|
+
}
|
|
140
|
+
if (expr.kind === "call" && expr.fn.kind === "ident") {
|
|
141
|
+
// Check inferred import sigs first, then fn defs
|
|
142
|
+
if (sigs?.has(expr.fn.name)) {
|
|
143
|
+
return sigs.get(expr.fn.name).returnType;
|
|
144
|
+
}
|
|
145
|
+
// Check enclosing module's function definitions
|
|
146
|
+
return binaryen.i32;
|
|
147
|
+
}
|
|
148
|
+
return binaryen.i32;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if target expression is or contains the needle (by reference).
|
|
152
|
+
*/
|
|
153
|
+
function isExprOrContains(target, needle) {
|
|
154
|
+
if (!target)
|
|
155
|
+
return false;
|
|
156
|
+
if (target === needle)
|
|
157
|
+
return true;
|
|
158
|
+
switch (target.kind) {
|
|
159
|
+
case "call": return target.args.some(a => isExprOrContains(a, needle)) || isExprOrContains(target.fn, needle);
|
|
160
|
+
case "binop": return isExprOrContains(target.left, needle) || isExprOrContains(target.right, needle);
|
|
161
|
+
case "unop": return isExprOrContains(target.operand, needle);
|
|
162
|
+
default: return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=imports.js.map
|