@scriptc/compiler 0.2.2 → 0.2.4

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 (243) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +99 -27
  2. package/dist/backend/cycle-analysis.js +63 -50
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-analysis.test.js +51 -0
  5. package/dist/backend/cycle-analysis.test.js.map +1 -1
  6. package/dist/backend/llvm/borrowed-inputs.d.ts +15 -0
  7. package/dist/backend/llvm/borrowed-inputs.js +28 -0
  8. package/dist/backend/llvm/borrowed-inputs.js.map +1 -0
  9. package/dist/backend/llvm/borrowed-receivers.d.ts +9 -0
  10. package/dist/backend/llvm/borrowed-receivers.js +58 -0
  11. package/dist/backend/llvm/borrowed-receivers.js.map +1 -0
  12. package/dist/backend/llvm/byte-numbers.d.ts +10 -0
  13. package/dist/backend/llvm/byte-numbers.js +235 -0
  14. package/dist/backend/llvm/byte-numbers.js.map +1 -0
  15. package/dist/backend/llvm/bytes-bounds.d.ts +9 -0
  16. package/dist/backend/llvm/bytes-bounds.js +189 -0
  17. package/dist/backend/llvm/bytes-bounds.js.map +1 -0
  18. package/dist/backend/llvm/call-lifetimes.d.ts +27 -0
  19. package/dist/backend/llvm/call-lifetimes.js +199 -0
  20. package/dist/backend/llvm/call-lifetimes.js.map +1 -0
  21. package/dist/backend/llvm/call-lifetimes.test.d.ts +1 -0
  22. package/dist/backend/llvm/call-lifetimes.test.js +259 -0
  23. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -0
  24. package/dist/backend/llvm/checked-value-lifetimes.d.ts +9 -0
  25. package/dist/backend/llvm/checked-value-lifetimes.js +35 -0
  26. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -0
  27. package/dist/backend/llvm/counted-loops.d.ts +6 -0
  28. package/dist/backend/llvm/counted-loops.js +28 -0
  29. package/dist/backend/llvm/counted-loops.js.map +1 -0
  30. package/dist/backend/llvm/dyn.d.ts +2 -2
  31. package/dist/backend/llvm/dyn.js +79 -35
  32. package/dist/backend/llvm/dyn.js.map +1 -1
  33. package/dist/backend/llvm/emitter.d.ts +56 -7
  34. package/dist/backend/llvm/emitter.js +310 -37
  35. package/dist/backend/llvm/emitter.js.map +1 -1
  36. package/dist/backend/llvm/emitter.test.js +24 -5
  37. package/dist/backend/llvm/emitter.test.js.map +1 -1
  38. package/dist/backend/llvm/expr-async.js +4 -3
  39. package/dist/backend/llvm/expr-async.js.map +1 -1
  40. package/dist/backend/llvm/expr-bytes.d.ts +4 -4
  41. package/dist/backend/llvm/expr-bytes.js +68 -35
  42. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  43. package/dist/backend/llvm/expr-calls.js +50 -5
  44. package/dist/backend/llvm/expr-calls.js.map +1 -1
  45. package/dist/backend/llvm/expr-containers.d.ts +2 -1
  46. package/dist/backend/llvm/expr-containers.js +136 -57
  47. package/dist/backend/llvm/expr-containers.js.map +1 -1
  48. package/dist/backend/llvm/expr-context.d.ts +11 -0
  49. package/dist/backend/llvm/expr-control.js +26 -5
  50. package/dist/backend/llvm/expr-control.js.map +1 -1
  51. package/dist/backend/llvm/expr-dynamic.js +33 -31
  52. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  53. package/dist/backend/llvm/expr-primitives.js +61 -27
  54. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  55. package/dist/backend/llvm/expr-records.js +9 -3
  56. package/dist/backend/llvm/expr-records.js.map +1 -1
  57. package/dist/backend/llvm/expr-stream-bridges.js +5 -10
  58. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  59. package/dist/backend/llvm/integer-values.d.ts +10 -0
  60. package/dist/backend/llvm/integer-values.js +41 -0
  61. package/dist/backend/llvm/integer-values.js.map +1 -0
  62. package/dist/backend/llvm/integer-views.d.ts +7 -0
  63. package/dist/backend/llvm/integer-views.js +67 -0
  64. package/dist/backend/llvm/integer-views.js.map +1 -0
  65. package/dist/backend/llvm/integer-views.test.d.ts +1 -0
  66. package/dist/backend/llvm/integer-views.test.js +34 -0
  67. package/dist/backend/llvm/integer-views.test.js.map +1 -0
  68. package/dist/backend/llvm/lib-dispatch.js +3 -1
  69. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  70. package/dist/backend/llvm/lib-filesystem.js +5 -5
  71. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  72. package/dist/backend/llvm/lib-shared.js +35 -1
  73. package/dist/backend/llvm/lib-shared.js.map +1 -1
  74. package/dist/backend/llvm/local-array-reads.d.ts +42 -0
  75. package/dist/backend/llvm/local-array-reads.js +226 -0
  76. package/dist/backend/llvm/local-array-reads.js.map +1 -0
  77. package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
  78. package/dist/backend/llvm/local-array-reads.test.js +446 -0
  79. package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
  80. package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
  81. package/dist/backend/llvm/map-read-lifetimes.js +128 -0
  82. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
  83. package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
  84. package/dist/backend/llvm/map-read-lifetimes.test.js +127 -0
  85. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
  86. package/dist/backend/llvm/reference-effects.d.ts +22 -0
  87. package/dist/backend/llvm/reference-effects.js +148 -0
  88. package/dist/backend/llvm/reference-effects.js.map +1 -0
  89. package/dist/backend/llvm/reference-effects.test.d.ts +1 -0
  90. package/dist/backend/llvm/reference-effects.test.js +74 -0
  91. package/dist/backend/llvm/reference-effects.test.js.map +1 -0
  92. package/dist/backend/llvm/shapes.d.ts +7 -4
  93. package/dist/backend/llvm/shapes.js +24 -6
  94. package/dist/backend/llvm/shapes.js.map +1 -1
  95. package/dist/backend/llvm/split.js +15 -5
  96. package/dist/backend/llvm/split.js.map +1 -1
  97. package/dist/backend/llvm/split.test.js +17 -0
  98. package/dist/backend/llvm/split.test.js.map +1 -1
  99. package/dist/backend/llvm/stack-unions.d.ts +20 -0
  100. package/dist/backend/llvm/stack-unions.js +61 -0
  101. package/dist/backend/llvm/stack-unions.js.map +1 -0
  102. package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
  103. package/dist/backend/llvm/stack-unions.test.js +262 -0
  104. package/dist/backend/llvm/stack-unions.test.js.map +1 -0
  105. package/dist/backend/llvm/string-construction.d.ts +10 -0
  106. package/dist/backend/llvm/string-construction.js +38 -0
  107. package/dist/backend/llvm/string-construction.js.map +1 -0
  108. package/dist/backend/llvm/string-construction.test.d.ts +1 -0
  109. package/dist/backend/llvm/string-construction.test.js +65 -0
  110. package/dist/backend/llvm/string-construction.test.js.map +1 -0
  111. package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
  112. package/dist/backend/llvm/string-lifetimes.js +72 -0
  113. package/dist/backend/llvm/string-lifetimes.js.map +1 -0
  114. package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
  115. package/dist/backend/llvm/string-lifetimes.test.js +239 -0
  116. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
  117. package/dist/backend/mangle.d.ts +2 -0
  118. package/dist/backend/mangle.js +4 -0
  119. package/dist/backend/mangle.js.map +1 -1
  120. package/dist/backend/may-throw.js +67 -29
  121. package/dist/backend/may-throw.js.map +1 -1
  122. package/dist/backend/may-throw.test.js +104 -1
  123. package/dist/backend/may-throw.test.js.map +1 -1
  124. package/dist/backend/native-toolchain.d.ts +2 -2
  125. package/dist/backend/native-toolchain.js +2 -0
  126. package/dist/backend/native-toolchain.js.map +1 -1
  127. package/dist/frontend/input-tracker.js +3 -3
  128. package/dist/frontend/input-tracker.js.map +1 -1
  129. package/dist/frontend/input-tracker.test.js +38 -2
  130. package/dist/frontend/input-tracker.test.js.map +1 -1
  131. package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
  132. package/dist/frontend/lowering/collection-ingestion.js +224 -0
  133. package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
  134. package/dist/frontend/lowering/containers/bytes.js +2 -0
  135. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  136. package/dist/frontend/lowering/containers/string-and-regexp.js +6 -0
  137. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  138. package/dist/frontend/lowering/import-meta.d.ts +10 -0
  139. package/dist/frontend/lowering/import-meta.js +52 -0
  140. package/dist/frontend/lowering/import-meta.js.map +1 -0
  141. package/dist/frontend/lowering/lower-assert.js +105 -41
  142. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  143. package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
  144. package/dist/frontend/lowering/lower-builtin-values.js +22 -1
  145. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  146. package/dist/frontend/lowering/lower-builtins.d.ts +3 -13
  147. package/dist/frontend/lowering/lower-builtins.js +152 -46
  148. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  149. package/dist/frontend/lowering/lower-calls.js +6 -3
  150. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  151. package/dist/frontend/lowering/lower-classes.js +7 -7
  152. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  153. package/dist/frontend/lowering/lower-containers.d.ts +5 -1
  154. package/dist/frontend/lowering/lower-containers.js +52 -37
  155. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  156. package/dist/frontend/lowering/lower-exprs.js +47 -43
  157. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  158. package/dist/frontend/lowering/lower-inspect.js +43 -0
  159. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  160. package/dist/frontend/lowering/lower-stmts.js +72 -68
  161. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  162. package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
  163. package/dist/frontend/lowering/lower-system-errors.js +29 -0
  164. package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
  165. package/dist/frontend/lowering/lowerer.d.ts +4 -3
  166. package/dist/frontend/lowering/lowerer.js +60 -25
  167. package/dist/frontend/lowering/lowerer.js.map +1 -1
  168. package/dist/frontend/lowering/surfaces.d.ts +2 -2
  169. package/dist/frontend/lowering/surfaces.js +69 -21
  170. package/dist/frontend/lowering/surfaces.js.map +1 -1
  171. package/dist/frontend/module-syntax.d.ts +1 -1
  172. package/dist/frontend/module-syntax.js +8 -1
  173. package/dist/frontend/module-syntax.js.map +1 -1
  174. package/dist/frontend/module-syntax.test.js +10 -0
  175. package/dist/frontend/module-syntax.test.js.map +1 -1
  176. package/dist/frontend/npm.d.ts +4 -0
  177. package/dist/frontend/npm.js +86 -33
  178. package/dist/frontend/npm.js.map +1 -1
  179. package/dist/frontend/npm.test.js +103 -0
  180. package/dist/frontend/npm.test.js.map +1 -1
  181. package/dist/frontend/pipeline-native.js +2 -1
  182. package/dist/frontend/pipeline-native.js.map +1 -1
  183. package/dist/frontend/services-node.js +3 -2
  184. package/dist/frontend/services-node.js.map +1 -1
  185. package/dist/frontend/services.d.ts +5 -1
  186. package/dist/frontend/services.js +9 -1
  187. package/dist/frontend/services.js.map +1 -1
  188. package/dist/frontend/services.test.js +21 -0
  189. package/dist/frontend/services.test.js.map +1 -1
  190. package/dist/frontend/ts7/ast-node.d.ts +2 -0
  191. package/dist/frontend/ts7/ast-node.js +30 -4
  192. package/dist/frontend/ts7/ast-node.js.map +1 -1
  193. package/dist/frontend/ts7/ast-node.test.js +60 -1
  194. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  195. package/dist/frontend/type-mapper.js +8 -2
  196. package/dist/frontend/type-mapper.js.map +1 -1
  197. package/dist/index.js +3 -2
  198. package/dist/index.js.map +1 -1
  199. package/dist/ir/analysis.js +4 -1
  200. package/dist/ir/analysis.js.map +1 -1
  201. package/dist/ir/byte-numbers.d.ts +20 -0
  202. package/dist/ir/byte-numbers.js +65 -0
  203. package/dist/ir/byte-numbers.js.map +1 -0
  204. package/dist/ir/byte-numbers.test.d.ts +1 -0
  205. package/dist/ir/byte-numbers.test.js +42 -0
  206. package/dist/ir/byte-numbers.test.js.map +1 -0
  207. package/dist/ir/integer-loops.d.ts +26 -0
  208. package/dist/ir/integer-loops.js +130 -1
  209. package/dist/ir/integer-loops.js.map +1 -1
  210. package/dist/ir/integer-loops.test.d.ts +1 -0
  211. package/dist/ir/integer-loops.test.js +91 -0
  212. package/dist/ir/integer-loops.test.js.map +1 -0
  213. package/dist/ir/integer-ranges.d.ts +8 -6
  214. package/dist/ir/integer-ranges.js +343 -89
  215. package/dist/ir/integer-ranges.js.map +1 -1
  216. package/dist/ir/integer-ranges.test.js +54 -3
  217. package/dist/ir/integer-ranges.test.js.map +1 -1
  218. package/dist/ir/ir.d.ts +29 -22
  219. package/dist/ir/ir.js +59 -14
  220. package/dist/ir/ir.js.map +1 -1
  221. package/dist/ir/ir.test.js +18 -0
  222. package/dist/ir/ir.test.js.map +1 -1
  223. package/dist/ir/validate.js +208 -105
  224. package/dist/ir/validate.js.map +1 -1
  225. package/dist/ir/validate.test.js +247 -0
  226. package/dist/ir/validate.test.js.map +1 -1
  227. package/dist/library/fence-eval.js +9 -2
  228. package/dist/library/fence-eval.js.map +1 -1
  229. package/dist/library/fence-eval.test.d.ts +1 -0
  230. package/dist/library/fence-eval.test.js +21 -0
  231. package/dist/library/fence-eval.test.js.map +1 -0
  232. package/dist/native/runtime-typescript.d.ts +4 -0
  233. package/dist/native/runtime-typescript.js +61 -0
  234. package/dist/native/runtime-typescript.js.map +1 -0
  235. package/dist/native/runtime-typescript.test.d.ts +1 -0
  236. package/dist/native/runtime-typescript.test.js +41 -0
  237. package/dist/native/runtime-typescript.test.js.map +1 -0
  238. package/dist/native/toolchain.js +6 -3
  239. package/dist/native/toolchain.js.map +1 -1
  240. package/dist/native/toolchain.test.js +43 -5
  241. package/dist/native/toolchain.test.js.map +1 -1
  242. package/package.json +20 -20
  243. package/surface-manifest.json +271 -17
