bonsai-js 1.0.0 → 1.2.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/CHANGELOG.md +20 -0
- package/README.md +24 -4
- package/dist/artifact.d.mts +47 -0
- package/dist/artifact.mjs +139 -0
- package/dist/artifact.mjs.map +1 -0
- package/dist/builtins/index.d.mts +91 -0
- package/dist/builtins/index.mjs +93 -0
- package/dist/builtins/index.mjs.map +1 -0
- package/dist/check/bind.mjs +117 -0
- package/dist/check/bind.mjs.map +1 -0
- package/dist/check/checker.mjs +34 -120
- package/dist/check/checker.mjs.map +1 -1
- package/dist/compile/compiler.mjs +2 -3
- package/dist/compile/compiler.mjs.map +1 -1
- package/dist/declared.mjs +8 -1
- package/dist/declared.mjs.map +1 -1
- package/dist/digest.mjs +109 -0
- package/dist/digest.mjs.map +1 -0
- package/dist/environment.d.mts +14 -1
- package/dist/environment.mjs +65 -315
- package/dist/environment.mjs.map +1 -1
- package/dist/errors.d.mts +21 -2
- package/dist/errors.mjs +17 -1
- package/dist/errors.mjs.map +1 -1
- package/dist/features.mjs +3 -3
- package/dist/features.mjs.map +1 -1
- package/dist/functions/builtins.mjs +551 -474
- package/dist/functions/builtins.mjs.map +1 -1
- package/dist/functions/define.mjs +53 -11
- package/dist/functions/define.mjs.map +1 -1
- package/dist/functions/descriptions.mjs +110 -0
- package/dist/functions/descriptions.mjs.map +1 -0
- package/dist/index.d.mts +4 -3
- package/dist/index.mjs +3 -2
- package/dist/lite/index.d.mts +4 -3
- package/dist/lite/index.mjs +3 -2
- package/dist/lite/index.mjs.map +1 -1
- package/dist/load.mjs +307 -0
- package/dist/load.mjs.map +1 -0
- package/dist/program.mjs +321 -0
- package/dist/program.mjs.map +1 -0
- package/dist/query/index.mjs +1 -1
- package/dist/runtime/core.d.mts +18 -0
- package/dist/runtime/core.mjs +31 -0
- package/dist/runtime/core.mjs.map +1 -0
- package/dist/runtime/create.d.mts +61 -0
- package/dist/runtime/create.mjs +76 -0
- package/dist/runtime/create.mjs.map +1 -0
- package/dist/runtime/index.d.mts +24 -0
- package/dist/runtime/index.mjs +34 -0
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/service/index.mjs +12 -8
- package/dist/service/index.mjs.map +1 -1
- package/dist/syntax/parser.mjs +1 -1
- package/dist/syntax/printer.mjs +1 -1
- package/dist/types.mjs +103 -23
- package/dist/types.mjs.map +1 -1
- package/dist/version.mjs +7 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +26 -2
|
@@ -2,10 +2,9 @@ import { BonsaiLimitError, BonsaiRuntimeError } from "../errors.mjs";
|
|
|
2
2
|
import { BLOCKED_NAMES } from "../syntax/lexer.mjs";
|
|
3
3
|
import { add, chargeKey, contains, describeKind, divide, errorText, hasKey, isEqual, isMap, keyListCost, mapBuildCost, mapKey, multiply, negate, order, power, readIndex, readMember, remainder, subtract, toText, track, truth } from "../runtime/values.mjs";
|
|
4
4
|
import { formatType } from "../types.mjs";
|
|
5
|
-
import { Out, conforms, matchesKind } from "../functions/define.mjs";
|
|
6
|
-
import { guardDepth, isStackOverflow, tooDeep } from "../runtime/overflow.mjs";
|
|
5
|
+
import { Out, conforms, matchesKind, signatureText } from "../functions/define.mjs";
|
|
7
6
|
import { forEachChild } from "../syntax/ast.mjs";
|
|
8
|
-
import {
|
|
7
|
+
import { guardDepth, isStackOverflow, tooDeep } from "../runtime/overflow.mjs";
|
|
9
8
|
import { forHost, isOwn, raised } from "../runtime/attribution.mjs";
|
|
10
9
|
//#region src/compile/compiler.ts
|
|
11
10
|
/** A child run from an async closure: `(await boxed(code)(s)).v`, a sync child never awaited. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.mjs","names":[],"sources":["../../src/compile/compiler.ts"],"sourcesContent":["import { BLOCKED_NAMES } from '../syntax/lexer.js'\nimport { signatureText, type Analysis, type CallPlan } from '../check/checker.js'\nimport { BonsaiLimitError, BonsaiRuntimeError, type BonsaiError, type Span } from '../errors.js'\nimport { guardDepth, isStackOverflow, tooDeep } from '../runtime/overflow.js'\nimport {\n conforms,\n matchesKind,\n Out,\n type CallSite,\n type FunctionDef,\n type Overload,\n} from '../functions/define.js'\nimport { forHost, isOwn, raised } from '../runtime/attribution.js'\nimport type { State } from '../runtime/state.js'\nimport type { TraceRecord, Tracer } from '../runtime/trace.js'\nimport {\n add,\n chargeKey,\n contains,\n describeKind,\n divide,\n errorText,\n hasKey,\n isEqual,\n isMap,\n keyListCost,\n mapBuildCost,\n mapKey,\n multiply,\n negate,\n order,\n power,\n readIndex,\n readMember,\n remainder,\n subtract,\n TEXT_SHIFT,\n toText,\n track,\n truth,\n} from '../runtime/values.js'\nimport {\n forEachChild,\n type BinaryNode,\n type CallNode,\n type LambdaNode,\n type Node,\n type SpreadNode,\n} from '../syntax/ast.js'\nimport { formatType } from '../types.js'\n\n/**\n * A compiled node: a closure over the per-run state. Async closures resolve to\n * an {@link Out}, so no value from the host is ever awaited.\n */\ninterface Code {\n readonly fn: (s: State) => unknown\n readonly async: boolean\n}\n\n/** A child run from an async closure: `(await boxed(code)(s)).v`, a sync child never awaited. */\nfunction boxed(code: Code): (s: State) => Out | Promise<Out> {\n const fn = code.fn\n return code.async ? (fn as (s: State) => Promise<Out>) : (s) => new Out(fn(s))\n}\n\nexport interface CompiledProgram {\n /** Runs the program; an async one resolves to an {@link Out}. */\n readonly run: (s: State) => unknown\n readonly async: boolean\n readonly localCount: number\n}\n\ninterface Scope {\n readonly locals: ReadonlyMap<string, number>\n readonly it: number | undefined\n}\n\n/**\n * Steps charged per host function call unless the function declares its own\n * `cost`. Host calls often do real I/O, so one evaluation cannot make more\n * than maxSteps / cost of them.\n */\nconst DEFAULT_HOST_CALL_COST = 32\n/** Map literals with at most this many entries and no nested values skip value tracking. */\nconst SMALL_MAP_ENTRIES = 8\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n}\n\n/**\n * Host data (getters, Proxy traps, species or `then` hooks) can throw while\n * the engine reads it. Such failures surface as HOST_ERROR, never as a raw\n * JavaScript error. Only the errors this evaluation raised pass through: any\n * other Bonsai error a getter threw (from another evaluation, from parsing,\n * checking, or translating, or built by the host) is the host data's failure.\n */\nfunction hostDataError(error: unknown, s: State): unknown {\n if (isOwn(error)) return error\n // Out of stack, in the engine's recursion or a getter it called (telling them\n // apart would mean wrapping every read): a limit, which try() lets through.\n if (isStackOverflow(error)) return raised(tooDeep(s.source, error))\n return s.error('HOST_ERROR', `Reading host data failed: ${errorText(error)}`, undefined, error)\n}\n\n/**\n * Records a node's failure on its trace, as the error evaluation reports: host\n * data's failure is a HOST_ERROR here too, not the code of an error it threw.\n */\nfunction failed(trace: TraceRecord, error: unknown, s: State): unknown {\n const failure = hostDataError(error, s) as BonsaiError\n trace.error = { code: failure.code, message: failure.message }\n return failure\n}\n\n/** Rethrows a failure of exhaustive explain's extra work only if it is a limit. */\nfunction extraFailure(error: unknown, s: State): void {\n const failure = hostDataError(error, s)\n if (failure instanceof BonsaiLimitError) throw failure\n}\n\n/** Whether `try()` recovers from an error: runtime failures, not limits or host contract violations. */\nfunction recoverable(error: unknown): boolean {\n return error instanceof BonsaiRuntimeError && error.code !== 'HOST_CONTRACT'\n}\n\n/**\n * Compiles an analyzed tree. In `sync` mode every closure is synchronous. In\n * `async` mode only the nodes on a path to an async host call become async.\n */\nexport interface CompileOptions {\n /**\n * Instrument every node to record its value on `state.tracer` (for\n * explain()). Traced programs are compiled separately, so ordinary\n * evaluation pays nothing for tracing.\n */\n readonly trace?: boolean\n /**\n * Free local names the compiled tree may read (for compiling a sub-tree\n * on its own). They occupy slots 0..n-1 in order; the caller stores their\n * values in `state.locals` before running.\n */\n readonly locals?: readonly string[]\n /**\n * Variables with fixed values (a partial-evaluation residual's bindings).\n * Reading one returns its value without looking in the context.\n */\n readonly constants?: ReadonlyMap<string, unknown>\n /**\n * The recorded size and depth of constants an evaluation built (partial\n * evaluation's folded lists and maps), so a residual nests them as the\n * original expression would, not as host data.\n */\n readonly shapes?: WeakMap<object, number> | undefined\n}\n\nexport function compileProgram(\n analysis: Analysis,\n mode: 'sync' | 'async',\n options: CompileOptions = {},\n): CompiledProgram {\n return guardDepth(undefined, () => compileTree(analysis, mode, options))\n}\n\nfunction compileTree(\n analysis: Analysis,\n mode: 'sync' | 'async',\n options: CompileOptions,\n): CompiledProgram {\n let slots = 0\n const allowAsync = mode === 'async'\n const tracing = options.trace === true\n\n const sync = (fn: (s: State) => unknown): Code => ({ fn, async: false })\n const asyncCode = (fn: (s: State) => Promise<Out>): Code => ({ fn, async: true })\n\n function compile(node: Node, scope: Scope): Code {\n const code = compileNode(node, scope)\n return tracing ? instrument(node, code) : code\n }\n\n function instrument(node: Node, code: Code): Code {\n const fn = code.fn\n if (!code.async) {\n return sync((s) => {\n const tracer = s.tracer as Tracer\n const trace = tracer.enter(node)\n if (trace === undefined) return fn(s)\n try {\n const value = fn(s)\n trace.value = value\n return value\n } catch (error) {\n throw failed(trace, error, s)\n } finally {\n tracer.exit()\n }\n })\n }\n return asyncCode(async (s) => {\n const tracer = s.tracer as Tracer\n const trace = tracer.enter(node)\n if (trace === undefined) return fn(s) as Promise<Out>\n try {\n const out = (await fn(s)) as Out\n trace.value = out.v\n return out\n } catch (error) {\n throw failed(trace, error, s)\n } finally {\n tracer.exit()\n }\n })\n }\n\n function compileNode(node: Node, scope: Scope): Code {\n switch (node.type) {\n case 'Literal': {\n const value = node.value\n return sync(() => value)\n }\n case 'Variable': {\n const name = node.name\n if (options.constants?.has(name) === true) {\n const value = options.constants.get(name)\n const shape =\n typeof value === 'object' && value !== null ? options.shapes?.get(value) : undefined\n if (shape === undefined) return sync(() => value)\n return sync((s) => {\n ;(s.shapes ??= new WeakMap()).set(value as object, shape)\n return value\n })\n }\n return sync((s) => {\n const ctx = s.ctx\n if (!Object.hasOwn(ctx, name)) return null\n const value = ctx[name]\n return value === undefined ? null : value\n })\n }\n case 'Local': {\n const slot = scope.locals.get(node.name) as number\n return sync((s) => s.locals[slot])\n }\n case 'It': {\n const slot = scope.it as number\n return sync((s) => s.locals[slot])\n }\n case 'Member':\n return compileMember(node, scope)\n case 'Index': {\n const object = compile(node.object, scope)\n const index = compile(node.index, scope)\n return strict2(object, index, (s, o, k) => readIndex(o, k, s, node))\n }\n case 'Template':\n return compileTemplate(node, scope)\n case 'Unary': {\n const operand = compile(node.operand, scope)\n if (node.operator === '!')\n return strict1(operand, (s, v) => !truth(v, s, node.operand, '\"!\"'))\n return strict1(operand, (s, v) => {\n if (typeof v !== 'number' || !Number.isFinite(v)) return negate(v, s, node)\n return v === 0 ? 0 : -v\n })\n }\n case 'Binary':\n return compileBinary(node, scope)\n case 'Conditional': {\n const test = compile(node.test, scope)\n const then = compile(node.then, scope)\n const otherwise = compile(node.otherwise, scope)\n const at = node.test\n if (!test.async && !then.async && !otherwise.async) {\n const [t, a, b] = [test.fn, then.fn, otherwise.fn]\n return sync((s) => (truth(t(s), s, at, 'A condition') ? a(s) : b(s)))\n }\n const [t, a, b] = [boxed(test), boxed(then), boxed(otherwise)]\n return asyncCode(async (s) => (truth((await t(s)).v, s, at, 'A condition') ? a(s) : b(s)))\n }\n case 'List':\n return compileList(node.items, scope, node)\n case 'Map':\n return compileMap(node, scope)\n case 'Call':\n return compileCall(node, scope)\n case 'Lambda':\n throw new BonsaiRuntimeError(\n 'TYPE_ERROR',\n 'A lambda can only be passed to a function that takes one',\n {\n span: node,\n },\n )\n case 'Let': {\n const value = compile(node.value, scope)\n const slot = slots++\n const locals = new Map(scope.locals)\n locals.set(node.name, slot)\n const body = compile(node.body, { ...scope, locals })\n if (!value.async && !body.async) {\n const [v, b] = [value.fn, body.fn]\n return sync((s) => {\n s.locals[slot] = v(s)\n return b(s)\n })\n }\n const [v, b] = [boxed(value), boxed(body)]\n return asyncCode(async (s) => {\n s.locals[slot] = (await v(s)).v\n return b(s)\n })\n }\n case 'Has': {\n const target = node.target\n const object = compile(target.object, scope)\n if (target.type === 'Member') {\n const name = target.name\n return strict1(object, (s, o) => hasKey(o, name, s, node))\n }\n const key = compile(target.index, scope)\n return strict2(object, key, (s, o, k) => hasKey(o, k, s, node))\n }\n case 'Try': {\n const body = compile(node.body, scope)\n const fallback = compile(node.fallback, scope)\n if (!body.async && !fallback.async) {\n const [b, f] = [body.fn, fallback.fn]\n return sync((s) => {\n try {\n return b(s)\n } catch (error) {\n const failure = hostDataError(error, s)\n if (recoverable(failure)) return f(s)\n throw failure\n }\n })\n }\n const [b, f] = [boxed(body), boxed(fallback)]\n return asyncCode(async (s) => {\n try {\n return await b(s)\n } catch (error) {\n const failure = hostDataError(error, s)\n if (recoverable(failure)) return f(s)\n throw failure\n }\n })\n }\n }\n throw new Error('unreachable')\n }\n\n // Strict nodes evaluate every child left to right, then combine. One\n // semantic function serves both the sync and the async closure.\n function strict1(a: Code, combine: (s: State, x: unknown) => unknown): Code {\n const fa = a.fn\n if (!a.async) return sync((s) => combine(s, fa(s)))\n return asyncCode(async (s) => new Out(combine(s, ((await fa(s)) as Out).v)))\n }\n\n function strict2(a: Code, b: Code, combine: (s: State, x: unknown, y: unknown) => unknown): Code {\n const fa = a.fn\n const fb = b.fn\n if (!a.async && !b.async) return sync((s) => combine(s, fa(s), fb(s)))\n const [ba, bb] = [boxed(a), boxed(b)]\n return asyncCode(async (s) => {\n const x = (await ba(s)).v\n return new Out(combine(s, x, (await bb(s)).v))\n })\n }\n\n function compileMember(node: Extract<Node, { type: 'Member' }>, scope: Scope): Code {\n if (tracing) {\n // Every step of a.b.c is its own traced node.\n const object = compile(node.object, scope)\n const name = node.name\n return strict1(object, (s, o) => readMember(o, name, s, node))\n }\n // Fuse a chain of static member reads: a.b.c reads in one closure.\n const names: string[] = []\n const spans: Span[] = []\n let base: Node = node\n while (base.type === 'Member') {\n names.unshift(base.name)\n spans.unshift(base)\n base = base.object\n }\n if (names.length === 1 && (base.type === 'It' || base.type === 'Local')) {\n const slot = (base.type === 'It' ? scope.it : scope.locals.get(base.name)) as number\n const name = names[0]\n // `.field` in a lambda over a list of plain objects: read inline.\n return sync((s) => {\n const o = s.locals[slot] as { constructor?: unknown } | null | undefined\n if (o?.constructor === Object)\n return Object.hasOwn(o, name) ? ((o as Record<string, unknown>)[name] ?? null) : null\n return readMember(o, name, s, node)\n })\n }\n const object = compile(base, scope)\n if (names.length === 1) {\n const name = names[0]\n return strict1(object, (s, o) => readMember(o, name, s, node))\n }\n return strict1(object, (s, o) => {\n let value = o\n for (let i = 0; i < names.length; i++) {\n if (value === null || value === undefined) return null\n value = readMember(value, names[i], s, spans[i])\n }\n return value\n })\n }\n\n function compileTemplate(node: Extract<Node, { type: 'Template' }>, scope: Scope): Code {\n const parts = node.parts.map((part) => (typeof part === 'string' ? part : compile(part, scope)))\n const spans = node.parts.map((part) => (typeof part === 'string' ? node : part))\n const build = (s: State, values: unknown[]): string => {\n let out = ''\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n const piece = typeof value === 'string' ? value : toText(value, s, spans[i])\n s.stringLimit(out.length + piece.length, node)\n out += piece\n }\n s.charge(1 + (out.length >>> TEXT_SHIFT))\n return out\n }\n if (parts.every((part) => typeof part === 'string' || !part.async)) {\n return sync((s) =>\n build(\n s,\n parts.map((part) => (typeof part === 'string' ? part : part.fn(s))),\n ),\n )\n }\n const runs = parts.map((part) => (typeof part === 'string' ? part : boxed(part)))\n return asyncCode(async (s) => {\n const values: unknown[] = []\n for (const run of runs) values.push(typeof run === 'string' ? run : (await run(s)).v)\n return new Out(build(s, values))\n })\n }\n\n function compileBinary(node: BinaryNode, scope: Scope): Code {\n const left = compile(node.left, scope)\n const right = compile(node.right, scope)\n const op = node.operator\n const at: Span = node\n const l = left.fn\n const r = right.fn\n const anyAsync = left.async || right.async\n const [bl, br] = [boxed(left), boxed(right)]\n\n if (tracing && (op === '&&' || op === '||')) return compileExplainedLogic(node, left, right)\n\n switch (op) {\n case '&&':\n if (!anyAsync)\n return sync(\n (s) => truth(l(s), s, node.left, '\"&&\"') && truth(r(s), s, node.right, '\"&&\"'),\n )\n return asyncCode(\n async (s) =>\n new Out(\n truth((await bl(s)).v, s, node.left, '\"&&\"') &&\n truth((await br(s)).v, s, node.right, '\"&&\"'),\n ),\n )\n case '||':\n if (!anyAsync)\n return sync(\n (s) => truth(l(s), s, node.left, '\"||\"') || truth(r(s), s, node.right, '\"||\"'),\n )\n return asyncCode(\n async (s) =>\n new Out(\n truth((await bl(s)).v, s, node.left, '\"||\"') ||\n truth((await br(s)).v, s, node.right, '\"||\"'),\n ),\n )\n case '??':\n if (!anyAsync) return sync((s) => l(s) ?? r(s))\n return asyncCode(async (s) => {\n const a = await bl(s)\n return a.v === null || a.v === undefined ? br(s) : a\n })\n case '!=':\n case '%':\n case '*':\n case '**':\n case '+':\n case '-':\n case '/':\n case '<':\n case '<=':\n case '==':\n case '>':\n case '>=':\n case 'in':\n case 'not in':\n default:\n break\n }\n\n if (!anyAsync) return sync(binaryOp(op, l, r, at))\n // Rare: the operands are awaited, then combined by the same closure.\n return asyncCode(async (s) => {\n const a = (await bl(s)).v\n const b = (await br(s)).v\n return new Out(\n binaryOp(\n op,\n () => a,\n () => b,\n at,\n )(s),\n )\n })\n }\n\n /**\n * && and || when explaining. With `exhaustive`, the side that\n * short-circuiting would skip is still evaluated (and traced) so every\n * deciding condition is recorded; its evaluation errors are ignored and the\n * result is the ordinary one.\n */\n function compileExplainedLogic(node: BinaryNode, left: Code, right: Code): Code {\n const isAnd = node.operator === '&&'\n const what = `\"${node.operator}\"`\n const extraSync = (s: State, r: (s: State) => unknown): void => {\n const tracer = s.tracer as Tracer\n tracer.extraDepth++\n try {\n r(s)\n } catch (error) {\n // Only limits stop the extra work; its failures (host data included) are ignored.\n extraFailure(error, s)\n } finally {\n tracer.extraDepth--\n }\n }\n if (!left.async && !right.async) {\n const [l, r] = [left.fn, right.fn]\n return sync((s) => {\n const a = truth(l(s), s, node.left, what)\n if (a !== isAnd) {\n if ((s.tracer as Tracer).exhaustive) extraSync(s, r)\n return a\n }\n return truth(r(s), s, node.right, what)\n })\n }\n const [bl, br] = [boxed(left), boxed(right)]\n return asyncCode(async (s) => {\n const a = truth((await bl(s)).v, s, node.left, what)\n if (a !== isAnd) {\n const tracer = s.tracer as Tracer\n if (tracer.exhaustive) {\n tracer.extraDepth++\n try {\n await br(s)\n } catch (error) {\n extraFailure(error, s)\n } finally {\n tracer.extraDepth--\n }\n }\n return new Out(a)\n }\n return new Out(truth((await br(s)).v, s, node.right, what))\n })\n }\n\n function compileList(items: readonly (Node | SpreadNode)[], scope: Scope, at: Span): Code {\n const codes = items.map((item) =>\n item.type === 'Spread' ? compile(item.argument, scope) : compile(item, scope),\n )\n const spreads = items.map((item) => item.type === 'Spread')\n const build = (s: State, values: unknown[]): unknown[] => {\n let length = 0\n for (let i = 0; i < values.length; i++) {\n if (!spreads[i]) length++\n else {\n const value = values[i]\n if (value === null || value === undefined) continue\n if (!Array.isArray(value)) {\n throw s.error(\n 'TYPE_ERROR',\n `Only a list can be spread into a list, not ${describeKind(value)}`,\n items[i],\n )\n }\n length += value.length\n }\n }\n s.listLimit(length, at)\n s.charge(1 + length)\n const out = new Array<unknown>(length)\n let k = 0\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (!spreads[i]) out[k++] = value\n else if (Array.isArray(value))\n // oxlint-disable-next-line typescript/prefer-for-of -- indexing never invokes a host array's own Symbol.iterator\n for (let j = 0; j < value.length; j++) out[k++] = value[j] === undefined ? null : value[j]\n }\n track(out, s, at)\n return out\n }\n if (codes.every((code) => !code.async)) {\n const fns = codes.map((code) => code.fn)\n if (!spreads.includes(true)) {\n const n = fns.length\n return sync((s) => {\n s.listLimit(n, at)\n const out = new Array<unknown>(n)\n for (let i = 0; i < n; i++) out[i] = fns[i](s)\n // Charged after the items, as the general (spread and async) path does.\n s.charge(1 + n)\n track(out, s, at)\n return out\n })\n }\n return sync((s) =>\n build(\n s,\n fns.map((fn) => fn(s)),\n ),\n )\n }\n const runs = codes.map(boxed)\n // Without spreads the length is known up front, checked before any item runs as above.\n const n = spreads.includes(true) ? -1 : runs.length\n return asyncCode(async (s) => {\n if (n >= 0) s.listLimit(n, at)\n const values: unknown[] = []\n for (const run of runs) values.push((await run(s)).v)\n return new Out(build(s, values))\n })\n }\n\n function compileMap(node: Extract<Node, { type: 'Map' }>, scope: Scope): Code {\n type Step =\n | { kind: 'static'; key: string; value: Code }\n | { kind: 'computed'; key: Code; value: Code; at: Span }\n | { kind: 'spread'; value: Code; at: Span }\n const steps: Step[] = node.entries.map((entry): Step => {\n if (entry.type === 'Spread')\n return { kind: 'spread', value: compile(entry.argument, scope), at: entry }\n if (typeof entry.key === 'string')\n return { kind: 'static', key: entry.key, value: compile(entry.value, scope) }\n return {\n kind: 'computed',\n key: compile(entry.key, scope),\n value: compile(entry.value, scope),\n at: entry.key,\n }\n })\n const assign = (\n s: State,\n out: Record<string, unknown>,\n step: Step,\n key: unknown,\n value: unknown,\n ): boolean => {\n // Returns whether the map may now need tracking (a nested value, or copied keys).\n if (step.kind === 'static') out[step.key] = value\n else if (step.kind === 'computed') out[mapKey(key, s, step.at)] = value\n else {\n if (value === null || value === undefined) return false\n if (!isMap(value))\n throw s.error(\n 'TYPE_ERROR',\n `Only a map can be spread into a map, not ${describeKind(value)}`,\n step.at,\n )\n const keys = Object.keys(value)\n s.charge(keyListCost(keys.length) + mapBuildCost(keys.length))\n for (const k of keys) {\n chargeKey(s, k)\n // A key holding undefined is absent (see holdsKey), so it is not copied.\n if (BLOCKED_NAMES.has(k)) continue\n const v = value[k]\n if (v !== undefined) out[k] = v\n }\n return true\n }\n return value !== null && typeof value === 'object'\n }\n // Small flat maps need no record (see `track`).\n const large = steps.length > SMALL_MAP_ENTRIES\n const isAsync = steps.some(\n (step) => step.value.async || (step.kind === 'computed' && step.key.async),\n )\n if (!isAsync) {\n const entryCost = 1 + steps.length\n return sync((s) => {\n const out = {}\n s.charge(entryCost)\n let nested = large\n for (const step of steps)\n if (\n assign(\n s,\n out,\n step,\n step.kind === 'computed' ? step.key.fn(s) : undefined,\n step.value.fn(s),\n )\n )\n nested = true\n if (nested) track(out, s, node)\n return out\n })\n }\n const runs = steps.map((step) => ({\n key: step.kind === 'computed' ? boxed(step.key) : undefined,\n value: boxed(step.value),\n }))\n return asyncCode(async (s) => {\n const out = {}\n s.charge(1 + steps.length)\n let nested = large\n for (let i = 0; i < steps.length; i++) {\n const { key, value } = runs[i]\n const k = key === undefined ? undefined : (await key(s)).v\n if (assign(s, out, steps[i], k, (await value(s)).v)) nested = true\n }\n if (nested) track(out, s, node)\n return new Out(out)\n })\n }\n\n // === calls ===\n\n function compileLambda(node: LambdaNode, scope: Scope): Code {\n // Produces a closure that, given the run state, returns the JS function the\n // built-in will invoke. Parameters live in dedicated local slots.\n let inner: Scope\n let first: number\n let second = -1\n if (node.implicit) {\n first = slots++\n inner = { locals: scope.locals, it: first }\n } else {\n const locals = new Map(scope.locals)\n first = slots++\n locals.set(node.params[0] ?? '\\0', first)\n if (node.params.length > 1) {\n second = slots++\n locals.set(node.params[1], second)\n }\n inner = { locals, it: undefined }\n }\n const body = compile(node.body, inner)\n const b = body.fn\n // Each invocation costs the static size of the body, so a large body run\n // over many items is bounded like the equivalent amount of written code.\n const cost = sizeOf(node.body)\n const make = (s: State) => {\n const locals = s.locals\n const run =\n second === -1\n ? (item: unknown) => {\n if ((s.steps += cost) >= s.nextSample) s.sample()\n locals[first] = item === undefined ? null : item\n return b(s)\n }\n : (item: unknown, index: unknown) => {\n if ((s.steps += cost) >= s.nextSample) s.sample()\n locals[first] = item === undefined ? null : item\n locals[second] = index === undefined ? null : index\n return b(s)\n }\n // Name the failing item: \"... (at item 3)\". Only the innermost lambda annotates.\n // Built-ins call lambdas as (item, index); reduce calls (acc, item, index).\n const annotated = (argA: unknown, argB: unknown, position?: number): unknown => {\n const index = position ?? argB\n try {\n const result = run(argA, argB)\n return body.async ? annotateAsync(result as Promise<unknown>, index) : result\n } catch (error) {\n throw annotate(error, index)\n }\n }\n if (!tracing) return annotated\n // Record each run as an iteration of the enclosing call.\n return (argA: unknown, argB: unknown, position?: number) => {\n const tracer = s.tracer as Tracer\n const recorded =\n position === undefined\n ? tracer.enterIteration(node, typeof argB === 'number' ? argB : 0, argA)\n : tracer.enterIteration(node, position, argB, argA)\n if (!body.async) {\n try {\n return annotated(argA, argB, position)\n } finally {\n tracer.exitIteration(recorded)\n }\n }\n return (async () => {\n try {\n return await annotated(argA, argB, position)\n } finally {\n tracer.exitIteration(recorded)\n }\n })()\n }\n }\n return { fn: make, async: body.async }\n }\n\n function compileCall(node: CallNode, scope: Scope): Code {\n const plan = analysis.calls.get(node)\n if (plan === undefined) {\n throw new BonsaiRuntimeError('NO_OVERLOAD', `Unknown function \"${node.name}\"`, { span: node })\n }\n const def = plan.def\n const argCodes: Code[] = []\n const kinds: ('value' | 'spread' | 'lambda')[] = []\n for (const arg of node.args) {\n if (arg.type === 'Spread') {\n argCodes.push(compile(arg.argument, scope))\n kinds.push('spread')\n } else if (arg.type === 'Lambda') {\n argCodes.push(compileLambda(arg, scope))\n kinds.push('lambda')\n } else {\n argCodes.push(compile(arg, scope))\n kinds.push('value')\n }\n }\n const invoke = makeInvoker(node, plan)\n const lambdaAsync = argCodes.some((code, i) => kinds[i] === 'lambda' && code.async)\n const valuesAsync = argCodes.some((code, i) => kinds[i] !== 'lambda' && code.async)\n const hostAsync = def.async === true && allowAsync\n const hasSpread = kinds.includes('spread')\n const optional = node.optional\n\n const collect = (s: State, values: unknown[]): unknown[] => {\n if (!hasSpread) return values\n const out: unknown[] = []\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (kinds[i] !== 'spread') out.push(value)\n else if (Array.isArray(value)) {\n s.charge(value.length)\n // oxlint-disable-next-line typescript/prefer-for-of -- indexing never invokes a host array's own Symbol.iterator\n for (let j = 0; j < value.length; j++) out.push(value[j] === undefined ? null : value[j])\n } else if (value !== null && value !== undefined) {\n throw s.error(\n 'TYPE_ERROR',\n `Only a list can be spread into arguments, not ${describeKind(value)}`,\n node.args[i],\n )\n }\n }\n return out\n }\n\n if (!lambdaAsync && !valuesAsync && !hostAsync) {\n const fns = argCodes.map((code) => code.fn)\n const n = fns.length\n return sync((s) => {\n const values = new Array<unknown>(n)\n for (let i = 0; i < n; i++) {\n values[i] = fns[i](s)\n if (i === 0 && optional && (values[0] === null || values[0] === undefined)) return null\n }\n return invoke(s, collect(s, values), false)\n })\n }\n // A lambda argument is the function built-ins call, never awaited.\n const runs = argCodes.map((code, i) =>\n kinds[i] === 'lambda' ? (s: State) => new Out(code.fn(s)) : boxed(code),\n )\n // Running async lambdas, a built-in resolves to an Out; so does an async host call.\n const settles = (lambdaAsync && def.host !== true) || hostAsync\n return asyncCode(async (s) => {\n const values = new Array<unknown>(runs.length)\n for (let i = 0; i < runs.length; i++) {\n values[i] = (await runs[i](s)).v\n if (i === 0 && optional && (values[0] === null || values[0] === undefined))\n return new Out(null)\n }\n const result = invoke(s, collect(s, values), lambdaAsync)\n return settles ? (result as Out | Promise<Out>) : new Out(result)\n })\n }\n\n function makeInvoker(\n node: CallNode,\n plan: CallPlan,\n ): (s: State, args: unknown[], asyncLambdas: boolean) => unknown {\n const def = plan.def\n const overloads = plan.candidates.map((index) => def.overloads[index])\n const host = def.host === true\n const hostCost = def.cost ?? DEFAULT_HOST_CALL_COST\n const span: Span = node\n\n const callOverload = (\n s: State,\n overload: Overload,\n args: unknown[],\n asyncLambdas: boolean,\n ): unknown => {\n const site: CallSite = { state: s, span }\n if (!host) {\n chargeArguments(s, args)\n if (asyncLambdas) {\n if (overload.runAsync === undefined)\n throw s.error('ASYNC_IN_SYNC', `${def.name}() cannot run an async lambda`, span)\n return overload.runAsync(args, site).then((out) => new Out(checkProduced(s, out.v, span)))\n }\n return checkProduced(s, overload.run(args, site), span)\n }\n s.charge(hostCost)\n let result: unknown\n let thenable: boolean\n let controller: AbortController | undefined\n try {\n if (def.call === true) {\n controller = new AbortController()\n const call = Object.freeze({ context: s.hostCtx, signal: controller.signal })\n result = overload.run([call, ...args], site)\n } else {\n result = overload.run(args, site)\n }\n thenable = isThenable(result)\n } catch (error) {\n throw hostError(s, def.name, error, span)\n }\n if (thenable && controller !== undefined) callControllers.set(result as object, controller)\n if (thenable) {\n if (!allowAsync || def.async !== true) {\n // Swallow the rejection of the orphaned promise; the call already failed.\n try {\n // Only a native promise: calling a thenable's `then` would run host code.\n if (result instanceof Promise)\n void Promise.prototype.then.call(result, undefined, () => undefined)\n } catch {\n // A hostile thenable; nothing more to clean up.\n }\n const error =\n def.async === true\n ? s.error(\n 'ASYNC_IN_SYNC',\n `${def.name}() is async; use evaluate() instead of evaluateSync()`,\n span,\n )\n : s.error(\n 'HOST_CONTRACT',\n `${def.name}() returned a promise but is not declared async`,\n span,\n )\n // Nothing waits on that promise: tell the host function to stop its work.\n controller?.abort(forHost(error))\n throw error\n }\n return awaitHost(s, result as PromiseLike<unknown>, node, def)\n }\n s.checkTime()\n const checked = checkHostResult(s, def, overload, result, span)\n // An async call's closure expects an Out (see compileCall).\n return allowAsync && def.async === true ? new Out(checked) : checked\n }\n\n // Static types describe declared data, but the context is not validated\n // against them, so argument kinds are always checked before a call.\n if (overloads.length === 1) {\n const overload = overloads[0]\n return (s, args, asyncLambdas) => {\n if (!matches(s, overload, args, host)) throw noOverload(s, def, node, args)\n return callOverload(s, overload, args, asyncLambdas)\n }\n }\n return (s, args, asyncLambdas) => {\n for (const overload of overloads) {\n if (matches(s, overload, args, host)) return callOverload(s, overload, args, asyncLambdas)\n }\n throw noOverload(s, def, node, args)\n }\n }\n\n const freeLocals = new Map<string, number>()\n for (const name of options.locals ?? []) freeLocals.set(name, slots++)\n const root = compile(analysis.root, { locals: freeLocals, it: undefined })\n const fn = root.fn\n const run = root.async\n ? (s: State): unknown =>\n (fn(s) as Promise<Out>).catch((error: unknown) => {\n throw hostDataError(error, s)\n })\n : (s: State): unknown => {\n try {\n return fn(s)\n } catch (error) {\n throw hostDataError(error, s)\n }\n }\n return { run, async: root.async, localCount: slots }\n}\n\nfunction matches(s: State, overload: Overload, args: unknown[], host: boolean): boolean {\n const required = overload.required ?? overload.params.length\n if (args.length < required) return false\n if (args.length > overload.params.length && overload.rest === undefined) return false\n for (let i = 0; i < args.length; i++) {\n const param = overload.params[i] ?? overload.rest\n if (param === undefined) return false\n const arg = args[i]\n if (\n i >= required &&\n i < overload.params.length &&\n (arg === null || arg === undefined) &&\n param.kind !== 'function'\n ) {\n // An omitted-or-null optional argument uses the default.\n continue\n }\n if (host ? !conforms(arg, param, s) : !matchesKind(arg, param)) return false\n }\n return true\n}\n\n/**\n * Built-ins pay for the text they are given (string operations are linear in\n * their input). Work over list elements is charged by each built-in, since\n * many list operations (at, first, slice) touch only part of the list.\n */\nfunction chargeArguments(s: State, args: unknown[]): void {\n let cost = 1\n for (const arg of args) if (typeof arg === 'string') cost += arg.length >>> TEXT_SHIFT\n s.charge(cost)\n}\n\n/**\n * Every string or list a built-in returns is a produced value subject to the\n * size limits, and text it produces is charged by length (see TEXT_SHIFT).\n */\nfunction checkProduced(s: State, result: unknown, span: Span): unknown {\n if (typeof result === 'string') {\n if (result.length > s.limits.maxStringLength) s.stringLimit(result.length, span)\n s.charge(result.length >>> TEXT_SHIFT)\n } else if (Array.isArray(result)) {\n if (result.length > s.limits.maxListLength) s.listLimit(result.length, span)\n }\n return result\n}\n\nfunction noOverload(\n s: State,\n def: FunctionDef,\n node: CallNode,\n args: unknown[],\n): BonsaiRuntimeError {\n if (args.length > 0 && (args[0] === null || args[0] === undefined)) {\n return s.error(\n 'NULL_RECEIVER',\n node.style === 'method'\n ? `Cannot call .${def.name}() on null; use ?.${def.name}() or ?? to supply a default`\n : `${def.name}() cannot take null as its first argument; use ?? to supply a default`,\n node,\n )\n }\n const shown = args\n .map((arg) => (typeof arg === 'function' ? 'a lambda' : describeKind(arg)))\n .join(', ')\n const signatures = def.overloads.map((overload) => signatureText(def.name, overload)).join('; ')\n return s.error(\n 'NO_OVERLOAD',\n `${def.name}() cannot take (${shown}); expected ${signatures}`,\n node,\n )\n}\n\n/**\n * Whatever a host function throws is a HOST_ERROR with the original as its\n * cause, even a Bonsai error (say, a limit hit by an evaluation the host ran\n * itself) or a stack overflow: it failed in host code, not in this expression,\n * and the depth limits leave host code most of the stack.\n */\nfunction hostError(s: State, name: string, error: unknown, span: Span): BonsaiError {\n return s.error('HOST_ERROR', `${name}() failed: ${errorText(error)}`, span, error)\n}\n\n/**\n * Host results must conform, deeply, to the declared result type (checked\n * against the step budget); undefined reads as null. A mismatch is a broken\n * host contract, which `try()` does not recover from.\n */\nfunction checkHostResult(\n s: State,\n def: FunctionDef,\n overload: Overload,\n result: unknown,\n span: Span,\n): unknown {\n const value = result === undefined ? null : result\n if (!conforms(value, overload.result, s)) {\n throw s.error(\n 'HOST_CONTRACT',\n `${def.name}() returned ${result === undefined ? 'undefined' : describeKind(value)}, which does not match its declared type ${formatType(overload.result)}`,\n span,\n )\n }\n return value\n}\n\n/**\n * The controller behind the `call.signal` a host function received, by the\n * promise it returned, so ending the wait early also aborts the host's work.\n */\nconst callControllers = new WeakMap<object, AbortController>()\n\nasync function awaitHost(\n s: State,\n promise: PromiseLike<unknown>,\n node: CallNode,\n def: FunctionDef,\n): Promise<Out> {\n const controller = callControllers.get(promise)\n // A rejection from the host is a HOST_ERROR; the limit errors racing it are not.\n // The value is boxed, so a thenable it holds is never adopted in turn.\n const settled = Promise.resolve(promise).then(\n (value) => new Out(value),\n (error: unknown) => {\n throw hostError(s, node.name, error, node)\n },\n )\n const result = ((await raceLimits(s, settled, controller)) as Out).v\n s.checkTime()\n return new Out(checkHostResult(s, def, def.overloads[0], result, node))\n}\n\n/** The longest delay a timer accepts (2^31 - 1 ms); a longer one fires at once. */\nconst MAX_TIMER_DELAY = 2_147_483_647\n\n/**\n * Waits for a host promise, rejecting early on timeout or abort. The signal is\n * host code: a listener method that throws counts as an abort, a cleanup that\n * throws is ignored, and the promise always settles exactly once. Ending the\n * wait early also aborts `controller`, the host call's own signal.\n */\nfunction raceLimits(\n s: State,\n promise: PromiseLike<unknown>,\n controller?: AbortController,\n): Promise<unknown> {\n const signal = s.signal\n const deadline = s.deadline\n if (signal === undefined && deadline === 0) return Promise.resolve(promise)\n // Rejection reasons are passed through unchanged; they are Bonsai errors or\n // whatever the host promise rejected with.\n return new Promise((resolve, reject: (reason: Error) => void) => {\n let settled = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const cleanup = (): void => {\n if (timer !== undefined) clearTimeout(timer)\n try {\n signal?.removeEventListener('abort', onAbort)\n } catch {\n // A broken signal cannot keep the evaluation from settling.\n }\n }\n const finish = (settle: () => void): void => {\n if (settled) return\n settled = true\n cleanup()\n settle()\n }\n // A limit ended the wait: reject, and tell the host function to stop.\n const fail = (error: Error): void => {\n reject(error)\n controller?.abort(forHost(error))\n }\n // An abort event (or a signal that fails) ends the wait even if the signal\n // does not read as aborted afterwards.\n const abort = (): void => {\n finish(() => {\n try {\n s.checkTime()\n fail(\n raised(\n new BonsaiLimitError('ABORTED', 'Evaluation was aborted', {\n source: s.source,\n cause: s.signalError,\n }),\n ),\n )\n } catch (error) {\n fail(error as Error)\n }\n })\n }\n function onAbort(): void {\n abort()\n }\n const arm = (): void => {\n const wait = deadline - performance.now()\n timer = setTimeout(\n () => {\n // A deadline beyond the longest timer delay is reached in steps.\n if (wait > MAX_TIMER_DELAY) {\n arm()\n return\n }\n // The timer is set for the deadline, so it has passed even if the\n // clock reads a hair earlier (timers and performance.now() differ).\n finish(() => {\n fail(s.limit('TIMEOUT', 'Evaluation timed out'))\n })\n },\n Math.min(MAX_TIMER_DELAY, Math.max(0, wait) + 1),\n )\n }\n if (deadline !== 0) arm()\n if (signal !== undefined) {\n try {\n signal.addEventListener('abort', onAbort, { once: true })\n } catch (error) {\n s.signalError = error\n abort()\n }\n }\n // A signal aborted (or a deadline passed) before the wait began.\n try {\n s.checkTime()\n } catch (error) {\n finish(() => {\n fail(error as Error)\n })\n }\n Promise.resolve(promise).then(\n (value) => {\n finish(() => {\n resolve(value)\n })\n },\n (error: unknown) => {\n finish(() => {\n reject(error as Error)\n })\n },\n )\n })\n}\n\ntype Fn = (s: State) => unknown\n\nconst annotated = new WeakSet()\n\nfunction annotate(error: unknown, index: unknown): unknown {\n if (error instanceof BonsaiRuntimeError && typeof index === 'number' && !annotated.has(error)) {\n annotated.add(error)\n error.message = `${error.message} (at item ${index})`\n }\n return error\n}\n\nasync function annotateAsync(result: Promise<unknown>, index: unknown): Promise<unknown> {\n try {\n return await result\n } catch (error) {\n throw annotate(error, index)\n }\n}\n\nfunction sizeOf(node: Node): number {\n let size = 1\n forEachChild(node, (child) => {\n size += sizeOf(child)\n })\n return size\n}\n\n/**\n * One closure per strict operator, reading both operands itself: a shared\n * combinator would be a megamorphic call site (about 2x slower arithmetic).\n */\nfunction binaryOp(op: BinaryNode['operator'], l: Fn, r: Fn, at: Span): Fn {\n switch (op) {\n case '==':\n return (s) => {\n const a = l(s)\n const b = r(s)\n return isEqual(a, b, s)\n }\n case '!=':\n return (s) => {\n const a = l(s)\n const b = r(s)\n return !isEqual(a, b, s)\n }\n case '<':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a < b\n const o = order(a, b, s, at)\n return o !== undefined && o < 0\n }\n case '<=':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a <= b\n const o = order(a, b, s, at)\n return o !== undefined && o <= 0\n }\n case '>':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a > b\n const o = order(a, b, s, at)\n return o !== undefined && o > 0\n }\n case '>=':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a >= b\n const o = order(a, b, s, at)\n return o !== undefined && o >= 0\n }\n case '+':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') {\n const x = a + b\n if (Number.isFinite(x)) return x\n }\n return add(a, b, s, at)\n }\n case '-':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') {\n const x = a - b\n if (Number.isFinite(x)) return x\n }\n return subtract(a, b, s, at)\n }\n case '*':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') {\n const x = a * b\n if (Number.isFinite(x)) return x\n }\n return multiply(a, b, s, at)\n }\n case '/':\n return (s) => divide(l(s), r(s), s, at)\n case '%':\n return (s) => remainder(l(s), r(s), s, at)\n case '**':\n return (s) => power(l(s), r(s), s, at)\n case 'in':\n return (s) => {\n const a = l(s)\n return contains(r(s), a, s, at)\n }\n case 'not in':\n return (s) => {\n const a = l(s)\n return !contains(r(s), a, s, at)\n }\n case '&&':\n case '||':\n case '??':\n default:\n throw new Error('unreachable')\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compiler.mjs","names":[],"sources":["../../src/compile/compiler.ts"],"sourcesContent":["import { BLOCKED_NAMES } from '../syntax/lexer.js'\nimport type { Analysis, CallPlan } from '../check/checker.js'\nimport { BonsaiLimitError, BonsaiRuntimeError, type BonsaiError, type Span } from '../errors.js'\nimport { guardDepth, isStackOverflow, tooDeep } from '../runtime/overflow.js'\nimport {\n conforms,\n matchesKind,\n Out,\n signatureText,\n type CallSite,\n type FunctionDef,\n type Overload,\n} from '../functions/define.js'\nimport { forHost, isOwn, raised } from '../runtime/attribution.js'\nimport type { State } from '../runtime/state.js'\nimport type { TraceRecord, Tracer } from '../runtime/trace.js'\nimport {\n add,\n chargeKey,\n contains,\n describeKind,\n divide,\n errorText,\n hasKey,\n isEqual,\n isMap,\n keyListCost,\n mapBuildCost,\n mapKey,\n multiply,\n negate,\n order,\n power,\n readIndex,\n readMember,\n remainder,\n subtract,\n TEXT_SHIFT,\n toText,\n track,\n truth,\n} from '../runtime/values.js'\nimport {\n forEachChild,\n type BinaryNode,\n type CallNode,\n type LambdaNode,\n type Node,\n type SpreadNode,\n} from '../syntax/ast.js'\nimport { formatType } from '../types.js'\n\n/**\n * A compiled node: a closure over the per-run state. Async closures resolve to\n * an {@link Out}, so no value from the host is ever awaited.\n */\ninterface Code {\n readonly fn: (s: State) => unknown\n readonly async: boolean\n}\n\n/** A child run from an async closure: `(await boxed(code)(s)).v`, a sync child never awaited. */\nfunction boxed(code: Code): (s: State) => Out | Promise<Out> {\n const fn = code.fn\n return code.async ? (fn as (s: State) => Promise<Out>) : (s) => new Out(fn(s))\n}\n\nexport interface CompiledProgram {\n /** Runs the program; an async one resolves to an {@link Out}. */\n readonly run: (s: State) => unknown\n readonly async: boolean\n readonly localCount: number\n}\n\ninterface Scope {\n readonly locals: ReadonlyMap<string, number>\n readonly it: number | undefined\n}\n\n/**\n * Steps charged per host function call unless the function declares its own\n * `cost`. Host calls often do real I/O, so one evaluation cannot make more\n * than maxSteps / cost of them.\n */\nconst DEFAULT_HOST_CALL_COST = 32\n/** Map literals with at most this many entries and no nested values skip value tracking. */\nconst SMALL_MAP_ENTRIES = 8\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n}\n\n/**\n * Host data (getters, Proxy traps, species or `then` hooks) can throw while\n * the engine reads it. Such failures surface as HOST_ERROR, never as a raw\n * JavaScript error. Only the errors this evaluation raised pass through: any\n * other Bonsai error a getter threw (from another evaluation, from parsing,\n * checking, or translating, or built by the host) is the host data's failure.\n */\nfunction hostDataError(error: unknown, s: State): unknown {\n if (isOwn(error)) return error\n // Out of stack, in the engine's recursion or a getter it called (telling them\n // apart would mean wrapping every read): a limit, which try() lets through.\n if (isStackOverflow(error)) return raised(tooDeep(s.source, error))\n return s.error('HOST_ERROR', `Reading host data failed: ${errorText(error)}`, undefined, error)\n}\n\n/**\n * Records a node's failure on its trace, as the error evaluation reports: host\n * data's failure is a HOST_ERROR here too, not the code of an error it threw.\n */\nfunction failed(trace: TraceRecord, error: unknown, s: State): unknown {\n const failure = hostDataError(error, s) as BonsaiError\n trace.error = { code: failure.code, message: failure.message }\n return failure\n}\n\n/** Rethrows a failure of exhaustive explain's extra work only if it is a limit. */\nfunction extraFailure(error: unknown, s: State): void {\n const failure = hostDataError(error, s)\n if (failure instanceof BonsaiLimitError) throw failure\n}\n\n/** Whether `try()` recovers from an error: runtime failures, not limits or host contract violations. */\nfunction recoverable(error: unknown): boolean {\n return error instanceof BonsaiRuntimeError && error.code !== 'HOST_CONTRACT'\n}\n\n/**\n * Compiles an analyzed tree. In `sync` mode every closure is synchronous. In\n * `async` mode only the nodes on a path to an async host call become async.\n */\nexport interface CompileOptions {\n /**\n * Instrument every node to record its value on `state.tracer` (for\n * explain()). Traced programs are compiled separately, so ordinary\n * evaluation pays nothing for tracing.\n */\n readonly trace?: boolean\n /**\n * Free local names the compiled tree may read (for compiling a sub-tree\n * on its own). They occupy slots 0..n-1 in order; the caller stores their\n * values in `state.locals` before running.\n */\n readonly locals?: readonly string[]\n /**\n * Variables with fixed values (a partial-evaluation residual's bindings).\n * Reading one returns its value without looking in the context.\n */\n readonly constants?: ReadonlyMap<string, unknown>\n /**\n * The recorded size and depth of constants an evaluation built (partial\n * evaluation's folded lists and maps), so a residual nests them as the\n * original expression would, not as host data.\n */\n readonly shapes?: WeakMap<object, number> | undefined\n}\n\nexport function compileProgram(\n analysis: Pick<Analysis, 'root' | 'calls'>,\n mode: 'sync' | 'async',\n options: CompileOptions = {},\n): CompiledProgram {\n return guardDepth(undefined, () => compileTree(analysis, mode, options))\n}\n\nfunction compileTree(\n analysis: Pick<Analysis, 'root' | 'calls'>,\n mode: 'sync' | 'async',\n options: CompileOptions,\n): CompiledProgram {\n let slots = 0\n const allowAsync = mode === 'async'\n const tracing = options.trace === true\n\n const sync = (fn: (s: State) => unknown): Code => ({ fn, async: false })\n const asyncCode = (fn: (s: State) => Promise<Out>): Code => ({ fn, async: true })\n\n function compile(node: Node, scope: Scope): Code {\n const code = compileNode(node, scope)\n return tracing ? instrument(node, code) : code\n }\n\n function instrument(node: Node, code: Code): Code {\n const fn = code.fn\n if (!code.async) {\n return sync((s) => {\n const tracer = s.tracer as Tracer\n const trace = tracer.enter(node)\n if (trace === undefined) return fn(s)\n try {\n const value = fn(s)\n trace.value = value\n return value\n } catch (error) {\n throw failed(trace, error, s)\n } finally {\n tracer.exit()\n }\n })\n }\n return asyncCode(async (s) => {\n const tracer = s.tracer as Tracer\n const trace = tracer.enter(node)\n if (trace === undefined) return fn(s) as Promise<Out>\n try {\n const out = (await fn(s)) as Out\n trace.value = out.v\n return out\n } catch (error) {\n throw failed(trace, error, s)\n } finally {\n tracer.exit()\n }\n })\n }\n\n function compileNode(node: Node, scope: Scope): Code {\n switch (node.type) {\n case 'Literal': {\n const value = node.value\n return sync(() => value)\n }\n case 'Variable': {\n const name = node.name\n if (options.constants?.has(name) === true) {\n const value = options.constants.get(name)\n const shape =\n typeof value === 'object' && value !== null ? options.shapes?.get(value) : undefined\n if (shape === undefined) return sync(() => value)\n return sync((s) => {\n ;(s.shapes ??= new WeakMap()).set(value as object, shape)\n return value\n })\n }\n return sync((s) => {\n const ctx = s.ctx\n if (!Object.hasOwn(ctx, name)) return null\n const value = ctx[name]\n return value === undefined ? null : value\n })\n }\n case 'Local': {\n const slot = scope.locals.get(node.name) as number\n return sync((s) => s.locals[slot])\n }\n case 'It': {\n const slot = scope.it as number\n return sync((s) => s.locals[slot])\n }\n case 'Member':\n return compileMember(node, scope)\n case 'Index': {\n const object = compile(node.object, scope)\n const index = compile(node.index, scope)\n return strict2(object, index, (s, o, k) => readIndex(o, k, s, node))\n }\n case 'Template':\n return compileTemplate(node, scope)\n case 'Unary': {\n const operand = compile(node.operand, scope)\n if (node.operator === '!')\n return strict1(operand, (s, v) => !truth(v, s, node.operand, '\"!\"'))\n return strict1(operand, (s, v) => {\n if (typeof v !== 'number' || !Number.isFinite(v)) return negate(v, s, node)\n return v === 0 ? 0 : -v\n })\n }\n case 'Binary':\n return compileBinary(node, scope)\n case 'Conditional': {\n const test = compile(node.test, scope)\n const then = compile(node.then, scope)\n const otherwise = compile(node.otherwise, scope)\n const at = node.test\n if (!test.async && !then.async && !otherwise.async) {\n const [t, a, b] = [test.fn, then.fn, otherwise.fn]\n return sync((s) => (truth(t(s), s, at, 'A condition') ? a(s) : b(s)))\n }\n const [t, a, b] = [boxed(test), boxed(then), boxed(otherwise)]\n return asyncCode(async (s) => (truth((await t(s)).v, s, at, 'A condition') ? a(s) : b(s)))\n }\n case 'List':\n return compileList(node.items, scope, node)\n case 'Map':\n return compileMap(node, scope)\n case 'Call':\n return compileCall(node, scope)\n case 'Lambda':\n throw new BonsaiRuntimeError(\n 'TYPE_ERROR',\n 'A lambda can only be passed to a function that takes one',\n {\n span: node,\n },\n )\n case 'Let': {\n const value = compile(node.value, scope)\n const slot = slots++\n const locals = new Map(scope.locals)\n locals.set(node.name, slot)\n const body = compile(node.body, { ...scope, locals })\n if (!value.async && !body.async) {\n const [v, b] = [value.fn, body.fn]\n return sync((s) => {\n s.locals[slot] = v(s)\n return b(s)\n })\n }\n const [v, b] = [boxed(value), boxed(body)]\n return asyncCode(async (s) => {\n s.locals[slot] = (await v(s)).v\n return b(s)\n })\n }\n case 'Has': {\n const target = node.target\n const object = compile(target.object, scope)\n if (target.type === 'Member') {\n const name = target.name\n return strict1(object, (s, o) => hasKey(o, name, s, node))\n }\n const key = compile(target.index, scope)\n return strict2(object, key, (s, o, k) => hasKey(o, k, s, node))\n }\n case 'Try': {\n const body = compile(node.body, scope)\n const fallback = compile(node.fallback, scope)\n if (!body.async && !fallback.async) {\n const [b, f] = [body.fn, fallback.fn]\n return sync((s) => {\n try {\n return b(s)\n } catch (error) {\n const failure = hostDataError(error, s)\n if (recoverable(failure)) return f(s)\n throw failure\n }\n })\n }\n const [b, f] = [boxed(body), boxed(fallback)]\n return asyncCode(async (s) => {\n try {\n return await b(s)\n } catch (error) {\n const failure = hostDataError(error, s)\n if (recoverable(failure)) return f(s)\n throw failure\n }\n })\n }\n }\n throw new Error('unreachable')\n }\n\n // Strict nodes evaluate every child left to right, then combine. One\n // semantic function serves both the sync and the async closure.\n function strict1(a: Code, combine: (s: State, x: unknown) => unknown): Code {\n const fa = a.fn\n if (!a.async) return sync((s) => combine(s, fa(s)))\n return asyncCode(async (s) => new Out(combine(s, ((await fa(s)) as Out).v)))\n }\n\n function strict2(a: Code, b: Code, combine: (s: State, x: unknown, y: unknown) => unknown): Code {\n const fa = a.fn\n const fb = b.fn\n if (!a.async && !b.async) return sync((s) => combine(s, fa(s), fb(s)))\n const [ba, bb] = [boxed(a), boxed(b)]\n return asyncCode(async (s) => {\n const x = (await ba(s)).v\n return new Out(combine(s, x, (await bb(s)).v))\n })\n }\n\n function compileMember(node: Extract<Node, { type: 'Member' }>, scope: Scope): Code {\n if (tracing) {\n // Every step of a.b.c is its own traced node.\n const object = compile(node.object, scope)\n const name = node.name\n return strict1(object, (s, o) => readMember(o, name, s, node))\n }\n // Fuse a chain of static member reads: a.b.c reads in one closure.\n const names: string[] = []\n const spans: Span[] = []\n let base: Node = node\n while (base.type === 'Member') {\n names.unshift(base.name)\n spans.unshift(base)\n base = base.object\n }\n if (names.length === 1 && (base.type === 'It' || base.type === 'Local')) {\n const slot = (base.type === 'It' ? scope.it : scope.locals.get(base.name)) as number\n const name = names[0]\n // `.field` in a lambda over a list of plain objects: read inline.\n return sync((s) => {\n const o = s.locals[slot] as { constructor?: unknown } | null | undefined\n if (o?.constructor === Object)\n return Object.hasOwn(o, name) ? ((o as Record<string, unknown>)[name] ?? null) : null\n return readMember(o, name, s, node)\n })\n }\n const object = compile(base, scope)\n if (names.length === 1) {\n const name = names[0]\n return strict1(object, (s, o) => readMember(o, name, s, node))\n }\n return strict1(object, (s, o) => {\n let value = o\n for (let i = 0; i < names.length; i++) {\n if (value === null || value === undefined) return null\n value = readMember(value, names[i], s, spans[i])\n }\n return value\n })\n }\n\n function compileTemplate(node: Extract<Node, { type: 'Template' }>, scope: Scope): Code {\n const parts = node.parts.map((part) => (typeof part === 'string' ? part : compile(part, scope)))\n const spans = node.parts.map((part) => (typeof part === 'string' ? node : part))\n const build = (s: State, values: unknown[]): string => {\n let out = ''\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n const piece = typeof value === 'string' ? value : toText(value, s, spans[i])\n s.stringLimit(out.length + piece.length, node)\n out += piece\n }\n s.charge(1 + (out.length >>> TEXT_SHIFT))\n return out\n }\n if (parts.every((part) => typeof part === 'string' || !part.async)) {\n return sync((s) =>\n build(\n s,\n parts.map((part) => (typeof part === 'string' ? part : part.fn(s))),\n ),\n )\n }\n const runs = parts.map((part) => (typeof part === 'string' ? part : boxed(part)))\n return asyncCode(async (s) => {\n const values: unknown[] = []\n for (const run of runs) values.push(typeof run === 'string' ? run : (await run(s)).v)\n return new Out(build(s, values))\n })\n }\n\n function compileBinary(node: BinaryNode, scope: Scope): Code {\n const left = compile(node.left, scope)\n const right = compile(node.right, scope)\n const op = node.operator\n const at: Span = node\n const l = left.fn\n const r = right.fn\n const anyAsync = left.async || right.async\n const [bl, br] = [boxed(left), boxed(right)]\n\n if (tracing && (op === '&&' || op === '||')) return compileExplainedLogic(node, left, right)\n\n switch (op) {\n case '&&':\n if (!anyAsync)\n return sync(\n (s) => truth(l(s), s, node.left, '\"&&\"') && truth(r(s), s, node.right, '\"&&\"'),\n )\n return asyncCode(\n async (s) =>\n new Out(\n truth((await bl(s)).v, s, node.left, '\"&&\"') &&\n truth((await br(s)).v, s, node.right, '\"&&\"'),\n ),\n )\n case '||':\n if (!anyAsync)\n return sync(\n (s) => truth(l(s), s, node.left, '\"||\"') || truth(r(s), s, node.right, '\"||\"'),\n )\n return asyncCode(\n async (s) =>\n new Out(\n truth((await bl(s)).v, s, node.left, '\"||\"') ||\n truth((await br(s)).v, s, node.right, '\"||\"'),\n ),\n )\n case '??':\n if (!anyAsync) return sync((s) => l(s) ?? r(s))\n return asyncCode(async (s) => {\n const a = await bl(s)\n return a.v === null || a.v === undefined ? br(s) : a\n })\n case '!=':\n case '%':\n case '*':\n case '**':\n case '+':\n case '-':\n case '/':\n case '<':\n case '<=':\n case '==':\n case '>':\n case '>=':\n case 'in':\n case 'not in':\n default:\n break\n }\n\n if (!anyAsync) return sync(binaryOp(op, l, r, at))\n // Rare: the operands are awaited, then combined by the same closure.\n return asyncCode(async (s) => {\n const a = (await bl(s)).v\n const b = (await br(s)).v\n return new Out(\n binaryOp(\n op,\n () => a,\n () => b,\n at,\n )(s),\n )\n })\n }\n\n /**\n * && and || when explaining. With `exhaustive`, the side that\n * short-circuiting would skip is still evaluated (and traced) so every\n * deciding condition is recorded; its evaluation errors are ignored and the\n * result is the ordinary one.\n */\n function compileExplainedLogic(node: BinaryNode, left: Code, right: Code): Code {\n const isAnd = node.operator === '&&'\n const what = `\"${node.operator}\"`\n const extraSync = (s: State, r: (s: State) => unknown): void => {\n const tracer = s.tracer as Tracer\n tracer.extraDepth++\n try {\n r(s)\n } catch (error) {\n // Only limits stop the extra work; its failures (host data included) are ignored.\n extraFailure(error, s)\n } finally {\n tracer.extraDepth--\n }\n }\n if (!left.async && !right.async) {\n const [l, r] = [left.fn, right.fn]\n return sync((s) => {\n const a = truth(l(s), s, node.left, what)\n if (a !== isAnd) {\n if ((s.tracer as Tracer).exhaustive) extraSync(s, r)\n return a\n }\n return truth(r(s), s, node.right, what)\n })\n }\n const [bl, br] = [boxed(left), boxed(right)]\n return asyncCode(async (s) => {\n const a = truth((await bl(s)).v, s, node.left, what)\n if (a !== isAnd) {\n const tracer = s.tracer as Tracer\n if (tracer.exhaustive) {\n tracer.extraDepth++\n try {\n await br(s)\n } catch (error) {\n extraFailure(error, s)\n } finally {\n tracer.extraDepth--\n }\n }\n return new Out(a)\n }\n return new Out(truth((await br(s)).v, s, node.right, what))\n })\n }\n\n function compileList(items: readonly (Node | SpreadNode)[], scope: Scope, at: Span): Code {\n const codes = items.map((item) =>\n item.type === 'Spread' ? compile(item.argument, scope) : compile(item, scope),\n )\n const spreads = items.map((item) => item.type === 'Spread')\n const build = (s: State, values: unknown[]): unknown[] => {\n let length = 0\n for (let i = 0; i < values.length; i++) {\n if (!spreads[i]) length++\n else {\n const value = values[i]\n if (value === null || value === undefined) continue\n if (!Array.isArray(value)) {\n throw s.error(\n 'TYPE_ERROR',\n `Only a list can be spread into a list, not ${describeKind(value)}`,\n items[i],\n )\n }\n length += value.length\n }\n }\n s.listLimit(length, at)\n s.charge(1 + length)\n const out = new Array<unknown>(length)\n let k = 0\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (!spreads[i]) out[k++] = value\n else if (Array.isArray(value))\n // oxlint-disable-next-line typescript/prefer-for-of -- indexing never invokes a host array's own Symbol.iterator\n for (let j = 0; j < value.length; j++) out[k++] = value[j] === undefined ? null : value[j]\n }\n track(out, s, at)\n return out\n }\n if (codes.every((code) => !code.async)) {\n const fns = codes.map((code) => code.fn)\n if (!spreads.includes(true)) {\n const n = fns.length\n return sync((s) => {\n s.listLimit(n, at)\n const out = new Array<unknown>(n)\n for (let i = 0; i < n; i++) out[i] = fns[i](s)\n // Charged after the items, as the general (spread and async) path does.\n s.charge(1 + n)\n track(out, s, at)\n return out\n })\n }\n return sync((s) =>\n build(\n s,\n fns.map((fn) => fn(s)),\n ),\n )\n }\n const runs = codes.map(boxed)\n // Without spreads the length is known up front, checked before any item runs as above.\n const n = spreads.includes(true) ? -1 : runs.length\n return asyncCode(async (s) => {\n if (n >= 0) s.listLimit(n, at)\n const values: unknown[] = []\n for (const run of runs) values.push((await run(s)).v)\n return new Out(build(s, values))\n })\n }\n\n function compileMap(node: Extract<Node, { type: 'Map' }>, scope: Scope): Code {\n type Step =\n | { kind: 'static'; key: string; value: Code }\n | { kind: 'computed'; key: Code; value: Code; at: Span }\n | { kind: 'spread'; value: Code; at: Span }\n const steps: Step[] = node.entries.map((entry): Step => {\n if (entry.type === 'Spread')\n return { kind: 'spread', value: compile(entry.argument, scope), at: entry }\n if (typeof entry.key === 'string')\n return { kind: 'static', key: entry.key, value: compile(entry.value, scope) }\n return {\n kind: 'computed',\n key: compile(entry.key, scope),\n value: compile(entry.value, scope),\n at: entry.key,\n }\n })\n const assign = (\n s: State,\n out: Record<string, unknown>,\n step: Step,\n key: unknown,\n value: unknown,\n ): boolean => {\n // Returns whether the map may now need tracking (a nested value, or copied keys).\n if (step.kind === 'static') out[step.key] = value\n else if (step.kind === 'computed') out[mapKey(key, s, step.at)] = value\n else {\n if (value === null || value === undefined) return false\n if (!isMap(value))\n throw s.error(\n 'TYPE_ERROR',\n `Only a map can be spread into a map, not ${describeKind(value)}`,\n step.at,\n )\n const keys = Object.keys(value)\n s.charge(keyListCost(keys.length) + mapBuildCost(keys.length))\n for (const k of keys) {\n chargeKey(s, k)\n // A key holding undefined is absent (see holdsKey), so it is not copied.\n if (BLOCKED_NAMES.has(k)) continue\n const v = value[k]\n if (v !== undefined) out[k] = v\n }\n return true\n }\n return value !== null && typeof value === 'object'\n }\n // Small flat maps need no record (see `track`).\n const large = steps.length > SMALL_MAP_ENTRIES\n const isAsync = steps.some(\n (step) => step.value.async || (step.kind === 'computed' && step.key.async),\n )\n if (!isAsync) {\n const entryCost = 1 + steps.length\n return sync((s) => {\n const out = {}\n s.charge(entryCost)\n let nested = large\n for (const step of steps)\n if (\n assign(\n s,\n out,\n step,\n step.kind === 'computed' ? step.key.fn(s) : undefined,\n step.value.fn(s),\n )\n )\n nested = true\n if (nested) track(out, s, node)\n return out\n })\n }\n const runs = steps.map((step) => ({\n key: step.kind === 'computed' ? boxed(step.key) : undefined,\n value: boxed(step.value),\n }))\n return asyncCode(async (s) => {\n const out = {}\n s.charge(1 + steps.length)\n let nested = large\n for (let i = 0; i < steps.length; i++) {\n const { key, value } = runs[i]\n const k = key === undefined ? undefined : (await key(s)).v\n if (assign(s, out, steps[i], k, (await value(s)).v)) nested = true\n }\n if (nested) track(out, s, node)\n return new Out(out)\n })\n }\n\n // === calls ===\n\n function compileLambda(node: LambdaNode, scope: Scope): Code {\n // Produces a closure that, given the run state, returns the JS function the\n // built-in will invoke. Parameters live in dedicated local slots.\n let inner: Scope\n let first: number\n let second = -1\n if (node.implicit) {\n first = slots++\n inner = { locals: scope.locals, it: first }\n } else {\n const locals = new Map(scope.locals)\n first = slots++\n locals.set(node.params[0] ?? '\\0', first)\n if (node.params.length > 1) {\n second = slots++\n locals.set(node.params[1], second)\n }\n inner = { locals, it: undefined }\n }\n const body = compile(node.body, inner)\n const b = body.fn\n // Each invocation costs the static size of the body, so a large body run\n // over many items is bounded like the equivalent amount of written code.\n const cost = sizeOf(node.body)\n const make = (s: State) => {\n const locals = s.locals\n const run =\n second === -1\n ? (item: unknown) => {\n if ((s.steps += cost) >= s.nextSample) s.sample()\n locals[first] = item === undefined ? null : item\n return b(s)\n }\n : (item: unknown, index: unknown) => {\n if ((s.steps += cost) >= s.nextSample) s.sample()\n locals[first] = item === undefined ? null : item\n locals[second] = index === undefined ? null : index\n return b(s)\n }\n // Name the failing item: \"... (at item 3)\". Only the innermost lambda annotates.\n // Built-ins call lambdas as (item, index); reduce calls (acc, item, index).\n const annotated = (argA: unknown, argB: unknown, position?: number): unknown => {\n const index = position ?? argB\n try {\n const result = run(argA, argB)\n return body.async ? annotateAsync(result as Promise<unknown>, index) : result\n } catch (error) {\n throw annotate(error, index)\n }\n }\n if (!tracing) return annotated\n // Record each run as an iteration of the enclosing call.\n return (argA: unknown, argB: unknown, position?: number) => {\n const tracer = s.tracer as Tracer\n const recorded =\n position === undefined\n ? tracer.enterIteration(node, typeof argB === 'number' ? argB : 0, argA)\n : tracer.enterIteration(node, position, argB, argA)\n if (!body.async) {\n try {\n return annotated(argA, argB, position)\n } finally {\n tracer.exitIteration(recorded)\n }\n }\n return (async () => {\n try {\n return await annotated(argA, argB, position)\n } finally {\n tracer.exitIteration(recorded)\n }\n })()\n }\n }\n return { fn: make, async: body.async }\n }\n\n function compileCall(node: CallNode, scope: Scope): Code {\n const plan = analysis.calls.get(node)\n if (plan === undefined) {\n throw new BonsaiRuntimeError('NO_OVERLOAD', `Unknown function \"${node.name}\"`, { span: node })\n }\n const def = plan.def\n const argCodes: Code[] = []\n const kinds: ('value' | 'spread' | 'lambda')[] = []\n for (const arg of node.args) {\n if (arg.type === 'Spread') {\n argCodes.push(compile(arg.argument, scope))\n kinds.push('spread')\n } else if (arg.type === 'Lambda') {\n argCodes.push(compileLambda(arg, scope))\n kinds.push('lambda')\n } else {\n argCodes.push(compile(arg, scope))\n kinds.push('value')\n }\n }\n const invoke = makeInvoker(node, plan)\n const lambdaAsync = argCodes.some((code, i) => kinds[i] === 'lambda' && code.async)\n const valuesAsync = argCodes.some((code, i) => kinds[i] !== 'lambda' && code.async)\n const hostAsync = def.async === true && allowAsync\n const hasSpread = kinds.includes('spread')\n const optional = node.optional\n\n const collect = (s: State, values: unknown[]): unknown[] => {\n if (!hasSpread) return values\n const out: unknown[] = []\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (kinds[i] !== 'spread') out.push(value)\n else if (Array.isArray(value)) {\n s.charge(value.length)\n // oxlint-disable-next-line typescript/prefer-for-of -- indexing never invokes a host array's own Symbol.iterator\n for (let j = 0; j < value.length; j++) out.push(value[j] === undefined ? null : value[j])\n } else if (value !== null && value !== undefined) {\n throw s.error(\n 'TYPE_ERROR',\n `Only a list can be spread into arguments, not ${describeKind(value)}`,\n node.args[i],\n )\n }\n }\n return out\n }\n\n if (!lambdaAsync && !valuesAsync && !hostAsync) {\n const fns = argCodes.map((code) => code.fn)\n const n = fns.length\n return sync((s) => {\n const values = new Array<unknown>(n)\n for (let i = 0; i < n; i++) {\n values[i] = fns[i](s)\n if (i === 0 && optional && (values[0] === null || values[0] === undefined)) return null\n }\n return invoke(s, collect(s, values), false)\n })\n }\n // A lambda argument is the function built-ins call, never awaited.\n const runs = argCodes.map((code, i) =>\n kinds[i] === 'lambda' ? (s: State) => new Out(code.fn(s)) : boxed(code),\n )\n // Running async lambdas, a built-in resolves to an Out; so does an async host call.\n const settles = (lambdaAsync && def.host !== true) || hostAsync\n return asyncCode(async (s) => {\n const values = new Array<unknown>(runs.length)\n for (let i = 0; i < runs.length; i++) {\n values[i] = (await runs[i](s)).v\n if (i === 0 && optional && (values[0] === null || values[0] === undefined))\n return new Out(null)\n }\n const result = invoke(s, collect(s, values), lambdaAsync)\n return settles ? (result as Out | Promise<Out>) : new Out(result)\n })\n }\n\n function makeInvoker(\n node: CallNode,\n plan: CallPlan,\n ): (s: State, args: unknown[], asyncLambdas: boolean) => unknown {\n const def = plan.def\n const overloads = plan.candidates.map((index) => def.overloads[index])\n const host = def.host === true\n const hostCost = def.cost ?? DEFAULT_HOST_CALL_COST\n const span: Span = node\n\n const callOverload = (\n s: State,\n overload: Overload,\n args: unknown[],\n asyncLambdas: boolean,\n ): unknown => {\n const site: CallSite = { state: s, span }\n if (!host) {\n chargeArguments(s, args)\n if (asyncLambdas) {\n if (overload.runAsync === undefined)\n throw s.error('ASYNC_IN_SYNC', `${def.name}() cannot run an async lambda`, span)\n return overload.runAsync(args, site).then((out) => new Out(checkProduced(s, out.v, span)))\n }\n return checkProduced(s, overload.run(args, site), span)\n }\n s.charge(hostCost)\n let result: unknown\n let thenable: boolean\n let controller: AbortController | undefined\n try {\n if (def.call === true) {\n controller = new AbortController()\n const call = Object.freeze({ context: s.hostCtx, signal: controller.signal })\n result = overload.run([call, ...args], site)\n } else {\n result = overload.run(args, site)\n }\n thenable = isThenable(result)\n } catch (error) {\n throw hostError(s, def.name, error, span)\n }\n if (thenable && controller !== undefined) callControllers.set(result as object, controller)\n if (thenable) {\n if (!allowAsync || def.async !== true) {\n // Swallow the rejection of the orphaned promise; the call already failed.\n try {\n // Only a native promise: calling a thenable's `then` would run host code.\n if (result instanceof Promise)\n void Promise.prototype.then.call(result, undefined, () => undefined)\n } catch {\n // A hostile thenable; nothing more to clean up.\n }\n const error =\n def.async === true\n ? s.error(\n 'ASYNC_IN_SYNC',\n `${def.name}() is async; use evaluate() instead of evaluateSync()`,\n span,\n )\n : s.error(\n 'HOST_CONTRACT',\n `${def.name}() returned a promise but is not declared async`,\n span,\n )\n // Nothing waits on that promise: tell the host function to stop its work.\n controller?.abort(forHost(error))\n throw error\n }\n return awaitHost(s, result as PromiseLike<unknown>, node, def)\n }\n s.checkTime()\n const checked = checkHostResult(s, def, overload, result, span)\n // An async call's closure expects an Out (see compileCall).\n return allowAsync && def.async === true ? new Out(checked) : checked\n }\n\n // Static types describe declared data, but the context is not validated\n // against them, so argument kinds are always checked before a call.\n if (overloads.length === 1) {\n const overload = overloads[0]\n return (s, args, asyncLambdas) => {\n if (!matches(s, overload, args, host)) throw noOverload(s, def, node, args)\n return callOverload(s, overload, args, asyncLambdas)\n }\n }\n return (s, args, asyncLambdas) => {\n for (const overload of overloads) {\n if (matches(s, overload, args, host)) return callOverload(s, overload, args, asyncLambdas)\n }\n throw noOverload(s, def, node, args)\n }\n }\n\n const freeLocals = new Map<string, number>()\n for (const name of options.locals ?? []) freeLocals.set(name, slots++)\n const root = compile(analysis.root, { locals: freeLocals, it: undefined })\n const fn = root.fn\n const run = root.async\n ? (s: State): unknown =>\n (fn(s) as Promise<Out>).catch((error: unknown) => {\n throw hostDataError(error, s)\n })\n : (s: State): unknown => {\n try {\n return fn(s)\n } catch (error) {\n throw hostDataError(error, s)\n }\n }\n return { run, async: root.async, localCount: slots }\n}\n\nfunction matches(s: State, overload: Overload, args: unknown[], host: boolean): boolean {\n const required = overload.required ?? overload.params.length\n if (args.length < required) return false\n if (args.length > overload.params.length && overload.rest === undefined) return false\n for (let i = 0; i < args.length; i++) {\n const param = overload.params[i] ?? overload.rest\n if (param === undefined) return false\n const arg = args[i]\n if (\n i >= required &&\n i < overload.params.length &&\n (arg === null || arg === undefined) &&\n param.kind !== 'function'\n ) {\n // An omitted-or-null optional argument uses the default.\n continue\n }\n if (host ? !conforms(arg, param, s) : !matchesKind(arg, param)) return false\n }\n return true\n}\n\n/**\n * Built-ins pay for the text they are given (string operations are linear in\n * their input). Work over list elements is charged by each built-in, since\n * many list operations (at, first, slice) touch only part of the list.\n */\nfunction chargeArguments(s: State, args: unknown[]): void {\n let cost = 1\n for (const arg of args) if (typeof arg === 'string') cost += arg.length >>> TEXT_SHIFT\n s.charge(cost)\n}\n\n/**\n * Every string or list a built-in returns is a produced value subject to the\n * size limits, and text it produces is charged by length (see TEXT_SHIFT).\n */\nfunction checkProduced(s: State, result: unknown, span: Span): unknown {\n if (typeof result === 'string') {\n if (result.length > s.limits.maxStringLength) s.stringLimit(result.length, span)\n s.charge(result.length >>> TEXT_SHIFT)\n } else if (Array.isArray(result)) {\n if (result.length > s.limits.maxListLength) s.listLimit(result.length, span)\n }\n return result\n}\n\nfunction noOverload(\n s: State,\n def: FunctionDef,\n node: CallNode,\n args: unknown[],\n): BonsaiRuntimeError {\n if (args.length > 0 && (args[0] === null || args[0] === undefined)) {\n return s.error(\n 'NULL_RECEIVER',\n node.style === 'method'\n ? `Cannot call .${def.name}() on null; use ?.${def.name}() or ?? to supply a default`\n : `${def.name}() cannot take null as its first argument; use ?? to supply a default`,\n node,\n )\n }\n const shown = args\n .map((arg) => (typeof arg === 'function' ? 'a lambda' : describeKind(arg)))\n .join(', ')\n const signatures = def.overloads.map((overload) => signatureText(def.name, overload)).join('; ')\n return s.error(\n 'NO_OVERLOAD',\n `${def.name}() cannot take (${shown}); expected ${signatures}`,\n node,\n )\n}\n\n/**\n * Whatever a host function throws is a HOST_ERROR with the original as its\n * cause, even a Bonsai error (say, a limit hit by an evaluation the host ran\n * itself) or a stack overflow: it failed in host code, not in this expression,\n * and the depth limits leave host code most of the stack.\n */\nfunction hostError(s: State, name: string, error: unknown, span: Span): BonsaiError {\n return s.error('HOST_ERROR', `${name}() failed: ${errorText(error)}`, span, error)\n}\n\n/**\n * Host results must conform, deeply, to the declared result type (checked\n * against the step budget); undefined reads as null. A mismatch is a broken\n * host contract, which `try()` does not recover from.\n */\nfunction checkHostResult(\n s: State,\n def: FunctionDef,\n overload: Overload,\n result: unknown,\n span: Span,\n): unknown {\n const value = result === undefined ? null : result\n if (!conforms(value, overload.result, s)) {\n throw s.error(\n 'HOST_CONTRACT',\n `${def.name}() returned ${result === undefined ? 'undefined' : describeKind(value)}, which does not match its declared type ${formatType(overload.result)}`,\n span,\n )\n }\n return value\n}\n\n/**\n * The controller behind the `call.signal` a host function received, by the\n * promise it returned, so ending the wait early also aborts the host's work.\n */\nconst callControllers = new WeakMap<object, AbortController>()\n\nasync function awaitHost(\n s: State,\n promise: PromiseLike<unknown>,\n node: CallNode,\n def: FunctionDef,\n): Promise<Out> {\n const controller = callControllers.get(promise)\n // A rejection from the host is a HOST_ERROR; the limit errors racing it are not.\n // The value is boxed, so a thenable it holds is never adopted in turn.\n const settled = Promise.resolve(promise).then(\n (value) => new Out(value),\n (error: unknown) => {\n throw hostError(s, node.name, error, node)\n },\n )\n const result = ((await raceLimits(s, settled, controller)) as Out).v\n s.checkTime()\n return new Out(checkHostResult(s, def, def.overloads[0], result, node))\n}\n\n/** The longest delay a timer accepts (2^31 - 1 ms); a longer one fires at once. */\nconst MAX_TIMER_DELAY = 2_147_483_647\n\n/**\n * Waits for a host promise, rejecting early on timeout or abort. The signal is\n * host code: a listener method that throws counts as an abort, a cleanup that\n * throws is ignored, and the promise always settles exactly once. Ending the\n * wait early also aborts `controller`, the host call's own signal.\n */\nfunction raceLimits(\n s: State,\n promise: PromiseLike<unknown>,\n controller?: AbortController,\n): Promise<unknown> {\n const signal = s.signal\n const deadline = s.deadline\n if (signal === undefined && deadline === 0) return Promise.resolve(promise)\n // Rejection reasons are passed through unchanged; they are Bonsai errors or\n // whatever the host promise rejected with.\n return new Promise((resolve, reject: (reason: Error) => void) => {\n let settled = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const cleanup = (): void => {\n if (timer !== undefined) clearTimeout(timer)\n try {\n signal?.removeEventListener('abort', onAbort)\n } catch {\n // A broken signal cannot keep the evaluation from settling.\n }\n }\n const finish = (settle: () => void): void => {\n if (settled) return\n settled = true\n cleanup()\n settle()\n }\n // A limit ended the wait: reject, and tell the host function to stop.\n const fail = (error: Error): void => {\n reject(error)\n controller?.abort(forHost(error))\n }\n // An abort event (or a signal that fails) ends the wait even if the signal\n // does not read as aborted afterwards.\n const abort = (): void => {\n finish(() => {\n try {\n s.checkTime()\n fail(\n raised(\n new BonsaiLimitError('ABORTED', 'Evaluation was aborted', {\n source: s.source,\n cause: s.signalError,\n }),\n ),\n )\n } catch (error) {\n fail(error as Error)\n }\n })\n }\n function onAbort(): void {\n abort()\n }\n const arm = (): void => {\n const wait = deadline - performance.now()\n timer = setTimeout(\n () => {\n // A deadline beyond the longest timer delay is reached in steps.\n if (wait > MAX_TIMER_DELAY) {\n arm()\n return\n }\n // The timer is set for the deadline, so it has passed even if the\n // clock reads a hair earlier (timers and performance.now() differ).\n finish(() => {\n fail(s.limit('TIMEOUT', 'Evaluation timed out'))\n })\n },\n Math.min(MAX_TIMER_DELAY, Math.max(0, wait) + 1),\n )\n }\n if (deadline !== 0) arm()\n if (signal !== undefined) {\n try {\n signal.addEventListener('abort', onAbort, { once: true })\n } catch (error) {\n s.signalError = error\n abort()\n }\n }\n // A signal aborted (or a deadline passed) before the wait began.\n try {\n s.checkTime()\n } catch (error) {\n finish(() => {\n fail(error as Error)\n })\n }\n Promise.resolve(promise).then(\n (value) => {\n finish(() => {\n resolve(value)\n })\n },\n (error: unknown) => {\n finish(() => {\n reject(error as Error)\n })\n },\n )\n })\n}\n\ntype Fn = (s: State) => unknown\n\nconst annotated = new WeakSet()\n\nfunction annotate(error: unknown, index: unknown): unknown {\n if (error instanceof BonsaiRuntimeError && typeof index === 'number' && !annotated.has(error)) {\n annotated.add(error)\n error.message = `${error.message} (at item ${index})`\n }\n return error\n}\n\nasync function annotateAsync(result: Promise<unknown>, index: unknown): Promise<unknown> {\n try {\n return await result\n } catch (error) {\n throw annotate(error, index)\n }\n}\n\nfunction sizeOf(node: Node): number {\n let size = 1\n forEachChild(node, (child) => {\n size += sizeOf(child)\n })\n return size\n}\n\n/**\n * One closure per strict operator, reading both operands itself: a shared\n * combinator would be a megamorphic call site (about 2x slower arithmetic).\n */\nfunction binaryOp(op: BinaryNode['operator'], l: Fn, r: Fn, at: Span): Fn {\n switch (op) {\n case '==':\n return (s) => {\n const a = l(s)\n const b = r(s)\n return isEqual(a, b, s)\n }\n case '!=':\n return (s) => {\n const a = l(s)\n const b = r(s)\n return !isEqual(a, b, s)\n }\n case '<':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a < b\n const o = order(a, b, s, at)\n return o !== undefined && o < 0\n }\n case '<=':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a <= b\n const o = order(a, b, s, at)\n return o !== undefined && o <= 0\n }\n case '>':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a > b\n const o = order(a, b, s, at)\n return o !== undefined && o > 0\n }\n case '>=':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') return a >= b\n const o = order(a, b, s, at)\n return o !== undefined && o >= 0\n }\n case '+':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') {\n const x = a + b\n if (Number.isFinite(x)) return x\n }\n return add(a, b, s, at)\n }\n case '-':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') {\n const x = a - b\n if (Number.isFinite(x)) return x\n }\n return subtract(a, b, s, at)\n }\n case '*':\n return (s) => {\n const a = l(s)\n const b = r(s)\n if (typeof a === 'number' && typeof b === 'number') {\n const x = a * b\n if (Number.isFinite(x)) return x\n }\n return multiply(a, b, s, at)\n }\n case '/':\n return (s) => divide(l(s), r(s), s, at)\n case '%':\n return (s) => remainder(l(s), r(s), s, at)\n case '**':\n return (s) => power(l(s), r(s), s, at)\n case 'in':\n return (s) => {\n const a = l(s)\n return contains(r(s), a, s, at)\n }\n case 'not in':\n return (s) => {\n const a = l(s)\n return !contains(r(s), a, s, at)\n }\n case '&&':\n case '||':\n case '??':\n default:\n throw new Error('unreachable')\n }\n}\n"],"mappings":"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"}
|
package/dist/declared.mjs
CHANGED
|
@@ -10,7 +10,14 @@ function recordDeclared(program, variables) {
|
|
|
10
10
|
function declaredVariables(program) {
|
|
11
11
|
return declared.get(program);
|
|
12
12
|
}
|
|
13
|
+
const compiled = /* @__PURE__ */ new WeakMap();
|
|
14
|
+
function recordCompiled(program, facts) {
|
|
15
|
+
compiled.set(program, facts);
|
|
16
|
+
}
|
|
17
|
+
function compiledFacts(program) {
|
|
18
|
+
return compiled.get(program);
|
|
19
|
+
}
|
|
13
20
|
//#endregion
|
|
14
|
-
export { declaredVariables, recordDeclared };
|
|
21
|
+
export { compiledFacts, declaredVariables, recordCompiled, recordDeclared };
|
|
15
22
|
|
|
16
23
|
//# sourceMappingURL=declared.mjs.map
|
package/dist/declared.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared.mjs","names":[],"sources":["../src/declared.ts"],"sourcesContent":["import type { Type } from './types.js'\n\n/**\n * The variables the environment of each compiled program declares. Internal:\n * the query translators read it to check declared columns against them.\n */\nconst declared = new WeakMap<object, Readonly<Record<string, Type>>>()\n\nexport function recordDeclared(\n program: object,\n variables: Readonly<Record<string, Type>> | undefined,\n): void {\n if (variables !== undefined) declared.set(program, variables)\n}\n\nexport function declaredVariables(program: object): Readonly<Record<string, Type>> | undefined {\n return declared.get(program)\n}\n"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"declared.mjs","names":[],"sources":["../src/declared.ts"],"sourcesContent":["import type { Analysis } from './check/checker.js'\nimport type { FunctionDef } from './functions/define.js'\nimport type { Type } from './types.js'\n\n/**\n * The variables the environment of each compiled program declares. Internal:\n * the query translators read it to check declared columns against them.\n */\nconst declared = new WeakMap<object, Readonly<Record<string, Type>>>()\n\nexport function recordDeclared(\n program: object,\n variables: Readonly<Record<string, Type>> | undefined,\n): void {\n if (variables !== undefined) declared.set(program, variables)\n}\n\nexport function declaredVariables(program: object): Readonly<Record<string, Type>> | undefined {\n return declared.get(program)\n}\n\n/** What a compiled program was checked against, for toArtifact. */\nexport interface CompiledFacts {\n readonly source: string\n readonly analysis: Analysis\n readonly expect: Type | undefined\n readonly lookup: (name: string) => FunctionDef | undefined\n readonly variables: Readonly<Record<string, Type>> | undefined\n}\n\nconst compiled = new WeakMap<object, CompiledFacts>()\n\nexport function recordCompiled(program: object, facts: CompiledFacts): void {\n compiled.set(program, facts)\n}\n\nexport function compiledFacts(program: object): CompiledFacts | undefined {\n return compiled.get(program)\n}\n"],"mappings":";;;;;AAQA,MAAM,2BAAW,IAAI,QAAgD;AAErE,SAAgB,eACd,SACA,WACM;CACN,IAAI,cAAc,KAAA,GAAW,SAAS,IAAI,SAAS,SAAS;AAC9D;AAEA,SAAgB,kBAAkB,SAA6D;CAC7F,OAAO,SAAS,IAAI,OAAO;AAC7B;AAWA,MAAM,2BAAW,IAAI,QAA+B;AAEpD,SAAgB,eAAe,SAAiB,OAA4B;CAC1E,SAAS,IAAI,SAAS,KAAK;AAC7B;AAEA,SAAgB,cAAc,SAA4C;CACxE,OAAO,SAAS,IAAI,OAAO;AAC7B"}
|
package/dist/digest.mjs
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
//#region src/digest.ts
|
|
2
|
+
/** Text with its length first, so no two sequences of texts encode alike. */
|
|
3
|
+
function lengthPrefixed(value) {
|
|
4
|
+
return `${value.length}:${value}`;
|
|
5
|
+
}
|
|
6
|
+
const typeCodes = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
/**
|
|
8
|
+
* A type's canonical encoding: object fields sorted by key, nested unions
|
|
9
|
+
* flattened and their members sorted and deduplicated, literals tagged by kind.
|
|
10
|
+
* Two types the checker treats alike encode alike, whatever order they were
|
|
11
|
+
* written in. Whether a map type is exact (known to hold only its fields, as a
|
|
12
|
+
* map literal's inferred type is) is not encoded: it does not survive JSON,
|
|
13
|
+
* and an artifact records the checker's decisions that depended on it.
|
|
14
|
+
*/
|
|
15
|
+
function encodeType(type) {
|
|
16
|
+
let code = typeCodes.get(type);
|
|
17
|
+
if (code === void 0) typeCodes.set(type, code = encode(type));
|
|
18
|
+
return code;
|
|
19
|
+
}
|
|
20
|
+
function encode(type) {
|
|
21
|
+
switch (type.kind) {
|
|
22
|
+
case "any":
|
|
23
|
+
case "never":
|
|
24
|
+
case "null":
|
|
25
|
+
case "boolean":
|
|
26
|
+
case "number":
|
|
27
|
+
case "string":
|
|
28
|
+
case "timestamp":
|
|
29
|
+
case "duration": return type.kind;
|
|
30
|
+
case "literal": {
|
|
31
|
+
const value = type.value;
|
|
32
|
+
if (typeof value === "string") return `s${lengthPrefixed(value)}`;
|
|
33
|
+
if (typeof value === "number") return `n${lengthPrefixed(String(value))}`;
|
|
34
|
+
return value ? "true" : "false";
|
|
35
|
+
}
|
|
36
|
+
case "list": return `[${encodeType(type.element)}]`;
|
|
37
|
+
case "map": {
|
|
38
|
+
const fields = Object.keys(type.fields).sort().map((key) => `${lengthPrefixed(key)}=${encodeType(type.fields[key])}`);
|
|
39
|
+
const rest = type.rest === void 0 ? "" : `...${encodeType(type.rest)}`;
|
|
40
|
+
return `{${fields.join(",")}${rest}}`;
|
|
41
|
+
}
|
|
42
|
+
case "union": {
|
|
43
|
+
const members = /* @__PURE__ */ new Set();
|
|
44
|
+
const add = (member) => {
|
|
45
|
+
if (member.kind === "union") member.types.forEach(add);
|
|
46
|
+
else members.add(encodeType(member));
|
|
47
|
+
};
|
|
48
|
+
type.types.forEach(add);
|
|
49
|
+
members.delete("never");
|
|
50
|
+
if (members.size === 0) return "never";
|
|
51
|
+
if (members.size === 1) return [...members][0];
|
|
52
|
+
return `(${[...members].sort().join("|")})`;
|
|
53
|
+
}
|
|
54
|
+
case "opaque": return `opaque${lengthPrefixed(type.name)}`;
|
|
55
|
+
case "function": return `fn(${type.params.map(encodeType).join(",")})${encodeType(type.result)}`;
|
|
56
|
+
default: return `var${lengthPrefixed(type.name)}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Everything about a function the checker's decisions depend on: whether it is
|
|
61
|
+
* a host function (the checker refines some built-ins' results, and a host
|
|
62
|
+
* function of the same name replaces the built-in), its flags, and each
|
|
63
|
+
* overload in order. Flags are normalized, since built-ins leave them unset
|
|
64
|
+
* where host functions set them to false.
|
|
65
|
+
*/
|
|
66
|
+
function encodeFunction(def) {
|
|
67
|
+
const overloads = def.overloads.map((overload) => {
|
|
68
|
+
const required = overload.required ?? overload.params.length;
|
|
69
|
+
const params = overload.params.map(encodeType).join(",");
|
|
70
|
+
const rest = overload.rest === void 0 ? "" : `...${encodeType(overload.rest)}`;
|
|
71
|
+
const ordered = overload.ordered === void 0 ? "" : lengthPrefixed(overload.ordered.join(","));
|
|
72
|
+
return `${required}(${params}${rest})${encodeType(overload.result)}${ordered}`;
|
|
73
|
+
});
|
|
74
|
+
const flags = `${def.host === true ? "h" : "b"}${def.async === true ? "a" : ""}${def.call === true ? "c" : ""}`;
|
|
75
|
+
return `${lengthPrefixed(def.name)}${flags}${lengthPrefixed(overloads.join(";"))}`;
|
|
76
|
+
}
|
|
77
|
+
const FNV_OFFSET = 2166136261;
|
|
78
|
+
const FNV_PRIME = 16777619;
|
|
79
|
+
const BYTE_BITS = 8;
|
|
80
|
+
const LOW_BYTE = 255;
|
|
81
|
+
/** A 32-bit lane in base 36 is at most 7 digits; padded, two lanes are always 14 characters. */
|
|
82
|
+
const LANE_RADIX = 36;
|
|
83
|
+
const LANE_DIGITS = 7;
|
|
84
|
+
/**
|
|
85
|
+
* A 64-bit hash of text, base-36: two FNV-1a 32-bit lanes, one over the text
|
|
86
|
+
* and one over it in reverse, each over both bytes of every UTF-16 code unit.
|
|
87
|
+
* It detects accidental drift between a compiled artifact and an environment,
|
|
88
|
+
* not tampering.
|
|
89
|
+
*/
|
|
90
|
+
function hash64(value) {
|
|
91
|
+
let forward = FNV_OFFSET;
|
|
92
|
+
let backward = FNV_OFFSET;
|
|
93
|
+
const n = value.length;
|
|
94
|
+
for (let i = 0; i < n; i++) {
|
|
95
|
+
forward = mixUnit(forward, value.charCodeAt(i));
|
|
96
|
+
backward = mixUnit(backward, value.charCodeAt(n - 1 - i));
|
|
97
|
+
}
|
|
98
|
+
const lane = (h) => (h >>> 0).toString(LANE_RADIX).padStart(LANE_DIGITS, "0");
|
|
99
|
+
return lane(forward) + lane(backward);
|
|
100
|
+
}
|
|
101
|
+
/** One FNV-1a step per byte of a UTF-16 code unit, low byte first. */
|
|
102
|
+
function mixUnit(hash, unit) {
|
|
103
|
+
const low = Math.imul(hash ^ unit & LOW_BYTE, FNV_PRIME);
|
|
104
|
+
return Math.imul(low ^ unit >>> BYTE_BITS, FNV_PRIME);
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
export { encodeFunction, encodeType, hash64, lengthPrefixed };
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=digest.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.mjs","names":[],"sources":["../src/digest.ts"],"sourcesContent":["import type { FunctionDef } from './functions/define.js'\nimport type { Type } from './types.js'\n\n// The canonical encoding behind an artifact's digest. Equal encodings mean the\n// checker sees the same thing, so the encoding is part of the artifact format:\n// changing it changes every digest, which needs a new format version. Golden\n// digests in the tests pin it.\n\n/** Text with its length first, so no two sequences of texts encode alike. */\nexport function lengthPrefixed(value: string): string {\n return `${value.length}:${value}`\n}\n\nconst typeCodes = new WeakMap<Type, string>()\n\n/**\n * A type's canonical encoding: object fields sorted by key, nested unions\n * flattened and their members sorted and deduplicated, literals tagged by kind.\n * Two types the checker treats alike encode alike, whatever order they were\n * written in. Whether a map type is exact (known to hold only its fields, as a\n * map literal's inferred type is) is not encoded: it does not survive JSON,\n * and an artifact records the checker's decisions that depended on it.\n */\nexport function encodeType(type: Type): string {\n let code = typeCodes.get(type)\n if (code === undefined) typeCodes.set(type, (code = encode(type)))\n return code\n}\n\nfunction encode(type: Type): string {\n switch (type.kind) {\n case 'any':\n case 'never':\n case 'null':\n case 'boolean':\n case 'number':\n case 'string':\n case 'timestamp':\n case 'duration':\n return type.kind\n case 'literal': {\n const value = type.value\n if (typeof value === 'string') return `s${lengthPrefixed(value)}`\n if (typeof value === 'number') return `n${lengthPrefixed(String(value))}`\n return value ? 'true' : 'false'\n }\n case 'list':\n return `[${encodeType(type.element)}]`\n case 'map': {\n const fields = Object.keys(type.fields)\n .sort()\n .map((key) => `${lengthPrefixed(key)}=${encodeType(type.fields[key])}`)\n const rest = type.rest === undefined ? '' : `...${encodeType(type.rest)}`\n return `{${fields.join(',')}${rest}}`\n }\n case 'union': {\n const members = new Set<string>()\n const add = (member: Type): void => {\n if (member.kind === 'union') member.types.forEach(add)\n else members.add(encodeType(member))\n }\n type.types.forEach(add)\n // never adds no values; a union of one member is that member.\n members.delete('never')\n if (members.size === 0) return 'never'\n if (members.size === 1) return [...members][0]\n return `(${[...members].sort().join('|')})`\n }\n case 'opaque':\n return `opaque${lengthPrefixed(type.name)}`\n case 'function':\n return `fn(${type.params.map(encodeType).join(',')})${encodeType(type.result)}`\n case 'var':\n default:\n return `var${lengthPrefixed(type.name)}`\n }\n}\n\n/**\n * Everything about a function the checker's decisions depend on: whether it is\n * a host function (the checker refines some built-ins' results, and a host\n * function of the same name replaces the built-in), its flags, and each\n * overload in order. Flags are normalized, since built-ins leave them unset\n * where host functions set them to false.\n */\nexport function encodeFunction(def: FunctionDef): string {\n const overloads = def.overloads.map((overload) => {\n const required = overload.required ?? overload.params.length\n const params = overload.params.map(encodeType).join(',')\n const rest = overload.rest === undefined ? '' : `...${encodeType(overload.rest)}`\n const ordered = overload.ordered === undefined ? '' : lengthPrefixed(overload.ordered.join(','))\n return `${required}(${params}${rest})${encodeType(overload.result)}${ordered}`\n })\n const flags = `${def.host === true ? 'h' : 'b'}${def.async === true ? 'a' : ''}${def.call === true ? 'c' : ''}`\n return `${lengthPrefixed(def.name)}${flags}${lengthPrefixed(overloads.join(';'))}`\n}\n\nconst FNV_OFFSET = 0x811c9dc5\nconst FNV_PRIME = 0x01000193\nconst BYTE_BITS = 8\nconst LOW_BYTE = 0xff\n/** A 32-bit lane in base 36 is at most 7 digits; padded, two lanes are always 14 characters. */\nconst LANE_RADIX = 36\nconst LANE_DIGITS = 7\n\n/**\n * A 64-bit hash of text, base-36: two FNV-1a 32-bit lanes, one over the text\n * and one over it in reverse, each over both bytes of every UTF-16 code unit.\n * It detects accidental drift between a compiled artifact and an environment,\n * not tampering.\n */\nexport function hash64(value: string): string {\n let forward = FNV_OFFSET\n let backward = FNV_OFFSET\n const n = value.length\n for (let i = 0; i < n; i++) {\n forward = mixUnit(forward, value.charCodeAt(i))\n backward = mixUnit(backward, value.charCodeAt(n - 1 - i))\n }\n const lane = (h: number): string => (h >>> 0).toString(LANE_RADIX).padStart(LANE_DIGITS, '0')\n return lane(forward) + lane(backward)\n}\n\n/** One FNV-1a step per byte of a UTF-16 code unit, low byte first. */\nfunction mixUnit(hash: number, unit: number): number {\n const low = Math.imul(hash ^ (unit & LOW_BYTE), FNV_PRIME)\n return Math.imul(low ^ (unit >>> BYTE_BITS), FNV_PRIME)\n}\n"],"mappings":"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"}
|
package/dist/environment.d.mts
CHANGED
|
@@ -214,6 +214,19 @@ export interface EnvironmentOptions<V extends Readonly<Record<string, Type>> = R
|
|
|
214
214
|
* naming the first mismatching path. Default: false.
|
|
215
215
|
*/
|
|
216
216
|
readonly validateContext?: boolean | undefined;
|
|
217
|
+
/**
|
|
218
|
+
* The built-ins available, from bonsai-js/builtins. Default: all of them
|
|
219
|
+
* (none in bonsai-js/runtime/core). Calling one left out is a CHECK error, so
|
|
220
|
+
* an environment that checks rules for bonsai-js/runtime/core passes the same
|
|
221
|
+
* list as the runtime. On extend(), these are added to the base's.
|
|
222
|
+
*/
|
|
223
|
+
readonly builtins?: readonly Builtin[] | undefined;
|
|
224
|
+
}
|
|
225
|
+
declare const builtinBrand: unique symbol;
|
|
226
|
+
/** A built-in function from bonsai-js/builtins, for the `builtins` option. */
|
|
227
|
+
export interface Builtin {
|
|
228
|
+
readonly name: string;
|
|
229
|
+
readonly [builtinBrand]: true;
|
|
217
230
|
}
|
|
218
231
|
/**
|
|
219
232
|
* What check() found. Only `ok`, `type`, and `diagnostics` are data (and the
|
|
@@ -244,7 +257,7 @@ type Checked<P> = ({
|
|
|
244
257
|
/** The inferred type of a node of `ast`, or undefined for another tree's node. */
|
|
245
258
|
readonly typeOf: (node: Node) => Type | undefined;
|
|
246
259
|
};
|
|
247
|
-
type Args<Ctx> = Record<string, never> extends Ctx ? [context?: Ctx, options?: EvaluateOptions] : [context: Ctx, options?: EvaluateOptions];
|
|
260
|
+
export type Args<Ctx> = Record<string, never> extends Ctx ? [context?: Ctx, options?: EvaluateOptions] : [context: Ctx, options?: EvaluateOptions];
|
|
248
261
|
/**
|
|
249
262
|
* A checked, compiled expression. Immutable and safe to share. A bare
|
|
250
263
|
* `Program` accepts any context, so a program typed for one context can be
|