@scriptc/compiler 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1060) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +73 -25
  2. package/ambient/scriptc-overrides.d.ts +10 -6
  3. package/ambient/scriptc.d.ts +28 -5
  4. package/dist/backend/build-cache.d.ts +1 -3
  5. package/dist/backend/build-cache.js +3 -22
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cache-root.d.ts +3 -0
  8. package/dist/backend/cache-root.js +23 -0
  9. package/dist/backend/cache-root.js.map +1 -0
  10. package/dist/backend/cycle-analysis.d.ts +15 -0
  11. package/dist/backend/cycle-analysis.js +107 -0
  12. package/dist/backend/cycle-analysis.js.map +1 -0
  13. package/dist/backend/cycle-analysis.test.js +124 -0
  14. package/dist/backend/cycle-analysis.test.js.map +1 -0
  15. package/dist/backend/debug-symbols.d.ts +8 -0
  16. package/dist/backend/debug-symbols.js +52 -0
  17. package/dist/backend/debug-symbols.js.map +1 -0
  18. package/dist/backend/executable-features.d.ts +4 -0
  19. package/dist/backend/executable-features.js +42 -0
  20. package/dist/backend/executable-features.js.map +1 -0
  21. package/dist/backend/external-c.d.ts +5 -27
  22. package/dist/backend/external-c.js +5 -40
  23. package/dist/backend/external-c.js.map +1 -1
  24. package/dist/backend/ffi-callbacks.d.ts +2 -3
  25. package/dist/backend/ffi-callbacks.js +2 -3
  26. package/dist/backend/ffi-callbacks.js.map +1 -1
  27. package/dist/backend/library-identity-markers.d.ts +4 -9
  28. package/dist/backend/library-identity-markers.js +11 -49
  29. package/dist/backend/library-identity-markers.js.map +1 -1
  30. package/dist/backend/library-pack.d.ts +5 -0
  31. package/dist/backend/library-pack.js +123 -0
  32. package/dist/backend/library-pack.js.map +1 -0
  33. package/dist/backend/link-plan-core.d.ts +20 -0
  34. package/dist/backend/link-plan-core.js +18 -0
  35. package/dist/backend/link-plan-core.js.map +1 -0
  36. package/dist/backend/link-plan.d.ts +2 -1
  37. package/dist/backend/link-plan.js +18 -17
  38. package/dist/backend/link-plan.js.map +1 -1
  39. package/dist/backend/link-trace.d.ts +2 -0
  40. package/dist/backend/link-trace.js +24 -0
  41. package/dist/backend/link-trace.js.map +1 -0
  42. package/dist/backend/linker.js +9 -1
  43. package/dist/backend/linker.js.map +1 -1
  44. package/dist/backend/literals.d.ts +9 -0
  45. package/dist/backend/literals.js +35 -0
  46. package/dist/backend/literals.js.map +1 -0
  47. package/dist/backend/literals.test.d.ts +1 -0
  48. package/dist/backend/literals.test.js +53 -0
  49. package/dist/backend/literals.test.js.map +1 -0
  50. package/dist/backend/llvm/blocks.d.ts +4 -0
  51. package/dist/backend/llvm/blocks.js +25 -4
  52. package/dist/backend/llvm/blocks.js.map +1 -1
  53. package/dist/backend/llvm/blocks.test.d.ts +1 -0
  54. package/dist/backend/llvm/blocks.test.js +91 -0
  55. package/dist/backend/llvm/blocks.test.js.map +1 -0
  56. package/dist/backend/llvm/classes.d.ts +14 -8
  57. package/dist/backend/llvm/classes.js +70 -28
  58. package/dist/backend/llvm/classes.js.map +1 -1
  59. package/dist/backend/llvm/common.d.ts +5 -1
  60. package/dist/backend/llvm/common.js +45 -4
  61. package/dist/backend/llvm/common.js.map +1 -1
  62. package/dist/backend/llvm/debug-info.d.ts +32 -0
  63. package/dist/backend/llvm/debug-info.js +198 -0
  64. package/dist/backend/llvm/debug-info.js.map +1 -0
  65. package/dist/backend/llvm/debug-info.test.d.ts +1 -0
  66. package/dist/backend/llvm/debug-info.test.js +110 -0
  67. package/dist/backend/llvm/debug-info.test.js.map +1 -0
  68. package/dist/backend/llvm/dyn.d.ts +16 -2
  69. package/dist/backend/llvm/dyn.js +498 -175
  70. package/dist/backend/llvm/dyn.js.map +1 -1
  71. package/dist/backend/llvm/emitter.d.ts +598 -1
  72. package/dist/backend/llvm/emitter.js +739 -409
  73. package/dist/backend/llvm/emitter.js.map +1 -1
  74. package/dist/backend/llvm/emitter.test.d.ts +1 -0
  75. package/dist/backend/llvm/emitter.test.js +179 -0
  76. package/dist/backend/llvm/emitter.test.js.map +1 -0
  77. package/dist/backend/llvm/expr-async.js +23 -14
  78. package/dist/backend/llvm/expr-async.js.map +1 -1
  79. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  80. package/dist/backend/llvm/expr-bytes.js +32 -14
  81. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  82. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  83. package/dist/backend/llvm/expr-callbacks.js +25 -22
  84. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  85. package/dist/backend/llvm/expr-calls.js +136 -35
  86. package/dist/backend/llvm/expr-calls.js.map +1 -1
  87. package/dist/backend/llvm/expr-containers.d.ts +1 -1
  88. package/dist/backend/llvm/expr-containers.js +43 -14
  89. package/dist/backend/llvm/expr-containers.js.map +1 -1
  90. package/dist/backend/llvm/expr-context.d.ts +5 -260
  91. package/dist/backend/llvm/expr-control.js +9 -5
  92. package/dist/backend/llvm/expr-control.js.map +1 -1
  93. package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
  94. package/dist/backend/llvm/expr-dispatch.js +2 -0
  95. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  96. package/dist/backend/llvm/expr-dynamic.js +72 -74
  97. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  98. package/dist/backend/llvm/expr-island.d.ts +1 -1
  99. package/dist/backend/llvm/expr-island.js +11 -7
  100. package/dist/backend/llvm/expr-island.js.map +1 -1
  101. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +51 -30
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  105. package/dist/backend/llvm/expr-records.d.ts +5 -1
  106. package/dist/backend/llvm/expr-records.js +43 -4
  107. package/dist/backend/llvm/expr-records.js.map +1 -1
  108. package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
  109. package/dist/backend/llvm/expr-stream-bridges.js +102 -121
  110. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  111. package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
  115. package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/layouts.d.ts +19 -0
  118. package/dist/backend/llvm/layouts.js +12 -0
  119. package/dist/backend/llvm/layouts.js.map +1 -0
  120. package/dist/backend/llvm/lib-abi.d.ts +19 -0
  121. package/dist/backend/llvm/lib-abi.js +82 -0
  122. package/dist/backend/llvm/lib-abi.js.map +1 -0
  123. package/dist/backend/llvm/lib-connect.d.ts +2 -0
  124. package/dist/backend/llvm/lib-connect.js +51 -0
  125. package/dist/backend/llvm/lib-connect.js.map +1 -0
  126. package/dist/backend/llvm/lib-datagram.d.ts +2 -0
  127. package/dist/backend/llvm/lib-datagram.js +135 -0
  128. package/dist/backend/llvm/lib-datagram.js.map +1 -0
  129. package/dist/backend/llvm/lib-dispatch.js +50 -6
  130. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  131. package/dist/backend/llvm/lib-filesystem.js +59 -18
  132. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  133. package/dist/backend/llvm/lib-http2.d.ts +2 -0
  134. package/dist/backend/llvm/lib-http2.js +215 -0
  135. package/dist/backend/llvm/lib-http2.js.map +1 -0
  136. package/dist/backend/llvm/lib-lookup.d.ts +2 -0
  137. package/dist/backend/llvm/lib-lookup.js +39 -0
  138. package/dist/backend/llvm/lib-lookup.js.map +1 -0
  139. package/dist/backend/llvm/lib-network.js +25 -2
  140. package/dist/backend/llvm/lib-network.js.map +1 -1
  141. package/dist/backend/llvm/lib-process.js +21 -16
  142. package/dist/backend/llvm/lib-process.js.map +1 -1
  143. package/dist/backend/llvm/lib-shared.js +125 -1
  144. package/dist/backend/llvm/lib-shared.js.map +1 -1
  145. package/dist/backend/llvm/lib-stream.js +3 -2
  146. package/dist/backend/llvm/lib-stream.js.map +1 -1
  147. package/dist/backend/llvm/lib-test.d.ts +2 -0
  148. package/dist/backend/llvm/lib-test.js +34 -0
  149. package/dist/backend/llvm/lib-test.js.map +1 -0
  150. package/dist/backend/llvm/lib-tls.d.ts +2 -0
  151. package/dist/backend/llvm/lib-tls.js +82 -0
  152. package/dist/backend/llvm/lib-tls.js.map +1 -0
  153. package/dist/backend/llvm/shapes.d.ts +10 -9
  154. package/dist/backend/llvm/shapes.js +35 -130
  155. package/dist/backend/llvm/shapes.js.map +1 -1
  156. package/dist/backend/llvm/split.js +4 -1
  157. package/dist/backend/llvm/split.js.map +1 -1
  158. package/dist/backend/llvm/split.test.js +26 -1
  159. package/dist/backend/llvm/split.test.js.map +1 -1
  160. package/dist/backend/llvm/unsupported.d.ts +1 -0
  161. package/dist/backend/llvm/unsupported.js +1 -2
  162. package/dist/backend/llvm/unsupported.js.map +1 -1
  163. package/dist/backend/llvm/walkers.js +1 -7
  164. package/dist/backend/llvm/walkers.js.map +1 -1
  165. package/dist/backend/mangle.d.ts +2 -2
  166. package/dist/backend/mangle.js +16 -5
  167. package/dist/backend/mangle.js.map +1 -1
  168. package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
  169. package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
  170. package/dist/backend/may-throw.js.map +1 -0
  171. package/dist/backend/may-throw.test.d.ts +1 -0
  172. package/dist/backend/may-throw.test.js +58 -0
  173. package/dist/backend/may-throw.test.js.map +1 -0
  174. package/dist/backend/native-codegen-core.d.ts +22 -0
  175. package/dist/backend/native-codegen-core.js +44 -0
  176. package/dist/backend/native-codegen-core.js.map +1 -0
  177. package/dist/backend/native-codegen.d.ts +3 -19
  178. package/dist/backend/native-codegen.js +5 -44
  179. package/dist/backend/native-codegen.js.map +1 -1
  180. package/dist/backend/native-codegen.test.js +2 -2
  181. package/dist/backend/native-codegen.test.js.map +1 -1
  182. package/dist/backend/native-link-info-core.d.ts +94 -0
  183. package/dist/backend/native-link-info-core.js +62 -0
  184. package/dist/backend/native-link-info-core.js.map +1 -0
  185. package/dist/backend/native-link-info.d.ts +3 -88
  186. package/dist/backend/native-link-info.js +12 -243
  187. package/dist/backend/native-link-info.js.map +1 -1
  188. package/dist/backend/native-link-info.test.js +41 -146
  189. package/dist/backend/native-link-info.test.js.map +1 -1
  190. package/dist/backend/native-toolchain.d.ts +10 -25
  191. package/dist/backend/native-toolchain.js +89 -219
  192. package/dist/backend/native-toolchain.js.map +1 -1
  193. package/dist/backend/native-toolchain.test.js +15 -5
  194. package/dist/backend/native-toolchain.test.js.map +1 -1
  195. package/dist/backend/native-tools.d.ts +24 -0
  196. package/dist/backend/native-tools.js +33 -0
  197. package/dist/backend/native-tools.js.map +1 -0
  198. package/dist/backend/object-localize.js +19 -8
  199. package/dist/backend/object-localize.js.map +1 -1
  200. package/dist/backend/object-localize.test.js +22 -0
  201. package/dist/backend/object-localize.test.js.map +1 -1
  202. package/dist/backend/runtime-abi.d.ts +2 -2
  203. package/dist/backend/runtime-abi.js +2 -2
  204. package/dist/backend/runtime-pack-core.d.ts +101 -0
  205. package/dist/backend/runtime-pack-core.js +172 -0
  206. package/dist/backend/runtime-pack-core.js.map +1 -0
  207. package/dist/backend/runtime-pack-native.d.ts +21 -0
  208. package/dist/backend/runtime-pack-native.js +70 -0
  209. package/dist/backend/runtime-pack-native.js.map +1 -0
  210. package/dist/backend/runtime-pack-targets.test.js +1 -1
  211. package/dist/backend/runtime-pack.d.ts +3 -83
  212. package/dist/backend/runtime-pack.js +8 -151
  213. package/dist/backend/runtime-pack.js.map +1 -1
  214. package/dist/backend/runtime-pack.test.js +24 -1
  215. package/dist/backend/runtime-pack.test.js.map +1 -1
  216. package/dist/backend/source-locations.d.ts +12 -0
  217. package/dist/backend/source-locations.js +32 -0
  218. package/dist/backend/source-locations.js.map +1 -0
  219. package/dist/backend/source-locations.test.d.ts +1 -0
  220. package/dist/backend/source-locations.test.js +16 -0
  221. package/dist/backend/source-locations.test.js.map +1 -0
  222. package/dist/backend/target-diagnostics.d.ts +22 -0
  223. package/dist/backend/target-diagnostics.js +108 -0
  224. package/dist/backend/target-diagnostics.js.map +1 -0
  225. package/dist/backend/target-platform.d.ts +15 -0
  226. package/dist/backend/target-platform.js +72 -0
  227. package/dist/backend/target-platform.js.map +1 -0
  228. package/dist/backend/targets.d.ts +13 -4
  229. package/dist/backend/targets.js +95 -30
  230. package/dist/backend/targets.js.map +1 -1
  231. package/dist/backend/targets.test.js +65 -4
  232. package/dist/backend/targets.test.js.map +1 -1
  233. package/dist/backend/toolchain-environment.d.ts +6 -0
  234. package/dist/backend/toolchain-environment.js +99 -0
  235. package/dist/backend/toolchain-environment.js.map +1 -0
  236. package/dist/backend/vendor-archives.d.ts +1 -9
  237. package/dist/backend/vendor-archives.js +2 -9
  238. package/dist/backend/vendor-archives.js.map +1 -1
  239. package/dist/backend/vendor-inputs.d.ts +9 -0
  240. package/dist/backend/vendor-inputs.js +10 -0
  241. package/dist/backend/vendor-inputs.js.map +1 -0
  242. package/dist/backend/warm-cache.d.ts +3 -0
  243. package/dist/backend/warm-cache.js +41 -0
  244. package/dist/backend/warm-cache.js.map +1 -0
  245. package/dist/cli/command.d.ts +3 -0
  246. package/dist/cli/command.js +328 -0
  247. package/dist/cli/command.js.map +1 -0
  248. package/dist/cli/host.d.ts +24 -0
  249. package/dist/cli/host.js +2 -0
  250. package/dist/cli/host.js.map +1 -0
  251. package/dist/cli/output-options.d.ts +26 -0
  252. package/dist/cli/output-options.js +60 -0
  253. package/dist/cli/output-options.js.map +1 -0
  254. package/dist/cli/paths.d.ts +12 -0
  255. package/dist/cli/paths.js +42 -0
  256. package/dist/cli/paths.js.map +1 -0
  257. package/dist/cli/usage.d.ts +74 -0
  258. package/dist/cli/usage.js +86 -0
  259. package/dist/cli/usage.js.map +1 -0
  260. package/dist/cli/wasi-paths.d.ts +8 -0
  261. package/dist/cli/wasi-paths.js +41 -0
  262. package/dist/cli/wasi-paths.js.map +1 -0
  263. package/dist/cli/wasi-runner.d.ts +2 -0
  264. package/dist/cli/wasi-runner.js +28 -0
  265. package/dist/cli/wasi-runner.js.map +1 -0
  266. package/dist/compat/fetch-profile.js +3 -3
  267. package/dist/compat/fetch-profile.js.map +1 -1
  268. package/dist/compile-types.d.ts +162 -0
  269. package/dist/compile-types.js +2 -0
  270. package/dist/compile-types.js.map +1 -0
  271. package/dist/coverage/report.js +11 -5
  272. package/dist/coverage/report.js.map +1 -1
  273. package/dist/coverage/surface-manifest.js +5 -2
  274. package/dist/coverage/surface-manifest.js.map +1 -1
  275. package/dist/diagnostics/diagnostic.d.ts +4 -0
  276. package/dist/diagnostics/diagnostic.js +15 -3
  277. package/dist/diagnostics/diagnostic.js.map +1 -1
  278. package/dist/executable/executable-cache.d.ts +3 -4
  279. package/dist/executable/executable-cache.js +33 -10
  280. package/dist/executable/executable-cache.js.map +1 -1
  281. package/dist/executable/executable-cache.test.js +38 -16
  282. package/dist/executable/executable-cache.test.js.map +1 -1
  283. package/dist/executable/prepare.d.ts +14 -0
  284. package/dist/executable/prepare.js +66 -0
  285. package/dist/executable/prepare.js.map +1 -0
  286. package/dist/ffi/ffi-manifest.d.ts +11 -4
  287. package/dist/ffi/ffi-manifest.js +170 -58
  288. package/dist/ffi/ffi-manifest.js.map +1 -1
  289. package/dist/ffi/ffi-manifest.test.d.ts +1 -0
  290. package/dist/ffi/ffi-manifest.test.js +111 -0
  291. package/dist/ffi/ffi-manifest.test.js.map +1 -0
  292. package/dist/format-integer.d.ts +3 -0
  293. package/dist/format-integer.js +14 -0
  294. package/dist/format-integer.js.map +1 -0
  295. package/dist/frontend/analysis.d.ts +5 -0
  296. package/dist/frontend/analysis.js +88 -0
  297. package/dist/frontend/analysis.js.map +1 -0
  298. package/dist/frontend/arguments-usage.d.ts +4 -0
  299. package/dist/frontend/arguments-usage.js +40 -0
  300. package/dist/frontend/arguments-usage.js.map +1 -0
  301. package/dist/frontend/binding-source.d.ts +4 -0
  302. package/dist/frontend/binding-source.js +18 -0
  303. package/dist/frontend/binding-source.js.map +1 -0
  304. package/dist/frontend/builtin-modules.d.ts +1 -1
  305. package/dist/frontend/builtin-modules.js +1 -1
  306. package/dist/frontend/builtin-modules.js.map +1 -1
  307. package/dist/frontend/cjs-lexer.d.ts +4 -25
  308. package/dist/frontend/cjs-lexer.js +6 -806
  309. package/dist/frontend/cjs-lexer.js.map +1 -1
  310. package/dist/frontend/cjs-resolve.d.ts +5 -0
  311. package/dist/frontend/cjs-resolve.js +429 -0
  312. package/dist/frontend/cjs-resolve.js.map +1 -0
  313. package/dist/frontend/cjs-syntax.d.ts +26 -0
  314. package/dist/frontend/cjs-syntax.js +806 -0
  315. package/dist/frontend/cjs-syntax.js.map +1 -0
  316. package/dist/frontend/comptime-node.d.ts +4 -0
  317. package/dist/frontend/comptime-node.js +16 -0
  318. package/dist/frontend/comptime-node.js.map +1 -0
  319. package/dist/frontend/comptime-node.test.d.ts +1 -0
  320. package/dist/frontend/comptime-node.test.js +37 -0
  321. package/dist/frontend/comptime-node.test.js.map +1 -0
  322. package/dist/frontend/dts-paths.d.ts +3 -4
  323. package/dist/frontend/dts-paths.js +15 -8
  324. package/dist/frontend/dts-paths.js.map +1 -1
  325. package/dist/frontend/fork-target.js +2 -2
  326. package/dist/frontend/fork-target.js.map +1 -1
  327. package/dist/frontend/helper-tokens.d.ts +1 -0
  328. package/dist/frontend/helper-tokens.js +147 -0
  329. package/dist/frontend/helper-tokens.js.map +1 -0
  330. package/dist/frontend/helper-tokens.test.d.ts +1 -0
  331. package/dist/frontend/helper-tokens.test.js +35 -0
  332. package/dist/frontend/helper-tokens.test.js.map +1 -0
  333. package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
  334. package/dist/frontend/inferred-js-diagnostics.js +69 -0
  335. package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
  336. package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
  337. package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
  338. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
  339. package/dist/frontend/input-tracker.d.ts +5 -2
  340. package/dist/frontend/input-tracker.js +24 -3
  341. package/dist/frontend/input-tracker.js.map +1 -1
  342. package/dist/frontend/input-tracker.test.js +23 -0
  343. package/dist/frontend/input-tracker.test.js.map +1 -1
  344. package/dist/frontend/lib-contract.js +32 -24
  345. package/dist/frontend/lib-contract.js.map +1 -1
  346. package/dist/frontend/literal-values.d.ts +4 -0
  347. package/dist/frontend/literal-values.js +21 -0
  348. package/dist/frontend/literal-values.js.map +1 -0
  349. package/dist/frontend/literal-values.test.d.ts +1 -0
  350. package/dist/frontend/literal-values.test.js +91 -0
  351. package/dist/frontend/literal-values.test.js.map +1 -0
  352. package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
  353. package/dist/frontend/lowering/abstract-equality.js +3 -0
  354. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  355. package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
  356. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  357. package/dist/frontend/lowering/array-values.d.ts +4 -1
  358. package/dist/frontend/lowering/array-values.js +43 -1
  359. package/dist/frontend/lowering/array-values.js.map +1 -1
  360. package/dist/frontend/lowering/callback-arg.js +1 -0
  361. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  362. package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
  363. package/dist/frontend/lowering/class-callbacks.js +63 -0
  364. package/dist/frontend/lowering/class-callbacks.js.map +1 -0
  365. package/dist/frontend/lowering/class-descriptors.d.ts +9 -0
  366. package/dist/frontend/lowering/class-descriptors.js +73 -0
  367. package/dist/frontend/lowering/class-descriptors.js.map +1 -0
  368. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +41 -0
  369. package/dist/frontend/lowering/class-dynamic-dispatch.js +803 -0
  370. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
  371. package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
  372. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +92 -0
  373. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
  374. package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
  375. package/dist/frontend/lowering/class-instance-constructor.js +64 -0
  376. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
  377. package/dist/frontend/lowering/class-method-values.d.ts +10 -0
  378. package/dist/frontend/lowering/class-method-values.js +170 -0
  379. package/dist/frontend/lowering/class-method-values.js.map +1 -0
  380. package/dist/frontend/lowering/class-prototypes.d.ts +16 -0
  381. package/dist/frontend/lowering/class-prototypes.js +134 -0
  382. package/dist/frontend/lowering/class-prototypes.js.map +1 -0
  383. package/dist/frontend/lowering/class-static-data.d.ts +6 -0
  384. package/dist/frontend/lowering/class-static-data.js +56 -0
  385. package/dist/frontend/lowering/class-static-data.js.map +1 -0
  386. package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
  387. package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
  388. package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
  389. package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
  390. package/dist/frontend/lowering/containers/bytes.js +164 -155
  391. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  392. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
  393. package/dist/frontend/lowering/containers/string-and-regexp.js +39 -16
  394. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  395. package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
  396. package/dist/frontend/lowering/containers/string-replacement.js +217 -0
  397. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
  398. package/dist/frontend/lowering/error-methods.d.ts +11 -0
  399. package/dist/frontend/lowering/error-methods.js +78 -0
  400. package/dist/frontend/lowering/error-methods.js.map +1 -0
  401. package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
  402. package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
  403. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
  404. package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
  405. package/dist/frontend/lowering/expressions/native-proxy.js +49 -0
  406. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
  407. package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
  408. package/dist/frontend/lowering/expressions/nullish-assignment.js +124 -0
  409. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
  410. package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
  411. package/dist/frontend/lowering/expressions/object-literals.js +485 -185
  412. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  413. package/dist/frontend/lowering/expressions/optional-chains.d.ts +5 -6
  414. package/dist/frontend/lowering/expressions/optional-chains.js +27 -14
  415. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  416. package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
  417. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
  418. package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
  419. package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
  420. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
  421. package/dist/frontend/lowering/function-context.d.ts +93 -0
  422. package/dist/frontend/lowering/function-context.js +103 -0
  423. package/dist/frontend/lowering/function-context.js.map +1 -0
  424. package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
  425. package/dist/frontend/lowering/generator-delegation.js +85 -0
  426. package/dist/frontend/lowering/generator-delegation.js.map +1 -0
  427. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +10 -0
  428. package/dist/frontend/lowering/generator-dynamic-dispatch.js +105 -0
  429. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
  430. package/dist/frontend/lowering/lib-boundary.d.ts +2 -1
  431. package/dist/frontend/lowering/lib-boundary.js +59 -20
  432. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  433. package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
  434. package/dist/frontend/lowering/lib-boundary.test.js +45 -0
  435. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
  436. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  437. package/dist/frontend/lowering/lower-assert.d.ts +1 -1
  438. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  439. package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
  440. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  441. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  442. package/dist/frontend/lowering/lower-builtin-values.js +139 -0
  443. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
  444. package/dist/frontend/lowering/lower-builtins.d.ts +27 -41
  445. package/dist/frontend/lowering/lower-builtins.js +553 -346
  446. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  447. package/dist/frontend/lowering/lower-calls.d.ts +22 -26
  448. package/dist/frontend/lowering/lower-calls.js +1373 -380
  449. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  450. package/dist/frontend/lowering/lower-classes.d.ts +83 -45
  451. package/dist/frontend/lowering/lower-classes.js +952 -339
  452. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  453. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  454. package/dist/frontend/lowering/lower-comptime.js +23 -32
  455. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  456. package/dist/frontend/lowering/lower-containers.d.ts +27 -32
  457. package/dist/frontend/lowering/lower-containers.js +796 -151
  458. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  459. package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
  460. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  461. package/dist/frontend/lowering/lower-enums.d.ts +1 -1
  462. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  463. package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
  464. package/dist/frontend/lowering/lower-event-emitter.js +58 -26
  465. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  466. package/dist/frontend/lowering/lower-expando.d.ts +7 -1
  467. package/dist/frontend/lowering/lower-expando.js +14 -6
  468. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  469. package/dist/frontend/lowering/lower-exprs.d.ts +35 -11
  470. package/dist/frontend/lowering/lower-exprs.js +1785 -790
  471. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  472. package/dist/frontend/lowering/lower-generators.d.ts +2 -5
  473. package/dist/frontend/lowering/lower-generators.js +77 -46
  474. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  475. package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
  476. package/dist/frontend/lowering/lower-global-value.js +17 -0
  477. package/dist/frontend/lowering/lower-global-value.js.map +1 -0
  478. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  479. package/dist/frontend/lowering/lower-inspect.js +17 -8
  480. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  481. package/dist/frontend/lowering/lower-island.d.ts +5 -8
  482. package/dist/frontend/lowering/lower-island.js +34 -23
  483. package/dist/frontend/lowering/lower-island.js.map +1 -1
  484. package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
  485. package/dist/frontend/lowering/lower-mixins.js +5 -3
  486. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  487. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  488. package/dist/frontend/lowering/lower-modules.js +252 -38
  489. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  490. package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
  491. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  492. package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
  493. package/dist/frontend/lowering/lower-node-module.js +13 -10
  494. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  496. package/dist/frontend/lowering/lower-server.js +6 -10
  497. package/dist/frontend/lowering/lower-server.js.map +1 -1
  498. package/dist/frontend/lowering/lower-stmts.d.ts +10 -14
  499. package/dist/frontend/lowering/lower-stmts.js +731 -532
  500. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  501. package/dist/frontend/lowering/lower-stream.d.ts +1 -1
  502. package/dist/frontend/lowering/lower-stream.js +19 -10
  503. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  504. package/dist/frontend/lowering/lower-test.d.ts +1 -1
  505. package/dist/frontend/lowering/lower-test.js.map +1 -1
  506. package/dist/frontend/lowering/lower-url.d.ts +6 -0
  507. package/dist/frontend/lowering/lower-url.js +77 -0
  508. package/dist/frontend/lowering/lower-url.js.map +1 -0
  509. package/dist/frontend/lowering/lowerer.d.ts +113 -189
  510. package/dist/frontend/lowering/lowerer.js +1033 -663
  511. package/dist/frontend/lowering/lowerer.js.map +1 -1
  512. package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
  513. package/dist/frontend/lowering/lowerer.test.js +26 -0
  514. package/dist/frontend/lowering/lowerer.test.js.map +1 -0
  515. package/dist/frontend/lowering/native-ffi.d.ts +5 -0
  516. package/dist/frontend/lowering/native-ffi.js +40 -0
  517. package/dist/frontend/lowering/native-ffi.js.map +1 -0
  518. package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
  519. package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
  520. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
  521. package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
  522. package/dist/frontend/lowering/object-factory-new.js +68 -0
  523. package/dist/frontend/lowering/object-factory-new.js.map +1 -0
  524. package/dist/frontend/lowering/optional-arguments.js +6 -1
  525. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  526. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  527. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  528. package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
  529. package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
  530. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
  531. package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
  532. package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
  533. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
  534. package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
  535. package/dist/frontend/lowering/sanitize-class-types.js +79 -0
  536. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
  537. package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
  538. package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
  539. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
  540. package/dist/frontend/lowering/static-this.d.ts +5 -1
  541. package/dist/frontend/lowering/static-this.js +28 -2
  542. package/dist/frontend/lowering/static-this.js.map +1 -1
  543. package/dist/frontend/lowering/string-index.d.ts +7 -0
  544. package/dist/frontend/lowering/string-index.js +39 -0
  545. package/dist/frontend/lowering/string-index.js.map +1 -0
  546. package/dist/frontend/lowering/surfaces.d.ts +9 -4
  547. package/dist/frontend/lowering/surfaces.js +98 -35
  548. package/dist/frontend/lowering/surfaces.js.map +1 -1
  549. package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
  550. package/dist/frontend/lowering/symbol-fields.js +183 -0
  551. package/dist/frontend/lowering/symbol-fields.js.map +1 -0
  552. package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
  553. package/dist/frontend/lowering/symbol-methods.js +30 -0
  554. package/dist/frontend/lowering/symbol-methods.js.map +1 -0
  555. package/dist/frontend/lowering/text-decoder-encoding.d.ts +10 -0
  556. package/dist/frontend/lowering/text-decoder-encoding.js +77 -0
  557. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
  558. package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
  559. package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
  560. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
  561. package/dist/frontend/lowering/union-narrow.d.ts +9 -0
  562. package/dist/frontend/lowering/union-narrow.js +59 -0
  563. package/dist/frontend/lowering/union-narrow.js.map +1 -0
  564. package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
  565. package/dist/frontend/lowering/union-narrow.test.js +72 -0
  566. package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
  567. package/dist/frontend/lowering/union-retag.d.ts +43 -0
  568. package/dist/frontend/lowering/union-retag.js +259 -0
  569. package/dist/frontend/lowering/union-retag.js.map +1 -0
  570. package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
  571. package/dist/frontend/lowering/union-retag.test.js +405 -0
  572. package/dist/frontend/lowering/union-retag.test.js.map +1 -0
  573. package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
  574. package/dist/frontend/lowering/unregistered-class-types.js +94 -0
  575. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
  576. package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
  577. package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
  578. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
  579. package/dist/frontend/lowering/width-lift.d.ts +40 -0
  580. package/dist/frontend/lowering/width-lift.js +2 -0
  581. package/dist/frontend/lowering/width-lift.js.map +1 -0
  582. package/dist/frontend/module-syntax.d.ts +58 -0
  583. package/dist/frontend/module-syntax.js +123 -0
  584. package/dist/frontend/module-syntax.js.map +1 -0
  585. package/dist/frontend/module-syntax.test.d.ts +1 -0
  586. package/dist/frontend/module-syntax.test.js +78 -0
  587. package/dist/frontend/module-syntax.test.js.map +1 -0
  588. package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
  589. package/dist/frontend/npm-fetch-analysis.js +100 -0
  590. package/dist/frontend/npm-fetch-analysis.js.map +1 -0
  591. package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
  592. package/dist/frontend/npm-fetch-analysis.test.js +107 -0
  593. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
  594. package/dist/frontend/npm-fetch-node.d.ts +2 -0
  595. package/dist/frontend/npm-fetch-node.js +12 -0
  596. package/dist/frontend/npm-fetch-node.js.map +1 -0
  597. package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
  598. package/dist/frontend/npm-fetch-syntax.js +207 -0
  599. package/dist/frontend/npm-fetch-syntax.js.map +1 -0
  600. package/dist/frontend/npm-node.d.ts +10 -0
  601. package/dist/frontend/npm-node.js +14 -0
  602. package/dist/frontend/npm-node.js.map +1 -0
  603. package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
  604. package/dist/frontend/npm-static-bundled-cjs.js +236 -0
  605. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
  606. package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
  607. package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
  608. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
  609. package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
  610. package/dist/frontend/npm-static-declaration-syntax.js +944 -0
  611. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
  612. package/dist/frontend/npm-static-declarations.d.ts +11 -39
  613. package/dist/frontend/npm-static-declarations.js +22 -561
  614. package/dist/frontend/npm-static-declarations.js.map +1 -1
  615. package/dist/frontend/npm-static-declarations.test.js +245 -6
  616. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  617. package/dist/frontend/npm-static-prune.d.ts +1 -1
  618. package/dist/frontend/npm-static-prune.js +5 -4
  619. package/dist/frontend/npm-static-prune.js.map +1 -1
  620. package/dist/frontend/npm-static-prune.test.js +1 -1
  621. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  622. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
  623. package/dist/frontend/npm-static-rewrite-host.js +179 -0
  624. package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
  625. package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
  626. package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
  627. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
  628. package/dist/frontend/npm-static-rewrite.d.ts +0 -5
  629. package/dist/frontend/npm-static-rewrite.js +2 -1079
  630. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  631. package/dist/frontend/npm-static-subtyping.d.ts +5 -0
  632. package/dist/frontend/npm-static-subtyping.js +55 -0
  633. package/dist/frontend/npm-static-subtyping.js.map +1 -0
  634. package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
  635. package/dist/frontend/npm-static-subtyping.test.js +58 -0
  636. package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
  637. package/dist/frontend/npm-static.d.ts +7 -15
  638. package/dist/frontend/npm-static.js +19 -28
  639. package/dist/frontend/npm-static.js.map +1 -1
  640. package/dist/frontend/npm.d.ts +8 -69
  641. package/dist/frontend/npm.js +21 -361
  642. package/dist/frontend/npm.js.map +1 -1
  643. package/dist/frontend/npm.test.js +2 -2
  644. package/dist/frontend/npm.test.js.map +1 -1
  645. package/dist/frontend/pipeline-native.d.ts +6 -0
  646. package/dist/frontend/pipeline-native.js +32 -0
  647. package/dist/frontend/pipeline-native.js.map +1 -0
  648. package/dist/frontend/pipeline.d.ts +54 -0
  649. package/dist/frontend/pipeline.js +382 -0
  650. package/dist/frontend/pipeline.js.map +1 -0
  651. package/dist/frontend/pipeline.test.d.ts +1 -0
  652. package/dist/frontend/pipeline.test.js +77 -0
  653. package/dist/frontend/pipeline.test.js.map +1 -0
  654. package/dist/frontend/program-analysis.d.ts +10 -0
  655. package/dist/frontend/program-analysis.js +14 -0
  656. package/dist/frontend/program-analysis.js.map +1 -0
  657. package/dist/frontend/program-node.d.ts +9 -0
  658. package/dist/frontend/program-node.js +48 -0
  659. package/dist/frontend/program-node.js.map +1 -0
  660. package/dist/frontend/program.d.ts +43 -19
  661. package/dist/frontend/program.js +556 -197
  662. package/dist/frontend/program.js.map +1 -1
  663. package/dist/frontend/program.test.d.ts +1 -0
  664. package/dist/frontend/program.test.js +202 -0
  665. package/dist/frontend/program.test.js.map +1 -0
  666. package/dist/frontend/provenance-core.d.ts +9 -0
  667. package/dist/frontend/provenance-core.js +435 -0
  668. package/dist/frontend/provenance-core.js.map +1 -0
  669. package/dist/frontend/provenance.d.ts +0 -4
  670. package/dist/frontend/provenance.js +4 -459
  671. package/dist/frontend/provenance.js.map +1 -1
  672. package/dist/frontend/resolve.d.ts +3 -1
  673. package/dist/frontend/resolve.js +6 -3
  674. package/dist/frontend/resolve.js.map +1 -1
  675. package/dist/frontend/runtime-resolve.d.ts +4 -3
  676. package/dist/frontend/runtime-resolve.js +22 -18
  677. package/dist/frontend/runtime-resolve.js.map +1 -1
  678. package/dist/frontend/runtime-resolve.test.js +53 -0
  679. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  680. package/dist/frontend/services-node.d.ts +5 -0
  681. package/dist/frontend/services-node.js +19 -0
  682. package/dist/frontend/services-node.js.map +1 -0
  683. package/dist/frontend/services-node.test.d.ts +1 -0
  684. package/dist/frontend/services-node.test.js +70 -0
  685. package/dist/frontend/services-node.test.js.map +1 -0
  686. package/dist/frontend/services.d.ts +44 -0
  687. package/dist/frontend/services.js +90 -0
  688. package/dist/frontend/services.js.map +1 -0
  689. package/dist/frontend/services.test.d.ts +1 -0
  690. package/dist/frontend/services.test.js +174 -0
  691. package/dist/frontend/services.test.js.map +1 -0
  692. package/dist/frontend/ts7/adapter.d.ts +3 -3
  693. package/dist/frontend/ts7/adapter.js +14 -31
  694. package/dist/frontend/ts7/adapter.js.map +1 -1
  695. package/dist/frontend/ts7/api.d.ts +16 -0
  696. package/dist/frontend/ts7/api.js +24 -0
  697. package/dist/frontend/ts7/api.js.map +1 -0
  698. package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
  699. package/dist/frontend/ts7/ast-bytes.js +137 -0
  700. package/dist/frontend/ts7/ast-bytes.js.map +1 -0
  701. package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
  702. package/dist/frontend/ts7/ast-bytes.test.js +73 -0
  703. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
  704. package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
  705. package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
  706. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
  707. package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
  708. package/dist/frontend/ts7/ast-guards.test.js +43 -0
  709. package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
  710. package/dist/frontend/ts7/ast-node.d.ts +194 -0
  711. package/dist/frontend/ts7/ast-node.js +448 -0
  712. package/dist/frontend/ts7/ast-node.js.map +1 -0
  713. package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
  714. package/dist/frontend/ts7/ast-node.test.js +266 -0
  715. package/dist/frontend/ts7/ast-node.test.js.map +1 -0
  716. package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
  717. package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
  718. package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
  719. package/dist/frontend/ts7/ast-text.d.ts +6 -0
  720. package/dist/frontend/ts7/ast-text.js +124 -0
  721. package/dist/frontend/ts7/ast-text.js.map +1 -0
  722. package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
  723. package/dist/frontend/ts7/ast-text.test.js +38 -0
  724. package/dist/frontend/ts7/ast-text.test.js.map +1 -0
  725. package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
  726. package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
  727. package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
  728. package/dist/frontend/ts7/ast-types.d.ts +42 -0
  729. package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
  730. package/dist/frontend/ts7/ast-types.generated.js +5 -0
  731. package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
  732. package/dist/frontend/ts7/ast-types.js +3 -0
  733. package/dist/frontend/ts7/ast-types.js.map +1 -0
  734. package/dist/frontend/ts7/ast-wire.d.ts +58 -0
  735. package/dist/frontend/ts7/ast-wire.js +267 -0
  736. package/dist/frontend/ts7/ast-wire.js.map +1 -0
  737. package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
  738. package/dist/frontend/ts7/ast-wire.test.js +151 -0
  739. package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
  740. package/dist/frontend/ts7/ast.d.ts +14 -14
  741. package/dist/frontend/ts7/ast.js +21 -15
  742. package/dist/frontend/ts7/ast.js.map +1 -1
  743. package/dist/frontend/ts7/census-check.js +1 -0
  744. package/dist/frontend/ts7/census-check.js.map +1 -1
  745. package/dist/frontend/ts7/checker-cache.d.ts +48 -0
  746. package/dist/frontend/ts7/checker-cache.js +92 -0
  747. package/dist/frontend/ts7/checker-cache.js.map +1 -0
  748. package/dist/frontend/ts7/checker.d.ts +19 -46
  749. package/dist/frontend/ts7/checker.js +231 -161
  750. package/dist/frontend/ts7/checker.js.map +1 -1
  751. package/dist/frontend/ts7/checker.test.d.ts +1 -0
  752. package/dist/frontend/ts7/checker.test.js +335 -0
  753. package/dist/frontend/ts7/checker.test.js.map +1 -0
  754. package/dist/frontend/ts7/enums.d.ts +4 -27
  755. package/dist/frontend/ts7/enums.generated.d.ts +878 -0
  756. package/dist/frontend/ts7/enums.generated.js +1313 -0
  757. package/dist/frontend/ts7/enums.generated.js.map +1 -0
  758. package/dist/frontend/ts7/enums.js +4 -45
  759. package/dist/frontend/ts7/enums.js.map +1 -1
  760. package/dist/frontend/ts7/enums.test.d.ts +1 -0
  761. package/dist/frontend/ts7/enums.test.js +48 -0
  762. package/dist/frontend/ts7/enums.test.js.map +1 -0
  763. package/dist/frontend/ts7/native-api.d.ts +10 -0
  764. package/dist/frontend/ts7/native-api.js +10 -0
  765. package/dist/frontend/ts7/native-api.js.map +1 -0
  766. package/dist/frontend/ts7/native-host.d.ts +2 -0
  767. package/dist/frontend/ts7/native-host.js +11 -0
  768. package/dist/frontend/ts7/native-host.js.map +1 -0
  769. package/dist/frontend/ts7/native-process.d.ts +14 -0
  770. package/dist/frontend/ts7/native-process.js +62 -0
  771. package/dist/frontend/ts7/native-process.js.map +1 -0
  772. package/dist/frontend/ts7/program-adapter.d.ts +10 -98
  773. package/dist/frontend/ts7/program-adapter.js +16 -310
  774. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  775. package/dist/frontend/ts7/program-host.d.ts +115 -0
  776. package/dist/frontend/ts7/program-host.js +347 -0
  777. package/dist/frontend/ts7/program-host.js.map +1 -0
  778. package/dist/frontend/ts7/program-host.test.d.ts +1 -0
  779. package/dist/frontend/ts7/program-host.test.js +207 -0
  780. package/dist/frontend/ts7/program-host.test.js.map +1 -0
  781. package/dist/frontend/ts7/rpc-api.d.ts +12 -0
  782. package/dist/frontend/ts7/rpc-api.js +23 -0
  783. package/dist/frontend/ts7/rpc-api.js.map +1 -0
  784. package/dist/frontend/ts7/rpc-client.d.ts +27 -0
  785. package/dist/frontend/ts7/rpc-client.js +102 -0
  786. package/dist/frontend/ts7/rpc-client.js.map +1 -0
  787. package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
  788. package/dist/frontend/ts7/rpc-client.test.js +133 -0
  789. package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
  790. package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
  791. package/dist/frontend/ts7/rpc-filesystem.js +42 -0
  792. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
  793. package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
  794. package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
  795. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
  796. package/dist/frontend/ts7/rpc-process.d.ts +2 -0
  797. package/dist/frontend/ts7/rpc-process.js +148 -0
  798. package/dist/frontend/ts7/rpc-process.js.map +1 -0
  799. package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
  800. package/dist/frontend/ts7/rpc-process.test.js +29 -0
  801. package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
  802. package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
  803. package/dist/frontend/ts7/rpc-wire.js +195 -0
  804. package/dist/frontend/ts7/rpc-wire.js.map +1 -0
  805. package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
  806. package/dist/frontend/ts7/rpc-wire.test.js +168 -0
  807. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
  808. package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
  809. package/dist/frontend/ts7/semantic-checker.js +221 -0
  810. package/dist/frontend/ts7/semantic-checker.js.map +1 -0
  811. package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
  812. package/dist/frontend/ts7/semantic-checker.test.js +119 -0
  813. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
  814. package/dist/frontend/ts7/semantic-json.d.ts +5 -0
  815. package/dist/frontend/ts7/semantic-json.js +52 -0
  816. package/dist/frontend/ts7/semantic-json.js.map +1 -0
  817. package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
  818. package/dist/frontend/ts7/semantic-json.test.js +42 -0
  819. package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
  820. package/dist/frontend/ts7/semantic-model.d.ts +222 -0
  821. package/dist/frontend/ts7/semantic-model.js +423 -0
  822. package/dist/frontend/ts7/semantic-model.js.map +1 -0
  823. package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
  824. package/dist/frontend/ts7/semantic-model.test.js +322 -0
  825. package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
  826. package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
  827. package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
  828. package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
  829. package/dist/frontend/ts7/semantic-types.d.ts +5 -0
  830. package/dist/frontend/ts7/semantic-types.js +2 -0
  831. package/dist/frontend/ts7/semantic-types.js.map +1 -0
  832. package/dist/frontend/ts7/session-cache.d.ts +17 -0
  833. package/dist/frontend/ts7/session-cache.js +97 -0
  834. package/dist/frontend/ts7/session-cache.js.map +1 -0
  835. package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
  836. package/dist/frontend/ts7/session-cache.test.js +87 -0
  837. package/dist/frontend/ts7/session-cache.test.js.map +1 -0
  838. package/dist/frontend/ts7/session-path.d.ts +18 -0
  839. package/dist/frontend/ts7/session-path.js +203 -0
  840. package/dist/frontend/ts7/session-path.js.map +1 -0
  841. package/dist/frontend/ts7/session-path.test.d.ts +1 -0
  842. package/dist/frontend/ts7/session-path.test.js +34 -0
  843. package/dist/frontend/ts7/session-path.test.js.map +1 -0
  844. package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
  845. package/dist/frontend/ts7/session-schema.generated.js +5 -0
  846. package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
  847. package/dist/frontend/ts7/session-timing.d.ts +50 -0
  848. package/dist/frontend/ts7/session-timing.js +61 -0
  849. package/dist/frontend/ts7/session-timing.js.map +1 -0
  850. package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
  851. package/dist/frontend/ts7/session-timing.test.js +52 -0
  852. package/dist/frontend/ts7/session-timing.test.js.map +1 -0
  853. package/dist/frontend/ts7/session.d.ts +105 -0
  854. package/dist/frontend/ts7/session.js +233 -0
  855. package/dist/frontend/ts7/session.js.map +1 -0
  856. package/dist/frontend/ts7/session.test.d.ts +1 -0
  857. package/dist/frontend/ts7/session.test.js +215 -0
  858. package/dist/frontend/ts7/session.test.js.map +1 -0
  859. package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
  860. package/dist/frontend/ts7/source-parser-node.js +15 -0
  861. package/dist/frontend/ts7/source-parser-node.js.map +1 -0
  862. package/dist/frontend/ts7/source-parser.d.ts +25 -0
  863. package/dist/frontend/ts7/source-parser.js +96 -0
  864. package/dist/frontend/ts7/source-parser.js.map +1 -0
  865. package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
  866. package/dist/frontend/ts7/source-parser.test.js +151 -0
  867. package/dist/frontend/ts7/source-parser.test.js.map +1 -0
  868. package/dist/frontend/ts7/syntax.d.ts +3 -0
  869. package/dist/frontend/ts7/syntax.js +4 -0
  870. package/dist/frontend/ts7/syntax.js.map +1 -0
  871. package/dist/frontend/tsc-codes.js +3 -0
  872. package/dist/frontend/tsc-codes.js.map +1 -1
  873. package/dist/frontend/type-mapper.d.ts +29 -19
  874. package/dist/frontend/type-mapper.js +713 -306
  875. package/dist/frontend/type-mapper.js.map +1 -1
  876. package/dist/frontend/type-mapper.test.d.ts +1 -0
  877. package/dist/frontend/type-mapper.test.js +207 -0
  878. package/dist/frontend/type-mapper.test.js.map +1 -0
  879. package/dist/frontend/union-discriminants.d.ts +16 -0
  880. package/dist/frontend/union-discriminants.js +98 -0
  881. package/dist/frontend/union-discriminants.js.map +1 -0
  882. package/dist/frontend/union-discriminants.test.d.ts +1 -0
  883. package/dist/frontend/union-discriminants.test.js +182 -0
  884. package/dist/frontend/union-discriminants.test.js.map +1 -0
  885. package/dist/index.d.ts +7 -197
  886. package/dist/index.js +369 -1567
  887. package/dist/index.js.map +1 -1
  888. package/dist/ir/analysis.d.ts +16 -4
  889. package/dist/ir/analysis.js +25 -6
  890. package/dist/ir/analysis.js.map +1 -1
  891. package/dist/ir/analysis.test.js +15 -2
  892. package/dist/ir/analysis.test.js.map +1 -1
  893. package/dist/ir/constant-tables.js +67 -49
  894. package/dist/ir/constant-tables.js.map +1 -1
  895. package/dist/ir/constant-tables.test.js +1 -1
  896. package/dist/ir/control-flow.d.ts +6 -0
  897. package/dist/ir/control-flow.js +142 -0
  898. package/dist/ir/control-flow.js.map +1 -0
  899. package/dist/ir/control-flow.test.d.ts +1 -0
  900. package/dist/ir/control-flow.test.js +113 -0
  901. package/dist/ir/control-flow.test.js.map +1 -0
  902. package/dist/ir/integer-loops.js +7 -18
  903. package/dist/ir/integer-loops.js.map +1 -1
  904. package/dist/ir/integer-ranges.js +53 -27
  905. package/dist/ir/integer-ranges.js.map +1 -1
  906. package/dist/ir/ir.d.ts +309 -164
  907. package/dist/ir/ir.js +588 -879
  908. package/dist/ir/ir.js.map +1 -1
  909. package/dist/ir/ir.test.js +127 -1
  910. package/dist/ir/ir.test.js.map +1 -1
  911. package/dist/ir/scalar-records.js +165 -134
  912. package/dist/ir/scalar-records.js.map +1 -1
  913. package/dist/ir/scalar-records.test.js +1 -1
  914. package/dist/ir/serialize.d.ts +4 -2
  915. package/dist/ir/serialize.js +19 -12
  916. package/dist/ir/serialize.js.map +1 -1
  917. package/dist/ir/serialize.test.d.ts +1 -0
  918. package/dist/ir/serialize.test.js +53 -0
  919. package/dist/ir/serialize.test.js.map +1 -0
  920. package/dist/ir/traverse.d.ts +41 -0
  921. package/dist/ir/traverse.js +660 -0
  922. package/dist/ir/traverse.js.map +1 -0
  923. package/dist/ir/traverse.test.d.ts +1 -0
  924. package/dist/ir/traverse.test.js +242 -0
  925. package/dist/ir/traverse.test.js.map +1 -0
  926. package/dist/ir/validate.js +1956 -1496
  927. package/dist/ir/validate.js.map +1 -1
  928. package/dist/ir/validate.test.js +476 -2
  929. package/dist/ir/validate.test.js.map +1 -1
  930. package/dist/library/cache-primitives.d.ts +2 -3
  931. package/dist/library/cache-primitives.js +4 -6
  932. package/dist/library/cache-primitives.js.map +1 -1
  933. package/dist/library/compiler-self-identity.d.ts +1 -1
  934. package/dist/library/compiler-self-identity.js +31 -15
  935. package/dist/library/compiler-self-identity.js.map +1 -1
  936. package/dist/library/compiler-self-identity.test.d.ts +1 -0
  937. package/dist/library/compiler-self-identity.test.js +93 -0
  938. package/dist/library/compiler-self-identity.test.js.map +1 -0
  939. package/dist/library/fence-eval.js +2 -2
  940. package/dist/library/fence-eval.js.map +1 -1
  941. package/dist/library/int-infer.js +7 -6
  942. package/dist/library/int-infer.js.map +1 -1
  943. package/dist/library/int-infer.test.js +4 -4
  944. package/dist/library/library-cache.d.ts +3 -2
  945. package/dist/library/library-cache.js +5 -17
  946. package/dist/library/library-cache.js.map +1 -1
  947. package/dist/library/library-cache.test.js +54 -41
  948. package/dist/library/library-cache.test.js.map +1 -1
  949. package/dist/library/library-profile.d.ts +3 -1
  950. package/dist/library/library-profile.js +15 -6
  951. package/dist/library/library-profile.js.map +1 -1
  952. package/dist/library/prepare.d.ts +15 -0
  953. package/dist/library/prepare.js +584 -0
  954. package/dist/library/prepare.js.map +1 -0
  955. package/dist/library/semantic-source.d.ts +1 -1
  956. package/dist/library/semantic-source.js +8 -6
  957. package/dist/library/semantic-source.js.map +1 -1
  958. package/dist/library/sidecar-validate.js +4 -4
  959. package/dist/library/sidecar-validate.js.map +1 -1
  960. package/dist/library/sidecar.d.ts +2 -0
  961. package/dist/library/sidecar.js +10 -3
  962. package/dist/library/sidecar.js.map +1 -1
  963. package/dist/native/cache.d.ts +11 -0
  964. package/dist/native/cache.js +113 -0
  965. package/dist/native/cache.js.map +1 -0
  966. package/dist/native/cache.test.d.ts +1 -0
  967. package/dist/native/cache.test.js +66 -0
  968. package/dist/native/cache.test.js.map +1 -0
  969. package/dist/native/cli.d.ts +1 -0
  970. package/dist/native/cli.js +112 -0
  971. package/dist/native/cli.js.map +1 -0
  972. package/dist/native/compiler.d.ts +15 -0
  973. package/dist/native/compiler.js +336 -0
  974. package/dist/native/compiler.js.map +1 -0
  975. package/dist/native/compiler.test.d.ts +1 -0
  976. package/dist/native/compiler.test.js +174 -0
  977. package/dist/native/compiler.test.js.map +1 -0
  978. package/dist/native/comptime.d.ts +5 -0
  979. package/dist/native/comptime.js +73 -0
  980. package/dist/native/comptime.js.map +1 -0
  981. package/dist/native/comptime.test.d.ts +1 -0
  982. package/dist/native/comptime.test.js +65 -0
  983. package/dist/native/comptime.test.js.map +1 -0
  984. package/dist/native/executable-cache.d.ts +26 -0
  985. package/dist/native/executable-cache.js +228 -0
  986. package/dist/native/executable-cache.js.map +1 -0
  987. package/dist/native/executable-cache.test.d.ts +1 -0
  988. package/dist/native/executable-cache.test.js +151 -0
  989. package/dist/native/executable-cache.test.js.map +1 -0
  990. package/dist/native/file-identity.d.ts +4 -0
  991. package/dist/native/file-identity.js +14 -0
  992. package/dist/native/file-identity.js.map +1 -0
  993. package/dist/native/file-identity.test.d.ts +1 -0
  994. package/dist/native/file-identity.test.js +43 -0
  995. package/dist/native/file-identity.test.js.map +1 -0
  996. package/dist/native/library.d.ts +22 -0
  997. package/dist/native/library.js +83 -0
  998. package/dist/native/library.js.map +1 -0
  999. package/dist/native/prepare.d.ts +21 -0
  1000. package/dist/native/prepare.js +174 -0
  1001. package/dist/native/prepare.js.map +1 -0
  1002. package/dist/native/prepare.test.d.ts +1 -0
  1003. package/dist/native/prepare.test.js +70 -0
  1004. package/dist/native/prepare.test.js.map +1 -0
  1005. package/dist/native/sanitizer.d.ts +11 -0
  1006. package/dist/native/sanitizer.js +135 -0
  1007. package/dist/native/sanitizer.js.map +1 -0
  1008. package/dist/native/sanitizer.test.d.ts +1 -0
  1009. package/dist/native/sanitizer.test.js +58 -0
  1010. package/dist/native/sanitizer.test.js.map +1 -0
  1011. package/dist/native/task.d.ts +4 -0
  1012. package/dist/native/task.js +16 -0
  1013. package/dist/native/task.js.map +1 -0
  1014. package/dist/native/task.test.d.ts +1 -0
  1015. package/dist/native/task.test.js +17 -0
  1016. package/dist/native/task.test.js.map +1 -0
  1017. package/dist/native/toolchain.d.ts +45 -0
  1018. package/dist/native/toolchain.js +74 -0
  1019. package/dist/native/toolchain.js.map +1 -0
  1020. package/dist/native/toolchain.test.d.ts +1 -0
  1021. package/dist/native/toolchain.test.js +33 -0
  1022. package/dist/native/toolchain.test.js.map +1 -0
  1023. package/dist/startup-cache.d.ts +1 -1
  1024. package/dist/startup-cache.js +2 -5
  1025. package/dist/startup-cache.js.map +1 -1
  1026. package/dist/timing.d.ts +4 -0
  1027. package/dist/timing.js +19 -0
  1028. package/dist/timing.js.map +1 -0
  1029. package/dist/wasi-paths.js +10 -7
  1030. package/dist/wasi-paths.js.map +1 -1
  1031. package/package.json +28 -19
  1032. package/surface-manifest.json +171 -18
  1033. package/dist/backend/c/async.d.ts +0 -171
  1034. package/dist/backend/c/async.js +0 -1317
  1035. package/dist/backend/c/async.js.map +0 -1
  1036. package/dist/backend/c/c-emitter.d.ts +0 -531
  1037. package/dist/backend/c/c-emitter.js +0 -1917
  1038. package/dist/backend/c/c-emitter.js.map +0 -1
  1039. package/dist/backend/c/exprs.d.ts +0 -15
  1040. package/dist/backend/c/exprs.js +0 -8803
  1041. package/dist/backend/c/exprs.js.map +0 -1
  1042. package/dist/backend/c/island.d.ts +0 -45
  1043. package/dist/backend/c/island.js +0 -281
  1044. package/dist/backend/c/island.js.map +0 -1
  1045. package/dist/backend/c/may-throw.js.map +0 -1
  1046. package/dist/backend/c/shapes.d.ts +0 -142
  1047. package/dist/backend/c/shapes.js +0 -603
  1048. package/dist/backend/c/shapes.js.map +0 -1
  1049. package/dist/backend/c/stmts.d.ts +0 -76
  1050. package/dist/backend/c/stmts.js +0 -1084
  1051. package/dist/backend/c/stmts.js.map +0 -1
  1052. package/dist/backend/c/types.d.ts +0 -71
  1053. package/dist/backend/c/types.js +0 -459
  1054. package/dist/backend/c/types.js.map +0 -1
  1055. package/dist/backend/c/types.test.js +0 -32
  1056. package/dist/backend/c/types.test.js.map +0 -1
  1057. package/dist/backend/c/walkers.d.ts +0 -134
  1058. package/dist/backend/c/walkers.js +0 -1773
  1059. package/dist/backend/c/walkers.js.map +0 -1
  1060. /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