@@ -0,0 +1,6 @@
1
+ import type { Lowerer } from "./lowerer.js";
2
+ import { type IrExpr, type SrcLoc } from "../../ir/ir.js";
3
+ /** Build the native Map through the same checked entry conversion as
4
+ * new Map(iterable), so its values use the ordinary mutable tuple layout. */
5
+ export declare function lowerSystemErrorMap(lowerer: Lowerer, loc: SrcLoc): IrExpr;
6
+ export declare function lowerSystemErrorMapValue(lowerer: Lowerer, loc: SrcLoc): IrExpr;
@@ -0,0 +1,29 @@
1
+ import { DYN, F64, STRING } from "../../ir/ir.js";
2
+ import { mapFromSeedValue } from "./lower-containers.js";
3
+ import { InternalCompilerError } from "../../errors.js";
4
+ /** Build the native Map through the same checked entry conversion as
5
+ * new Map(iterable), so its values use the ordinary mutable tuple layout. */
6
+ export function lowerSystemErrorMap(lowerer, loc) {
7
+ const pair = { kind: "record", shapeId: lowerer.shapes.intern([
8
+ { name: "0", type: STRING }, { name: "1", type: STRING },
9
+ ], true) };
10
+ const map = { kind: "map", key: F64, value: pair };
11
+ const entries = { kind: "libCall", fn: "util.systemErrorEntries", args: [], type: DYN, loc };
12
+ const result = mapFromSeedValue(lowerer, entries, map);
13
+ if (!result)
14
+ throw new InternalCompilerError("system error entries must seed a native Map");
15
+ return result;
16
+ }
17
+ export function lowerSystemErrorMapValue(lowerer, loc) {
18
+ const key = "%builtin.util.getSystemErrorMap";
19
+ let name = lowerer.builtinCallableValueFns.get(key);
20
+ const result = lowerSystemErrorMap(lowerer, loc);
21
+ if (!name) {
22
+ name = key;
23
+ lowerer.builtinCallableValueFns.set(key, name);
24
+ lowerer.liftedFns.push({ name, params: [], returnType: result.type, locals: [],
25
+ body: [{ kind: "return", value: result, loc }], loc });
26
+ }
27
+ return { kind: "closure", fnName: name, captures: [], type: { kind: "func", params: [], ret: result.type }, loc };
28
+ }
29
+ //# sourceMappingURL=lower-system-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lower-system-errors.js","sourceRoot":"","sources":["../../../src/frontend/lowering/lower-system-errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAyC,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;6EAC6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAW;IAC/D,MAAM,IAAI,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACpE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;SACzD,EAAE,IAAI,CAAC,EAAE,CAAC;IACX,MAAM,GAAG,GAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrG,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,6CAA6C,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAE,GAAW;IACpE,MAAM,GAAG,GAAG,iCAAiC,CAAC;IAC9C,IAAI,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,GAAG,CAAC;QACX,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC5E,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;AACpH,CAAC"}
@@ -1927,9 +1927,10 @@ export declare class Lowerer {
1927
1927
  exactClassOfReceiver(expr: ts.Expression): ClassInfo | null;
1928
1928
  lowerClassMembers(info: ClassInfo): IrFunction[];
1929
1929
  lowerStaticFieldInits(info: ClassInfo): IrStmt[];
1930
- /** The method-like members (methods and accessors) of a class that have
1931
- * lowerable bodies, with their collected method-map names. */
1932
- classMethodMembers(info: ClassInfo): Generator<{
1930
+ /** Method-like members with their collected method-map names. Body
1931
+ * lowering omits abstract declarations; ABI analysis must include them
1932
+ * because an abstract-typed call selects the same virtual slot. */
1933
+ classMethodMembers(info: ClassInfo, includeAbstract?: boolean): Generator<{
1933
1934
  mName: string;
1934
1935
  member: ts.MethodDeclaration | ts.AccessorDeclaration;
1935
1936
  }>;
@@ -1,4 +1,4 @@
1
- import { pathModuleValue } from "./lower-builtin-values.js";
1
+ import { lowerUtilTypeValue, pathModuleValue, utilTypesModuleValue } from "./lower-builtin-values.js";
2
2
  import { everyExprChild, everyStmtChild, transformStmtList } from "../../ir/traverse.js";
3
3
  import { RuntimeOptionalLocals } from "./runtime-optional-locals.js";
4
4
  import { sanitizeUnregisteredClassTypes } from "./sanitize-class-types.js";
@@ -33,7 +33,7 @@ import * as ts from "../ts7/adapter.js";
33
33
  import { literalValues } from "../literal-values.js";
34
34
  import { discriminantOwners, literalUnionArm } from "../union-discriminants.js";
35
35
  import { anyOpRequiresDynamicDiag, blockedBindingUseDiag, checkerPanicDiag, componentTypeDiag, isCheckerPanic, genericSignatureTypeDiag, indexSignatureTypeDiag, intersectionTypeDiag, noLoweringDiag, overloadedSignatureTypeDiag, recordShapeMismatchDiag, requiresDynamicApiDiag, requiresDynamicPackageDiag, requiresDynamicTypeDiag, unionMismatchDiag, UNSUPPORTED, unsupportedDiag, unsupportedTypeDiag, } from "../../diagnostics/diagnostic.js";
36
- import { arrayOf, BOOL, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canCrossIslandBoundary, canExitIslandToType, canMarshalTypedFuncIntoIsland, DYN, DYN_HANDLE_KINDS, F64, isDynTypedRefType, isJsonSafeType, isJsonStringifySafeType, isSupportedMapKey, isSupportedMapValue, isUndefinedArmedUnion, isUnitType, JSVAL, NULL_T, RUNTIME_ERROR_CLASSES, STRING, typeEquals, UNDEFINED_T, VOID } from "../../ir/ir.js";
36
+ import { arrayOf, BOOL, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canCrossIslandBoundary, canExitIslandToType, canMarshalTypedFuncIntoIsland, DYN, DYN_HANDLE_KINDS, F64, isDynTypedRefType, isJsonSafeType, isJsonStringifySafeType, isPrimitiveCollectionKey, isSupportedMapKey, isSupportedMapValue, isUndefinedArmedUnion, isUnitType, JSVAL, NULL_T, RUNTIME_ERROR_CLASSES, STRING, typeEquals, UNDEFINED_T, VOID } from "../../ir/ir.js";
37
37
  import {} from "../npm.js";
38
38
  import { provenanceActive } from "../provenance-registry.js";
39
39
  import { ambientDtsPath, canonicalBuiltinModule, cjsExportAssignmentOf, cjsExportDiscardReason, fallbackDtsPath, isCjsExportTableLiteral, isCjsJsFile, isJsSourceFile, isNodeEsmFile, isNodeTypesPath, locOf, orderedImportsOf, overridesDtsPath, npmStaticDepSf7, requireSpecOf, resolveImport, workspacePackageOfPath, } from "../program.js";
@@ -58,6 +58,7 @@ import { lowerDgramDnsModuleCall, lowerDgramMethodCall } from "./lower-dgram.js"
58
58
  import { lowerNodeTestModuleCall, lowerTestDirectCall, lowerTestMethodCall, lowerTestCtxProperty } from "./lower-test.js";
59
59
  import { lowerAssertModuleCall, lowerAssertDirectCall } from "./lower-assert.js";
60
60
  import { lowerUtilModuleCall } from "./lower-inspect.js";
61
+ import { lowerSystemErrorMapValue } from "./lower-system-errors.js";
61
62
  import { lowerComptime, comptimeBakeable, rejectComptimeCaptures, comptimeValueToIr } from "./lower-comptime.js";
62
63
  import { lowerStmts, hasJsTypeAnnotation, noteBlockedBindings, isBlockedBinding, lowerScopedBlock, predeclareForwardCapture, predeclareForwardFnDecl, predeclareForwardVar, lowerStmt, lowerVarStatement, lowerDestructuringDecl, lowerDestructuringAssignParts, lowerBindingPattern, lowerJsvalBindingPattern, checkBindingElement, bindPatternTarget, isParseArgsDynCheckerType, lowerVarDeclList, lowerVarDecl, lowerSwitch, lowerTry, lowerExprStatement, lowerForOf, lowerForStatement } from "./lower-stmts.js";
63
64
  import { lowerExpr, maybeNarrow, lowerUnitComparison, lowerNullishCoalesce, lowerCondition, ensureBool, requireTruthyUnion, eqComparableUnion, lowerIntrinsicProperty, lowerArrayLiteral, lowerElementAccess, lowerElementWrite, lowerRecordKeyRead, ensureString, lowerTemplate, lowerAsExpression, lowerPrefixUnary, lowerBinary, lowerCaughtTypeofTest, caughtRead, caughtLocalOf, caughtToString, lowerInstanceOf, lowerRegexLiteral, lowerFieldRead, lowerUnionProperty, fieldTarget, fieldGetExpr, fieldSetStmt, lowerFieldCompound, uniqueSymbolKeyOf } from "./lower-exprs.js";
@@ -2789,7 +2790,7 @@ export class Lowerer {
2789
2790
  });
2790
2791
  }
