@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.
Files changed (284) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +84 -19
  2. package/dist/backend/cycle-analysis.js +1 -0
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/llvm/classes.js +21 -5
  5. package/dist/backend/llvm/classes.js.map +1 -1
  6. package/dist/backend/llvm/dyn.d.ts +8 -0
  7. package/dist/backend/llvm/dyn.js +247 -108
  8. package/dist/backend/llvm/dyn.js.map +1 -1
  9. package/dist/backend/llvm/emitter.d.ts +6 -3
  10. package/dist/backend/llvm/emitter.js +99 -25
  11. package/dist/backend/llvm/emitter.js.map +1 -1
  12. package/dist/backend/llvm/emitter.test.js +9 -1
  13. package/dist/backend/llvm/emitter.test.js.map +1 -1
  14. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  15. package/dist/backend/llvm/expr-bytes.js +28 -17
  16. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  17. package/dist/backend/llvm/expr-containers.js +5 -0
  18. package/dist/backend/llvm/expr-containers.js.map +1 -1
  19. package/dist/backend/llvm/expr-control.js +1 -1
  20. package/dist/backend/llvm/expr-control.js.map +1 -1
  21. package/dist/backend/llvm/expr-dynamic.js +47 -13
  22. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  23. package/dist/backend/llvm/expr-primitives.js +11 -1
  24. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  25. package/dist/backend/llvm/expr-records.js +11 -3
  26. package/dist/backend/llvm/expr-records.js.map +1 -1
  27. package/dist/backend/llvm/expr-stream-bridges.js +187 -18
  28. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  29. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  30. package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
  31. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  32. package/dist/backend/llvm/lib-dispatch.js +41 -3
  33. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  34. package/dist/backend/llvm/lib-filesystem.js +12 -9
  35. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  36. package/dist/backend/llvm/lib-process.js +23 -3
  37. package/dist/backend/llvm/lib-process.js.map +1 -1
  38. package/dist/backend/llvm/lib-shared.js +80 -3
  39. package/dist/backend/llvm/lib-shared.js.map +1 -1
  40. package/dist/backend/llvm/shapes.js +8 -2
  41. package/dist/backend/llvm/shapes.js.map +1 -1
  42. package/dist/backend/may-throw.js +4 -0
  43. package/dist/backend/may-throw.js.map +1 -1
  44. package/dist/backend/native-codegen.d.ts +1 -1
  45. package/dist/backend/native-codegen.js +4 -3
  46. package/dist/backend/native-codegen.js.map +1 -1
  47. package/dist/backend/native-codegen.test.js +11 -0
  48. package/dist/backend/native-codegen.test.js.map +1 -1
  49. package/dist/backend/native-toolchain.d.ts +3 -6
  50. package/dist/backend/native-toolchain.js +53 -23
  51. package/dist/backend/native-toolchain.js.map +1 -1
  52. package/dist/backend/native-toolchain.test.js +72 -0
  53. package/dist/backend/native-toolchain.test.js.map +1 -1
  54. package/dist/backend/runtime-abi.d.ts +2 -2
  55. package/dist/backend/runtime-abi.js +2 -2
  56. package/dist/backend/runtime-pack-native.js +4 -1
  57. package/dist/backend/runtime-pack-native.js.map +1 -1
  58. package/dist/backend/runtime-pack-targets.test.js +1 -1
  59. package/dist/backend/runtime-pack.test.js +1 -1
  60. package/dist/backend/target-diagnostics.d.ts +5 -0
  61. package/dist/backend/target-diagnostics.js +72 -1
  62. package/dist/backend/target-diagnostics.js.map +1 -1
  63. package/dist/backend/target-diagnostics.test.d.ts +1 -0
  64. package/dist/backend/target-diagnostics.test.js +68 -0
  65. package/dist/backend/target-diagnostics.test.js.map +1 -0
  66. package/dist/backend/targets.js +10 -6
  67. package/dist/backend/targets.js.map +1 -1
  68. package/dist/backend/targets.test.js +7 -0
  69. package/dist/backend/targets.test.js.map +1 -1
  70. package/dist/compat/fetch-profile.js +34 -4
  71. package/dist/compat/fetch-profile.js.map +1 -1
  72. package/dist/coverage/surface-manifest.js +5 -3
  73. package/dist/coverage/surface-manifest.js.map +1 -1
  74. package/dist/diagnostics/diagnostic.js +2 -7
  75. package/dist/diagnostics/diagnostic.js.map +1 -1
  76. package/dist/executable/executable-cache.d.ts +7 -3
  77. package/dist/executable/executable-cache.js +47 -11
  78. package/dist/executable/executable-cache.js.map +1 -1
  79. package/dist/executable/executable-cache.test.js +109 -2
  80. package/dist/executable/executable-cache.test.js.map +1 -1
  81. package/dist/executable/prepare.js +2 -1
  82. package/dist/executable/prepare.js.map +1 -1
  83. package/dist/frontend/builtin-modules.d.ts +1 -1
  84. package/dist/frontend/builtin-modules.js +1 -1
  85. package/dist/frontend/builtin-modules.js.map +1 -1
  86. package/dist/frontend/function-completion.d.ts +6 -0
  87. package/dist/frontend/function-completion.js +50 -0
  88. package/dist/frontend/function-completion.js.map +1 -0
  89. package/dist/frontend/lowering/abstract-equality.js +5 -1
  90. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  91. package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
  92. package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
  93. package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
  94. package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
  95. package/dist/frontend/lowering/checked-promise-all.js +31 -0
  96. package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
  97. package/dist/frontend/lowering/class-callbacks.d.ts +4 -4
  98. package/dist/frontend/lowering/class-callbacks.js +29 -17
  99. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  100. package/dist/frontend/lowering/class-construction.d.ts +14 -0
  101. package/dist/frontend/lowering/class-construction.js +185 -0
  102. package/dist/frontend/lowering/class-construction.js.map +1 -0
  103. package/dist/frontend/lowering/class-descriptors.d.ts +2 -1
  104. package/dist/frontend/lowering/class-descriptors.js +58 -10
  105. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  106. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +36 -1
  107. package/dist/frontend/lowering/class-dynamic-dispatch.js +965 -91
  108. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  109. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +66 -3
  110. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  111. package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
  112. package/dist/frontend/lowering/class-instance-constructor.js +15 -42
  113. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  114. package/dist/frontend/lowering/class-method-values.d.ts +20 -1
  115. package/dist/frontend/lowering/class-method-values.js +120 -24
  116. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  117. package/dist/frontend/lowering/class-prototypes.d.ts +10 -3
  118. package/dist/frontend/lowering/class-prototypes.js +188 -21
  119. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  120. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  121. package/dist/frontend/lowering/class-runtime-statics.js +84 -0
  122. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
  123. package/dist/frontend/lowering/class-static-data.d.ts +1 -0
  124. package/dist/frontend/lowering/class-static-data.js +6 -4
  125. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  126. package/dist/frontend/lowering/containers/bytes.js +66 -17
  127. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  128. package/dist/frontend/lowering/containers/string-and-regexp.js +24 -47
  129. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  130. package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
  131. package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
  132. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
  133. package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
  134. package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
  135. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
  136. package/dist/frontend/lowering/error-methods.d.ts +4 -1
  137. package/dist/frontend/lowering/error-methods.js +100 -1
  138. package/dist/frontend/lowering/error-methods.js.map +1 -1
  139. package/dist/frontend/lowering/expressions/native-proxy.js +3 -1
  140. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  141. package/dist/frontend/lowering/expressions/nullish-assignment.js +19 -11
  142. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  143. package/dist/frontend/lowering/expressions/object-literals.js +68 -7
  144. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  145. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
  146. package/dist/frontend/lowering/expressions/optional-chains.js +72 -20
  147. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  148. package/dist/frontend/lowering/function-context.d.ts +11 -3
  149. package/dist/frontend/lowering/function-context.js +11 -5
  150. package/dist/frontend/lowering/function-context.js.map +1 -1
  151. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -0
  152. package/dist/frontend/lowering/generator-dynamic-dispatch.js +39 -1
  153. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  154. package/dist/frontend/lowering/lib-boundary.d.ts +2 -0
  155. package/dist/frontend/lowering/lib-boundary.js +54 -1
  156. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  157. package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -1
  158. package/dist/frontend/lowering/lower-builtin-values.js +113 -3
  159. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  160. package/dist/frontend/lowering/lower-builtins.d.ts +10 -14
  161. package/dist/frontend/lowering/lower-builtins.js +443 -88
  162. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  163. package/dist/frontend/lowering/lower-calls.d.ts +8 -5
  164. package/dist/frontend/lowering/lower-calls.js +717 -142
  165. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  166. package/dist/frontend/lowering/lower-classes.d.ts +18 -13
  167. package/dist/frontend/lowering/lower-classes.js +1076 -188
  168. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  169. package/dist/frontend/lowering/lower-containers.d.ts +9 -0
  170. package/dist/frontend/lowering/lower-containers.js +172 -51
  171. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  172. package/dist/frontend/lowering/lower-dgram.js +3 -2
  173. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  174. package/dist/frontend/lowering/lower-exprs.d.ts +12 -8
  175. package/dist/frontend/lowering/lower-exprs.js +802 -232
  176. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  177. package/dist/frontend/lowering/lower-generators.js +17 -2
  178. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  179. package/dist/frontend/lowering/lower-inspect.js +15 -1
  180. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  181. package/dist/frontend/lowering/lower-island.d.ts +2 -0
  182. package/dist/frontend/lowering/lower-island.js +36 -10
  183. package/dist/frontend/lowering/lower-island.js.map +1 -1
  184. package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
  185. package/dist/frontend/lowering/lower-island.test.js +51 -0
  186. package/dist/frontend/lowering/lower-island.test.js.map +1 -0
  187. package/dist/frontend/lowering/lower-modules.d.ts +1 -3
  188. package/dist/frontend/lowering/lower-modules.js +380 -73
  189. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  190. package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
  191. package/dist/frontend/lowering/lower-modules.test.js +107 -0
  192. package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
  193. package/dist/frontend/lowering/lower-stmts.d.ts +7 -3
  194. package/dist/frontend/lowering/lower-stmts.js +221 -47
  195. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  196. package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
  197. package/dist/frontend/lowering/lower-stmts.test.js +77 -0
  198. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
  199. package/dist/frontend/lowering/lower-stream.js +3 -1
  200. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  201. package/dist/frontend/lowering/lower-url.d.ts +2 -1
  202. package/dist/frontend/lowering/lower-url.js +32 -9
  203. package/dist/frontend/lowering/lower-url.js.map +1 -1
  204. package/dist/frontend/lowering/lowerer.d.ts +53 -10
  205. package/dist/frontend/lowering/lowerer.js +390 -77
  206. package/dist/frontend/lowering/lowerer.js.map +1 -1
  207. package/dist/frontend/lowering/lowerer.test.js +187 -3
  208. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  209. package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
  210. package/dist/frontend/lowering/module-namespace-elements.js +54 -0
  211. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
  212. package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
  213. package/dist/frontend/lowering/object-factory-new.js +27 -14
  214. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  215. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  216. package/dist/frontend/lowering/surfaces.js +48 -19
  217. package/dist/frontend/lowering/surfaces.js.map +1 -1
  218. package/dist/frontend/lowering/text-decoder-encoding.d.ts +2 -0
  219. package/dist/frontend/lowering/text-decoder-encoding.js +8 -0
  220. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
  221. package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
  222. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
  223. package/dist/frontend/lowering/unregistered-class-types.test.js +3 -3
  224. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
  225. package/dist/frontend/npm-static-prune.js +116 -34
  226. package/dist/frontend/npm-static-prune.js.map +1 -1
  227. package/dist/frontend/npm-static-prune.test.js +8 -0
  228. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  229. package/dist/frontend/program.d.ts +1 -1
  230. package/dist/frontend/program.js +57 -26
  231. package/dist/frontend/program.js.map +1 -1
  232. package/dist/frontend/program.test.js +18 -0
  233. package/dist/frontend/program.test.js.map +1 -1
  234. package/dist/frontend/ts7/ast.js +4 -3
  235. package/dist/frontend/ts7/ast.js.map +1 -1
  236. package/dist/frontend/ts7/semantic-json.js +5 -10
  237. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  238. package/dist/frontend/type-mapper.d.ts +9 -1
  239. package/dist/frontend/type-mapper.js +169 -23
  240. package/dist/frontend/type-mapper.js.map +1 -1
  241. package/dist/frontend/type-mapper.test.js +23 -0
  242. package/dist/frontend/type-mapper.test.js.map +1 -1
  243. package/dist/frontend/union-discriminants.d.ts +1 -1
  244. package/dist/frontend/union-discriminants.js +24 -9
  245. package/dist/frontend/union-discriminants.js.map +1 -1
  246. package/dist/index.js +16 -10
  247. package/dist/index.js.map +1 -1
  248. package/dist/ir/analysis.js +2 -0
  249. package/dist/ir/analysis.js.map +1 -1
  250. package/dist/ir/ir.d.ts +74 -41
  251. package/dist/ir/ir.js +167 -43
  252. package/dist/ir/ir.js.map +1 -1
  253. package/dist/ir/ir.test.js +35 -0
  254. package/dist/ir/ir.test.js.map +1 -1
  255. package/dist/ir/serialize.js +35 -3
  256. package/dist/ir/serialize.js.map +1 -1
  257. package/dist/ir/serialize.test.js +26 -1
  258. package/dist/ir/serialize.test.js.map +1 -1
  259. package/dist/ir/traverse.d.ts +0 -3
  260. package/dist/ir/traverse.js +33 -20
  261. package/dist/ir/traverse.js.map +1 -1
  262. package/dist/ir/validate.js +136 -16
  263. package/dist/ir/validate.js.map +1 -1
  264. package/dist/ir/validate.test.js +77 -1
  265. package/dist/ir/validate.test.js.map +1 -1
  266. package/dist/library/compiler-self-identity.js +1 -1
  267. package/dist/library/compiler-self-identity.test.js +2 -2
  268. package/dist/library/compiler-self-identity.test.js.map +1 -1
  269. package/dist/library/int-infer.d.ts +2 -2
  270. package/dist/library/int-infer.js +10 -7
  271. package/dist/library/int-infer.js.map +1 -1
  272. package/dist/library/int-infer.test.js +44 -0
  273. package/dist/library/int-infer.test.js.map +1 -1
  274. package/dist/library/prepare.js +2 -1
  275. package/dist/library/prepare.js.map +1 -1
  276. package/dist/native/sanitizer.js +3 -1
  277. package/dist/native/sanitizer.js.map +1 -1
  278. package/dist/native/toolchain.d.ts +1 -1
  279. package/dist/native/toolchain.js +26 -6
  280. package/dist/native/toolchain.js.map +1 -1
  281. package/dist/native/toolchain.test.js +53 -1
  282. package/dist/native/toolchain.test.js.map +1 -1
  283. package/package.json +20 -20
  284. 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 { IrExpr } from "../../ir/ir.js";
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
- /** An ordinary constructor's explicit object return replaces its receiver.
6
- * Without observing this or new.target, it can use the function's call ABI. */
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
- export function objectFactorySignature(lowerer, expr) {
7
+ function isObjectFactoryNew(lowerer, expr) {
7
8
  if (!ts.isIdentifier(expr.expression) || lowerer.peekLocal(expr.expression))
8
- return null;
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 null;
24
- const declaration = lowerer.checker.declarationsOf(symbol).find((node) => ts.isFunctionDeclaration(node) && node.body !== undefined);
25
- if (!declaration?.body || !bindingNeverReassigned(lowerer, symbol, declaration) || !isJsSourceFile(declaration.getSourceFile()) || declaration.asteriskToken ||
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 null;
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 || !ts.isObjectLiteralExpression(last.expression))
30
- return null;
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 || !ts.isObjectLiteralExpression(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
- if (!safe)
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 signature = lowerer.fnSigOf(expr.expression);
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":"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"}
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 MAP_METHODS = new Set(["get", "set", "has", "delete", "clear", "forEach"]);
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 encode() compile, " +
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 with recognized literal WHATWG labels and default options can be stored, passed, and captured; " +
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.questionDotToken)
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
- // Only alias OBJECT-shaped globals whose members lower by receiver
1700
- // identity (process, console, globalThis itself, and perf_hooks'
1701
- // performance — the mockable-clock idiom snapshots it). Function-valued
1702
- // globals (setTimeout) taken as values are a different story — the
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
  }