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,195 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Match expression compiler — pattern matching
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import binaryen from "binaryen";
|
|
5
|
+
import { wasmValidationError } from "../errors/structured-errors.js";
|
|
6
|
+
import { compileExpr, inferExprWasmType } from "./compile-expr.js";
|
|
7
|
+
export function compileMatch(expr, cc, ctx) {
|
|
8
|
+
const { mod, strings, errors } = cc;
|
|
9
|
+
// Attempt to determine the Edict type name of the target for enum matching
|
|
10
|
+
let targetEdictTypeName;
|
|
11
|
+
if (expr.target.kind === "ident") {
|
|
12
|
+
const local = ctx.getLocal(expr.target.name);
|
|
13
|
+
targetEdictTypeName = local?.edictTypeName;
|
|
14
|
+
}
|
|
15
|
+
else if (expr.target.kind === "call") {
|
|
16
|
+
// Can't easily infer return named type yet without a type env here,
|
|
17
|
+
// but let's be pragmatic if it's annotated
|
|
18
|
+
}
|
|
19
|
+
else if ("type" in expr.target && expr.target.type && expr.target.type.kind === "named") {
|
|
20
|
+
targetEdictTypeName = expr.target.type.name;
|
|
21
|
+
}
|
|
22
|
+
else if ("type" in expr.target && expr.target.type && expr.target.type.kind === "option") {
|
|
23
|
+
targetEdictTypeName = "Option";
|
|
24
|
+
}
|
|
25
|
+
else if ("type" in expr.target && expr.target.type && expr.target.type.kind === "result") {
|
|
26
|
+
targetEdictTypeName = "Result";
|
|
27
|
+
}
|
|
28
|
+
// Infer the target and result types
|
|
29
|
+
const targetType = inferExprWasmType(expr.target, cc, ctx);
|
|
30
|
+
const matchResultType = inferExprWasmType(expr, cc, ctx);
|
|
31
|
+
// Evaluate target once and store in a temporary local
|
|
32
|
+
const targetExpr = compileExpr(expr.target, cc, ctx);
|
|
33
|
+
const tmpIndex = ctx.addLocal(`__match_${expr.id}`, targetType);
|
|
34
|
+
const setTarget = mod.local.set(tmpIndex, targetExpr);
|
|
35
|
+
const getTarget = () => mod.local.get(tmpIndex, targetType);
|
|
36
|
+
// Compile body of a match arm (list of expressions → single expression)
|
|
37
|
+
function compileArmBody(body) {
|
|
38
|
+
const compiled = body.map((e) => compileExpr(e, cc, ctx));
|
|
39
|
+
if (compiled.length === 0)
|
|
40
|
+
return mod.nop();
|
|
41
|
+
if (compiled.length === 1)
|
|
42
|
+
return compiled[0];
|
|
43
|
+
const bodyType = body.length > 0
|
|
44
|
+
? inferExprWasmType(body[body.length - 1], cc, ctx)
|
|
45
|
+
: binaryen.i32;
|
|
46
|
+
return mod.block(null, compiled, bodyType);
|
|
47
|
+
}
|
|
48
|
+
// Build condition for a pattern match against the target
|
|
49
|
+
function compilePatternCondition(pattern) {
|
|
50
|
+
switch (pattern.kind) {
|
|
51
|
+
case "literal_pattern": {
|
|
52
|
+
const val = pattern.value;
|
|
53
|
+
// Int64 literal pattern — value may be string or number
|
|
54
|
+
if (pattern.type?.kind === "basic" && pattern.type.name === "Int64") {
|
|
55
|
+
const big = BigInt(val);
|
|
56
|
+
const low = Number(big & 0xffffffffn);
|
|
57
|
+
const high = Number((big >> 32n) & 0xffffffffn);
|
|
58
|
+
return mod.i64.eq(getTarget(), mod.i64.const(low, high));
|
|
59
|
+
}
|
|
60
|
+
if (typeof val === "number" && Number.isInteger(val)) {
|
|
61
|
+
return mod.i32.eq(getTarget(), mod.i32.const(val));
|
|
62
|
+
}
|
|
63
|
+
if (typeof val === "boolean") {
|
|
64
|
+
return mod.i32.eq(getTarget(), mod.i32.const(val ? 1 : 0));
|
|
65
|
+
}
|
|
66
|
+
// String/float literal patterns — compare i32 representation
|
|
67
|
+
if (typeof val === "number") {
|
|
68
|
+
// Float literal pattern — not yet supported in i32 mode
|
|
69
|
+
errors.push(wasmValidationError(`float literal patterns not yet supported in match`));
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (typeof val === "string") {
|
|
73
|
+
const interned = strings.intern(val);
|
|
74
|
+
return mod.i32.eq(getTarget(), mod.i32.const(interned.offset));
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
case "wildcard":
|
|
79
|
+
return null; // always matches
|
|
80
|
+
case "binding":
|
|
81
|
+
return null; // always matches (binding is set up in compileArmWithBinding)
|
|
82
|
+
case "constructor": {
|
|
83
|
+
// Determine the tag value from the enum layout
|
|
84
|
+
let tagValue = -1;
|
|
85
|
+
if (targetEdictTypeName) {
|
|
86
|
+
const enumLayout = cc.enumLayouts.get(targetEdictTypeName);
|
|
87
|
+
if (enumLayout) {
|
|
88
|
+
const variantLayout = enumLayout.variants.find(v => v.name === pattern.name);
|
|
89
|
+
if (variantLayout) {
|
|
90
|
+
tagValue = variantLayout.tag;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
errors.push(wasmValidationError(`unknown variant ${pattern.name} for enum ${targetEdictTypeName}`));
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
errors.push(wasmValidationError(`unknown enum ${targetEdictTypeName}`));
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
errors.push(wasmValidationError(`cannot infer enum type for match target ${expr.id}`));
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (tagValue === -1)
|
|
107
|
+
return null;
|
|
108
|
+
// Load tag at offset 0 from the heap pointer (target)
|
|
109
|
+
const loadTag = mod.i32.load(0, 0, getTarget());
|
|
110
|
+
return mod.i32.eq(loadTag, mod.i32.const(tagValue));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Pre-register binding locals so they're available during body compilation.
|
|
115
|
+
// We must do this before compiling arm bodies, otherwise ident lookups
|
|
116
|
+
// for bound names will fail.
|
|
117
|
+
const bindingLocals = new Map(); // arm index → local index
|
|
118
|
+
const constructorFieldBindings = new Map();
|
|
119
|
+
for (let i = 0; i < expr.arms.length; i++) {
|
|
120
|
+
const pattern = expr.arms[i].pattern;
|
|
121
|
+
if (pattern.kind === "binding") {
|
|
122
|
+
const bindIndex = ctx.addLocal(pattern.name, targetType);
|
|
123
|
+
bindingLocals.set(i, bindIndex);
|
|
124
|
+
}
|
|
125
|
+
else if (pattern.kind === "constructor") {
|
|
126
|
+
if (targetEdictTypeName) {
|
|
127
|
+
const enumLayout = cc.enumLayouts.get(targetEdictTypeName);
|
|
128
|
+
if (enumLayout) {
|
|
129
|
+
const variantLayout = enumLayout.variants.find(v => v.name === pattern.name);
|
|
130
|
+
if (variantLayout) {
|
|
131
|
+
const fieldBindings = [];
|
|
132
|
+
for (let j = 0; j < pattern.fields.length; j++) {
|
|
133
|
+
const subPattern = pattern.fields[j];
|
|
134
|
+
if (subPattern.kind === "binding") {
|
|
135
|
+
const fieldLayout = variantLayout.fields[j];
|
|
136
|
+
if (fieldLayout) {
|
|
137
|
+
const bindIndex = ctx.addLocal(subPattern.name, fieldLayout.wasmType);
|
|
138
|
+
fieldBindings.push({
|
|
139
|
+
localIndex: bindIndex,
|
|
140
|
+
offset: fieldLayout.offset,
|
|
141
|
+
wasmType: fieldLayout.wasmType
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (subPattern.kind !== "wildcard") {
|
|
146
|
+
errors.push(wasmValidationError(`nested patterns inside constructor patterns not yet supported`));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
constructorFieldBindings.set(i, fieldBindings);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Build nested if/else chain from arms (right to left)
|
|
156
|
+
// Start from the last arm and work backwards
|
|
157
|
+
let result = mod.unreachable();
|
|
158
|
+
for (let i = expr.arms.length - 1; i >= 0; i--) {
|
|
159
|
+
const arm = expr.arms[i];
|
|
160
|
+
const bodyExpr = compileArmBody(arm.body);
|
|
161
|
+
// Wrap with binding set if this is a binding pattern
|
|
162
|
+
let armExpr = bodyExpr;
|
|
163
|
+
const bindIndex = bindingLocals.get(i);
|
|
164
|
+
if (bindIndex !== undefined) {
|
|
165
|
+
const setBinding = mod.local.set(bindIndex, getTarget());
|
|
166
|
+
armExpr = mod.block(null, [setBinding, bodyExpr], matchResultType);
|
|
167
|
+
}
|
|
168
|
+
else if (arm.pattern.kind === "constructor") {
|
|
169
|
+
const fieldBindings = constructorFieldBindings.get(i);
|
|
170
|
+
if (fieldBindings && fieldBindings.length > 0) {
|
|
171
|
+
const sets = [];
|
|
172
|
+
for (const binding of fieldBindings) {
|
|
173
|
+
const loadField = binding.wasmType === binaryen.f64
|
|
174
|
+
? mod.f64.load(binding.offset, 0, getTarget())
|
|
175
|
+
: mod.i32.load(binding.offset, 0, getTarget());
|
|
176
|
+
sets.push(mod.local.set(binding.localIndex, loadField));
|
|
177
|
+
}
|
|
178
|
+
armExpr = mod.block(null, [...sets, bodyExpr], matchResultType);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const condition = compilePatternCondition(arm.pattern);
|
|
182
|
+
if (condition === null) {
|
|
183
|
+
// Wildcard or binding — this arm always matches
|
|
184
|
+
// It becomes the else (or the whole result if it's the only/last arm)
|
|
185
|
+
result = armExpr;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// Conditional arm — if condition then this arm else previous result
|
|
189
|
+
result = mod.if(condition, armExpr, result);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Wrap: set target, then evaluate the if/else chain
|
|
193
|
+
return mod.block(null, [setTarget, result], matchResultType);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=compile-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-match.js","sourceRoot":"","sources":["../../src/codegen/compile-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import binaryen from "binaryen";
|
|
2
|
+
import type { Expression } from "../ast/nodes.js";
|
|
3
|
+
import { type CompilationContext, FunctionContext } from "./types.js";
|
|
4
|
+
export declare function compileLiteral(expr: Expression & {
|
|
5
|
+
kind: "literal";
|
|
6
|
+
}, cc: CompilationContext): binaryen.ExpressionRef;
|
|
7
|
+
export declare function compileIdent(expr: Expression & {
|
|
8
|
+
kind: "ident";
|
|
9
|
+
}, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
|
|
10
|
+
export declare function compileBinop(expr: Expression & {
|
|
11
|
+
kind: "binop";
|
|
12
|
+
}, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
|
|
13
|
+
export declare function compileUnop(expr: Expression & {
|
|
14
|
+
kind: "unop";
|
|
15
|
+
}, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
|
|
16
|
+
export declare function compileIf(expr: Expression & {
|
|
17
|
+
kind: "if";
|
|
18
|
+
}, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
|
|
19
|
+
export declare function compileLet(expr: Expression & {
|
|
20
|
+
kind: "let";
|
|
21
|
+
}, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
|
|
22
|
+
export declare function compileBlock(expr: Expression & {
|
|
23
|
+
kind: "block";
|
|
24
|
+
}, cc: CompilationContext, ctx: FunctionContext): binaryen.ExpressionRef;
|
|
25
|
+
//# sourceMappingURL=compile-scalars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-scalars.d.ts","sourceRoot":"","sources":["../../src/codegen/compile-scalars.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EACH,KAAK,kBAAkB,EACvB,eAAe,EAElB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,cAAc,CAC1B,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,EACtC,EAAE,EAAE,kBAAkB,GACvB,QAAQ,CAAC,aAAa,CAoCxB;AAED,wBAAgB,YAAY,CACxB,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,EACpC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CAuBxB;AAED,wBAAgB,YAAY,CACxB,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,EACpC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CAiDxB;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACnC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CAqBxB;AAED,wBAAgB,SAAS,CACrB,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,EACjC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CA6BxB;AAED,wBAAgB,UAAU,CACtB,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,EAClC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CA8CxB;AAED,wBAAgB,YAAY,CACxB,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,EACpC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACrB,QAAQ,CAAC,aAAa,CASxB"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Scalar expression compilers — literal, ident, binop, unop, if, let, block
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import binaryen from "binaryen";
|
|
5
|
+
import { wasmValidationError } from "../errors/structured-errors.js";
|
|
6
|
+
import { edictTypeToWasm, } from "./types.js";
|
|
7
|
+
import { allocClosurePair } from "./closures.js";
|
|
8
|
+
import { compileExpr, inferExprWasmType } from "./compile-expr.js";
|
|
9
|
+
export function compileLiteral(expr, cc) {
|
|
10
|
+
const { mod, strings } = cc;
|
|
11
|
+
const val = expr.value;
|
|
12
|
+
if (typeof val === "boolean") {
|
|
13
|
+
return mod.i32.const(val ? 1 : 0);
|
|
14
|
+
}
|
|
15
|
+
// Int64 literal — value may be string (for >2^53 precision) or number
|
|
16
|
+
if (expr.type?.kind === "basic" && expr.type.name === "Int64") {
|
|
17
|
+
try {
|
|
18
|
+
const big = BigInt(val);
|
|
19
|
+
const low = Number(big & 0xffffffffn);
|
|
20
|
+
const high = Number((big >> 32n) & 0xffffffffn);
|
|
21
|
+
return mod.i64.const(low, high);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
cc.errors.push(wasmValidationError(`invalid Int64 literal value: ${JSON.stringify(val)}`));
|
|
25
|
+
return mod.unreachable();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (typeof val === "number") {
|
|
29
|
+
// Check type annotation first — 0.0 is integer in JS but Float in Edict
|
|
30
|
+
if (expr.type && expr.type.kind === "basic" && expr.type.name === "Float") {
|
|
31
|
+
return mod.f64.const(val);
|
|
32
|
+
}
|
|
33
|
+
if (Number.isInteger(val)) {
|
|
34
|
+
return mod.i32.const(val);
|
|
35
|
+
}
|
|
36
|
+
return mod.f64.const(val);
|
|
37
|
+
}
|
|
38
|
+
if (typeof val === "string") {
|
|
39
|
+
const interned = strings.intern(val);
|
|
40
|
+
// Return the pointer (offset). The caller/callee will also need
|
|
41
|
+
// the length — for builtin calls we handle this specially in compileCall.
|
|
42
|
+
return mod.i32.const(interned.offset);
|
|
43
|
+
}
|
|
44
|
+
return mod.unreachable();
|
|
45
|
+
}
|
|
46
|
+
export function compileIdent(expr, cc, ctx) {
|
|
47
|
+
const { mod } = cc;
|
|
48
|
+
const local = ctx.getLocal(expr.name);
|
|
49
|
+
if (local) {
|
|
50
|
+
return mod.local.get(local.index, local.type);
|
|
51
|
+
}
|
|
52
|
+
// Check module-level const globals
|
|
53
|
+
const globalType = cc.constGlobals.get(expr.name);
|
|
54
|
+
if (globalType !== undefined) {
|
|
55
|
+
return mod.global.get(expr.name, globalType);
|
|
56
|
+
}
|
|
57
|
+
// Check function table — return a closure pair (table_index, env_ptr=0)
|
|
58
|
+
// This enables `let f = myFunc` to store a function reference as a closure
|
|
59
|
+
const tableIndex = cc.fnTableIndices.get(expr.name);
|
|
60
|
+
if (tableIndex !== undefined) {
|
|
61
|
+
return allocClosurePair(mod, ctx, mod.i32.const(tableIndex), mod.i32.const(0), `ident_${expr.name}`);
|
|
62
|
+
}
|
|
63
|
+
return mod.unreachable();
|
|
64
|
+
}
|
|
65
|
+
export function compileBinop(expr, cc, ctx) {
|
|
66
|
+
const { mod, errors } = cc;
|
|
67
|
+
const left = compileExpr(expr.left, cc, ctx);
|
|
68
|
+
const right = compileExpr(expr.right, cc, ctx);
|
|
69
|
+
// Determine the WASM type from the left operand.
|
|
70
|
+
// Type checker guarantees matching types for both operands.
|
|
71
|
+
const opType = inferExprWasmType(expr.left, cc, ctx);
|
|
72
|
+
const isFloat = opType === binaryen.f64;
|
|
73
|
+
const isInt64 = opType === binaryen.i64;
|
|
74
|
+
switch (expr.op) {
|
|
75
|
+
case "+":
|
|
76
|
+
return isFloat ? mod.f64.add(left, right) : isInt64 ? mod.i64.add(left, right) : mod.i32.add(left, right);
|
|
77
|
+
case "-":
|
|
78
|
+
return isFloat ? mod.f64.sub(left, right) : isInt64 ? mod.i64.sub(left, right) : mod.i32.sub(left, right);
|
|
79
|
+
case "*":
|
|
80
|
+
return isFloat ? mod.f64.mul(left, right) : isInt64 ? mod.i64.mul(left, right) : mod.i32.mul(left, right);
|
|
81
|
+
case "/":
|
|
82
|
+
return isFloat ? mod.f64.div(left, right) : isInt64 ? mod.i64.div_s(left, right) : mod.i32.div_s(left, right);
|
|
83
|
+
case "%":
|
|
84
|
+
if (isFloat) {
|
|
85
|
+
errors.push(wasmValidationError(`modulo (%) not supported for Float`));
|
|
86
|
+
return mod.unreachable();
|
|
87
|
+
}
|
|
88
|
+
return isInt64 ? mod.i64.rem_s(left, right) : mod.i32.rem_s(left, right);
|
|
89
|
+
case "==":
|
|
90
|
+
return isFloat ? mod.f64.eq(left, right) : isInt64 ? mod.i64.eq(left, right) : mod.i32.eq(left, right);
|
|
91
|
+
case "!=":
|
|
92
|
+
return isFloat ? mod.f64.ne(left, right) : isInt64 ? mod.i64.ne(left, right) : mod.i32.ne(left, right);
|
|
93
|
+
case "<":
|
|
94
|
+
return isFloat ? mod.f64.lt(left, right) : isInt64 ? mod.i64.lt_s(left, right) : mod.i32.lt_s(left, right);
|
|
95
|
+
case ">":
|
|
96
|
+
return isFloat ? mod.f64.gt(left, right) : isInt64 ? mod.i64.gt_s(left, right) : mod.i32.gt_s(left, right);
|
|
97
|
+
case "<=":
|
|
98
|
+
return isFloat ? mod.f64.le(left, right) : isInt64 ? mod.i64.le_s(left, right) : mod.i32.le_s(left, right);
|
|
99
|
+
case ">=":
|
|
100
|
+
return isFloat ? mod.f64.ge(left, right) : isInt64 ? mod.i64.ge_s(left, right) : mod.i32.ge_s(left, right);
|
|
101
|
+
case "and":
|
|
102
|
+
return mod.i32.and(left, right);
|
|
103
|
+
case "or":
|
|
104
|
+
return mod.i32.or(left, right);
|
|
105
|
+
case "implies":
|
|
106
|
+
// A implies B ≡ (not A) or B
|
|
107
|
+
return mod.i32.or(mod.i32.eqz(left), right);
|
|
108
|
+
default:
|
|
109
|
+
errors.push(wasmValidationError(`unsupported binop: ${expr.op}`));
|
|
110
|
+
return mod.unreachable();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function compileUnop(expr, cc, ctx) {
|
|
114
|
+
const { mod, errors } = cc;
|
|
115
|
+
const operand = compileExpr(expr.operand, cc, ctx);
|
|
116
|
+
const opType = inferExprWasmType(expr.operand, cc, ctx);
|
|
117
|
+
const isFloat = opType === binaryen.f64;
|
|
118
|
+
const isInt64 = opType === binaryen.i64;
|
|
119
|
+
switch (expr.op) {
|
|
120
|
+
case "-":
|
|
121
|
+
return isFloat
|
|
122
|
+
? mod.f64.neg(operand)
|
|
123
|
+
: isInt64
|
|
124
|
+
? mod.i64.sub(mod.i64.const(0, 0), operand)
|
|
125
|
+
: mod.i32.sub(mod.i32.const(0), operand);
|
|
126
|
+
case "not":
|
|
127
|
+
return mod.i32.eqz(operand);
|
|
128
|
+
default:
|
|
129
|
+
errors.push(wasmValidationError(`unsupported unop: ${expr.op}`));
|
|
130
|
+
return mod.unreachable();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function compileIf(expr, cc, ctx) {
|
|
134
|
+
const { mod } = cc;
|
|
135
|
+
const cond = compileExpr(expr.condition, cc, ctx);
|
|
136
|
+
// Infer the result type from the then-branch's last expression
|
|
137
|
+
const resultType = expr.then.length > 0
|
|
138
|
+
? inferExprWasmType(expr.then[expr.then.length - 1], cc, ctx)
|
|
139
|
+
: binaryen.i32;
|
|
140
|
+
const thenExprs = expr.then.map((e) => compileExpr(e, cc, ctx));
|
|
141
|
+
const thenBody = thenExprs.length === 1
|
|
142
|
+
? thenExprs[0]
|
|
143
|
+
: mod.block(null, thenExprs, resultType);
|
|
144
|
+
if (expr.else) {
|
|
145
|
+
const elseExprs = expr.else.map((e) => compileExpr(e, cc, ctx));
|
|
146
|
+
const elseBody = elseExprs.length === 1
|
|
147
|
+
? elseExprs[0]
|
|
148
|
+
: mod.block(null, elseExprs, resultType);
|
|
149
|
+
return mod.if(cond, thenBody, elseBody);
|
|
150
|
+
}
|
|
151
|
+
return mod.if(cond, thenBody);
|
|
152
|
+
}
|
|
153
|
+
export function compileLet(expr, cc, ctx) {
|
|
154
|
+
const { mod, strings } = cc;
|
|
155
|
+
const resolvedLetType = cc.typeInfo?.inferredLetTypes.get(expr.id) ?? expr.type;
|
|
156
|
+
const wasmType = resolvedLetType
|
|
157
|
+
? edictTypeToWasm(resolvedLetType)
|
|
158
|
+
: inferExprWasmType(expr.value, cc, ctx);
|
|
159
|
+
let edictTypeName;
|
|
160
|
+
if (resolvedLetType && resolvedLetType.kind === "named") {
|
|
161
|
+
edictTypeName = resolvedLetType.name;
|
|
162
|
+
}
|
|
163
|
+
else if (resolvedLetType && resolvedLetType.kind === "option") {
|
|
164
|
+
edictTypeName = "Option";
|
|
165
|
+
}
|
|
166
|
+
else if (resolvedLetType && resolvedLetType.kind === "result") {
|
|
167
|
+
edictTypeName = "Result";
|
|
168
|
+
}
|
|
169
|
+
else if (expr.value.kind === "record_expr") {
|
|
170
|
+
edictTypeName = expr.value.name;
|
|
171
|
+
}
|
|
172
|
+
else if (expr.value.kind === "enum_constructor") {
|
|
173
|
+
edictTypeName = expr.value.enumName;
|
|
174
|
+
}
|
|
175
|
+
const index = ctx.addLocal(expr.name, wasmType, edictTypeName);
|
|
176
|
+
const value = compileExpr(expr.value, cc, ctx);
|
|
177
|
+
const localSet = mod.local.set(index, value);
|
|
178
|
+
// For String-type let bindings, save __str_ret_len into a companion local
|
|
179
|
+
// so the correct length is available when the variable is later used as an argument.
|
|
180
|
+
const isStringType = resolvedLetType?.kind === "basic" && resolvedLetType.name === "String";
|
|
181
|
+
if (isStringType) {
|
|
182
|
+
const lenIndex = ctx.addLocal(`__str_len_${expr.name}`, binaryen.i32);
|
|
183
|
+
if (expr.value.kind === "literal" && typeof expr.value.value === "string") {
|
|
184
|
+
// String literal — length known at compile time
|
|
185
|
+
const interned = strings.intern(expr.value.value);
|
|
186
|
+
return mod.block(null, [
|
|
187
|
+
localSet,
|
|
188
|
+
mod.local.set(lenIndex, mod.i32.const(interned.length)),
|
|
189
|
+
], binaryen.none);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// Non-literal (host call result, etc.) — capture __str_ret_len
|
|
193
|
+
return mod.block(null, [
|
|
194
|
+
localSet,
|
|
195
|
+
mod.local.set(lenIndex, mod.global.get("__str_ret_len", binaryen.i32)),
|
|
196
|
+
], binaryen.none);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return localSet;
|
|
200
|
+
}
|
|
201
|
+
export function compileBlock(expr, cc, ctx) {
|
|
202
|
+
const { mod } = cc;
|
|
203
|
+
const bodyExprs = expr.body.map((e) => compileExpr(e, cc, ctx));
|
|
204
|
+
if (bodyExprs.length === 0)
|
|
205
|
+
return mod.nop();
|
|
206
|
+
if (bodyExprs.length === 1)
|
|
207
|
+
return bodyExprs[0];
|
|
208
|
+
const blockType = inferExprWasmType(expr.body[expr.body.length - 1], cc, ctx);
|
|
209
|
+
return mod.block(null, bodyExprs, blockType);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=compile-scalars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-scalars.js","sourceRoot":"","sources":["../../src/codegen/compile-scalars.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import binaryen from "binaryen";
|
|
2
|
+
/**
|
|
3
|
+
* Generate array_map(arrPtr: i32, closurePtr: i32) → i32
|
|
4
|
+
*
|
|
5
|
+
* Allocates a new array, maps each element through the closure, returns result ptr.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateArrayMap(mod: binaryen.Module): void;
|
|
8
|
+
/**
|
|
9
|
+
* Generate array_filter(arrPtr: i32, closurePtr: i32) → i32
|
|
10
|
+
*
|
|
11
|
+
* Single-pass overalloc: allocates max-length result, filters in one pass,
|
|
12
|
+
* then writes actual count. Tail waste is acceptable (arena allocator).
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateArrayFilter(mod: binaryen.Module): void;
|
|
15
|
+
/**
|
|
16
|
+
* Generate array_reduce(arrPtr: i32, init: i32, closurePtr: i32) → i32
|
|
17
|
+
*
|
|
18
|
+
* Folds array elements into an accumulator via the closure.
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateArrayReduce(mod: binaryen.Module): void;
|
|
21
|
+
/**
|
|
22
|
+
* Generate array_find(arrPtr: i32, closurePtr: i32) → i32
|
|
23
|
+
*
|
|
24
|
+
* Scans array, calls predicate on each element. Returns Option<Int>:
|
|
25
|
+
* - Some(elem): heap-allocated [tag=1][pad(4)][value][pad(4)]
|
|
26
|
+
* - None: heap-allocated [tag=0][pad(4)]
|
|
27
|
+
*
|
|
28
|
+
* Option layout matches the built-in enum: None=tag0/8 bytes, Some=tag1/16 bytes.
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateArrayFind(mod: binaryen.Module): void;
|
|
31
|
+
/**
|
|
32
|
+
* Generate array_sort(arrPtr: i32, closurePtr: i32) → i32
|
|
33
|
+
*
|
|
34
|
+
* Copies the input array to a new heap allocation, then sorts in-place
|
|
35
|
+
* using insertion sort. The comparator closure returns:
|
|
36
|
+
* negative if a < b, 0 if a == b, positive if a > b (C qsort convention).
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateArraySort(mod: binaryen.Module): void;
|
|
39
|
+
//# sourceMappingURL=hof-generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hof-generators.d.ts","sourceRoot":"","sources":["../../src/codegen/hof-generators.ts"],"names":[],"mappings":"AAUA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAqE3D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAgF9D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CA0D9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CA8F5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CA+I5D"}
|