@scriptc/compiler 0.2.0 → 0.2.2
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/ambient/scriptc-node-fallback.d.ts +84 -19
- package/dist/backend/cycle-analysis.js +1 -0
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/llvm/classes.js +21 -5
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +8 -0
- package/dist/backend/llvm/dyn.js +247 -108
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +6 -3
- package/dist/backend/llvm/emitter.js +99 -25
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +9 -1
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +28 -17
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +5 -0
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +1 -1
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +47 -13
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +11 -1
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +11 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +187 -18
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +41 -3
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +12 -9
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +23 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +80 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/shapes.js +8 -2
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/may-throw.js +4 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +1 -1
- package/dist/backend/native-codegen.js +4 -3
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +11 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +3 -6
- package/dist/backend/native-toolchain.js +53 -23
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +72 -0
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-native.js +4 -1
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/backend/target-diagnostics.d.ts +5 -0
- package/dist/backend/target-diagnostics.js +72 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.d.ts +1 -0
- package/dist/backend/target-diagnostics.test.js +68 -0
- package/dist/backend/target-diagnostics.test.js.map +1 -0
- package/dist/backend/targets.js +10 -6
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +7 -0
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/compat/fetch-profile.js +34 -4
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/coverage/surface-manifest.js +5 -3
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +2 -7
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +7 -3
- package/dist/executable/executable-cache.js +47 -11
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +109 -2
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -1
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/function-completion.d.ts +6 -0
- package/dist/frontend/function-completion.js +50 -0
- package/dist/frontend/function-completion.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.js +5 -1
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
- package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
- package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
- package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
- package/dist/frontend/lowering/checked-promise-all.js +31 -0
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +4 -4
- package/dist/frontend/lowering/class-callbacks.js +29 -17
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +14 -0
- package/dist/frontend/lowering/class-construction.js +185 -0
- package/dist/frontend/lowering/class-construction.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +2 -1
- package/dist/frontend/lowering/class-descriptors.js +58 -10
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +36 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +965 -91
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +66 -3
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +15 -42
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.d.ts +20 -1
- package/dist/frontend/lowering/class-method-values.js +120 -24
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +10 -3
- package/dist/frontend/lowering/class-prototypes.js +188 -21
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
- package/dist/frontend/lowering/class-runtime-statics.js +84 -0
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
- package/dist/frontend/lowering/class-static-data.d.ts +1 -0
- package/dist/frontend/lowering/class-static-data.js +6 -4
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +66 -17
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +24 -47
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
- package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
- package/dist/frontend/lowering/error-methods.d.ts +4 -1
- package/dist/frontend/lowering/error-methods.js +100 -1
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/native-proxy.js +3 -1
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +19 -11
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +68 -7
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
- package/dist/frontend/lowering/expressions/optional-chains.js +72 -20
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/function-context.d.ts +11 -3
- package/dist/frontend/lowering/function-context.js +11 -5
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +39 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.d.ts +2 -0
- package/dist/frontend/lowering/lib-boundary.js +54 -1
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -1
- package/dist/frontend/lowering/lower-builtin-values.js +113 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +10 -14
- package/dist/frontend/lowering/lower-builtins.js +443 -88
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +8 -5
- package/dist/frontend/lowering/lower-calls.js +717 -142
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +18 -13
- package/dist/frontend/lowering/lower-classes.js +1076 -188
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +9 -0
- package/dist/frontend/lowering/lower-containers.js +172 -51
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -2
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +12 -8
- package/dist/frontend/lowering/lower-exprs.js +802 -232
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +17 -2
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +15 -1
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +2 -0
- package/dist/frontend/lowering/lower-island.js +36 -10
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-island.test.js +51 -0
- package/dist/frontend/lowering/lower-island.test.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.d.ts +1 -3
- package/dist/frontend/lowering/lower-modules.js +380 -73
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.test.js +107 -0
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
- package/dist/frontend/lowering/lower-stmts.d.ts +7 -3
- package/dist/frontend/lowering/lower-stmts.js +221 -47
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-stmts.test.js +77 -0
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
- package/dist/frontend/lowering/lower-stream.js +3 -1
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-url.d.ts +2 -1
- package/dist/frontend/lowering/lower-url.js +32 -9
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +53 -10
- package/dist/frontend/lowering/lowerer.js +390 -77
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +187 -3
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
- package/dist/frontend/lowering/module-namespace-elements.js +54 -0
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
- package/dist/frontend/lowering/object-factory-new.js +27 -14
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +48 -19
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.d.ts +2 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +8 -0
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
- package/dist/frontend/lowering/unregistered-class-types.test.js +3 -3
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.js +116 -34
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +8 -0
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/program.d.ts +1 -1
- package/dist/frontend/program.js +57 -26
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +18 -0
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/ts7/ast.js +4 -3
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.js +5 -10
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +9 -1
- package/dist/frontend/type-mapper.js +169 -23
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +23 -0
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/union-discriminants.d.ts +1 -1
- package/dist/frontend/union-discriminants.js +24 -9
- package/dist/frontend/union-discriminants.js.map +1 -1
- package/dist/index.js +16 -10
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +2 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/ir.d.ts +74 -41
- package/dist/ir/ir.js +167 -43
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +35 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/serialize.js +35 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +26 -1
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.d.ts +0 -3
- package/dist/ir/traverse.js +33 -20
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +136 -16
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +77 -1
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/compiler-self-identity.js +1 -1
- package/dist/library/compiler-self-identity.test.js +2 -2
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/int-infer.d.ts +2 -2
- package/dist/library/int-infer.js +10 -7
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +44 -0
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/prepare.js +2 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/sanitizer.js +3 -1
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/toolchain.d.ts +1 -1
- package/dist/native/toolchain.js +26 -6
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +53 -1
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +170 -93
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { expect, test } from "vitest";
|
|
2
|
-
import { BOOL, F64, JSVAL } from "../../ir/ir.js";
|
|
3
|
-
import { stmtUsesIsland } from "./lowerer.js";
|
|
1
|
+
import { expect, test, vi } from "vitest";
|
|
2
|
+
import { BOOL, F64, JSVAL, NULL_T, STRING, UNDEFINED_T, VOID } from "../../ir/ir.js";
|
|
3
|
+
import { Lowerer, stmtUsesIsland } from "./lowerer.js";
|
|
4
|
+
import { classMethodValue } from "./class-method-values.js";
|
|
4
5
|
const loc = { file: "island.ts", start: 0, end: 1 };
|
|
5
6
|
const island = { kind: "jsOp", op: "undefLit", args: [], type: JSVAL, loc };
|
|
6
7
|
const statement = { kind: "exprStmt", expr: island, loc };
|
|
@@ -23,4 +24,187 @@ test("retains accounting for island library calls and generated loop conditions"
|
|
|
23
24
|
expect(stmtUsesIsland({ kind: "block", body: [loop], loc })).toBe(true);
|
|
24
25
|
expect(stmtUsesIsland({ kind: "exprStmt", expr: { kind: "numLit", value: 1, type: F64, loc }, loc })).toBe(false);
|
|
25
26
|
});
|
|
27
|
+
const record = (shapeId) => ({ kind: "record", shapeId });
|
|
28
|
+
const context = () => new Lowerer({ getTypeChecker: () => ({}) }, { fileName: loc.file }, [], false);
|
|
29
|
+
test("reuses complete copy routes without repeating discriminator planning", () => {
|
|
30
|
+
const lowerer = context();
|
|
31
|
+
const shape = record(lowerer.shapes.intern([{ name: "kind", type: STRING }]));
|
|
32
|
+
const discriminant = { field: "kind", cases: [{ tag: 0, values: ["value"] }] };
|
|
33
|
+
const from = lowerer.unions.intern([shape, UNDEFINED_T], discriminant);
|
|
34
|
+
const to = lowerer.unions.intern([shape, NULL_T], discriminant);
|
|
35
|
+
const plan = vi.spyOn(lowerer, "widthLiftPlan");
|
|
36
|
+
const helper = lowerer.unionRetagHelper(from, to, loc);
|
|
37
|
+
expect(helper).not.toBeNull();
|
|
38
|
+
expect(plan).toHaveBeenCalled();
|
|
39
|
+
plan.mockClear();
|
|
40
|
+
for (let i = 0; i < 20; i++)
|
|
41
|
+
expect(lowerer.unionRetagHelper(from, to, loc)).toBe(helper);
|
|
42
|
+
expect(plan).not.toHaveBeenCalled();
|
|
43
|
+
expect(lowerer.liftedFns.filter((fn) => fn.name === helper)).toHaveLength(1);
|
|
44
|
+
const recursive = {};
|
|
45
|
+
lowerer.shapes.recursiveRef(recursive);
|
|
46
|
+
lowerer.shapes.finalizeRecursive(recursive, [{ name: "kind", type: STRING }]);
|
|
47
|
+
expect(lowerer.unionRetagHelper(from, to, loc)).toBe(helper);
|
|
48
|
+
expect(plan).toHaveBeenCalled();
|
|
49
|
+
});
|
|
50
|
+
test("keeps narrowing evidence local to each conversion request", () => {
|
|
51
|
+
const lowerer = context();
|
|
52
|
+
const from = lowerer.unions.intern([F64, STRING, UNDEFINED_T]);
|
|
53
|
+
const to = lowerer.unions.intern([F64, NULL_T]);
|
|
54
|
+
const helper = lowerer.unionRetagHelper(from, to, loc, new Set([1]));
|
|
55
|
+
expect(helper).not.toBeNull();
|
|
56
|
+
expect(lowerer.unionRetagHelper(from, to, loc)).toBeNull();
|
|
57
|
+
expect(lowerer.unionRetagHelper(from, to, loc, new Set([0]))).toBeNull();
|
|
58
|
+
expect(lowerer.unionRetagHelper(from, to, loc, new Set([1]))).toBe(helper);
|
|
59
|
+
expect(lowerer.unionRetagHelper(from, to, loc, new Set([1, 0]))).toBe(helper);
|
|
60
|
+
});
|
|
61
|
+
test("replans after a recursive union gains its final arms", () => {
|
|
62
|
+
const lowerer = context();
|
|
63
|
+
const recursive = {};
|
|
64
|
+
const from = lowerer.unions.intern([UNDEFINED_T, NULL_T]);
|
|
65
|
+
const to = lowerer.unions.recursiveRef(recursive);
|
|
66
|
+
const trapped = lowerer.unionRetagHelper(from, to, loc);
|
|
67
|
+
expect(trapped).not.toBeNull();
|
|
68
|
+
lowerer.unions.finalizeRecursive(recursive, [UNDEFINED_T]);
|
|
69
|
+
const completed = lowerer.unionRetagHelper(from, to, loc);
|
|
70
|
+
expect(completed).not.toBeNull();
|
|
71
|
+
expect(completed).not.toBe(trapped);
|
|
72
|
+
expect(lowerer.liftedFns.find((fn) => fn.name === completed)?.body).toEqual(expect.arrayContaining([
|
|
73
|
+
expect.objectContaining({ kind: "if", then: expect.arrayContaining([expect.objectContaining({ kind: "return" })]) }),
|
|
74
|
+
]));
|
|
75
|
+
});
|
|
76
|
+
test("rechecks width conversions after recursive record definitions settle", () => {
|
|
77
|
+
const lowerer = context();
|
|
78
|
+
const recursive = {};
|
|
79
|
+
const source = record(lowerer.shapes.intern([{ name: "value", type: F64 }]));
|
|
80
|
+
const target = record(lowerer.shapes.recursiveRef(recursive));
|
|
81
|
+
const from = lowerer.unions.intern([source, UNDEFINED_T]);
|
|
82
|
+
const to = lowerer.unions.intern([target, NULL_T]);
|
|
83
|
+
expect(lowerer.unionRetagHelper(from, to, loc)).not.toBeNull();
|
|
84
|
+
lowerer.shapes.finalizeRecursive(recursive, [{ name: "value", type: STRING }]);
|
|
85
|
+
expect(lowerer.unionRetagHelper(from, to, loc)).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
test("method adapter interning does not inspect unrelated lifted functions", () => {
|
|
88
|
+
const lowerer = context();
|
|
89
|
+
let nameReads = 0;
|
|
90
|
+
for (let i = 0; i < 100; i++) {
|
|
91
|
+
const fn = { name: `unrelated.${i}`, params: [], returnType: VOID, locals: [], body: [], loc };
|
|
92
|
+
Object.defineProperty(fn, "name", { get() { nameReads++; return `unrelated.${i}`; } });
|
|
93
|
+
lowerer.liftedFns.push(fn);
|
|
94
|
+
}
|
|
95
|
+
const owner = lowerer.classes.get("%Error");
|
|
96
|
+
const inherited = lowerer.classes.get("%TypeError");
|
|
97
|
+
const first = classMethodValue(lowerer, {}, owner, "toString", loc);
|
|
98
|
+
expect(first).toMatchObject({ kind: "closure" });
|
|
99
|
+
for (let i = 0; i < 20; i++) {
|
|
100
|
+
expect(classMethodValue(lowerer, {}, inherited, "toString", loc)).toEqual(first);
|
|
101
|
+
}
|
|
102
|
+
expect(nameReads).toBe(0);
|
|
103
|
+
expect(lowerer.liftedFns.slice(100)).toHaveLength(2);
|
|
104
|
+
});
|
|
105
|
+
test("literal ownership is reused across values and rechecked when recursive records close", () => {
|
|
106
|
+
const lowerer = context();
|
|
107
|
+
const shape = record(lowerer.shapes.intern([{ name: "kind", type: STRING }]));
|
|
108
|
+
const union = lowerer.unions.intern([shape, UNDEFINED_T], { field: "kind", cases: [{ tag: 0, values: ["a", "b"] }] });
|
|
109
|
+
const inspect = vi.spyOn(lowerer.shapes, "get");
|
|
110
|
+
expect(lowerer.literalUnionArm(union, ["a"])).toEqual(shape);
|
|
111
|
+
inspect.mockClear();
|
|
112
|
+
for (let i = 0; i < 20; i++)
|
|
113
|
+
expect(lowerer.literalUnionArm(union, ["b"])).toEqual(shape);
|
|
114
|
+
expect(lowerer.literalUnionArm(union, ["missing"])).toBeNull();
|
|
115
|
+
expect(inspect).not.toHaveBeenCalled();
|
|
116
|
+
const recursive = {};
|
|
117
|
+
const pendingShape = record(lowerer.shapes.recursiveRef(recursive));
|
|
118
|
+
const pending = lowerer.unions.intern([pendingShape], { field: "kind", cases: [{ tag: 0, values: ["a"] }] });
|
|
119
|
+
expect(lowerer.literalUnionArm(pending, ["a"])).toBeNull();
|
|
120
|
+
lowerer.shapes.finalizeRecursive(recursive, [{ name: "kind", type: STRING }]);
|
|
121
|
+
expect(lowerer.literalUnionArm(pending, ["a"])).toEqual(pendingShape);
|
|
122
|
+
expect(lowerer.literalUnionArm(pending, ["b"])).toBeNull();
|
|
123
|
+
});
|
|
124
|
+
test("literal ownership sees a recursive union's finalized discriminator", () => {
|
|
125
|
+
const lowerer = context();
|
|
126
|
+
const recursive = {};
|
|
127
|
+
const union = lowerer.unions.recursiveRef(recursive);
|
|
128
|
+
const shape = record(lowerer.shapes.intern([{ name: "kind", type: STRING }]));
|
|
129
|
+
expect(lowerer.literalUnionArm(union, ["ready"])).toBeNull();
|
|
130
|
+
lowerer.unions.finalizeRecursive(recursive, [shape], { field: "kind", cases: [{ tag: 0, values: ["ready"] }] });
|
|
131
|
+
expect(lowerer.literalUnionArm(union, ["ready"])).toEqual(shape);
|
|
132
|
+
});
|
|
133
|
+
test("removing undefined reuses the discriminator transformation without hiding recursive completion", () => {
|
|
134
|
+
const lowerer = context();
|
|
135
|
+
const a = record(lowerer.shapes.intern([{ name: "kind", type: STRING }]));
|
|
136
|
+
const b = record(lowerer.shapes.intern([{ name: "kind", type: STRING }, { name: "value", type: F64 }]));
|
|
137
|
+
const union = { kind: "union", unionId: lowerer.unions.intern([a, b, UNDEFINED_T], {
|
|
138
|
+
field: "kind", cases: [{ tag: 0, values: ["a"] }, { tag: 1, values: ["b"] }],
|
|
139
|
+
}) };
|
|
140
|
+
const transform = vi.spyOn(lowerer.unions, "transform");
|
|
141
|
+
const stripped = lowerer.stripUndefinedArm(union);
|
|
142
|
+
for (let i = 0; i < 20; i++)
|
|
143
|
+
expect(lowerer.stripUndefinedArm(union)).toEqual(stripped);
|
|
144
|
+
expect(transform).toHaveBeenCalledTimes(1);
|
|
145
|
+
if (stripped.kind !== "union")
|
|
146
|
+
throw new Error("expected two remaining arms");
|
|
147
|
+
expect(lowerer.unions.get(stripped.unionId)?.discriminant).toEqual(lowerer.unions.get(union.unionId)?.discriminant);
|
|
148
|
+
const recursive = {};
|
|
149
|
+
const pending = { kind: "union", unionId: lowerer.unions.recursiveRef(recursive) };
|
|
150
|
+
expect(lowerer.stripUndefinedArm(pending)).toEqual(pending);
|
|
151
|
+
lowerer.unions.finalizeRecursive(recursive, [STRING, UNDEFINED_T]);
|
|
152
|
+
expect(lowerer.stripUndefinedArm(pending)).toEqual(STRING);
|
|
153
|
+
expect(lowerer.stripUndefinedArm(union)).toEqual(stripped);
|
|
154
|
+
expect(transform).toHaveBeenCalledTimes(2);
|
|
155
|
+
});
|
|
156
|
+
test("adding undefined reuses semantic union transformations and sees recursive completion", () => {
|
|
157
|
+
const lowerer = context();
|
|
158
|
+
const a = record(lowerer.shapes.intern([{ name: "kind", type: STRING }]));
|
|
159
|
+
const b = record(lowerer.shapes.intern([{ name: "kind", type: STRING }, { name: "value", type: F64 }]));
|
|
160
|
+
const discriminant = { field: "kind", cases: [{ tag: 0, values: ["a"] }, { tag: 1, values: ["b"] }] };
|
|
161
|
+
const union = { kind: "union", unionId: lowerer.unions.intern([a, b], discriminant) };
|
|
162
|
+
const transform = vi.spyOn(lowerer.unions, "transform");
|
|
163
|
+
const added = lowerer.withUndefinedArmOf(union);
|
|
164
|
+
for (let i = 0; i < 20; i++)
|
|
165
|
+
expect(lowerer.withUndefinedArmOf(union)).toEqual(added);
|
|
166
|
+
expect(transform).toHaveBeenCalledTimes(1);
|
|
167
|
+
if (added?.kind !== "union")
|
|
168
|
+
throw new Error("expected optional union");
|
|
169
|
+
expect(lowerer.unions.get(added.unionId)?.discriminant).toEqual(discriminant);
|
|
170
|
+
const recursive = {};
|
|
171
|
+
const pending = { kind: "union", unionId: lowerer.unions.recursiveRef(recursive) };
|
|
172
|
+
const before = lowerer.withUndefinedArmOf(pending);
|
|
173
|
+
lowerer.unions.finalizeRecursive(recursive, [a, b], discriminant);
|
|
174
|
+
expect(lowerer.withUndefinedArmOf(pending)).toEqual(added);
|
|
175
|
+
expect(lowerer.withUndefinedArmOf(pending)).not.toEqual(before);
|
|
176
|
+
expect(lowerer.withUndefinedArmOf(union)).toEqual(added);
|
|
177
|
+
expect(transform).toHaveBeenCalledTimes(4);
|
|
178
|
+
});
|
|
179
|
+
test("optional union widening keeps refused and missing contracts current", () => {
|
|
180
|
+
const lowerer = context();
|
|
181
|
+
const recursive = {};
|
|
182
|
+
const pending = { kind: "union", unionId: lowerer.unions.recursiveRef(recursive) };
|
|
183
|
+
expect(lowerer.withUndefinedArmOf(pending)).not.toBeNull();
|
|
184
|
+
lowerer.unions.finalizeRecursive(recursive, [{ kind: "date" }, STRING]);
|
|
185
|
+
expect(lowerer.withUndefinedArmOf(pending)).toBeNull();
|
|
186
|
+
expect(lowerer.withUndefinedArmOf(pending)).toBeNull();
|
|
187
|
+
const missing = { kind: "union", unionId: `u${lowerer.unions.unions.length}` };
|
|
188
|
+
expect(lowerer.withUndefinedArmOf(missing)).toBeNull();
|
|
189
|
+
expect(lowerer.unions.intern([F64, STRING])).toBe(missing.unionId);
|
|
190
|
+
expect(lowerer.withUndefinedArmOf(missing)?.kind).toBe("union");
|
|
191
|
+
expect(lowerer.withUndefinedArmOf(VOID)).toBeNull();
|
|
192
|
+
expect(lowerer.withUndefinedArmOf(JSVAL)).toBe(JSVAL);
|
|
193
|
+
});
|
|
194
|
+
test("stdlib provenance is cached by symbol identity, including merged and shadowed declarations", () => {
|
|
195
|
+
const builtin = {}, shadow = {};
|
|
196
|
+
const userFile = { fileName: "user.ts" };
|
|
197
|
+
const library = { fileName: "library.d.ts" };
|
|
198
|
+
const userDeclaration = { getSourceFile: () => userFile };
|
|
199
|
+
const libraryDeclaration = { getSourceFile: () => library };
|
|
200
|
+
const declarationsOf = vi.fn((symbol) => symbol === builtin ? [userDeclaration, libraryDeclaration] : [userDeclaration]);
|
|
201
|
+
const lowerer = new Lowerer({ getTypeChecker: () => ({ declarationsOf }) }, userFile, [], false);
|
|
202
|
+
vi.spyOn(lowerer, "isStdlibFile").mockImplementation((file) => file === library);
|
|
203
|
+
for (let i = 0; i < 20; i++) {
|
|
204
|
+
expect(lowerer.isStdlibSymbol(builtin)).toBe(true);
|
|
205
|
+
expect(lowerer.isStdlibSymbol(shadow)).toBe(false);
|
|
206
|
+
expect(lowerer.isStdlibSymbol(undefined)).toBe(false);
|
|
207
|
+
}
|
|
208
|
+
expect(declarationsOf).toHaveBeenCalledTimes(2);
|
|
209
|
+
});
|
|
26
210
|
//# sourceMappingURL=lowerer.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lowerer.test.js","sourceRoot":"","sources":["../../../src/frontend/lowering/lowerer.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lowerer.test.js","sourceRoot":"","sources":["../../../src/frontend/lowering/lowerer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import { type IrExpr } from "../../ir/ir.js";
|
|
3
|
+
import { type Lowerer } from "./lowerer.js";
|
|
4
|
+
/** Computed namespace reads select live exports instead of copying a
|
|
5
|
+
* namespace into a registry snapshot. Constructor registries may contain
|
|
6
|
+
* unrelated classes with different native signatures. */
|
|
7
|
+
export declare function lowerModuleNamespaceElement(lowerer: Lowerer, expr: ts.ElementAccessExpression): IrExpr | null;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import { DYN, STRING } from "../../ir/ir.js";
|
|
3
|
+
import { strLit, varRef } from "../../ir/build.js";
|
|
4
|
+
import { locOf } from "../program.js";
|
|
5
|
+
import { dynUndefinedExpr, newFnCtx } from "./lowerer.js";
|
|
6
|
+
/** Computed namespace reads select live exports instead of copying a
|
|
7
|
+
* namespace into a registry snapshot. Constructor registries may contain
|
|
8
|
+
* unrelated classes with different native signatures. */
|
|
9
|
+
export function lowerModuleNamespaceElement(lowerer, expr) {
|
|
10
|
+
const type = lowerer.mapTypeOf(lowerer.typeOf(expr.expression));
|
|
11
|
+
if (type?.kind !== "moduleNs")
|
|
12
|
+
return null;
|
|
13
|
+
const source = lowerer.sourceFileOfModuleNamespace(type);
|
|
14
|
+
if (!source)
|
|
15
|
+
return null;
|
|
16
|
+
const loc = locOf(expr);
|
|
17
|
+
const name = `%module.element:${type.moduleId}`;
|
|
18
|
+
if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
|
|
19
|
+
const context = newFnCtx(false, null, null, DYN);
|
|
20
|
+
const previousClass = lowerer.currentClass;
|
|
21
|
+
lowerer.currentClass = null;
|
|
22
|
+
lowerer.fnStack.push(context);
|
|
23
|
+
try {
|
|
24
|
+
const body = [];
|
|
25
|
+
const symbol = lowerer.checker.getSymbolAtLocation(source);
|
|
26
|
+
symbol?.getExports().forEach((exported, key) => {
|
|
27
|
+
const target = exported.flags & ts.SymbolFlags.Alias ? lowerer.checker.getAliasedSymbol(exported) : exported;
|
|
28
|
+
if (!(target.flags & ts.SymbolFlags.Value))
|
|
29
|
+
return;
|
|
30
|
+
const declaration = lowerer.checker.valueDeclarationOf(target);
|
|
31
|
+
const identifier = declaration?.name;
|
|
32
|
+
if (!identifier || !ts.isIdentifier(identifier)) {
|
|
33
|
+
lowerer.unsupported("SC1090", expr, "computed namespace reads of unnamed exports");
|
|
34
|
+
}
|
|
35
|
+
const value = lowerer.lowerExprExpecting(identifier, DYN);
|
|
36
|
+
body.push({ kind: "if", cond: { kind: "strEq", negated: false, left: varRef("key", STRING, loc), right: strLit(String(key), loc), type: { kind: "bool" }, loc },
|
|
37
|
+
then: [{ kind: "return", value, loc }], else_: null, loc });
|
|
38
|
+
});
|
|
39
|
+
body.push({ kind: "return", value: dynUndefinedExpr(loc), loc });
|
|
40
|
+
const fn = { name, params: [{ localId: "namespace", name: "namespace", type }, { localId: "key", name: "key", type: STRING }],
|
|
41
|
+
returnType: DYN, locals: [{ id: "namespace", name: "namespace", type, mutable: false }, { id: "key", name: "key", type: STRING, mutable: false }, ...context.locals], body, loc };
|
|
42
|
+
lowerer.liftedFns.push(fn);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
lowerer.fnStack.pop();
|
|
46
|
+
lowerer.currentClass = previousClass;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const receiver = lowerer.lowerExpr(expr.expression);
|
|
50
|
+
const key = lowerer.lowerExpr(expr.argumentExpression);
|
|
51
|
+
const text = key.type.kind === "string" ? key : { kind: "libCall", fn: "dyn.toStringCoerce", args: [lowerer.coerceInto(expr.argumentExpression, key, DYN)], type: STRING, loc };
|
|
52
|
+
return { kind: "call", callee: name, args: [receiver, text], type: DYN, loc };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=module-namespace-elements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-namespace-elements.js","sourceRoot":"","sources":["../../../src/frontend/lowering/module-namespace-elements.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as ts from "../ts7/adapter.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type IrExpr, type IrType } from "../../ir/ir.js";
|
|
3
3
|
import type { Lowerer } from "./lowerer.js";
|
|
4
4
|
import { type FnSig } from "./lower-calls.js";
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
5
|
+
/** Collection must register the shared result before reaching factory
|
|
6
|
+
* bodies: those bodies can reference later globals in the same module. */
|
|
7
|
+
export declare function objectFactoryGlobalType(lowerer: Lowerer, expr: ts.NewExpression): IrType | null;
|
|
7
8
|
export declare function objectFactorySignature(lowerer: Lowerer, expr: ts.NewExpression): FnSig | null;
|
|
8
9
|
export declare function lowerObjectFactoryNew(lowerer: Lowerer, expr: ts.NewExpression): IrExpr | null;
|
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import { DYN } from "../../ir/ir.js";
|
|
2
3
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
3
|
-
import { bindingNeverReassigned } from "./lower-calls.js";
|
|
4
|
+
import { bindingNeverReassigned, implicitDefaultInstance } from "./lower-calls.js";
|
|
4
5
|
/** An ordinary constructor's explicit object return replaces its receiver.
|
|
5
6
|
* Without observing this or new.target, it can use the function's call ABI. */
|
|
6
|
-
|
|
7
|
+
function isObjectFactoryNew(lowerer, expr) {
|
|
7
8
|
if (!ts.isIdentifier(expr.expression) || lowerer.peekLocal(expr.expression))
|
|
8
|
-
return
|
|
9
|
+
return false;
|
|
9
10
|
// This probe also sees ordinary classes during global collection. Leave
|
|
10
11
|
// their deferred diagnostics for the class declaration's lowering.
|
|
11
12
|
const wasCollecting = lowerer.collecting;
|
|
12
13
|
let symbol = null;
|
|
13
14
|
lowerer.collecting = true;
|
|
14
15
|
try {
|
|
15
|
-
if (!lowerer.isTopLevelFnSymbol(expr.expression))
|
|
16
|
-
return null;
|
|
17
16
|
symbol = lowerer.resolveValueSymbol(expr.expression);
|
|
18
17
|
}
|
|
19
18
|
finally {
|
|
20
19
|
lowerer.collecting = wasCollecting;
|
|
21
20
|
}
|
|
22
21
|
if (!symbol)
|
|
23
|
-
return
|
|
24
|
-
const
|
|
25
|
-
|
|
22
|
+
return false;
|
|
23
|
+
const owner = lowerer.checker.declarationsOf(symbol).find((node) => ts.isFunctionDeclaration(node) && node.body !== undefined ||
|
|
24
|
+
ts.isVariableDeclaration(node) && node.initializer && ts.isFunctionExpression(node.initializer));
|
|
25
|
+
const declaration = owner && ts.isVariableDeclaration(owner) && owner.initializer && ts.isFunctionExpression(owner.initializer)
|
|
26
|
+
? owner.initializer : owner && ts.isFunctionDeclaration(owner) ? owner : null;
|
|
27
|
+
if (!owner || !declaration?.body || !bindingNeverReassigned(lowerer, symbol, owner) || !isJsSourceFile(declaration.getSourceFile()) || declaration.asteriskToken ||
|
|
26
28
|
declaration.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword))
|
|
27
|
-
return
|
|
29
|
+
return false;
|
|
30
|
+
const objectReturn = (expression) => ts.isObjectLiteralExpression(expression) ||
|
|
31
|
+
ts.isArrayLiteralExpression(expression) || ts.isArrowFunction(expression) || ts.isFunctionExpression(expression) || ts.isNewExpression(expression);
|
|
28
32
|
const last = declaration.body.statements.at(-1);
|
|
29
|
-
if (!last || !ts.isReturnStatement(last) || !last.expression || !
|
|
30
|
-
return
|
|
33
|
+
if (!last || !ts.isReturnStatement(last) || !last.expression || !objectReturn(last.expression))
|
|
34
|
+
return false;
|
|
31
35
|
let safe = true;
|
|
32
36
|
const visit = (node, nestedArrow = false) => {
|
|
33
37
|
if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
|
|
@@ -41,16 +45,25 @@ export function objectFactorySignature(lowerer, expr) {
|
|
|
41
45
|
}
|
|
42
46
|
if (node.kind === ts.SyntaxKind.ThisKeyword || ts.isMetaProperty(node))
|
|
43
47
|
safe = false;
|
|
44
|
-
if (!nestedArrow && ts.isReturnStatement(node) && (!node.expression || !
|
|
48
|
+
if (!nestedArrow && ts.isReturnStatement(node) && (!node.expression || !objectReturn(node.expression)))
|
|
45
49
|
safe = false;
|
|
46
50
|
ts.forEachChild(node, (child) => visit(child, nestedArrow));
|
|
47
51
|
};
|
|
48
52
|
for (const parameter of declaration.parameters)
|
|
49
53
|
visit(parameter);
|
|
50
54
|
visit(declaration.body);
|
|
51
|
-
|
|
55
|
+
return safe;
|
|
56
|
+
}
|
|
57
|
+
/** Collection must register the shared result before reaching factory
|
|
58
|
+
* bodies: those bodies can reference later globals in the same module. */
|
|
59
|
+
export function objectFactoryGlobalType(lowerer, expr) {
|
|
60
|
+
return isObjectFactoryNew(lowerer, expr) ? DYN : null;
|
|
61
|
+
}
|
|
62
|
+
export function objectFactorySignature(lowerer, expr) {
|
|
63
|
+
if (!ts.isIdentifier(expr.expression) || !isObjectFactoryNew(lowerer, expr))
|
|
52
64
|
return null;
|
|
53
|
-
const
|
|
65
|
+
const generic = lowerer.genericFnOf(expr.expression);
|
|
66
|
+
const signature = generic?.implicitParams ? implicitDefaultInstance(lowerer, expr, generic) : lowerer.fnSigOf(expr.expression);
|
|
54
67
|
return signature && signature.returnType.kind !== "void" ? signature : null;
|
|
55
68
|
}
|
|
56
69
|
export function lowerObjectFactoryNew(lowerer, expr) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-factory-new.js","sourceRoot":"","sources":["../../../src/frontend/lowering/object-factory-new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"object-factory-new.js","sourceRoot":"","sources":["../../../src/frontend/lowering/object-factory-new.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,6 +76,7 @@ export declare const ARRAY_METHODS: Set<string>;
|
|
|
76
76
|
* only half the check — the resolved symbol must be declared by the
|
|
77
77
|
* standard library (isStdlibMember). `size` is a property, handled in
|
|
78
78
|
* property-access position. */
|
|
79
|
+
export declare const COLLECTION_ITERATOR_METHODS: Set<string>;
|
|
79
80
|
export declare const MAP_METHODS: Set<string>;
|
|
80
81
|
/** The lowered Set<T> method surface — Map's minus get/set plus add.
|
|
81
82
|
* `size` is a property, handled in property-access position. */
|
|
@@ -258,6 +259,8 @@ export declare const AMBIENT_SURFACE_FNS: readonly AmbientSurfaceRow[];
|
|
|
258
259
|
/** One MEMBER's table entry, own-property-safe (`path.toString` must not
|
|
259
260
|
* answer Object.prototype.toString as a BuiltinModuleFn). */
|
|
260
261
|
export declare function builtinModuleFnOf(lowerer: Lowerer, module: string, member: string): BuiltinModuleFn | undefined;
|
|
262
|
+
/** Native error-first function values used by platform service adapters. */
|
|
263
|
+
export declare const FS_CALLBACK_MEMBERS: Set<string>;
|
|
261
264
|
/** One member's fence hint, own-property-safe (a collision would print an
|
|
262
265
|
* inherited function into the diagnostic text). */
|
|
263
266
|
export declare function builtinFenceHintOf(module: string, member: string): string | undefined;
|
|
@@ -290,10 +290,11 @@ export const ARRAY_METHODS = new Set([
|
|
|
290
290
|
* only half the check — the resolved symbol must be declared by the
|
|
291
291
|
* standard library (isStdlibMember). `size` is a property, handled in
|
|
292
292
|
* property-access position. */
|
|
293
|
-
export const
|
|
293
|
+
export const COLLECTION_ITERATOR_METHODS = new Set(["keys", "values", "entries"]);
|
|
294
|
+
export const MAP_METHODS = new Set(["get", "set", "has", "delete", "clear", "forEach", ...COLLECTION_ITERATOR_METHODS]);
|
|
294
295
|
/** The lowered Set<T> method surface — Map's minus get/set plus add.
|
|
295
296
|
* `size` is a property, handled in property-access position. */
|
|
296
|
-
export const SET_METHODS = new Set(["add", "has", "delete", "clear", "forEach"]);
|
|
297
|
+
export const SET_METHODS = new Set(["add", "has", "delete", "clear", "forEach", ...COLLECTION_ITERATOR_METHODS]);
|
|
297
298
|
/** The ES2025 Set composition surface (union/intersection/…): desugared
|
|
298
299
|
* to interned helper loops over the set iteration primitives — no user
|
|
299
300
|
* code runs mid-loop, so the walks need no enter/exit bracketing. The
|
|
@@ -368,6 +369,7 @@ export const STR_METHODS = {
|
|
|
368
369
|
// flips the regex LINK switch (moduleUsesRegex).
|
|
369
370
|
toLowerCase: { method: "toLowerCase", result: STRING, minArgs: 0, maxArgs: 0 },
|
|
370
371
|
toUpperCase: { method: "toUpperCase", result: STRING, minArgs: 0, maxArgs: 0 },
|
|
372
|
+
normalize: { method: "normalize", result: STRING, minArgs: 0, maxArgs: 1 },
|
|
371
373
|
// The ES2024 well-formedness pair — no-ops over the runtime's
|
|
372
374
|
// well-formed storage (constant true / the identity, per spec on
|
|
373
375
|
// well-formed input; where Node would answer false the program already
|
|
@@ -528,6 +530,8 @@ function exactValueParams(...types) {
|
|
|
528
530
|
/** Object helpers whose checked-native ABI is also their stored value ABI.
|
|
529
531
|
* These adapters operate on the live checked object/property table. */
|
|
530
532
|
export const OBJECT_CALLABLE_VALUES = {
|
|
533
|
+
is: { fn: "dyn.sameValue", params: [DYN, DYN], result: BOOL, valueParams: exactValueParams(DYN, DYN) },
|
|
534
|
+
create: { fn: "dyn.objCreateWithProperties", params: [DYN, DYN], result: DYN, valueParams: exactValueParams(DYN, DYN) },
|
|
531
535
|
defineProperty: { fn: "dyn.defineProperty", params: [DYN, DYN, DYN], result: DYN, valueParams: exactValueParams(DYN, DYN, DYN) },
|
|
532
536
|
getOwnPropertyDescriptor: { fn: "dyn.getOwnPropertyDescriptor", params: [DYN, DYN], result: DYN, valueParams: exactValueParams(DYN, DYN) },
|
|
533
537
|
getOwnPropertyDescriptors: { fn: "dyn.getOwnPropertyDescriptors", params: [DYN], result: DYN, valueParams: exactValueParams(DYN) },
|
|
@@ -537,6 +541,8 @@ export const OBJECT_CALLABLE_VALUES = {
|
|
|
537
541
|
entries: { fn: "dyn.objEntries", params: [DYN], result: DYN, valueParams: exactValueParams(DYN) },
|
|
538
542
|
fromEntries: { fn: "dyn.fromEntries", params: [DYN], result: DYN, valueParams: exactValueParams(DYN) },
|
|
539
543
|
getOwnPropertySymbols: { fn: "dyn.getOwnPropertySymbols", params: [DYN], result: DYN, valueParams: exactValueParams(DYN) },
|
|
544
|
+
getOwnPropertyNames: { fn: "dyn.getOwnPropertyNames", params: [DYN], result: DYN, valueParams: exactValueParams(DYN) },
|
|
545
|
+
getPrototypeOf: { fn: "dyn.getPrototype", params: [DYN], result: DYN, valueParams: exactValueParams(DYN) },
|
|
540
546
|
};
|
|
541
547
|
/** The lowerable surface of the supported node builtin modules, keyed by
|
|
542
548
|
* CANONICAL module name (both "fs" and "node:fs" land on "fs" — see
|
|
@@ -612,6 +618,10 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
612
618
|
fstatSync: { fn: "fs.fstatSync", params: [F64], result: STATS_T, valueParams: exactValueParams(F64) },
|
|
613
619
|
fchmodSync: { fn: "fs.fchmodSync", params: [F64, F64], result: VOID, valueParams: exactValueParams(F64, F64) },
|
|
614
620
|
fsyncSync: { fn: "fs.fsyncSync", params: [F64], result: VOID, valueParams: exactValueParams(F64) },
|
|
621
|
+
fdatasyncSync: { fn: "fs.fdatasyncSync", params: [F64], result: VOID, valueParams: exactValueParams(F64) },
|
|
622
|
+
ftruncateSync: { fn: "fs.ftruncateSync", params: [F64, F64], result: VOID },
|
|
623
|
+
readvSync: { fn: "fs.readvSync", params: [F64, arrayOf(BYTES_U8), F64], result: F64 },
|
|
624
|
+
writevSync: { fn: "fs.writevSync", params: [F64, arrayOf(BYTES_U8), F64], result: F64 },
|
|
615
625
|
linkSync: { fn: "fs.linkSync", params: [STRING, STRING], result: VOID, valueParams: exactValueParams(STRING, STRING) },
|
|
616
626
|
// realpath(3) — Node's realpathSync (failures spell syscall "lstat",
|
|
617
627
|
// Node's own message shape).
|
|
@@ -699,7 +709,7 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
699
709
|
// form KEEPS its one-libCall lowering (lowerCryptoComposedCall runs
|
|
700
710
|
// first and the Buffer never materializes there); this entry covers
|
|
701
711
|
// the bare calls and non-composed uses.
|
|
702
|
-
randomBytes: { fn: "crypto.randomBytes", params: [F64], result: BYTES_U8 },
|
|
712
|
+
randomBytes: { fn: "crypto.randomBytes", params: [F64], result: BYTES_U8, valueParams: exactValueParams(F64) },
|
|
703
713
|
// The crypto utility surface is special-cased for overloads and
|
|
704
714
|
// string/Buffer splits in lowerCryptoModuleCall. These rows carry the
|
|
705
715
|
// canonical signatures for manifest projection and fallback dispatch.
|
|
@@ -711,6 +721,10 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
711
721
|
randomInt: { fn: "crypto.randomInt", params: [F64, F64], result: F64 },
|
|
712
722
|
pbkdf2Sync: { fn: "crypto.pbkdf2", params: [BYTES_U8, BYTES_U8, F64, F64, STRING], result: BYTES_U8 },
|
|
713
723
|
pbkdf2: { fn: "crypto.pbkdf2Cb", params: [], result: VOID },
|
|
724
|
+
hkdfSync: { fn: "crypto.hkdf", params: [STRING, BYTES_U8, BYTES_U8, BYTES_U8, F64], result: DYN },
|
|
725
|
+
hkdf: { fn: "crypto.hkdfCb", params: [], result: VOID },
|
|
726
|
+
scryptSync: { fn: "crypto.scrypt", params: [BYTES_U8, BYTES_U8, F64, DYN], result: BYTES_U8 },
|
|
727
|
+
scrypt: { fn: "crypto.scryptCb", params: [], result: VOID },
|
|
714
728
|
},
|
|
715
729
|
zlib: {
|
|
716
730
|
// The default-options convenience family is special-cased in
|
|
@@ -769,6 +783,15 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
769
783
|
// call-site-specific result type before this canonical signature is used.
|
|
770
784
|
util: {
|
|
771
785
|
parseArgs: { fn: "util.parseArgs", params: [DYN], result: DYN },
|
|
786
|
+
parseEnv: { fn: "util.parseEnv", params: [DYN], result: DYN },
|
|
787
|
+
},
|
|
788
|
+
buffer: {
|
|
789
|
+
isAscii: { fn: "buffer.isAscii", params: [DYN], result: BOOL },
|
|
790
|
+
isUtf8: { fn: "buffer.isUtf8", params: [DYN], result: BOOL },
|
|
791
|
+
transcode: { fn: "buffer.transcode", params: [DYN, DYN, DYN], result: BYTES_U8 },
|
|
792
|
+
},
|
|
793
|
+
process: {
|
|
794
|
+
loadEnvFile: { fn: "process.loadEnvFile", params: [DYN], result: VOID },
|
|
772
795
|
},
|
|
773
796
|
// node:string_decoder's surface is the StringDecoder CLASS — new/write/
|
|
774
797
|
// end are special-cased (lowerNew + lowerStringDecoderMethodCall); no
|
|
@@ -950,6 +973,13 @@ export const BUILTIN_MODULE_FN_ALIASES = {
|
|
|
950
973
|
},
|
|
951
974
|
};
|
|
952
975
|
export const AMBIENT_SURFACE_FNS = [
|
|
976
|
+
{
|
|
977
|
+
id: "node-builtin.fs.callbacks",
|
|
978
|
+
kind: "node-builtin",
|
|
979
|
+
name: "fs error-first callbacks",
|
|
980
|
+
fns: ["fs.callbackValue", "fs.callbackCall"],
|
|
981
|
+
note: "native filesystem callbacks, including stored platform adapter functions",
|
|
982
|
+
},
|
|
953
983
|
// ── the Date slice (lowerDateCall/lowerNew): statics, construction,
|
|
954
984
|
// stored read-only values, calendar getters, and ISO formatting.
|
|
955
985
|
{
|
|
@@ -1200,9 +1230,17 @@ function ownEntry(table, key) {
|
|
|
1200
1230
|
/** One MEMBER's table entry, own-property-safe (`path.toString` must not
|
|
1201
1231
|
* answer Object.prototype.toString as a BuiltinModuleFn). */
|
|
1202
1232
|
export function builtinModuleFnOf(lowerer, module, member) {
|
|
1233
|
+
if (module === "fs" && FS_CALLBACK_MEMBERS.has(member))
|
|
1234
|
+
return { fn: "fs.callbackCall", params: [], result: DYN };
|
|
1203
1235
|
const mod = builtinModuleFnsOf(lowerer, module);
|
|
1204
1236
|
return mod ? ownEntry(mod, member) : undefined;
|
|
1205
1237
|
}
|
|
1238
|
+
/** Native error-first function values used by platform service adapters. */
|
|
1239
|
+
export const FS_CALLBACK_MEMBERS = new Set([
|
|
1240
|
+
"access", "cp", "copyFile", "chmod", "chown", "glob", "link", "mkdir", "mkdtemp", "rm", "rmdir", "unlink",
|
|
1241
|
+
"open", "close", "fstat", "ftruncate", "fsync", "fdatasync", "fchmod", "read", "write", "readv", "writev", "readlink", "realpath", "rename", "stat", "lstat",
|
|
1242
|
+
"symlink", "truncate", "utimes", "readFile", "writeFile", "appendFile", "readdir",
|
|
1243
|
+
]);
|
|
1206
1244
|
/** One member's fence hint, own-property-safe (a collision would print an
|
|
1207
1245
|
* inherited function into the diagnostic text). */
|
|
1208
1246
|
export function builtinFenceHintOf(module, member) {
|
|
@@ -1340,11 +1378,6 @@ export const BUILTIN_MODULE_FENCE_HINTS = {
|
|
|
1340
1378
|
"symmetric ciphers need a cipher stack the static runtime does not vendor — " +
|
|
1341
1379
|
"the lowered crypto surface is hashing, randomness, and the introspection statics",
|
|
1342
1380
|
])),
|
|
1343
|
-
...Object.fromEntries(["scrypt", "scryptSync", "hkdf", "hkdfSync"].map((m) => [
|
|
1344
|
-
m,
|
|
1345
|
-
"key-derivation functions have no lowering yet — the lowered crypto surface is " +
|
|
1346
|
-
"hashing, randomness, and the introspection statics",
|
|
1347
|
-
])),
|
|
1348
1381
|
setFips: "a compiled binary has no FIPS provider to enable, and Node itself throws on setFips(true) " +
|
|
1349
1382
|
"in a non-FIPS build — getFips() answers 0 here",
|
|
1350
1383
|
webcrypto: "the WebCrypto object has no lowering — the lowered crypto surface is randomUUID, " +
|
|
@@ -1468,13 +1501,11 @@ export function stdlibMemberFence(lowerer, access) {
|
|
|
1468
1501
|
}
|
|
1469
1502
|
else if (container === "TextEncoder") {
|
|
1470
1503
|
hint =
|
|
1471
|
-
"TextEncoder instances can be stored, passed, and captured; encode(string) and
|
|
1472
|
-
"while encodeInto and other members have no static lowering";
|
|
1504
|
+
"TextEncoder instances can be stored, passed, and captured; encode(), encodeInto(string, Uint8Array), and encoding compile";
|
|
1473
1505
|
}
|
|
1474
1506
|
else if (container === "TextDecoder") {
|
|
1475
1507
|
hint =
|
|
1476
|
-
"TextDecoder instances
|
|
1477
|
-
"decode(Uint8Array/Buffer) and decode() compile; streaming, constructor options, and other members have no static lowering";
|
|
1508
|
+
"TextDecoder instances support recognized labels, encoding/fatal/ignoreBOM properties, literal constructor options, and streaming UTF-8/UTF-16/single-byte decode; runtime option objects remain unsupported";
|
|
1478
1509
|
}
|
|
1479
1510
|
else if (member === "prototype") {
|
|
1480
1511
|
hint =
|
|
@@ -1641,7 +1672,7 @@ export function isStdlibGlobal(lowerer, expr, name) {
|
|
|
1641
1672
|
* anything else, so property-lowering chains keep trying other
|
|
1642
1673
|
* receivers. */
|
|
1643
1674
|
export function stdlibGlobalMember(lowerer, access, name) {
|
|
1644
|
-
if (access
|
|
1675
|
+
if (lowerer.chainBlocked(access))
|
|
1645
1676
|
return null;
|
|
1646
1677
|
return lowerer.isStdlibGlobal(access.expression, name) ? access.name.text : null;
|
|
1647
1678
|
}
|
|
@@ -1696,12 +1727,10 @@ export function stdlibGlobalAliasNameOf(lowerer, init) {
|
|
|
1696
1727
|
ts.isVariableDeclaration(init.parent) &&
|
|
1697
1728
|
(lowerer.typeOf(init.parent.name).flags & ts.TypeFlags.Any) !== 0)
|
|
1698
1729
|
return null;
|
|
1699
|
-
//
|
|
1700
|
-
//
|
|
1701
|
-
//
|
|
1702
|
-
|
|
1703
|
-
// ordinary value paths (and their fences) apply.
|
|
1704
|
-
return name === "process" || name === "console" || name === "globalThis" || name === "performance"
|
|
1730
|
+
// These globals have provenance-aware call or member lowering, so a
|
|
1731
|
+
// stable snapshot keeps the same dispatch as the original global.
|
|
1732
|
+
// Other callable globals still use their ordinary value paths.
|
|
1733
|
+
return ["process", "console", "globalThis", "performance", "Array", "Buffer", "BigInt", "Number", "String", "Boolean"].includes(name)
|
|
1705
1734
|
? name
|
|
1706
1735
|
: null;
|
|
1707
1736
|
}
|