2791
2792
  for (const info of this.classes.values()) {
2792
- for (const { mName, member } of this.classMethodMembers(info)) {
2793
+ for (const { mName, member } of this.classMethodMembers(info, true)) {
2793
2794
  if (!member.name || !(ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)))
2794
2795
  continue;
2795
2796
  const symbol = symbolOf(member.name);
@@ -3459,21 +3460,32 @@ export class Lowerer {
3459
3460
  }
3460
3461
  return;
3461
3462
  }
3462
- const set = optionalParams.get(symbol) ?? new Set();
3463
- shape.type = addUndefined(shape.type);
3464
- const before = set.size;
3465
- set.add(i);
3466
- optionalParams.set(symbol, set);
3467
- if (set.size !== before) {
3468
- changed = true;
3469
- const callee = functionDeclBySymbol.get(symbol);
3470
- const parameter = callee?.parameters[i];
3471
- if (parameter) {
3472
- for (const bound of boundIdentifiersOf(parameter.name)) {
3473
- const boundSymbol = symbolOf(bound);
3474
- if (boundSymbol && !optionalSymbols.has(boundSymbol)) {
3475
- optionalSymbols.add(boundSymbol);
3476
- changed = true;
3463
+ // A virtual slot has one argument representation, even when
3464
+ // the unchecked read reaches only a base-typed call site.
3465
+ // Promote every implementation and its parameter bindings so
3466
+ // downstream calls and returns see the same optional value.
3467
+ const family = familyBySymbol.get(symbol);
3468
+ if (family)
3469
+ optionalMethodFamilies.add(family);
3470
+ for (const target of family ?? [symbol]) {
3471
+ const parameterShape = signatureBySymbol.get(target)?.params[i];
3472
+ if (!parameterShape)
3473
+ continue;
3474
+ parameterShape.type = addUndefined(parameterShape.type);
3475
+ const set = optionalParams.get(target) ?? new Set();
3476
+ const before = set.size;
3477
+ set.add(i);
3478
+ optionalParams.set(target, set);
3479
+ if (set.size !== before) {
3480
+ changed = true;
3481
+ const parameter = functionDeclBySymbol.get(target)?.parameters[i];
3482
+ if (parameter) {
3483
+ for (const bound of boundIdentifiersOf(parameter.name)) {
3484
+ const boundSymbol = symbolOf(bound);
3485
+ if (boundSymbol && !optionalSymbols.has(boundSymbol)) {
3486
+ optionalSymbols.add(boundSymbol);
3487
+ changed = true;
3488
+ }
3477
3489
  }
3478
3490
  }
3479
3491
  }
@@ -8071,9 +8083,17 @@ export class Lowerer {
8071
8083
  literal = literal.expression;
8072
8084
  // Fresh literals have no previous outer identity to preserve. Build them
8073
8085
  // for their storage layout, just as ordinary contextual literals do.
8074
- if (ts.isObjectLiteralExpression(literal) || ts.isArrayLiteralExpression(literal) || expected.kind === "f64" || expected.kind === "string") {
8086
+ if (ts.isObjectLiteralExpression(literal) || ts.isArrayLiteralExpression(literal) ||
8087
+ isPrimitiveCollectionKey(expected, expected.kind === "union" ? this.unions.get(expected.unionId)?.arms : undefined)) {
8075
8088
  return this.lowerExprExpecting(node, expected);
8076
8089
  }
8090
+ const value = this.lowerExpr(node);
8091
+ const valueArms = value.type.kind === "union" ? this.unions.get(value.type.unionId)?.arms ?? [] : [value.type];
8092
+ // Primitive checks and reboxing preserve values, including tag-only
8093
+ // null/undefined keys. Identity restrictions apply only to references.
8094
+ if (valueArms.length > 0 && valueArms.every((arm) => isPrimitiveCollectionKey(arm))) {
8095
+ return this.coerceInto(node, value, expected);
8096
+ }
8077
8097
  // Assertions can perform their own conversion before slot coercion.
8078
8098
  // Inspect the assertion chain so a width copy cannot hide behind its
8079
8099
  // already-converted result type. Union-arm checks only unwrap a box.
@@ -8088,7 +8108,6 @@ export class Lowerer {
8088
8108
  }
8089
8109
  asserted = asserted.expression;
8090
8110
  }
8091
- const value = this.lowerExpr(node);
8092
8111
  const source = (value.type.kind === "union" ? this.unions.get(value.type.unionId)?.arms ?? [] : [value.type]).filter((type) => !isUnitType(type));
8093
8112
  const target = expected.kind === "union" ? this.unions.get(expected.unionId)?.arms ?? [] : [expected];
8094
8113
  const preservesIdentity = source.length > 0 && source.every((from) => target.some((to) => typeEquals(from, to) || (from.kind === "object" && to.kind === "object" && this.isSubclassOf(from.className, to.className))));
@@ -8749,9 +8768,10 @@ export class Lowerer {
8749
8768
  lowerStaticFieldInits(info) {
8750
8769
  return lowerStaticFieldInits(this, info);
8751
8770
  }
8752
- /** The method-like members (methods and accessors) of a class that have
8753
- * lowerable bodies, with their collected method-map names. */
8754
- *classMethodMembers(info) {
8771
+ /** Method-like members with their collected method-map names. Body
8772
+ * lowering omits abstract declarations; ABI analysis must include them
8773
+ * because an abstract-typed call selects the same virtual slot. */
8774
+ *classMethodMembers(info, includeAbstract = false) {
8755
8775
  if (!info.decl)
8756
8776
  return; // builtin error classes: runtime-provided bodies
8757
8777
  for (const member of info.decl.members) {
@@ -8775,7 +8795,8 @@ export class Lowerer {
8775
8795
  if (baseName === null)
8776
8796
  continue;
8777
8797
  const mName = ts.isMethodDeclaration(fnLike) ? baseName : `${ts.isGetAccessor(fnLike) ? "get" : "set"}:${baseName}`;
8778
- if (!info.methods.get(mName) || !fnLike.body)
8798
+ const signature = info.methods.get(mName);
8799
+ if (!signature || (!fnLike.body && !(includeAbstract && signature.abstract)))
8779
8800
  continue;
8780
8801
  yield { mName, member: fnLike };
8781
8802
  }
@@ -9946,6 +9967,9 @@ export class Lowerer {
9946
9967
  // methods and properties keep their existing process lowerings.
9947
9968
  if (stdlibGlobalNameOf(this, expr) === "process")
9948
9969
  return null;
9970
+ const imported = ts.isIdentifier(expr) ? this.builtinImportOf(expr) : null;
9971
+ if (imported?.module === "util" && imported.member === "types")
9972
+ return "util/types";
9949
9973
  const stored = ts.isIdentifier(expr)
9950
9974
  ? (this.peekLocal(expr)?.type ?? this.globalOf(expr)?.type)
9951
9975
  : undefined;
@@ -10231,6 +10255,12 @@ export class Lowerer {
10231
10255
  * deliberately narrower than table membership because many table rows
10232
10256
  * are only dispatch sentinels for call-site-specific lowering. */
10233
10257
  lowerBuiltinCallableValue(bi, loc) {
10258
+ if (bi.module === "util" && bi.member === "types")
10259
+ return utilTypesModuleValue(this, loc);
10260
+ if (bi.module === "util/types" && builtinModuleFnOf(this, bi.module, bi.member))
10261
+ return lowerUtilTypeValue(this, bi.member, loc);
10262
+ if (bi.module === "util" && bi.member === "getSystemErrorMap")
10263
+ return lowerSystemErrorMapValue(this, loc);
10234
10264
  if (bi.module === "fs" && builtinModuleFnOf(this, bi.module, bi.member)?.fn === "fs.callbackCall") {
10235
10265
  return { kind: "libCall", fn: "fs.callbackValue", args: [{ kind: "strLit", value: bi.member, type: STRING, loc }], type: DYN, loc };
10236
10266
  }
@@ -10245,6 +10275,8 @@ export class Lowerer {
10245
10275
  if (param.mode === "rest")
10246
10276
  return { mode: "rest", type: arrayOf(param.type) };
10247
10277
  if (param.mode === "optional") {
10278
+ if (param.type.kind === "dyn" && param.defaultValue === undefined)
10279
+ return { mode: "omittable", type: DYN };
10248
10280
  return { mode: "omittable", type: this.withUndefinedArm(param.type), bodyType: param.type };
10249
10281
  }
10250
10282
  return { mode: "required", type: param.type };
@@ -10276,7 +10308,10 @@ export class Lowerer {
10276
10308
  };
10277
10309
  if (valueParam.mode !== "optional")
10278
10310
  return ref;
10279
- if ((valueParam.type.kind !== "string" && valueParam.type.kind !== "f64") || param.type.kind !== "union") {
10311
+ // Checked runtime APIs consume undefined directly for omitted options.
10312
+ if (valueParam.type.kind === "dyn" && valueParam.defaultValue === undefined)
10313
+ return ref;
10314
+ if (valueParam.defaultValue === undefined || (valueParam.type.kind !== "string" && valueParam.type.kind !== "f64") || param.type.kind !== "union") {
10280
10315
  throw new InternalCompilerError(`builtin callable value '${display}' has an unsupported optional default`);
10281
10316
  }
10282
10317
  const undefTag = this.armTag(param.type.unionId, UNDEFINED_T);