@@ -1,3 +1,4 @@
1
+ import { objectEnumerationReceiver } from "./object-enumeration-receiver.js";
1
2
  import { InternalCompilerError } from "../../errors.js";
2
3
  /* Container-surface call lowering: array methods (including the HOF family
3
4
  * map/filter/forEach with their synthesized helper functions), Map/Set
@@ -7,13 +8,13 @@ import * as ts from "../ts7/adapter.js";
7
8
  import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
8
9
  import { ARRAY_METHODS, MAP_METHODS, SET_COMBINE_METHODS, SET_METHODS } from "./surfaces.js";
9
10
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
10
- import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
11
11
  import { forOfVarTarget, lowerDestructuringAssign } from "./lower-stmts.js";
12
12
  import { isJsSourceFile, locOf } from "../program.js";
13
13
  import { islandPrimitiveExit, lowerDynDispatchMethodCall } from "./lower-calls.js";
14
14
  import { buildArraySortFn } from "./lower-array-sort.js";
15
15
  import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, currentArrayIndexPresent } from "./array-values.js";
16
16
  import { typeKey } from "../type-mapper.js";
17
+ import { nodeThrowExpr } from "./lowerer.js";
17
18
  import { boolLit, countedFor, numLit, strLit, varRef } from "../../ir/build.js";
18
19
  import { defaultAfterUndefined, lowerPositionArgument, lowerStaticallyUndefinedArgument, positionNumber } from "./optional-arguments.js";
19
20
  import { lowerArrayCopyWithin, lowerArrayFill } from "./array-indexed-mutation.js";
@@ -79,7 +80,13 @@ function lowerArraySpreadItems(lowerer, nodes, elem, arrType, loc) {
79
80
  ];
80
81
  for (const node of nodes) {
81
82
  if (ts.isSpreadElement(node)) {
82
- const source = lowerer.lowerExpr(node.expression);
83
+ let source = lowerer.lowerExpr(node.expression);
84
+ if (source.type.kind === "set" && typeEquals(source.type.elem, elem)) {
85
+ source = { kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrType, loc };
86
+ }
87
+ if (source.type.kind === "record" && lowerer.shapes.get(source.type.shapeId)?.tuple) {
88
+ source = lowerer.widthCoerce(source, arrType) ?? source;
89
+ }
83
90
  if (!typeEquals(source.type, arrType)) {
84
91
  lowerer.noLowering(`Array insertion spread from '${lowerer.fmt(source.type)}'`, node);
85
92
  }
@@ -205,6 +212,21 @@ export function lowerArrayMethodCall(lowerer, call, access) {
205
212
  // static arrIntrinsic over a jsval (the validator ICE).
206
213
  {
207
214
  const receiver = lowerer.lowerExpr(access.expression);
215
+ if (receiver.type.kind === "union") {
216
+ const arms = lowerer.unions.get(receiver.type.unionId)?.arms;
217
+ const present = arms?.find((arm) => arm.kind === "array");
218
+ if (present?.kind === "array" && arms?.every((arm) => typeEquals(arm, present) || isUnitType(arm))) {
219
+ // A predicate can narrow the element type without changing the
220
+ // original array layout. Extract that stored array before choosing
221
+ // a helper, then adapt callback arguments at their actual ABI.
222
+ const array = lowerer.runtimeOptionalPropertyReceiver(access.expression, receiver, present, name) ??
223
+ lowerer.coerceInto(access.expression, receiver, present);
224
+ return lowerer.withExpressionOverride(access.expression, array, () => lowerArrayMethodCall(lowerer, call, access));
225
+ }
226
+ }
227
+ if (receiver.type.kind === "record" && lowerer.shapes.get(receiver.type.shapeId)?.tuple) {
228
+ return lowerTupleReadMethodCall(lowerer, call, access, receiver);
229
+ }
208
230
  if (receiver.type.kind === "jsval") {
209
231
  const loweredArgs = call.arguments.map((a) => lowerer.lowerExpr(a));
210
232
  if (name === "filter" && loweredArgs[0]?.type.kind === "func" && loweredArgs[0].type.ret.kind === "void") {
@@ -228,16 +250,11 @@ export function lowerArrayMethodCall(lowerer, call, access) {
228
250
  return dispatched;
229
251
  lowerer.noLowering(`.${name} on an array value held in a checked-dynamic binding`, call, "assign it to an array-typed binding first (the validated extraction), then call the method");
230
252
  }
231
- // An evolving-`any` array binding under --dynamic whose flow type
232
- // EVOLVED past `any[]` (`const fns = []; fns.push(() => 1);
233
- // fns.map(...)` — the binding lowered array<jsval> at its `any[]`
234
- // declaration, while tsc's evolving-array analysis answers the
235
- // pushed element type at this site): the VALUE's element type is
236
- // the truth — ride the explicit-`any[]` handle-element lowering
237
- // (pushes marshal in, HOF callbacks bind the handle, results exit
238
- // per the checker type), never a typed intrinsic over a jsval-
239
- // element array (the validator ICE).
240
- if (receiver.type.kind === "array" && receiver.type.elem.kind === "jsval" && !typeEquals(receiverIr, receiver.type)) {
253
+ // Flow predicates and evolving-any analysis can refine the checker
254
+ // element type without changing the array's storage. Helpers and
255
+ // callback array arguments must retain the original layout and
256
+ // identity; element conversions happen at the callback boundary.
257
+ if (receiver.type.kind === "array" && !typeEquals(receiverIr, receiver.type)) {
241
258
  receiverIr = receiver.type;
242
259
  elem = receiver.type.elem;
243
260
  }
@@ -445,6 +462,17 @@ export function lowerArrayMethodCall(lowerer, call, access) {
445
462
  loc,
446
463
  };
447
464
  }
465
+ if (call.arguments.some(ts.isSpreadElement)) {
466
+ // Finish argument evaluation before mutating the receiver. Each
467
+ // spread snapshots its elements immediately, so a later argument
468
+ // can mutate that source without changing already-collected values.
469
+ const items = lowerArraySpreadItems(lowerer, call.arguments, elem, receiverIr, loc);
470
+ return {
471
+ kind: "arrIntrinsic",
472
+ method: name === "push" ? "pushSpread" : "unshiftSpread",
473
+ receiver, args: [items], type: F64, loc,
474
+ };
475
+ }
448
476
  const valueProbes = call.arguments.map((arg) => tryLowerExpression(lowerer, arg));
449
477
  if (valueProbes.some((probe) => probe !== null && lowerer.runtimeOptionalWidening(probe.type, elem) !== null)) {
450
478
  const items = lowerArrayValueItems(lowerer, call.arguments.map((arg) => lowerer.lowerExpr(arg)), elem, receiverIr, loc);
@@ -471,12 +499,11 @@ export function lowerArrayMethodCall(lowerer, call, access) {
471
499
  };
472
500
  }
473
501
  if (name === "pop") {
474
- // Like shift(), pop() returns undefined for an empty array. Union
475
- // element arrays remain fenced here because their existing boxed
476
- // element already carries the result union and a second undefined
477
- // wrapper would lose the element identity contract.
502
+ // Widen a union payload through the normal array-read machinery
503
+ // before removing it. Reinterpreting the stored union's tag as the
504
+ // result union would confuse arms when undefined changes their order.
478
505
  if (elem.kind === "union" && lowerer.armTag(elem.unionId, UNDEFINED_T) < 0) {
479
- lowerer.unsupported("SC1090", call, "'.pop()' on union-element arrays without an undefined arm (read the last element and splice it after narrowing instead)");
506
+ return lowerUnionArrayRemoval(lowerer, access.expression, elem, false, loc);
480
507
  }
481
508
  const receiver = lowerer.lowerExpr(access.expression);
482
509
  return {
@@ -580,14 +607,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
580
607
  return { kind: "arrIntrinsic", method: "spliceInsert", receiver, args: [...args, items], type: receiverIr, loc };
581
608
  }
582
609
  if (name === "shift") {
583
- // JS shift exactly: undefined on an empty array, else the first
584
- // element with the tail sliding down — the result is the interned
585
- // `elem | undefined` union, the env-read convention. Union-element
586
- // arrays are fenced: their shift result would collapse arms
587
- // (`(string | undefined)[]`'s shift is `string | undefined` too, and
588
- // the box can't say which world the undefined came from).
610
+ // Like pop, a union without undefined needs an explicit tag widening.
589
611
  if (elem.kind === "union" && lowerer.armTag(elem.unionId, UNDEFINED_T) < 0) {
590
- lowerer.unsupported("SC1090", call, "'.shift()' on union-element arrays without an undefined arm (read [0] and splice(0, 1) with the narrowed value instead)");
612
+ return lowerUnionArrayRemoval(lowerer, access.expression, elem, true, loc);
591
613
  }
592
614
  const receiver = lowerer.lowerExpr(access.expression);
593
615
  return { kind: "arrIntrinsic", method: "shift", receiver, args: [], type: arrayValueType(lowerer, elem), loc };
@@ -627,6 +649,38 @@ export function lowerArrayMethodCall(lowerer, call, access) {
627
649
  // reduce / reduceRight
628
650
  return lowerArrayReduceCall(lowerer, call, access, name, elem);
629
651
  }
652
+ /** Read before splice so removal cannot destroy the result's owned payload.
653
+ * The source is evaluated once and empty/sparse arrays yield undefined using
654
+ * the same slot-state checks as an indexed read. */
655
+ function lowerUnionArrayRemoval(lowerer, source, elem, first, loc) {
656
+ const receiver = lowerer.lowerExpr(source);
657
+ const arr = lowerer.declareHiddenLocal("%removeArray", receiver.type);
658
+ const arrRef = varRef(arr.id, arr.type, loc);
659
+ const index = lowerer.declareHiddenLocal("%removeIndex", F64);
660
+ const indexRef = varRef(index.id, F64, loc);
661
+ const value = arrayValueRead(lowerer, arrRef, indexRef, elem, loc);
662
+ const result = lowerer.declareHiddenLocal("%removedValue", value.type);
663
+ return {
664
+ kind: "seqExpr",
665
+ stmts: [
666
+ { kind: "varDecl", localId: arr.id, init: receiver, loc },
667
+ {
668
+ kind: "varDecl", localId: index.id,
669
+ init: first ? numLit(0, loc) : {
670
+ kind: "bin", op: "-",
671
+ left: { kind: "arrIntrinsic", method: "length", receiver: arrRef, args: [], type: F64, loc },
672
+ right: numLit(1, loc), type: F64, loc,
673
+ }, loc,
674
+ },
675
+ { kind: "varDecl", localId: result.id, init: value, loc },
676
+ {
677
+ kind: "exprStmt",
678
+ expr: { kind: "arrIntrinsic", method: "splice", receiver: arrRef, args: [indexRef, numLit(1, loc)], type: arr.type, loc }, loc,
679
+ },
680
+ ],
681
+ result: varRef(result.id, result.type, loc), type: result.type, loc,
682
+ };
683
+ }
630
684
  function literalFlatDepth(value) {
631
685
  if (value.kind === "numLit")
632
686
  return value.value;
@@ -709,10 +763,9 @@ function lowerArrayFlatCall(lowerer, call, access, receiverType) {
709
763
  function lowerArraySearchCall(lowerer, call, access, method, elem) {
710
764
  const loc = locOf(call);
711
765
  const receiver = lowerer.lowerExpr(access.expression);
712
- const argNode = call.arguments[0] ?? call;
713
766
  if (call.arguments.some(ts.isSpreadElement))
714
767
  lowerer.noLowering(`.${method} with spread arguments`, call);
715
- let needle = call.arguments[0]
768
+ const needle = call.arguments[0]
716
769
  ? lowerer.lowerExpr(call.arguments[0])
717
770
  : { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc };
718
771
  const fromIndex = call.arguments[1]
@@ -720,6 +773,11 @@ function lowerArraySearchCall(lowerer, call, access, method, elem) {
720
773
  : method === "lastIndexOf"
721
774
  ? { kind: "bin", op: "/", left: numLit(1, loc), right: numLit(0, loc), type: F64, loc }
722
775
  : numLit(0, loc);
776
+ return lowerArraySearchValues(lowerer, call, method, elem, receiver, needle, fromIndex);
777
+ }
778
+ function lowerArraySearchValues(lowerer, call, method, elem, receiver, needle, fromIndex) {
779
+ const loc = locOf(call);
780
+ const argNode = call.arguments[0] ?? call;
723
781
  // A derived CLASS VALUE against a base-classval element widens (the same
724
782
  // pointer — identity search is exact); the coercion path owns the ABI gate.
725
783
  if (needle.type.kind === "classval" && elem.kind === "classval" && !typeEquals(needle.type, elem)) {
@@ -765,14 +823,15 @@ function lowerArraySearchCall(lowerer, call, access, method, elem) {
765
823
  : [needle.type];
766
824
  const scalarNeedle = needleArms.every((arm) => arm.kind === "f64" || arm.kind === "string" || arm.kind === "bool" ||
767
825
  arm.kind === "bigint" || arm.kind === "symbol" || isUnitType(arm));
768
- const valueArms = lowerer.unions.get(valueT.unionId).arms;
826
+ const valueDef = lowerer.unions.get(valueT.unionId);
827
+ const valueArms = valueDef.arms;
769
828
  if (scalarNeedle && !valueArms.some((arm) => arm.kind === "func" || arm.kind === "set")) {
770
829
  const arms = [...valueArms];
771
830
  for (const arm of needleArms)
772
831
  if (!arms.some((existing) => typeEquals(existing, arm)))
773
832
  arms.push(arm);
774
833
  if (arms.length !== valueArms.length)
775
- valueT = { kind: "union", unionId: lowerer.unions.intern(arms) };
834
+ valueT = { kind: "union", unionId: lowerer.unions.transform(valueDef, arms) };
776
835
  }
777
836
  const directNeedle = method === "lastIndexOf" && elem.kind !== "union" && typeEquals(needle.type, elem);
778
837
  const searchNeedle = directNeedle ? needle : lowerer.coerceInto(argNode, needle, valueT);
@@ -791,6 +850,12 @@ function lowerArraySearchCall(lowerer, call, access, method, elem) {
791
850
  * includes, where NaN equals NaN while +0 and -0 remain equal. */
792
851
  function arraySearchEquality(lowerer, left, right, sameValueZero, loc) {
793
852
  if (left.type.kind !== "union" || right.type.kind !== "union" || left.type.unionId !== right.type.unionId) {
853
+ if (left.type.kind === "string" && right.type.kind === "string") {
854
+ return { kind: "strEq", negated: false, left, right, type: BOOL, loc };
855
+ }
856
+ if (left.type.kind === "bigint" && right.type.kind === "bigint") {
857
+ return { kind: "bin", op: "===", left: { kind: "libCall", fn: "bigint.cmp", args: [left, right], type: F64, loc }, right: numLit(0, loc), type: BOOL, loc };
858
+ }
794
859
  return { kind: "bin", op: "===", left, right, type: BOOL, loc };
795
860
  }
796
861
  const unionId = left.type.unionId;
@@ -1004,7 +1069,7 @@ function arraySearchHelper(lowerer, method, elem, valueT, needleT, directNeedle,
1004
1069
  * loop passes exactly what it declares (JS passes everything; a callback
1005
1070
  * only sees the parameters it names). Returns the lowered callback and
1006
1071
  * its declared arity. */
1007
- function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
1072
+ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false, expectedReturn) {
1008
1073
  const full = [...lead, F64, arrT];
1009
1074
  // A DYN-receiver HOF's callback (`parsed.flatMap((value) => ...)`):
1010
1075
  // the contextual signature types the unannotated param `any` (the
@@ -1039,15 +1104,16 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
1039
1104
  lowerer.jsvalParamOverrides.add(p);
1040
1105
  });
1041
1106
  }
1042
- // A checker-untyped array expression whose lowered value supplies a
1043
- // concrete static element type still contextually types an inline HOF
1044
- // callback with any/unknown. Bind only unannotated parameters to the
1045
- // exact ABI the synthesized loop passes. The override is temporary:
1046
- // one callback AST may be lowered under several generic instances.
1107
+ // An untyped or flow-refined array can contextually type an inline
1108
+ // callback differently from the stored element and array layout. Bind
1109
+ // unannotated parameters to the helper's ABI when a boundary adapter
1110
+ // cannot carry it. Include the optional-read prepass's parameter type
1111
+ // in this comparison. The override is temporary because one callback
1112
+ // AST can lower under several generic instances.
1047
1113
  const contextual = [];
1048
1114
  const previousImplicit = lowerer.implicitParamTypes;
1049
1115
  let contextualTs = null;
1050
- if (bindUntyped && (ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode))) {
1116
+ if (ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode)) {
1051
1117
  argNode.parameters.forEach((param, i) => {
1052
1118
  const expected = full[i];
1053
1119
  if (expected === undefined || expected.kind === "dyn" || expected.kind === "jsval" ||
@@ -1055,7 +1121,10 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
1055
1121
  return;
1056
1122
  }
1057
1123
  const checkerType = lowerer.checker.getTypeAtLocation(param.name);
1058
- if ((checkerType.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) === 0)
1124
+ const untyped = (checkerType.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0;
1125
+ const raw = untyped ? null : lowerer.mapTypeOf(checkerType);
1126
+ const mapped = raw ? lowerer.runtimeOptionalBindingType(param.name, raw) : null;
1127
+ if (untyped ? !bindUntyped : mapped === null || lowerer.coercibleValue(expected, mapped))
1059
1128
  return;
1060
1129
  const symbol = lowerer.checker.getSymbolAtLocation(param.name);
1061
1130
  if (!symbol)
@@ -1076,6 +1145,10 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
1076
1145
  }
1077
1146
  if (contextualTs !== null)
1078
1147
  lowerer.implicitParamTypes = contextualTs;
1148
+ const previousReturn = lowerer.contextualFunctionReturns.get(argNode);
1149
+ if (expectedReturn && (ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode))) {
1150
+ lowerer.contextualFunctionReturns.set(argNode, expectedReturn);
1151
+ }
1079
1152
  let fnArg;
1080
1153
  try {
1081
1154
  fnArg = lowerer.lowerExpr(argNode);
@@ -1090,6 +1163,27 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
1090
1163
  lowerer.runtimeOptionalBindingTypes.set(symbol, previous);
1091
1164
  }
1092
1165
  lowerer.implicitParamTypes = previousImplicit;
1166
+ if (previousReturn === undefined)
1167
+ lowerer.contextualFunctionReturns.delete(argNode);
1168
+ else
1169
+ lowerer.contextualFunctionReturns.set(argNode, previousReturn);
1170
+ }
1171
+ // A callback can accept a wider parameter type than the array supplies
1172
+ // (a reusable predicate over a union is common). Its closure still has
1173
+ // that wider ABI: adapt each actual argument before invoking it, just
1174
+ // as assignment to a narrower function slot does. Require a conversion
1175
+ // plan so this path never manufactures a stranded callback.
1176
+ if (fnArg.type.kind === "dyn") {
1177
+ const signatures = lowerer.checker.getCallSignatures(lowerer.typeOf(argNode));
1178
+ const ret = expectedReturn ?? (signatures[0] ? lowerer.mapTypeOf(lowerer.checker.getReturnTypeOfSignature(signatures[0])) : null);
1179
+ if (ret && ret.kind !== "void")
1180
+ fnArg = lowerer.coerceToExpected(fnArg, funcOf(full, ret));
1181
+ }
1182
+ if (fnArg.type.kind === "func" && fnArg.type.params.length <= full.length &&
1183
+ fnArg.type.params.every((param, i) => lowerer.coercibleValue(full[i], param))) {
1184
+ const callbackType = funcOf(full.slice(0, fnArg.type.params.length), fnArg.type.ret);
1185
+ if (!typeEquals(fnArg.type, callbackType))
1186
+ fnArg = lowerer.coerceToExpected(fnArg, callbackType);
1093
1187
  }
1094
1188
  // Array storage widens indexed reads with undefined so holes remain
1095
1189
  // observable. The HOF helper guards every callback behind arrayHas,
@@ -1193,12 +1287,10 @@ function filterResultElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
1193
1287
  const checkerReceiver = access
1194
1288
  ? lowerer.mapTypeOf(lowerer.typeOf(access.expression))
1195
1289
  : null;
1196
- // Evolving-any arrays of island handles retain their jsval element ABI,
1197
- // while the checker later describes both the receiver and unchanged
1198
- // filter result by the evolved callable type. Equal checker elements mean
1199
- // no predicate narrowing occurred; preserve the runtime element home.
1200
- if (elem.kind === "jsval" && valueT.kind === "jsval" &&
1201
- result?.kind === "array" && checkerReceiver?.kind === "array" &&
1290
+ // Equal checker elements mean the filter introduces no new refinement.
1291
+ // Preserve the stored element layout even if an earlier predicate or
1292
+ // evolving-any analysis changed the receiver's flow type.
1293
+ if (result?.kind === "array" && checkerReceiver?.kind === "array" &&
1202
1294
  typeEquals(result.elem, checkerReceiver.elem)) {
1203
1295
  return elem;
1204
1296
  }
@@ -1451,29 +1543,22 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
1451
1543
  });
1452
1544
  return name;
1453
1545
  }
1454
- /** READ-ONLY array methods on TUPLE receivers — `t.slice(...)` and
1455
- * `t.map(f)`: a tuple is a fixed-shape record, but these methods never
1456
- * write, so the positions snapshot into a fresh array (the for-of-over-
1457
- * tuples stance — pure receivers only, since the reads re-emit per
1458
- * position) and the ordinary array machinery runs over it. The element
1459
- * type is the one position type, or the positions' interned union with
1460
- * each read wrapped into its arm (exactly the checker's callback
1461
- * parameter type). Null when this isn't a tuple slice/map — writers and
1462
- * the rest of the surface keep their fences. */
1463
- export function lowerTupleReadMethodCall(lowerer, call, access) {
1546
+ /** Tuple methods keep the original receiver alive through argument evaluation.
1547
+ * Callback methods read each position only when it is visited, so writes to
1548
+ * later positions through a captured alias are visible. A tuple cannot be
1549
+ * passed as the callback's array parameter without changing its identity;
1550
+ * that parameter retains an explicit representation boundary. */
1551
+ export function lowerTupleReadMethodCall(lowerer, call, access, tupleReceiver) {
1464
1552
  if (lowerer.chainBlocked(access, call))
1465
1553
  return null;
1466
- const name = access.name.text;
1467
- if (name !== "slice" && name !== "map")
1554
+ const method = access.name.text;
1555
+ const search = method === "includes" || method === "indexOf" || method === "lastIndexOf";
1556
+ if (method !== "slice" && method !== "map" && method !== "flatMap" && method !== "join" && !search)
1468
1557
  return null;
1469
1558
  if (!lowerer.isStdlibMember(access))
1470
1559
  return null;
1471
- let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
1472
- let receiver = null;
1473
- // A readonly tuple union under Array.isArray is checker-typed as an
1474
- // unmappable intersection with any[], while maybeNarrow still extracts
1475
- // its one tuple arm. Dispatch the supported tuple read methods from
1476
- // that lowered representation, like tuple indexing and `.length`.
1560
+ let receiverIr = tupleReceiver?.type ?? lowerer.mapTypeOf(lowerer.typeOf(access.expression));
1561
+ let receiver = tupleReceiver ?? null;
1477
1562
  const checkerArray = lowerer.checkerArrayValue(access.expression);
1478
1563
  if (checkerArray?.type.kind === "record") {
1479
1564
  receiverIr = checkerArray.type;
@@ -1485,75 +1570,185 @@ export function lowerTupleReadMethodCall(lowerer, call, access) {
1485
1570
  if (!shape?.tuple)
1486
1571
  return null;
1487
1572
  receiver ??= lowerer.lowerExpr(access.expression);
1573
+ if (method === "join") {
1574
+ // Object.entries can retain its dynamic array representation behind a
1575
+ // checker tuple. Native tuples box as live references, so separator
1576
+ // evaluation can still mutate their elements before join reads them.
1577
+ // An unchecked outer array read must validate its optional payload
1578
+ // before passing the tuple to the runtime.
1579
+ if (receiver.type.kind === "union") {
1580
+ receiver = lowerer.coerceInto(access.expression, receiver, receiverIr);
1581
+ }
1582
+ const converted = lowerer.coerceInto(access.expression, receiver, DYN);
1583
+ const boxed = converted.kind === "dynFrom" && converted.value.type.kind === "record"
1584
+ ? { ...converted, liveRef: true } : converted;
1585
+ const joined = lowerDynDispatchMethodCall(lowerer, call, access, boxed, true);
1586
+ return joined ? lowerer.coerceInto(call, joined, STRING) : null;
1587
+ }
1488
1588
  if (receiver.type.kind !== "record")
1489
1589
  return null;
1490
- if (!isSafeToRepeat(receiver)) {
1491
- lowerer.noLowering(`${lowerer.checker.typeToString(lowerer.typeOf(access.expression))}.${name}`, call, "tuple receivers snapshot per position, so only effect-free receivers lower — bind the tuple to a const first");
1492
- }
1590
+ const fields = [...shape.fields].sort((a, b) => Number(a.name) - Number(b.name));
1591
+ const arms = [];
1592
+ for (const field of fields) {
1593
+ const types = field.type.kind === "union" ? lowerer.unions.get(field.type.unionId).arms : [field.type];
1594
+ for (const type of types)
1595
+ if (!arms.some(arm => typeEquals(arm, type)))
1596
+ arms.push(type);
1597
+ }
1598
+ if (arms.length === 0)
1599
+ return null;
1600
+ const elem = arms.length === 1 ? arms[0] : { kind: "union", unionId: lowerer.unions.intern(arms) };
1493
1601
  const loc = locOf(call);
1494
- const byIndex = [...shape.fields].sort((a, b) => Number(a.name) - Number(b.name));
1495
- let elemT = null;
1496
- {
1497
- const arms = [];
1498
- for (const f of byIndex) {
1499
- if (f.type.kind === "union") {
1500
- elemT = null;
1501
- break;
1502
- }
1503
- if (!arms.some((a) => typeEquals(a, f.type)))
1504
- arms.push(f.type);
1505
- elemT = arms.length === 1 ? arms[0] : { kind: "union", unionId: lowerer.unions.intern(arms) };
1602
+ const tuple = varRef("a.0", receiver.type, loc);
1603
+ const read = (field) => lowerer.coerceInto(access.expression, {
1604
+ kind: "recordGet", obj: tuple, shapeId: receiverIr.shapeId, field: field.name, type: field.type, loc,
1605
+ }, elem);
1606
+ if (search) {
1607
+ if (call.arguments.length > 2 || call.arguments.some(ts.isSpreadElement)) {
1608
+ return lowerer.noLowering(`tuple .${method} with spread or extra arguments`, call);
1506
1609
  }
1610
+ const arg = call.arguments[0];
1611
+ const undefinedArg = arg ? lowerStaticallyUndefinedArgument(lowerer, arg) : null;
1612
+ let needle = arg ? undefinedArg ?? lowerer.lowerExpr(arg) : null;
1613
+ if (!needle || isUnitType(needle.type) || needle.type.kind === "void") {
1614
+ const optional = arrayValueType(lowerer, elem);
1615
+ const wrapped = needle?.type.kind === "nullT"
1616
+ ? lowerer.coerceInto(arg ?? call, needle, optional) : lowerer.wrappedUndefined(optional, loc);
1617
+ if (!wrapped)
1618
+ return lowerer.noLowering(`tuple .${method} missing search value`, call);
1619
+ needle = needle ? defaultAfterUndefined(needle, wrapped) : wrapped;
1620
+ }
1621
+ const from = call.arguments[1]
1622
+ ? lowerPositionArgument(lowerer, call.arguments[1], numLit(0, loc))
1623
+ : numLit(method === "lastIndexOf" ? Infinity : 0, loc);
1624
+ const key = `tuple.${method}:${typeKey(receiver.type)}:${typeKey(needle.type)}:${typeKey(from.type)}:${call.arguments.length}`;
1625
+ let helper = lowerer.arrHofHelpers.get(key);
1626
+ const resultType = method === "includes" ? BOOL : F64;
1627
+ if (!helper) {
1628
+ helper = `%tuple.${method}.${lowerer.arrHofHelpers.size}`;
1629
+ lowerer.arrHofHelpers.set(key, helper);
1630
+ const params = [
1631
+ { localId: "a.0", name: "a", type: receiver.type },
1632
+ { localId: "needle.0", name: "needle", type: needle.type },
1633
+ { localId: "from.0", name: "from", type: from.type },
1634
+ ];
1635
+ const result = lowerArraySearchValues(lowerer, call, method, elem, { kind: "arrayLit", elems: fields.map(read), type: arrayOf(elem), loc }, varRef("needle.0", needle.type, loc), varRef("position.0", F64, loc));
1636
+ lowerer.liftedFns.push({
1637
+ name: helper, params, returnType: resultType,
1638
+ locals: [
1639
+ ...params.map(param => ({ id: param.localId, name: param.name, type: param.type, mutable: false })),
1640
+ { id: "position.0", name: "position", type: F64, mutable: false },
1641
+ ],
1642
+ body: [
1643
+ { kind: "varDecl", localId: "position.0", init: positionNumber(lowerer, varRef("from.0", from.type, loc), numLit(0, loc), call.arguments[1] ?? call, "tuple search position"), loc },
1644
+ { kind: "return", value: result, loc },
1645
+ ], loc,
1646
+ });
1647
+ }
1648
+ return { kind: "call", callee: helper, args: [receiver, needle, from], type: resultType, loc };
1507
1649
  }
1508
- if (elemT === null || byIndex.length === 0)
1509
- return null; // empty/union-position tuples keep the fence
1510
- const snapshotElem = elemT;
1511
- const snapshot = {
1512
- kind: "arrayLit",
1513
- elems: byIndex.map((f) => {
1514
- const read = {
1515
- kind: "recordGet",
1516
- obj: receiver,
1517
- shapeId: receiverIr.shapeId,
1518
- field: f.name,
1519
- type: f.type,
1520
- loc,
1521
- };
1522
- return typeEquals(f.type, snapshotElem) ? read : lowerer.coerceInto(access.expression, read, snapshotElem);
1523
- }),
1524
- type: arrayOf(snapshotElem),
1525
- loc,
1526
- };
1527
- if (name === "slice") {
1528
- if (call.arguments.length > 2) {
1650
+ if (method === "slice") {
1651
+ if (call.arguments.length > 2 || call.arguments.some(ts.isSpreadElement)) {
1529
1652
  lowerer.noLowering(`.slice with ${call.arguments.length} arguments`, call);
1530
1653
  }
1531
- const args = call.arguments.map((a) => lowerer.lowerExpr(a));
1532
- for (let i = 0; i < args.length; i++) {
1533
- if (args[i].type.kind !== "f64")
1534
- lowerer.badType(call.arguments[i], lowerer.typeOf(call.arguments[i]));
1654
+ const args = call.arguments.map(arg => lowerer.lowerExpr(arg));
1655
+ args.forEach((arg, i) => { if (arg.type.kind !== "f64")
1656
+ lowerer.badType(call.arguments[i], lowerer.typeOf(call.arguments[i])); });
1657
+ const resultType = arrayOf(elem);
1658
+ const key = `tuple.slice:${typeKey(receiver.type)}:${args.length}`;
1659
+ let helper = lowerer.arrHofHelpers.get(key);
1660
+ if (!helper) {
1661
+ helper = `%tuple.slice.${lowerer.arrHofHelpers.size}`;
1662
+ lowerer.arrHofHelpers.set(key, helper);
1663
+ const params = [receiver, ...args].map((arg, i) => ({ localId: i === 0 ? "a.0" : `arg.${i}`, name: `arg${i}`, type: arg.type }));
1664
+ lowerer.liftedFns.push({
1665
+ name: helper, params, returnType: resultType,
1666
+ locals: params.map(param => ({ id: param.localId, name: param.name, type: param.type, mutable: false })),
1667
+ body: [{ kind: "return", value: {
1668
+ kind: "arrIntrinsic", method: "slice",
1669
+ receiver: { kind: "arrayLit", elems: fields.map(read), type: resultType, loc },
1670
+ args: args.map((arg, i) => varRef(`arg.${i + 1}`, arg.type, loc)), type: resultType, loc,
1671
+ }, loc }], loc,
1672
+ });
1535
1673
  }
1536
- return { kind: "arrIntrinsic", method: "slice", receiver: snapshot, args, type: arrayOf(snapshotElem), loc };
1674
+ return { kind: "call", callee: helper, args: [receiver, ...args], type: resultType, loc };
1537
1675
  }
1538
- // map
1539
- if (call.arguments.length !== 1) {
1540
- lowerer.noLowering(`.map with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
1676
+ if (call.arguments.length !== 1 || call.arguments.some(ts.isSpreadElement)) {
1677
+ lowerer.noLowering(`.${method} with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
1541
1678
  }
1542
- const argNode = call.arguments[0];
1543
- const { fnArg, arity } = hofCallbackArg(lowerer, argNode, [arrayValueType(lowerer, snapshotElem)], arrayOf(snapshotElem));
1544
- const fnRet = fnArg.type.ret;
1545
- if (fnRet.kind === "void" || fnRet.kind === "func")
1679
+ const callback = call.arguments[0];
1680
+ // Check before the array HOF adapter can create a tuple-to-array copy.
1681
+ const signatures = lowerer.checker.getCallSignatures(lowerer.typeOf(callback));
1682
+ if (signatures.some(signature => signature.getParameters().length > 2)) {
1683
+ lowerer.noLowering(`tuple .${method} callback array parameter`, callback, "capture the original tuple explicitly to preserve its identity");
1684
+ }
1685
+ const { fnArg, arity } = hofCallbackArg(lowerer, callback, [elem], receiver.type);
1686
+ const ret = fnArg.type.ret;
1687
+ if (ret.kind === "void" || ret.kind === "func")
1546
1688
  lowerer.badType(call, lowerer.typeOf(call));
1547
- fenceProducedArrayElem(lowerer, call, "'.map()'", fnRet);
1548
- const outElem = callbackArrayElem(lowerer, call, fnRet);
1549
- const helper = arrayHofHelper(lowerer, "map", snapshotElem, fnRet, arity, loc, outElem);
1550
- return { kind: "call", callee: helper, args: [snapshot, fnArg], type: arrayOf(outElem), loc };
1689
+ if (method === "flatMap" && ret.kind === "union" && lowerer.unions.get(ret.unionId).arms.some(arm => arm.kind === "array")) {
1690
+ lowerer.noLowering("tuple .flatMap callback mixing array and scalar results", callback, "return an array from every path");
1691
+ }
1692
+ const flatten = method === "flatMap" && ret.kind === "array";
1693
+ const outElem = flatten ? ret.elem : callbackArrayElem(lowerer, call, ret);
1694
+ fenceProducedArrayElem(lowerer, call, `'.${method}()'`, outElem);
1695
+ const outType = arrayOf(outElem);
1696
+ const key = `tuple.${method}:${typeKey(receiver.type)}:${typeKey(fnArg.type)}:${typeKey(outElem)}`;
1697
+ let helper = lowerer.arrHofHelpers.get(key);
1698
+ if (!helper) {
1699
+ helper = `%tuple.${method}.${lowerer.arrHofHelpers.size}`;
1700
+ lowerer.arrHofHelpers.set(key, helper);
1701
+ const out = varRef("out.0", outType, loc);
1702
+ const result = varRef("r.0", ret, loc);
1703
+ const outputLength = { kind: "arrIntrinsic", method: "length", receiver: out, args: [], type: F64, loc };
1704
+ const body = [{ kind: "varDecl", localId: "out.0", init: { kind: "arrayLit", elems: [], type: outType, loc }, loc }];
1705
+ for (const field of fields) {
1706
+ const invocation = {
1707
+ kind: "callValue", callee: varRef("f.0", fnArg.type, loc),
1708
+ args: [read(field), numLit(Number(field.name), loc)].slice(0, arity), type: ret, loc,
1709
+ };
1710
+ body.push(field === fields[0]
1711
+ ? { kind: "varDecl", localId: "r.0", init: invocation, loc }
1712
+ : { kind: "assign", localId: "r.0", value: invocation, loc });
1713
+ if (flatten) {
1714
+ const index = varRef("i.0", F64, loc);
1715
+ body.push(countedFor(loc, { kind: "arrIntrinsic", method: "length", receiver: result, args: [], type: F64, loc }, () => [{
1716
+ kind: "if", cond: arrayIndexPresent(result, index, loc), then: [
1717
+ { kind: "varDecl", localId: "inner.0", init: arrayValueRead(lowerer, result, index, outElem, loc), loc },
1718
+ arrayValueStore(lowerer, out, outputLength, varRef("inner.0", arrayValueType(lowerer, outElem), loc), outElem, loc),
1719
+ ], else_: null, loc,
1720
+ }]));
1721
+ }
1722
+ else {
1723
+ body.push(arrayValueStore(lowerer, out, outputLength, result, outElem, loc));
1724
+ }
1725
+ }
1726
+ body.push({ kind: "return", value: out, loc });
1727
+ lowerer.liftedFns.push({
1728
+ name: helper,
1729
+ params: [{ localId: "a.0", name: "a", type: receiver.type }, { localId: "f.0", name: "f", type: fnArg.type }],
1730
+ returnType: outType,
1731
+ locals: [
1732
+ { id: "a.0", name: "a", type: receiver.type, mutable: false },
1733
+ { id: "f.0", name: "f", type: fnArg.type, mutable: false },
1734
+ { id: "out.0", name: "out", type: outType, mutable: false },
1735
+ { id: "r.0", name: "r", type: ret, mutable: true },
1736
+ ...(flatten ? [
1737
+ { id: "i.0", name: "i", type: F64, mutable: true },
1738
+ { id: "inner.0", name: "inner", type: arrayValueType(lowerer, outElem), mutable: false },
1739
+ ] : []),
1740
+ ], body, loc,
1741
+ });
1742
+ }
1743
+ return { kind: "call", callee: helper, args: [receiver, fnArg], type: outType, loc };
1551
1744
  }
1552
1745
  /** An ordinary indexed read: values retain their element type, while
1553
1746
  * holes, missing properties, and present undefined yield undefined. */
1554
1747
  export function lowerSafeIndexRead(lowerer, arr, index, loc) {
1748
+ if (arr.type.kind !== "array")
1749
+ throw new InternalCompilerError("indexed read requires an array");
1555
1750
  const elem = arr.type.elem;
1556
- if (elem.kind === "void" || elem.kind === "dyn")
1751
+ if (elem.kind === "void")
1557
1752
  return null;
1558
1753
  const resultT = arrayValueType(lowerer, elem);
1559
1754
  const key = `idxOr:${typeKey(elem)}`;
@@ -1814,18 +2009,38 @@ function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bindUntyped
1814
2009
  loc,
1815
2010
  };
1816
2011
  }
1817
- // find: the result is the checker's `T | undefined` union. When the
1818
- // element type IS that union already (it carries an undefined arm), the
1819
- // found element passes through untouched; otherwise it wraps into its
1820
- // arm. A union element whose result union differs would need the
1821
- // union-into-union re-tag that doesn't exist — fenced.
1822
- const resultT = bindUntyped ? arrayValueType(lowerer, elem) : lowerer.irTypeOf(call);
2012
+ // find visits holes as undefined and can infer a predicate that selects
2013
+ // a subset of the element union. A result matching the receiver's flow
2014
+ // element inherits that earlier refinement. Otherwise only an inline,
2015
+ // inferred predicate proves a new narrowing; explicit assertions keep
2016
+ // the same refusal boundary as filter.
2017
+ const valueT = arrayValueType(lowerer, elem);
2018
+ const checkerReceiver = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
2019
+ const checkerResult = lowerer.irTypeOf(call);
2020
+ const unchangedElement = checkerReceiver?.kind === "array" &&
2021
+ typeEquals(checkerResult, arrayValueType(lowerer, checkerReceiver.elem));
2022
+ const resultT = bindUntyped ? valueT : checkerResult;
1823
2023
  if (resultT.kind !== "union")
1824
2024
  lowerer.badType(call, lowerer.typeOf(call)); // defensive: T | undefined always maps to a union
1825
2025
  const undefTag = lowerer.armTag(resultT.unionId, UNDEFINED_T);
1826
2026
  if (undefTag < 0)
1827
2027
  lowerer.badType(call, lowerer.typeOf(call));
1828
- const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc);
2028
+ let retag = null;
2029
+ if (!lowerer.coercibleValue(valueT, resultT)) {
2030
+ const inline = ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode);
2031
+ if (!unchangedElement && (!inline || argNode.type !== undefined)) {
2032
+ lowerer.unsupported("SC1090", argNode, `narrowing '.${method}' requires an inline callback with an inferred predicate (annotate the return ': boolean' to keep the receiver's element type)`);
2033
+ }
2034
+ const signature = inline ? lowerer.checker.getSignatureFromDeclaration(argNode) : undefined;
2035
+ const predicate = signature ? lowerer.checker.getTypePredicateOfSignature(signature) : undefined;
2036
+ if ((!unchangedElement && (!predicate || predicate.parameterIndex !== 0)) || valueT.kind !== "union") {
2037
+ lowerer.unsupported("SC1090", call, `'.${method}' result narrowing without a predicate over its element`);
2038
+ }
2039
+ retag = lowerer.narrowedRetagHelper(call, valueT.unionId, resultT.unionId, loc);
2040
+ if (retag === null)
2041
+ lowerer.unsupported("SC1090", call, `'.${method}' narrowing to an incompatible result layout`);
2042
+ }
2043
+ const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag);
1829
2044
  return { kind: "call", callee: helper, args: [receiver, fnArg], type: resultT, loc };
1830
2045
  }
1831
2046
  /** ToBoolean of a predicate result inside a synthesized HOF helper — the
@@ -1842,7 +2057,7 @@ function predToBool(e) {
1842
2057
  * for (i = 0; i < n; i++) { v = a[i]; if (f(v)) return <v as result arm>; }
1843
2058
  * return <undefined arm>;
1844
2059
  */
1845
- function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc) {
2060
+ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag) {
1846
2061
  const method = last ? "findLast" : "find";
1847
2062
  const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}`;
1848
2063
  const existing = lowerer.arrHofHelpers.get(key);
@@ -1854,7 +2069,8 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc) {
1854
2069
  const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
1855
2070
  const valueT = arrayValueType(lowerer, elem);
1856
2071
  const v = varRef("v.0", valueT, loc);
1857
- const found = lowerer.coerceToExpected(v, resultT);
2072
+ const found = retag === null ? lowerer.coerceToExpected(v, resultT) :
2073
+ { kind: "call", callee: retag, args: [v], type: resultT, loc };
1858
2074
  const miss = {
1859
2075
  kind: "unionWrap",
1860
2076
  unionId: resultT.unionId,
@@ -2170,7 +2386,7 @@ function lowerArrayReduceCall(lowerer, call, access, method, elem) {
2170
2386
  (hasInit ? lowerer.irTypeOf(call) : arrayValueType(lowerer, elem));
2171
2387
  if (accT.kind === "void" || accT.kind === "func")
2172
2388
  lowerer.badType(call, lowerer.typeOf(call));
2173
- const { fnArg, arity } = hofCallbackArg(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], arrT);
2389
+ const { fnArg, arity } = hofCallbackArg(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], arrT, false, accT);
2174
2390
  const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type.ret, arity, hasInit, loc);
2175
2391
  const args = [receiver, fnArg];
2176
2392
  if (hasInit)
@@ -2311,7 +2527,18 @@ function lowerArraySortCall(lowerer, call, access, elem, arrT) {
2311
2527
  }
2312
2528
  const receiver = lowerer.lowerExpr(access.expression);
2313
2529
  const argNode = call.arguments[0];
2314
- const fnArg = lowerer.lowerExpr(argNode);
2530
+ let fnArg = lowerer.lowerExpr(argNode);
2531
+ // Reusable JS comparators often accept checked values. Adapt the array's
2532
+ // element ABI just as other array callbacks do before sorting.
2533
+ if (fnArg.type.kind === "func" && fnArg.type.params.length <= 2 &&
2534
+ fnArg.type.params.every((param) => lowerer.coercibleValue(elem, param))) {
2535
+ // Arithmetic on inferred JS values retains a checked result because
2536
+ // it can produce BigInt. The sort callback still requires a number.
2537
+ const result = fnArg.type.ret.kind === "dyn" && isJsSourceFile(argNode.getSourceFile()) ? F64 : fnArg.type.ret;
2538
+ const expected = funcOf(fnArg.type.params.map(() => elem), result);
2539
+ if (!typeEquals(fnArg.type, expected))
2540
+ fnArg = lowerer.coerceToExpected(fnArg, expected);
2541
+ }
2315
2542
  // The comparator receives exactly (a, b); declaring a prefix is
2316
2543
  // ordinary TS. Its result must be number (the spec coerces arbitrary
2317
2544
  // results — no lowering for that).
@@ -2556,10 +2783,25 @@ export function lowerArrayConstructor(lowerer, expr, args) {
2556
2783
  if (contextual)
2557
2784
  result = lowerer.mapTypeOf(contextual);
2558
2785
  }
2786
+ if (isJsSourceFile(expr.getSourceFile()) && (result === null || result.kind === "dyn"))
2787
+ result = arrayOf(DYN);
2559
2788
  if (result?.kind !== "array" || !isSupportedArrayElem(result.elem)) {
2560
2789
  lowerer.badType(expr, lowerer.typeOf(expr));
2561
2790
  }
2562
2791
  const argType = args.length === 1 ? lowerer.mapTypeOf(lowerer.typeOf(args[0])) : null;
2792
+ if (args.length === 1 && result.elem.kind === "dyn" && (argType === null || argType.kind === "dyn")) {
2793
+ const input = lowerer.declareHiddenLocal("%arrayCtorValue", DYN);
2794
+ const value = varRef(input.id, DYN, loc);
2795
+ const local = lowerer.declareHiddenLocal("%arrayCtor", result);
2796
+ const array = varRef(local.id, result, loc);
2797
+ return { kind: "seqExpr", stmts: [
2798
+ { kind: "varDecl", localId: input.id, init: lowerer.lowerExprExpecting(args[0], DYN), loc },
2799
+ { kind: "varDecl", localId: local.id, init: { kind: "arrayLit", elems: [], type: result, loc }, loc },
2800
+ { kind: "if", cond: { kind: "dynTest", test: "number", value, type: BOOL, loc },
2801
+ then: [{ kind: "arraySetLength", arr: array, length: { kind: "dynCheck", value, type: F64, loc }, loc }],
2802
+ else_: [arrayValueStore(lowerer, array, numLit(0, loc), value, DYN, loc)], loc },
2803
+ ], result: array, type: result, loc };
2804
+ }
2563
2805
  if (argType?.kind === "dyn" || argType?.kind === "jsval") {
2564
2806
  lowerer.noLowering("Array constructor with a dynamically typed sole argument", args[0]);
2565
2807
  }
@@ -2622,6 +2864,33 @@ export function lowerArrayOfCall(lowerer, call, access) {
2622
2864
  loc: locOf(call),
2623
2865
  };
2624
2866
  }
2867
+ /** Mapper-less checked Array.from: acquire once, then step through emitted
2868
+ * property and call dispatch so native class iterators retain their methods. */
2869
+ function lowerCheckedArrayFrom(lowerer, source, loc) {
2870
+ const iterator = lowerer.declareHiddenLocal("%fromIterator", DYN);
2871
+ const next = lowerer.declareHiddenLocal("%fromNext", DYN);
2872
+ const step = lowerer.declareHiddenLocal("%fromStep", DYN);
2873
+ const out = lowerer.declareHiddenLocal("%fromArray", DYN);
2874
+ const done = lowerer.declareHiddenLocal("%fromDone", BOOL);
2875
+ done.mutable = true;
2876
+ const get = (value, key) => ({ kind: "dynKeyGet", value, key: strLit(key, loc), type: DYN, loc });
2877
+ const stmts = [
2878
+ { kind: "varDecl", localId: iterator.id, init: { kind: "libCall", fn: "dyn.iteratorResult", args: [{ kind: "libCall", fn: "dyn.arrayFromIterator", args: [source], type: DYN, loc }], type: DYN, loc }, loc },
2879
+ { kind: "varDecl", localId: next.id, init: get(varRef(iterator.id, DYN, loc), "next"), loc },
2880
+ { kind: "varDecl", localId: out.id, init: { kind: "dynArrLit", elems: [], type: DYN, loc }, loc },
2881
+ { kind: "varDecl", localId: done.id, init: boolLit(false, loc), loc },
2882
+ { kind: "while", cond: { kind: "unary", op: "!", operand: varRef(done.id, BOOL, loc), type: BOOL, loc }, body: [
2883
+ { kind: "varDecl", localId: step.id, init: { kind: "libCall", fn: "dyn.iteratorResult", args: [{
2884
+ kind: "dynCall", callee: varRef(next.id, DYN, loc), receiver: varRef(iterator.id, DYN, loc), calleeName: "iterator.next", args: [], type: DYN, loc,
2885
+ }], type: DYN, loc }, loc },
2886
+ { kind: "assign", localId: done.id, value: { kind: "dynTest", test: "truthy", value: get(varRef(step.id, DYN, loc), "done"), type: BOOL, loc }, loc },
2887
+ { kind: "if", cond: { kind: "unary", op: "!", operand: varRef(done.id, BOOL, loc), type: BOOL, loc }, then: [
2888
+ { kind: "exprStmt", expr: { kind: "dynInvoke", recv: varRef(out.id, DYN, loc), method: "push", calleeName: "Array.from", args: [get(varRef(step.id, DYN, loc), "value")], type: DYN, loc }, loc },
2889
+ ], else_: null, loc },
2890
+ ], loc },
2891
+ ];
2892
+ return { kind: "seqExpr", stmts, result: varRef(out.id, DYN, loc), type: DYN, loc };
2893
+ }
2625
2894
  /** `Array.from({ length: n }, mapfn)` — the counted-generation idiom — on
2626
2895
  * THE stdlib Array global. The source must be an OBJECT LITERAL whose
2627
2896
  * single property is `length` (the shape the idiom always spells; the
@@ -2719,6 +2988,9 @@ export function lowerArrayFromCall(lowerer, call, access) {
2719
2988
  }
2720
2989
  return { kind: "call", callee: helper, args: [src, fnArg], type: arrayOf(outElem), loc };
2721
2990
  }
2991
+ if (src.type.kind === "bytes" && args.length === 1) {
2992
+ return { kind: "bytesIntrinsic", method: "toArray", receiver: src, args: [], type: arrayOf(F64), loc };
2993
+ }
2722
2994
  if (src.type.kind === "set" && args.length === 1) {
2723
2995
  return { kind: "setIntrinsic", method: "toArray", receiver: src, args: [], type: arrayOf(src.type.elem), loc };
2724
2996
  }
@@ -2726,6 +2998,9 @@ export function lowerArrayFromCall(lowerer, call, access) {
2726
2998
  // `[...s]` and both Array.from(s) forms.
2727
2999
  if (src.type.kind === "string" && args.length === 1)
2728
3000
  return strCharsCall(lowerer, src, loc);
3001
+ if (src.type.kind === "dyn" && args.length === 1) {
3002
+ return lowerCheckedArrayFrom(lowerer, src, loc);
3003
+ }
2729
3004
  lowerer.noLowering("Array.from with this argument shape", call, "Array.from(array), Array.from(array, mapper), Array.from(aString), Array.from(aString, mapper), and Array.from({ length: n }, mapper) are the lowered forms");
2730
3005
  }
2731
3006
  const n = args.length === 2 && ts.isObjectLiteralExpression(args[0]) && args[0].properties.length === 1
@@ -2949,10 +3224,12 @@ export function lowerMapMethodCall(lowerer, call, access) {
2949
3224
  }
2950
3225
  if (receiverIr?.kind !== "map")
2951
3226
  return null;
2952
- if (!lowerer.isStdlibMember(access))
3227
+ // Collection views can refine has() while retaining its native ABI.
3228
+ if (!lowerer.isStdlibMember(access) && name !== "has")
2953
3229
  return null;
2954
3230
  const loc = locOf(call);
2955
- const receiver = lowerer.lowerExpr(access.expression);
3231
+ const value = lowerer.lowerExpr(access.expression);
3232
+ const receiver = lowerer.runtimeOptionalPropertyReceiver(access.expression, value, receiverIr, name) ?? value;
2956
3233
  // The lib's `set` returns the Map (chaining typechecks); the lowered
2957
3234
  // set is a void statement, so a chained receiver has no value — fence
2958
3235
  // it instead of emitting a void receiver.
@@ -2964,23 +3241,25 @@ export function lowerMapMethodCall(lowerer, call, access) {
2964
3241
  lowerer.noLowering(`.forEach with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
2965
3242
  }
2966
3243
  if (name === "get") {
2967
- const k = lowerer.lowerExprExpecting(call.arguments[0], receiverIr.key);
3244
+ const k = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.key);
2968
3245
  // The checker types the call `V | undefined`, which interns the
2969
3246
  // result union. `undefined` sorts LAST among all possible arm
2970
3247
  // typeKeys, so when V is itself a union its arms keep their tags in
2971
3248
  // the result union — the backend leans on that (docs/ir.md).
2972
- const type = lowerer.irTypeOf(call);
2973
- if (type.kind !== "union")
3249
+ const type = receiverIr.value.kind === "dyn" ? DYN : lowerer.irTypeOf(call);
3250
+ if (type.kind !== "union" && type.kind !== "dyn")
2974
3251
  lowerer.badType(call, lowerer.typeOf(call));
2975
3252
  return { kind: "mapIntrinsic", method: "get", receiver, args: [k], type, loc };
2976
3253
  }
2977
3254
  if (name === "set") {
2978
- const k = lowerer.lowerExprExpecting(call.arguments[0], receiverIr.key);
2979
- const v = lowerer.lowerExprExpecting(call.arguments[1], receiverIr.value);
3255
+ const k = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.key);
3256
+ const v = receiverIr.value.kind === "dyn"
3257
+ ? lowerer.lowerCollectionKey(call.arguments[1], receiverIr.value)
3258
+ : lowerer.lowerExprExpecting(call.arguments[1], receiverIr.value);
2980
3259
  return { kind: "mapIntrinsic", method: "set", receiver, args: [k, v], type: VOID, loc };
2981
3260
  }
2982
3261
  if (name === "has" || name === "delete") {
2983
- const k = lowerer.lowerExprExpecting(call.arguments[0], receiverIr.key);
3262
+ const k = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.key);
2984
3263
  return { kind: "mapIntrinsic", method: name, receiver, args: [k], type: BOOL, loc };
2985
3264
  }
2986
3265
  if (name === "clear") {
@@ -3100,6 +3379,65 @@ function buildMapIterDrainFn(name, mapT, method, elemT, tupleT, loc) {
3100
3379
  loc,
3101
3380
  };
3102
3381
  }
3382
+ /** An immediate Map spread observes the same entry order as entries().
3383
+ * Each pair is new; its key and value retain their original identities. */
3384
+ export function mapEntriesArray(lowerer, receiver) {
3385
+ const mapT = receiver.type;
3386
+ if (mapT.kind !== "map")
3387
+ throw new InternalCompilerError("Map entries require a map");
3388
+ const tupleT = {
3389
+ kind: "record", shapeId: lowerer.shapes.intern([
3390
+ { name: "0", type: mapT.key }, { name: "1", type: mapT.value },
3391
+ ], true),
3392
+ };
3393
+ const key = `entries:${typeKey(mapT.key)}:${typeKey(mapT.value)}`;
3394
+ let helper = lowerer.mapHofHelpers.get(key);
3395
+ if (!helper) {
3396
+ helper = `%map.entries.${lowerer.mapHofHelpers.size}`;
3397
+ lowerer.mapHofHelpers.set(key, helper);
3398
+ lowerer.liftedFns.push(buildMapIterDrainFn(helper, mapT, "entries", tupleT, tupleT, receiver.loc));
3399
+ }
3400
+ return { kind: "call", callee: helper, args: [receiver], type: arrayOf(tupleT), loc: receiver.loc };
3401
+ }
3402
+ /** Snapshot a collection for immediate iteration. Array reads and callback
3403
+ * parameters may retain an undefined arm even when the checker spells a
3404
+ * bare collection. Observe that arm before touching native storage. */
3405
+ export function lowerCollectionSpread(lowerer, source, node) {
3406
+ if (source.type.kind === "map")
3407
+ return mapEntriesArray(lowerer, source);
3408
+ if (source.type.kind === "set")
3409
+ return {
3410
+ kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrayOf(source.type.elem), loc: source.loc,
3411
+ };
3412
+ if (source.type.kind !== "union")
3413
+ return null;
3414
+ const arms = lowerer.unions.get(source.type.unionId)?.arms;
3415
+ const tag = arms?.findIndex((arm) => arm.kind === "map" || arm.kind === "set") ?? -1;
3416
+ const collection = arms?.[tag];
3417
+ if ((collection?.kind !== "map" && collection?.kind !== "set") ||
3418
+ !arms?.every((arm, index) => index === tag || isUnitType(arm)))
3419
+ return null;
3420
+ const loc = locOf(node);
3421
+ const slot = lowerer.declareHiddenLocal("%collectionSpread", source.type);
3422
+ const value = varRef(slot.id, source.type, loc);
3423
+ const narrowed = {
3424
+ kind: "unionNarrow", unionId: source.type.unionId, tag, value, type: collection, loc,
3425
+ };
3426
+ const entries = collection.kind === "map"
3427
+ ? mapEntriesArray(lowerer, narrowed)
3428
+ : { kind: "setIntrinsic", method: "toArray", receiver: narrowed, args: [], type: arrayOf(collection.elem), loc };
3429
+ return {
3430
+ kind: "seqExpr", stmts: [{ kind: "varDecl", localId: slot.id, init: source, loc }],
3431
+ result: {
3432
+ kind: "ternary",
3433
+ cond: { kind: "unionIsTag", unionId: source.type.unionId, tag, value, negated: false, type: BOOL, loc },
3434
+ then: entries,
3435
+ else_: nodeThrowExpr(1, "", `${node.getText()} is not iterable`, entries.type, loc),
3436
+ type: entries.type, loc,
3437
+ },
3438
+ type: entries.type, loc,
3439
+ };
3440
+ }
3103
3441
  /** `m.forEach(fn)` desugars to a direct call of a synthetic module
3104
3442
  * function — one per key/value type + callback arity, interned — whose
3105
3443
  * body is an index loop over the map's ITERATION PRIMITIVES: read
@@ -3285,10 +3623,14 @@ export function lowerSetMethodCall(lowerer, call, access) {
3285
3623
  }
3286
3624
  if (receiverIr?.kind !== "set")
3287
3625
  return null;
3288
- if (!lowerer.isStdlibMember(access))
3626
+ // A collection interface may refine has() into a type predicate.
3627
+ // Type mapping checked that view's native ABI; the value check below
3628
+ // still rejects structural mocks and assertions over other objects.
3629
+ if (!lowerer.isStdlibMember(access) && name !== "has")
3289
3630
  return null;
3290
3631
  const loc = locOf(call);
3291
- const receiver = lowerer.lowerExpr(access.expression);
3632
+ const value = lowerer.lowerExpr(access.expression);
3633
+ const receiver = lowerer.runtimeOptionalPropertyReceiver(access.expression, value, receiverIr, name) ?? value;
3292
3634
  // The lib's `add` returns the Set (chaining typechecks); the lowered
3293
3635
  // add is a void statement — fence chained receivers like Map's set.
3294
3636
  if (receiver.type.kind !== "set") {
@@ -3301,11 +3643,11 @@ export function lowerSetMethodCall(lowerer, call, access) {
3301
3643
  return lowerSetCombineCall(lowerer, call, name, receiver, receiverIr);
3302
3644
  }
3303
3645
  if (name === "add") {
3304
- const v = lowerer.lowerExprExpecting(call.arguments[0], receiverIr.elem);
3646
+ const v = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.elem);
3305
3647
  return { kind: "setIntrinsic", method: "add", receiver, args: [v], type: VOID, loc };
3306
3648
  }
3307
3649
  if (name === "has" || name === "delete") {
3308
- const v = lowerer.lowerExprExpecting(call.arguments[0], receiverIr.elem);
3650
+ const v = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.elem);
3309
3651
  return { kind: "setIntrinsic", method: name, receiver, args: [v], type: BOOL, loc };
3310
3652
  }
3311
3653
  if (name === "clear") {
@@ -3771,7 +4113,11 @@ export function lowerIteratorHelperCall(lowerer, call, access) {
3771
4113
  if (terminal !== "forEach" && (checkerT === null || !typeEquals(checkerT, resultT))) {
3772
4114
  lowerer.noLowering(`.${terminal} at this result type`, call, "the chain's element and result types must be representable — annotate the callbacks' types");
3773
4115
  }
3774
- const stageKeys = stageIrs.map((s) => (s.kind === "take" || s.kind === "drop" ? s.kind : `${s.kind}:${typeKey(s.fn.type)}`));
4116
+ const stageKeys = stageIrs.map((s) => {
4117
+ if (!s)
4118
+ throw new InternalCompilerError("missing iterator stage");
4119
+ return "budget" in s ? s.kind : `${s.kind}:${typeKey(s.fn.type)}`;
4120
+ });
3775
4121
  const key = `iter:${srcProj}:${typeKey(items.type)}:${stageKeys.join(",")}:${terminal}:${termArgs.map((a) => typeKey(a.type)).join(",")}`;
3776
4122
  let helper = lowerer.arrHofHelpers.get(key);
3777
4123
  if (!helper) {
@@ -3779,7 +4125,11 @@ export function lowerIteratorHelperCall(lowerer, call, access) {
3779
4125
  lowerer.arrHofHelpers.set(key, helper);
3780
4126
  lowerer.liftedFns.push(buildIterChainFn(lowerer, helper, items.type, srcProj, stageIrs, terminal, termArgs.map((a) => a.type), resultT, loc));
3781
4127
  }
3782
- const budgetOrFn = stageIrs.map((s) => (s.kind === "take" || s.kind === "drop" ? s.budget : s.fn));
4128
+ const budgetOrFn = stageIrs.map((s) => {
4129
+ if (!s)
4130
+ throw new InternalCompilerError("missing iterator stage");
4131
+ return "budget" in s ? s.budget : s.fn;
4132
+ });
3783
4133
  return { kind: "call", callee: helper, args: [items, ...budgetOrFn, ...termArgs], type: resultT, loc };
3784
4134
  }
3785
4135
  const ITER_STAGES = new Set(["map", "filter", "take", "drop", "flatMap"]);
@@ -4457,6 +4807,8 @@ export function lowerForOfSearchParams(lowerer, stmt, iterable, proj) {
4457
4807
  export function lowerForOfArrayIter(lowerer, stmt, iterable, proj) {
4458
4808
  const loc = locOf(stmt);
4459
4809
  const arrT = iterable.type;
4810
+ if (arrT.kind !== "array" && arrT.kind !== "bytes")
4811
+ throw new InternalCompilerError("array iterator requires indexed storage");
4460
4812
  const elemT = arrT.kind === "array" ? arrayValueType(lowerer, arrT.elem) : F64;
4461
4813
  const yieldsPair = proj === "entries";
4462
4814
  if (!ts.isVariableDeclarationList(stmt.initializer)) {
@@ -4835,7 +5187,11 @@ function exitBeforeReturns(stmts, make) {
4835
5187
  case "block":
4836
5188
  return [{ ...s, body: walk(s.body) }];
4837
5189
  case "switch":
4838
- return [{ ...s, cases: s.cases.map((c) => ({ ...c, body: walk(c.body) })) }];
5190
+ return [{ ...s, cases: s.cases.map((c) => {
5191
+ if (!c)
5192
+ throw new InternalCompilerError("missing switch clause");
5193
+ return { ...c, body: walk(c.body) };
5194
+ }) }];
4839
5195
  case "tryCatch":
4840
5196
  return [
4841
5197
  {
@@ -4851,18 +5207,290 @@ function exitBeforeReturns(stmts, make) {
4851
5207
  });
4852
5208
  return walk(stmts);
4853
5209
  }
4854
- /** `new Map(entries)` from a tuple-array VALUE — any `[K, V][]`-typed
4855
- * expression (a variable, a .map() result, a sorted entries spread), not
4856
- * just the pair-literal form lower-classes handles inline. Desugars to a
4857
- * direct call of a synthetic function that constructs the empty map and
4858
- * set()s each pair in array order — JS-exact: pairs are visited in
4859
- * insertion order and a later duplicate key overwrites while keeping the
4860
- * first occurrence's position (set()'s own contract). Null when the
4861
- * argument isn't a matching tuple array (the caller keeps its fence). */
4862
- export function lowerMapSeedArrayNew(lowerer, argNode, mapT) {
5210
+ /** Consume a Set seed immediately, including optional inherited sets used
5211
+ * by compiler tables. Nullish seeds construct empty sets; a lazy fallback
5212
+ * consumes its evaluated branch even when it reassigns the source binding. */
5213
+ export function lowerSetSeedNew(lowerer, node, setT) {
5214
+ if (ts.isSpreadElement(node))
5215
+ return null;
5216
+ while (ts.isParenthesizedExpression(node))
5217
+ node = node.expression;
5218
+ const loc = locOf(node);
5219
+ const undefinedSeed = lowerStaticallyUndefinedArgument(lowerer, node);
5220
+ if (undefinedSeed)
5221
+ return defaultAfterUndefined(undefinedSeed, { kind: "setNew", type: setT, loc });
5222
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken) {
5223
+ const undefinedLeft = lowerStaticallyUndefinedArgument(lowerer, node.left);
5224
+ const fallback = node.right;
5225
+ if (undefinedLeft) {
5226
+ const selected = lowerSetSeedNew(lowerer, fallback, setT);
5227
+ return selected ? defaultAfterUndefined(undefinedLeft, selected) : null;
5228
+ }
5229
+ const source = lowerer.lowerExpr(node.left);
5230
+ if (isUnitType(source.type)) {
5231
+ const selected = lowerSetSeedNew(lowerer, fallback, setT);
5232
+ return selected ? defaultAfterUndefined(source, selected) : null;
5233
+ }
5234
+ return setFromSeedValue(lowerer, source, setT, () => lowerSetSeedNew(lowerer, fallback, setT));
5235
+ }
5236
+ if (ts.isConditionalExpression(node)) {
5237
+ const yes = lowerSetSeedNew(lowerer, node.whenTrue, setT);
5238
+ const no = lowerSetSeedNew(lowerer, node.whenFalse, setT);
5239
+ return yes && no ? { kind: "ternary", cond: lowerer.lowerCondition(node.condition), then: yes, else_: no, type: setT, loc } : null;
5240
+ }
5241
+ // Constructor contextual types include Iterable<T>, which has no value
5242
+ // representation. Build a literal at the actual Set element ABI instead.
5243
+ if (ts.isArrayLiteralExpression(node) && !node.elements.some(ts.isSpreadElement)) {
5244
+ const elems = node.elements.map((element) => lowerer.lowerCollectionKey(element, setT.elem));
5245
+ return { kind: "setNew", seed: { kind: "arrayLit", elems, type: arrayOf(setT.elem), loc }, type: setT, loc };
5246
+ }
5247
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(node));
5248
+ const scalar = setT.elem.kind === "f64" || setT.elem.kind === "string";
5249
+ let source = !scalar && (declared?.kind === "array" || declared?.kind === "record")
5250
+ ? lowerer.lowerCollectionKey(node, declared)
5251
+ : lowerer.lowerExpr(node);
5252
+ if (declared?.kind === "string" && setT.elem.kind === "string" &&
5253
+ (source.type.kind === "dyn" || source.type.kind === "jsval")) {
5254
+ source = lowerer.coerceInto(node, source, STRING);
5255
+ }
5256
+ if (source.type.kind === "dyn" && setT.elem.kind === "dyn") {
5257
+ return { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.nativeSetNew", args: [source], type: DYN, loc }, type: setT, loc };
5258
+ }
5259
+ if (declared?.kind === "array" && typeEquals(declared.elem, setT.elem)) {
5260
+ // Preserve the existing checked scalar-iterable bridge. Reference
5261
+ // elements must retain identity and cannot enter via a copying exit.
5262
+ if (source.type.kind === "jsval" && lowerer.boundaryExitSafe(arrayOf(setT.elem))) {
5263
+ source = { kind: "jsExit", value: source, type: arrayOf(setT.elem), loc };
5264
+ }
5265
+ if (source.type.kind === "dyn" && scalar) {
5266
+ source = lowerer.coerceInto(node, {
5267
+ kind: "libCall", fn: "dyn.iterPack", args: [source, strLit(node.getText(), loc)], type: DYN, loc,
5268
+ }, arrayOf(setT.elem));
5269
+ }
5270
+ }
5271
+ return setFromSeedValue(lowerer, source, setT, () => ({ kind: "setNew", type: setT, loc }));
5272
+ }
5273
+ function setFromSeedValue(lowerer, source, setT, missing) {
5274
+ const loc = source.loc;
5275
+ if (isUnitType(source.type)) {
5276
+ const empty = missing();
5277
+ return empty ? defaultAfterUndefined(source, empty) : null;
5278
+ }
5279
+ if (source.type.kind === "union") {
5280
+ const unionId = source.type.unionId;
5281
+ const arms = lowerer.unions.get(unionId)?.arms;
5282
+ if (!arms)
5283
+ return null;
5284
+ const slot = lowerer.declareHiddenLocal("%setSeed", source.type);
5285
+ const ref = varRef(slot.id, source.type, loc);
5286
+ let result = null;
5287
+ for (let tag = arms.length - 1; tag >= 0; tag--) {
5288
+ const arm = arms[tag];
5289
+ const branch = isUnitType(arm) ? missing() : setFromSeedValue(lowerer, {
5290
+ kind: "unionNarrow", unionId, tag, value: ref, type: arm, loc,
5291
+ }, setT, missing);
5292
+ if (!branch)
5293
+ return null;
5294
+ result = result === null ? branch : {
5295
+ kind: "ternary", cond: { kind: "unionIsTag", unionId, tag, value: ref, negated: false, type: BOOL, loc },
5296
+ then: branch, else_: result, type: setT, loc,
5297
+ };
5298
+ }
5299
+ return result ? {
5300
+ kind: "seqExpr", stmts: [{ kind: "varDecl", localId: slot.id, init: source, loc }], result, type: setT, loc,
5301
+ } : null;
5302
+ }
5303
+ let seed;
5304
+ if (source.type.kind === "set" && typeEquals(source.type, setT)) {
5305
+ seed = { kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrayOf(setT.elem), loc };
5306
+ }
5307
+ else if (source.type.kind === "string" && setT.elem.kind === "string") {
5308
+ seed = strCharsCall(lowerer, source, loc);
5309
+ }
5310
+ else if (source.type.kind === "array" && typeEquals(source.type.elem, setT.elem)) {
5311
+ seed = source;
5312
+ }
5313
+ else if (source.type.kind === "record") {
5314
+ const shape = lowerer.shapes.get(source.type.shapeId);
5315
+ if (!shape?.tuple || !shape.fields.every((field) => typeEquals(field.type, setT.elem)))
5316
+ return null;
5317
+ const arrayT = { kind: "array", elem: setT.elem };
5318
+ const helper = lowerer.tupleArrayWidthHelper(source.type.shapeId, arrayT, loc);
5319
+ if (!helper)
5320
+ return null;
5321
+ seed = { kind: "call", callee: helper, args: [source], type: arrayT, loc };
5322
+ }
5323
+ else
5324
+ return null;
5325
+ return { kind: "setNew", seed, type: setT, loc };
5326
+ }
5327
+ /** Consume supported Map seeds: matching Maps and tuple arrays, plus
5328
+ * nullish values that construct an empty Map. Conditional/nullish seeds
5329
+ * select one lazy branch without representing a first-class iterable.
5330
+ * Copy loops preserve entry order and stored reference identities. */
5331
+ export function lowerMapSeedNew(lowerer, argNode, mapT) {
4863
5332
  if (ts.isSpreadElement(argNode))
4864
5333
  return null;
5334
+ const empty = lowerer.emptyCollectionFor(argNode, mapT);
5335
+ if (empty)
5336
+ return empty;
5337
+ while (ts.isParenthesizedExpression(argNode))
5338
+ argNode = argNode.expression;
5339
+ // A constructor consumes either iterable branch immediately. It does
5340
+ // not need a first-class Map|array representation for `cached ?? []`.
5341
+ // Snapshot the left before the lazy fallback can mutate its binding.
5342
+ if (ts.isBinaryExpression(argNode) && argNode.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken) {
5343
+ const source = lowerer.lowerExpr(argNode.left);
5344
+ if (isUnitType(source.type)) {
5345
+ const fallback = lowerMapSeedNew(lowerer, argNode.right, mapT);
5346
+ return fallback ? defaultAfterUndefined(source, fallback) : null;
5347
+ }
5348
+ if (source.type.kind !== "union")
5349
+ return mapFromSeedValue(lowerer, source, mapT);
5350
+ const arms = lowerer.unions.get(source.type.unionId)?.arms;
5351
+ if (!arms)
5352
+ return null;
5353
+ const loc = locOf(argNode);
5354
+ const saved = lowerer.declareHiddenLocal("%mapSeed", source.type);
5355
+ const ref = varRef(saved.id, source.type, loc);
5356
+ let result = null;
5357
+ for (let tag = arms.length - 1; tag >= 0; tag--) {
5358
+ const arm = arms[tag];
5359
+ const branch = isUnitType(arm)
5360
+ ? lowerMapSeedNew(lowerer, argNode.right, mapT)
5361
+ : mapFromSeedValue(lowerer, { kind: "unionNarrow", unionId: source.type.unionId, tag, value: ref, type: arm, loc }, mapT);
5362
+ if (!branch)
5363
+ return null;
5364
+ result = result === null ? branch : {
5365
+ kind: "ternary",
5366
+ cond: { kind: "unionIsTag", unionId: source.type.unionId, tag, value: ref, negated: false, type: BOOL, loc },
5367
+ then: branch, else_: result, type: mapT, loc,
5368
+ };
5369
+ }
5370
+ return result ? { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: source, loc }], result, type: mapT, loc } : null;
5371
+ }
5372
+ if (ts.isConditionalExpression(argNode)) {
5373
+ const yes = lowerMapSeedNew(lowerer, argNode.whenTrue, mapT);
5374
+ const no = lowerMapSeedNew(lowerer, argNode.whenFalse, mapT);
5375
+ return yes && no ? { kind: "ternary", cond: lowerer.lowerCondition(argNode.condition), then: yes, else_: no, type: mapT, loc: locOf(argNode) } : null;
5376
+ }
5377
+ if (ts.isArrayLiteralExpression(argNode)) {
5378
+ if (isJsSourceFile(argNode.getSourceFile()) && argNode.elements.some((entry) => !ts.isArrayLiteralExpression(entry))) {
5379
+ return mapFromSeedValue(lowerer, lowerer.lowerExprExpecting(argNode, DYN), mapT);
5380
+ }
5381
+ const tuple = { kind: "record", shapeId: lowerer.shapes.intern([
5382
+ { name: "0", type: mapT.key }, { name: "1", type: mapT.value },
5383
+ ], true) };
5384
+ return mapFromSeedValue(lowerer, lowerer.lowerArrayLiteral(argNode, { kind: "array", elem: tuple }), mapT);
5385
+ }
4865
5386
  const seed = lowerer.lowerExpr(argNode);
5387
+ return mapFromSeedValue(lowerer, seed, mapT);
5388
+ }
5389
+ function mapFromSeedValue(lowerer, seed, mapT) {
5390
+ const loc = seed.loc;
5391
+ if (isUnitType(seed.type)) {
5392
+ return defaultAfterUndefined(seed, { kind: "mapNew", type: mapT, loc });
5393
+ }
5394
+ if (seed.type.kind === "union") {
5395
+ const arms = lowerer.unions.get(seed.type.unionId)?.arms;
5396
+ if (!arms)
5397
+ return null;
5398
+ const saved = lowerer.declareHiddenLocal("%mapSeed", seed.type);
5399
+ const ref = varRef(saved.id, seed.type, loc);
5400
+ let result = null;
5401
+ for (let tag = arms.length - 1; tag >= 0; tag--) {
5402
+ const arm = arms[tag];
5403
+ const branch = isUnitType(arm) ? { kind: "mapNew", type: mapT, loc }
5404
+ : mapFromSeedValue(lowerer, { kind: "unionNarrow", unionId: seed.type.unionId, tag, value: ref, type: arm, loc }, mapT);
5405
+ if (!branch)
5406
+ return null;
5407
+ result = result === null ? branch : {
5408
+ kind: "ternary",
5409
+ cond: { kind: "unionIsTag", unionId: seed.type.unionId, tag, value: ref, negated: false, type: BOOL, loc },
5410
+ then: branch, else_: result, type: mapT, loc,
5411
+ };
5412
+ }
5413
+ return result ? { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: seed, loc }], result, type: mapT, loc } : null;
5414
+ }
5415
+ if (seed.type.kind === "map") {
5416
+ if (!typeEquals(seed.type, mapT))
5417
+ return null;
5418
+ const key = `copy:${typeKey(mapT)}`;
5419
+ let name = lowerer.mapHofHelpers.get(key);
5420
+ if (!name) {
5421
+ name = `%map.copy.${lowerer.mapHofHelpers.size}`;
5422
+ lowerer.mapHofHelpers.set(key, name);
5423
+ const source = varRef("source.0", mapT, loc);
5424
+ const target = varRef("target.0", mapT, loc);
5425
+ const index = varRef("i.0", F64, loc);
5426
+ const read = (method, type) => ({
5427
+ kind: "mapIntrinsic", method, receiver: source, args: method === "iterCount" ? [] : [index], type, loc,
5428
+ });
5429
+ lowerer.liftedFns.push({
5430
+ name, params: [{ localId: "source.0", name: "source", type: mapT }], returnType: mapT,
5431
+ locals: [
5432
+ { id: "source.0", name: "source", type: mapT, mutable: false },
5433
+ { id: "target.0", name: "target", type: mapT, mutable: false },
5434
+ { id: "i.0", name: "i", type: F64, mutable: true },
5435
+ ],
5436
+ body: [
5437
+ { kind: "varDecl", localId: "target.0", init: { kind: "mapNew", type: mapT, loc }, loc },
5438
+ countedFor(loc, read("iterCount", F64), () => [{
5439
+ kind: "if", cond: read("iterLive", BOOL), then: [{ kind: "exprStmt", expr: {
5440
+ kind: "mapIntrinsic", method: "set", receiver: target,
5441
+ args: [read("iterKey", mapT.key), read("iterValue", mapT.value)], type: VOID, loc,
5442
+ }, loc }], else_: null, loc,
5443
+ }]),
5444
+ { kind: "return", value: target, loc },
5445
+ ], loc,
5446
+ });
5447
+ }
5448
+ return { kind: "call", callee: name, args: [seed], type: mapT, loc };
5449
+ }
5450
+ if (seed.type.kind === "dyn" || seed.type.kind === "array" && seed.type.elem.kind === "dyn") {
5451
+ const key = `checked-seed:${typeKey(mapT)}`;
5452
+ let name = lowerer.mapHofHelpers.get(key);
5453
+ if (!name) {
5454
+ name = `%map.checkedSeed.${lowerer.mapHofHelpers.size}`;
5455
+ lowerer.mapHofHelpers.set(key, name);
5456
+ const source = varRef("source.0", DYN, loc);
5457
+ const entries = varRef("entries.0", DYN, loc);
5458
+ const entry = varRef("entry.0", DYN, loc);
5459
+ const target = varRef("target.0", mapT, loc);
5460
+ const keyValue = varRef("key.0", DYN, loc);
5461
+ const itemValue = varRef("value.0", DYN, loc);
5462
+ const checked = (value, type) => type.kind === "dyn" ? value
5463
+ : { kind: "dynCheck", value, type, loc };
5464
+ lowerer.liftedFns.push({
5465
+ name, params: [{ localId: "source.0", name: "source", type: DYN }], returnType: mapT,
5466
+ locals: [
5467
+ { id: "source.0", name: "source", type: DYN, mutable: false },
5468
+ { id: "entries.0", name: "entries", type: DYN, mutable: false },
5469
+ { id: "entry.0", name: "entry", type: DYN, mutable: false },
5470
+ { id: "key.0", name: "key", type: DYN, mutable: false },
5471
+ { id: "value.0", name: "value", type: DYN, mutable: false },
5472
+ { id: "target.0", name: "target", type: mapT, mutable: false },
5473
+ { id: "i.0", name: "i", type: F64, mutable: true },
5474
+ ],
5475
+ body: [
5476
+ { kind: "varDecl", localId: "target.0", init: { kind: "mapNew", type: mapT, loc }, loc },
5477
+ { kind: "varDecl", localId: "entries.0", init: { kind: "libCall", fn: "dyn.mapSeedEntries", args: [source], type: DYN, loc }, loc },
5478
+ countedFor(loc, { kind: "libCall", fn: "dyn.arrLen", args: [entries], type: F64, loc }, () => [
5479
+ { kind: "varDecl", localId: "entry.0", init: { kind: "libCall", fn: "dyn.mapSeedEntry", args: [
5480
+ { kind: "libCall", fn: "dyn.arrAt", args: [entries, varRef("i.0", F64, loc)], type: DYN, loc },
5481
+ ], type: DYN, loc }, loc },
5482
+ { kind: "varDecl", localId: "key.0", init: { kind: "dynKeyGet", value: entry, key: strLit("0", loc), type: DYN, loc }, loc },
5483
+ { kind: "varDecl", localId: "value.0", init: { kind: "dynKeyGet", value: entry, key: strLit("1", loc), type: DYN, loc }, loc },
5484
+ { kind: "exprStmt", expr: { kind: "mapIntrinsic", method: "set", receiver: target,
5485
+ args: [checked(keyValue, mapT.key), checked(itemValue, mapT.value)], type: VOID, loc }, loc },
5486
+ ]),
5487
+ { kind: "return", value: target, loc },
5488
+ ], loc,
5489
+ });
5490
+ }
5491
+ const source = seed.type.kind === "dyn" ? seed : { kind: "dynFrom", value: seed, type: DYN, loc };
5492
+ return { kind: "call", callee: name, args: [source], type: mapT, loc };
5493
+ }
4866
5494
  if (seed.type.kind !== "array" || seed.type.elem.kind !== "record")
4867
5495
  return null;
4868
5496
  const elem = seed.type.elem;
@@ -4873,7 +5501,6 @@ export function lowerMapSeedArrayNew(lowerer, argNode, mapT) {
4873
5501
  const vT = shape.fields.find((f) => f.name === "1").type;
4874
5502
  if (!typeEquals(kT, mapT.key) || !typeEquals(vT, mapT.value))
4875
5503
  return null;
4876
- const loc = locOf(argNode);
4877
5504
  const key = `seed:${typeKey(mapT.key)}:${typeKey(mapT.value)}:${elem.shapeId}`;
4878
5505
  let helper = lowerer.mapHofHelpers.get(key);
4879
5506
  if (!helper) {
@@ -4946,7 +5573,7 @@ export function lowerObjectIterOverIndexShape(lowerer, call, member, argIr, shap
4946
5573
  const resultT = lowerer.irTypeOf(call);
4947
5574
  if (resultT.kind !== "array")
4948
5575
  lowerer.badType(call, lowerer.typeOf(call)); // defensive
4949
- return objectIterOverIndexShape(lowerer, call, member, argIr, shape, lowerer.lowerExpr(call.arguments[0]), resultT, locOf(call));
5576
+ return objectIterOverIndexShape(lowerer, call, member, argIr, shape, objectEnumerationReceiver(lowerer, lowerer.lowerExpr(call.arguments[0]), argIr, locOf(call)), resultT, locOf(call));
4950
5577
  }
4951
5578
  /** The construction core, receiver/result pre-resolved — `node` anchors
4952
5579
  * the fences. for-in reuses the "keys" arm directly (it iterates exactly
@@ -5146,6 +5773,21 @@ export function objectIterOverIndexShape(lowerer, node, member, argIr, shape, re
5146
5773
  * (lowerRecordOvfCaptureHelper). Null when the argument or result shape
5147
5774
  * is outside this (Maps, richer iterables → the SC2020 fence). */
5148
5775
  export function lowerObjectFromEntriesCall(lowerer, call, callee) {
5776
+ const typed = lowerTypedObjectFromEntriesCall(lowerer, call, callee);
5777
+ if (typed)
5778
+ return typed;
5779
+ if (!ts.isPropertyAccessExpression(callee) || call.questionDotToken || callee.questionDotToken ||
5780
+ !lowerer.isStdlibGlobal(callee.expression, "Object") || callee.name.text !== "fromEntries" ||
5781
+ call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0]))
5782
+ return null;
5783
+ if (lowerer.dynamic)
5784
+ return null;
5785
+ return {
5786
+ kind: "libCall", fn: "dyn.fromEntries", type: DYN, loc: locOf(call),
5787
+ args: [lowerer.lowerExprExpecting(call.arguments[0], DYN)],
5788
+ };
5789
+ }
5790
+ function lowerTypedObjectFromEntriesCall(lowerer, call, callee) {
5149
5791
  if (!ts.isPropertyAccessExpression(callee))
5150
5792
  return null;
5151
5793
  if (call.questionDotToken || callee.questionDotToken)
@@ -5202,7 +5844,10 @@ export function lowerObjectFromEntriesCall(lowerer, call, callee) {
5202
5844
  if (!convertible) {
5203
5845
  lowerer.unsupported("SC1090", call, `Object.fromEntries over '${lowerer.fmt(argIr)}' (the tuple's '${lowerer.fmt(valT)}' value cannot flow into the '${lowerer.fmt(iv)}' signature slot)`);
5204
5846
  }
5205
- const receiver = lowerer.lowerExpr(argNode);
5847
+ // Enumeration/filtering may keep the array in checked-dynamic storage.
5848
+ // Validate its tuple layout before calling a helper with a native-array
5849
+ // ABI; opaque tuple values themselves retain their original references.
5850
+ const receiver = lowerer.lowerExprExpecting(argNode, argIr);
5206
5851
  const key = `obj.fromEntries:${argIr.elem.shapeId}:${resultT.shapeId}`;
5207
5852
  let helper = lowerer.arrHofHelpers.get(key);
5208
5853
  if (!helper) {