@scriptc/compiler 0.4.5 → 0.4.6

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 (1200) hide show
  1. package/ambient/node-fallback/assert-strict.d.ts +47 -0
  2. package/ambient/node-fallback/assert.d.ts +86 -0
  3. package/ambient/node-fallback/async_hooks.d.ts +41 -0
  4. package/ambient/node-fallback/buffer.d.ts +23 -0
  5. package/ambient/node-fallback/child_process.d.ts +242 -0
  6. package/ambient/node-fallback/cluster.d.ts +17 -0
  7. package/ambient/node-fallback/constants.d.ts +15 -0
  8. package/ambient/node-fallback/crypto.d.ts +837 -0
  9. package/ambient/node-fallback/dgram.d.ts +58 -0
  10. package/ambient/node-fallback/diagnostics_channel.d.ts +87 -0
  11. package/ambient/node-fallback/dns-promises.d.ts +27 -0
  12. package/ambient/node-fallback/dns.d.ts +65 -0
  13. package/ambient/node-fallback/events.d.ts +60 -0
  14. package/ambient/node-fallback/fs-promises.d.ts +225 -0
  15. package/ambient/node-fallback/fs.d.ts +641 -0
  16. package/ambient/node-fallback/graceful-fs.d.ts +9 -0
  17. package/ambient/node-fallback/http.d.ts +326 -0
  18. package/ambient/node-fallback/http2.d.ts +816 -0
  19. package/ambient/node-fallback/https.d.ts +59 -0
  20. package/ambient/node-fallback/module.d.ts +10 -0
  21. package/ambient/node-fallback/net.d.ts +374 -0
  22. package/ambient/node-fallback/os.d.ts +288 -0
  23. package/ambient/node-fallback/path-posix.d.ts +22 -0
  24. package/ambient/node-fallback/path-win32.d.ts +22 -0
  25. package/ambient/node-fallback/path.d.ts +55 -0
  26. package/ambient/node-fallback/process.d.ts +11 -0
  27. package/ambient/node-fallback/punycode.d.ts +18 -0
  28. package/ambient/node-fallback/querystring.d.ts +55 -0
  29. package/ambient/node-fallback/stream-consumers.d.ts +21 -0
  30. package/ambient/node-fallback/stream-promises.d.ts +28 -0
  31. package/ambient/node-fallback/stream-web.d.ts +36 -0
  32. package/ambient/node-fallback/stream.d.ts +644 -0
  33. package/ambient/node-fallback/string_decoder.d.ts +20 -0
  34. package/ambient/node-fallback/test.d.ts +236 -0
  35. package/ambient/node-fallback/timers-promises.d.ts +31 -0
  36. package/ambient/node-fallback/timers.d.ts +28 -0
  37. package/ambient/node-fallback/tls.d.ts +169 -0
  38. package/ambient/node-fallback/url.d.ts +95 -0
  39. package/ambient/node-fallback/util-types.d.ts +50 -0
  40. package/ambient/node-fallback/util.d.ts +416 -0
  41. package/ambient/node-fallback/v8.d.ts +43 -0
  42. package/ambient/node-fallback/worker_threads.d.ts +113 -0
  43. package/ambient/node-fallback/zlib.d.ts +422 -0
  44. package/ambient/scriptc-node-fallback.d.ts +224 -6688
  45. package/dist/backend/cycle-analysis.js +4 -0
  46. package/dist/backend/cycle-analysis.js.map +1 -1
  47. package/dist/backend/executable-features.d.ts +1 -1
  48. package/dist/backend/executable-features.js +15 -2
  49. package/dist/backend/executable-features.js.map +1 -1
  50. package/dist/backend/huge-text.d.ts +16 -0
  51. package/dist/backend/huge-text.js +103 -0
  52. package/dist/backend/huge-text.js.map +1 -0
  53. package/dist/backend/huge-text.test.d.ts +1 -0
  54. package/dist/backend/huge-text.test.js +73 -0
  55. package/dist/backend/huge-text.test.js.map +1 -0
  56. package/dist/backend/library-pack.js +1 -1
  57. package/dist/backend/library-pack.js.map +1 -1
  58. package/dist/backend/link-plan-core.d.ts +10 -0
  59. package/dist/backend/link-plan-core.js +14 -2
  60. package/dist/backend/link-plan-core.js.map +1 -1
  61. package/dist/backend/link-plan-core.test.d.ts +1 -0
  62. package/dist/backend/link-plan-core.test.js +20 -0
  63. package/dist/backend/link-plan-core.test.js.map +1 -0
  64. package/dist/backend/link-plan.d.ts +8 -0
  65. package/dist/backend/link-plan.js +7 -0
  66. package/dist/backend/link-plan.js.map +1 -1
  67. package/dist/backend/linker.js +37 -14
  68. package/dist/backend/linker.js.map +1 -1
  69. package/dist/backend/lld.d.ts +13 -0
  70. package/dist/backend/lld.js +18 -1
  71. package/dist/backend/lld.js.map +1 -1
  72. package/dist/backend/lld.test.js +7 -1
  73. package/dist/backend/lld.test.js.map +1 -1
  74. package/dist/backend/llvm/alloc.d.ts +2 -0
  75. package/dist/backend/llvm/alloc.js +1 -1
  76. package/dist/backend/llvm/alloc.js.map +1 -1
  77. package/dist/backend/llvm/arenas.d.ts +78 -0
  78. package/dist/backend/llvm/arenas.js +313 -0
  79. package/dist/backend/llvm/arenas.js.map +1 -0
  80. package/dist/backend/llvm/arenas.test.d.ts +1 -0
  81. package/dist/backend/llvm/arenas.test.js +140 -0
  82. package/dist/backend/llvm/arenas.test.js.map +1 -0
  83. package/dist/backend/llvm/blocks.d.ts +11 -1
  84. package/dist/backend/llvm/blocks.js +23 -5
  85. package/dist/backend/llvm/blocks.js.map +1 -1
  86. package/dist/backend/llvm/bytes-headers.d.ts +19 -0
  87. package/dist/backend/llvm/bytes-headers.js +55 -0
  88. package/dist/backend/llvm/bytes-headers.js.map +1 -0
  89. package/dist/backend/llvm/bytes-loop-versions.d.ts +4 -3
  90. package/dist/backend/llvm/bytes-loop-versions.js +42 -7
  91. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  92. package/dist/backend/llvm/bytes-loop-versions.test.js +39 -4
  93. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  94. package/dist/backend/llvm/call-lifetimes.d.ts +5 -0
  95. package/dist/backend/llvm/call-lifetimes.js +43 -8
  96. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  97. package/dist/backend/llvm/call-lifetimes.test.js +26 -0
  98. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  99. package/dist/backend/llvm/checked-narrows.d.ts +3 -0
  100. package/dist/backend/llvm/checked-narrows.js +8 -1
  101. package/dist/backend/llvm/checked-narrows.js.map +1 -1
  102. package/dist/backend/llvm/class-unions.d.ts +21 -0
  103. package/dist/backend/llvm/class-unions.js +141 -0
  104. package/dist/backend/llvm/class-unions.js.map +1 -0
  105. package/dist/backend/llvm/class-unions.test.d.ts +1 -0
  106. package/dist/backend/llvm/class-unions.test.js +137 -0
  107. package/dist/backend/llvm/class-unions.test.js.map +1 -0
  108. package/dist/backend/llvm/classes.d.ts +46 -8
  109. package/dist/backend/llvm/classes.js +259 -32
  110. package/dist/backend/llvm/classes.js.map +1 -1
  111. package/dist/backend/llvm/classes.test.js +4 -0
  112. package/dist/backend/llvm/classes.test.js.map +1 -1
  113. package/dist/backend/llvm/common.d.ts +23 -0
  114. package/dist/backend/llvm/common.js +34 -0
  115. package/dist/backend/llvm/common.js.map +1 -1
  116. package/dist/backend/llvm/constant-callbacks.test.js +39 -0
  117. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  118. package/dist/backend/llvm/constant-choices.d.ts +32 -0
  119. package/dist/backend/llvm/constant-choices.js +209 -0
  120. package/dist/backend/llvm/constant-choices.js.map +1 -0
  121. package/dist/backend/llvm/constant-choices.test.d.ts +1 -0
  122. package/dist/backend/llvm/constant-choices.test.js +94 -0
  123. package/dist/backend/llvm/constant-choices.test.js.map +1 -0
  124. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  125. package/dist/backend/llvm/counted-loops.js +60 -7
  126. package/dist/backend/llvm/counted-loops.js.map +1 -1
  127. package/dist/backend/llvm/counted-loops.test.d.ts +1 -0
  128. package/dist/backend/llvm/counted-loops.test.js +34 -0
  129. package/dist/backend/llvm/counted-loops.test.js.map +1 -0
  130. package/dist/backend/llvm/cpu-dispatch.d.ts +26 -0
  131. package/dist/backend/llvm/cpu-dispatch.js +279 -0
  132. package/dist/backend/llvm/cpu-dispatch.js.map +1 -0
  133. package/dist/backend/llvm/dense-array-access.d.ts +13 -2
  134. package/dist/backend/llvm/dense-array-access.js +60 -6
  135. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  136. package/dist/backend/llvm/dyn-handle-tags.test.js +40 -14
  137. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  138. package/dist/backend/llvm/dyn.d.ts +28 -2
  139. package/dist/backend/llvm/dyn.js +176 -27
  140. package/dist/backend/llvm/dyn.js.map +1 -1
  141. package/dist/backend/llvm/emit-function.js +25 -3
  142. package/dist/backend/llvm/emit-function.js.map +1 -1
  143. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  144. package/dist/backend/llvm/emit-journal.js.map +1 -1
  145. package/dist/backend/llvm/emit-module.d.ts +5 -3
  146. package/dist/backend/llvm/emit-module.js +362 -74
  147. package/dist/backend/llvm/emit-module.js.map +1 -1
  148. package/dist/backend/llvm/emit-statements.js +327 -59
  149. package/dist/backend/llvm/emit-statements.js.map +1 -1
  150. package/dist/backend/llvm/emitter.d.ts +223 -33
  151. package/dist/backend/llvm/emitter.js +713 -100
  152. package/dist/backend/llvm/emitter.js.map +1 -1
  153. package/dist/backend/llvm/emitter.test.js +20 -1
  154. package/dist/backend/llvm/emitter.test.js.map +1 -1
  155. package/dist/backend/llvm/expr-async.js +32 -6
  156. package/dist/backend/llvm/expr-async.js.map +1 -1
  157. package/dist/backend/llvm/expr-bytes.d.ts +9 -1
  158. package/dist/backend/llvm/expr-bytes.js +105 -9
  159. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  160. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  161. package/dist/backend/llvm/expr-callbacks.js +29 -22
  162. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  163. package/dist/backend/llvm/expr-calls.d.ts +0 -4
  164. package/dist/backend/llvm/expr-calls.js +116 -14
  165. package/dist/backend/llvm/expr-calls.js.map +1 -1
  166. package/dist/backend/llvm/expr-containers.js +77 -12
  167. package/dist/backend/llvm/expr-containers.js.map +1 -1
  168. package/dist/backend/llvm/expr-context.d.ts +22 -0
  169. package/dist/backend/llvm/expr-control.d.ts +4 -0
  170. package/dist/backend/llvm/expr-control.js +485 -426
  171. package/dist/backend/llvm/expr-control.js.map +1 -1
  172. package/dist/backend/llvm/expr-dispatch.js +4 -0
  173. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  174. package/dist/backend/llvm/expr-dynamic.js +3 -3
  175. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  176. package/dist/backend/llvm/expr-primitives.d.ts +6 -0
  177. package/dist/backend/llvm/expr-primitives.js +119 -58
  178. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  179. package/dist/backend/llvm/expr-primitives.test.js +11 -2
  180. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  181. package/dist/backend/llvm/expr-records.d.ts +36 -4
  182. package/dist/backend/llvm/expr-records.js +249 -37
  183. package/dist/backend/llvm/expr-records.js.map +1 -1
  184. package/dist/backend/llvm/expr-stream-bridges.js +124 -7
  185. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  186. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  187. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  188. package/dist/backend/llvm/expr-stream-callbacks.js +13 -14
  189. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  190. package/dist/backend/llvm/frame-escapes.d.ts +11 -0
  191. package/dist/backend/llvm/frame-escapes.js +219 -0
  192. package/dist/backend/llvm/frame-escapes.js.map +1 -0
  193. package/dist/backend/llvm/function-layout.d.ts +15 -0
  194. package/dist/backend/llvm/function-layout.js +40 -0
  195. package/dist/backend/llvm/function-layout.js.map +1 -0
  196. package/dist/backend/llvm/heap-census.d.ts +34 -0
  197. package/dist/backend/llvm/heap-census.js +163 -0
  198. package/dist/backend/llvm/heap-census.js.map +1 -0
  199. package/dist/backend/llvm/inline-arrays.d.ts +41 -0
  200. package/dist/backend/llvm/inline-arrays.js +195 -0
  201. package/dist/backend/llvm/inline-arrays.js.map +1 -0
  202. package/dist/backend/llvm/int32-kind-loops.js +2 -0
  203. package/dist/backend/llvm/int32-kind-loops.js.map +1 -1
  204. package/dist/backend/llvm/integer-clones.d.ts +32 -5
  205. package/dist/backend/llvm/integer-clones.js +237 -44
  206. package/dist/backend/llvm/integer-clones.js.map +1 -1
  207. package/dist/backend/llvm/integer-clones.test.js +120 -0
  208. package/dist/backend/llvm/integer-clones.test.js.map +1 -1
  209. package/dist/backend/llvm/iterative-teardown.test.d.ts +1 -0
  210. package/dist/backend/llvm/iterative-teardown.test.js +62 -0
  211. package/dist/backend/llvm/iterative-teardown.test.js.map +1 -0
  212. package/dist/backend/llvm/js-ic.js +246 -62
  213. package/dist/backend/llvm/js-ic.js.map +1 -1
  214. package/dist/backend/llvm/lib-connect.js +1 -1
  215. package/dist/backend/llvm/lib-connect.js.map +1 -1
  216. package/dist/backend/llvm/lib-datagram.js +2 -2
  217. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  218. package/dist/backend/llvm/lib-dispatch.js +153 -16
  219. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  220. package/dist/backend/llvm/lib-filesystem.d.ts +8 -0
  221. package/dist/backend/llvm/lib-filesystem.js +48 -4
  222. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  223. package/dist/backend/llvm/lib-http2.js +4 -3
  224. package/dist/backend/llvm/lib-http2.js.map +1 -1
  225. package/dist/backend/llvm/lib-lookup.js +1 -1
  226. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  227. package/dist/backend/llvm/lib-network.js +15 -1
  228. package/dist/backend/llvm/lib-network.js.map +1 -1
  229. package/dist/backend/llvm/lib-process.js +32 -8
  230. package/dist/backend/llvm/lib-process.js.map +1 -1
  231. package/dist/backend/llvm/lib-shared.d.ts +3 -0
  232. package/dist/backend/llvm/lib-shared.js +191 -28
  233. package/dist/backend/llvm/lib-shared.js.map +1 -1
  234. package/dist/backend/llvm/lib-stream.js +1 -1
  235. package/dist/backend/llvm/lib-stream.js.map +1 -1
  236. package/dist/backend/llvm/local-array-reads.js +15 -1
  237. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  238. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  239. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  240. package/dist/backend/llvm/local-extents.d.ts +22 -0
  241. package/dist/backend/llvm/local-extents.js +102 -0
  242. package/dist/backend/llvm/local-extents.js.map +1 -1
  243. package/dist/backend/llvm/local-union-storage.js +15 -2
  244. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  245. package/dist/backend/llvm/local-union-storage.test.js +1 -1
  246. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  247. package/dist/backend/llvm/loop-callees.d.ts +21 -0
  248. package/dist/backend/llvm/loop-callees.js +119 -0
  249. package/dist/backend/llvm/loop-callees.js.map +1 -0
  250. package/dist/backend/llvm/loop-callees.test.d.ts +1 -0
  251. package/dist/backend/llvm/loop-callees.test.js +65 -0
  252. package/dist/backend/llvm/loop-callees.test.js.map +1 -0
  253. package/dist/backend/llvm/loop-entry-versions.d.ts +17 -0
  254. package/dist/backend/llvm/loop-entry-versions.js +185 -0
  255. package/dist/backend/llvm/loop-entry-versions.js.map +1 -0
  256. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  257. package/dist/backend/llvm/map-number-lookup.test.js +13 -4
  258. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  259. package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -0
  260. package/dist/backend/llvm/map-read-lifetimes.js +51 -1
  261. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  262. package/dist/backend/llvm/map-read-lifetimes.test.js +6 -3
  263. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  264. package/dist/backend/llvm/nullable-unions.d.ts +67 -10
  265. package/dist/backend/llvm/nullable-unions.js +218 -22
  266. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  267. package/dist/backend/llvm/nullable-unions.test.js +124 -1
  268. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  269. package/dist/backend/llvm/periodic-guards.d.ts +16 -0
  270. package/dist/backend/llvm/periodic-guards.js +91 -0
  271. package/dist/backend/llvm/periodic-guards.js.map +1 -0
  272. package/dist/backend/llvm/periodic-guards.test.d.ts +1 -0
  273. package/dist/backend/llvm/periodic-guards.test.js +64 -0
  274. package/dist/backend/llvm/periodic-guards.test.js.map +1 -0
  275. package/dist/backend/llvm/publish.d.ts +12 -2
  276. package/dist/backend/llvm/publish.js +15 -8
  277. package/dist/backend/llvm/publish.js.map +1 -1
  278. package/dist/backend/llvm/rebound-parameters.d.ts +4 -1
  279. package/dist/backend/llvm/rebound-parameters.js +17 -1
  280. package/dist/backend/llvm/rebound-parameters.js.map +1 -1
  281. package/dist/backend/llvm/receivers.d.ts +7 -0
  282. package/dist/backend/llvm/receivers.js +77 -10
  283. package/dist/backend/llvm/receivers.js.map +1 -1
  284. package/dist/backend/llvm/record-union-keys.test.js +29 -0
  285. package/dist/backend/llvm/record-union-keys.test.js.map +1 -1
  286. package/dist/backend/llvm/record-views.d.ts +29 -0
  287. package/dist/backend/llvm/record-views.js +249 -0
  288. package/dist/backend/llvm/record-views.js.map +1 -0
  289. package/dist/backend/llvm/record-views.test.d.ts +1 -0
  290. package/dist/backend/llvm/record-views.test.js +118 -0
  291. package/dist/backend/llvm/record-views.test.js.map +1 -0
  292. package/dist/backend/llvm/reference-writes.js +21 -0
  293. package/dist/backend/llvm/reference-writes.js.map +1 -1
  294. package/dist/backend/llvm/reference-writes.test.js +42 -0
  295. package/dist/backend/llvm/reference-writes.test.js.map +1 -1
  296. package/dist/backend/llvm/regex-matchers.d.ts +5 -1
  297. package/dist/backend/llvm/regex-matchers.js +173 -21
  298. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  299. package/dist/backend/llvm/regex-matchers.test.js +39 -1
  300. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  301. package/dist/backend/llvm/region-groups.d.ts +67 -0
  302. package/dist/backend/llvm/region-groups.js +1719 -0
  303. package/dist/backend/llvm/region-groups.js.map +1 -0
  304. package/dist/backend/llvm/region-groups.test.d.ts +1 -0
  305. package/dist/backend/llvm/region-groups.test.js +197 -0
  306. package/dist/backend/llvm/region-groups.test.js.map +1 -0
  307. package/dist/backend/llvm/region-ir.d.ts +31 -0
  308. package/dist/backend/llvm/region-ir.js +256 -0
  309. package/dist/backend/llvm/region-ir.js.map +1 -0
  310. package/dist/backend/llvm/region-sites.d.ts +20 -0
  311. package/dist/backend/llvm/region-sites.js +327 -0
  312. package/dist/backend/llvm/region-sites.js.map +1 -0
  313. package/dist/backend/llvm/region-sites.test.d.ts +1 -0
  314. package/dist/backend/llvm/region-sites.test.js +216 -0
  315. package/dist/backend/llvm/region-sites.test.js.map +1 -0
  316. package/dist/backend/llvm/repr-report.d.ts +9 -0
  317. package/dist/backend/llvm/repr-report.js +143 -0
  318. package/dist/backend/llvm/repr-report.js.map +1 -0
  319. package/dist/backend/llvm/repr-report.test.d.ts +1 -0
  320. package/dist/backend/llvm/repr-report.test.js +62 -0
  321. package/dist/backend/llvm/repr-report.test.js.map +1 -0
  322. package/dist/backend/llvm/runtime-registries.test.d.ts +1 -0
  323. package/dist/backend/llvm/runtime-registries.test.js +88 -0
  324. package/dist/backend/llvm/runtime-registries.test.js.map +1 -0
  325. package/dist/backend/llvm/serialized-ir-emission.test.js +1 -0
  326. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  327. package/dist/backend/llvm/shape-union-tags.test.d.ts +1 -0
  328. package/dist/backend/llvm/shape-union-tags.test.js +75 -0
  329. package/dist/backend/llvm/shape-union-tags.test.js.map +1 -0
  330. package/dist/backend/llvm/shapes.d.ts +60 -10
  331. package/dist/backend/llvm/shapes.js +233 -51
  332. package/dist/backend/llvm/shapes.js.map +1 -1
  333. package/dist/backend/llvm/shapes.test.js +37 -18
  334. package/dist/backend/llvm/shapes.test.js.map +1 -1
  335. package/dist/backend/llvm/speculative-integers.d.ts +3 -0
  336. package/dist/backend/llvm/speculative-integers.js +20 -8
  337. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  338. package/dist/backend/llvm/split.js +6 -1
  339. package/dist/backend/llvm/split.js.map +1 -1
  340. package/dist/backend/llvm/split.test.js +23 -0
  341. package/dist/backend/llvm/split.test.js.map +1 -1
  342. package/dist/backend/llvm/stack-callbacks.js +4 -2
  343. package/dist/backend/llvm/stack-callbacks.js.map +1 -1
  344. package/dist/backend/llvm/stack-objects.d.ts +12 -3
  345. package/dist/backend/llvm/stack-objects.js +110 -22
  346. package/dist/backend/llvm/stack-objects.js.map +1 -1
  347. package/dist/backend/llvm/stack-objects.test.js +144 -0
  348. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  349. package/dist/backend/llvm/stack-unions.test.js +24 -1
  350. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  351. package/dist/backend/llvm/string-lifetimes.js +2 -1
  352. package/dist/backend/llvm/string-lifetimes.js.map +1 -1
  353. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  354. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  355. package/dist/backend/llvm/string-reads.d.ts +4 -0
  356. package/dist/backend/llvm/string-reads.js +27 -0
  357. package/dist/backend/llvm/string-reads.js.map +1 -1
  358. package/dist/backend/llvm/test-boxed-unions.d.ts +10 -8
  359. package/dist/backend/llvm/test-boxed-unions.js +20 -25
  360. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  361. package/dist/backend/llvm/union-repr.js +9 -8
  362. package/dist/backend/llvm/union-repr.js.map +1 -1
  363. package/dist/backend/llvm/union-retype.test.js +45 -2
  364. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  365. package/dist/backend/llvm/unwind-abi.d.ts +20 -8
  366. package/dist/backend/llvm/unwind-abi.js +177 -70
  367. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  368. package/dist/backend/llvm/unwind-abi.test.js +90 -3
  369. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  370. package/dist/backend/llvm/walk-borrows.d.ts +3 -2
  371. package/dist/backend/llvm/walk-borrows.js +2 -2
  372. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  373. package/dist/backend/llvm/walk-borrows.test.js +18 -0
  374. package/dist/backend/llvm/walk-borrows.test.js.map +1 -1
  375. package/dist/backend/llvm/walkers.d.ts +14 -1
  376. package/dist/backend/llvm/walkers.js +103 -11
  377. package/dist/backend/llvm/walkers.js.map +1 -1
  378. package/dist/backend/llvm/wrapping-sums.d.ts +26 -6
  379. package/dist/backend/llvm/wrapping-sums.js +64 -12
  380. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  381. package/dist/backend/loop-polls.d.ts +4 -2
  382. package/dist/backend/loop-polls.js +11 -2
  383. package/dist/backend/loop-polls.js.map +1 -1
  384. package/dist/backend/mangle.d.ts +0 -5
  385. package/dist/backend/mangle.js +0 -9
  386. package/dist/backend/mangle.js.map +1 -1
  387. package/dist/backend/may-throw.d.ts +10 -9
  388. package/dist/backend/may-throw.js +189 -27
  389. package/dist/backend/may-throw.js.map +1 -1
  390. package/dist/backend/may-throw.test.js +44 -7
  391. package/dist/backend/may-throw.test.js.map +1 -1
  392. package/dist/backend/native/compiler-fingerprint.d.ts +5 -0
  393. package/dist/backend/native/compiler-fingerprint.js +62 -16
  394. package/dist/backend/native/compiler-fingerprint.js.map +1 -1
  395. package/dist/backend/native/contracts.d.ts +31 -8
  396. package/dist/backend/native/executable.js +56 -32
  397. package/dist/backend/native/executable.js.map +1 -1
  398. package/dist/backend/native/library.js +3 -4
  399. package/dist/backend/native/library.js.map +1 -1
  400. package/dist/backend/native/object-merge.d.ts +3 -1
  401. package/dist/backend/native/object-merge.js +24 -11
  402. package/dist/backend/native/object-merge.js.map +1 -1
  403. package/dist/backend/native/program-shards.js +6 -3
  404. package/dist/backend/native/program-shards.js.map +1 -1
  405. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  406. package/dist/backend/native/runtime-inputs.js +3 -0
  407. package/dist/backend/native/runtime-inputs.js.map +1 -1
  408. package/dist/backend/native/vendor.d.ts +1 -1
  409. package/dist/backend/native-codegen-core.d.ts +15 -6
  410. package/dist/backend/native-codegen-core.js +20 -9
  411. package/dist/backend/native-codegen-core.js.map +1 -1
  412. package/dist/backend/native-codegen.js +51 -5
  413. package/dist/backend/native-codegen.js.map +1 -1
  414. package/dist/backend/native-codegen.test.js +82 -8
  415. package/dist/backend/native-codegen.test.js.map +1 -1
  416. package/dist/backend/native-link-info-core.d.ts +30 -0
  417. package/dist/backend/native-link-info-core.js.map +1 -1
  418. package/dist/backend/native-profile.d.ts +68 -4
  419. package/dist/backend/native-profile.js +86 -14
  420. package/dist/backend/native-profile.js.map +1 -1
  421. package/dist/backend/native-profile.test.js +127 -4
  422. package/dist/backend/native-profile.test.js.map +1 -1
  423. package/dist/backend/native-toolchain.d.ts +1 -1
  424. package/dist/backend/native-toolchain.js +1 -1
  425. package/dist/backend/native-toolchain.js.map +1 -1
  426. package/dist/backend/native-toolchain.test.js +58 -4
  427. package/dist/backend/native-toolchain.test.js.map +1 -1
  428. package/dist/backend/native-tools.d.ts +17 -3
  429. package/dist/backend/native-tools.js +12 -4
  430. package/dist/backend/native-tools.js.map +1 -1
  431. package/dist/backend/native-tools.test.d.ts +1 -0
  432. package/dist/backend/native-tools.test.js +76 -0
  433. package/dist/backend/native-tools.test.js.map +1 -0
  434. package/dist/backend/object-localize.js +69 -9
  435. package/dist/backend/object-localize.js.map +1 -1
  436. package/dist/backend/object-localize.test.js +99 -10
  437. package/dist/backend/object-localize.test.js.map +1 -1
  438. package/dist/backend/publication.d.ts +2 -0
  439. package/dist/backend/publication.js +4 -0
  440. package/dist/backend/publication.js.map +1 -1
  441. package/dist/backend/runtime-abi.d.ts +2 -2
  442. package/dist/backend/runtime-abi.js +2 -2
  443. package/dist/backend/runtime-pack-core.d.ts +19 -0
  444. package/dist/backend/runtime-pack-core.js +23 -3
  445. package/dist/backend/runtime-pack-core.js.map +1 -1
  446. package/dist/backend/runtime-pack-targets.test.js +1 -1
  447. package/dist/backend/runtime-pack.test.js +48 -2
  448. package/dist/backend/runtime-pack.test.js.map +1 -1
  449. package/dist/backend/target-cpu.d.ts +2 -0
  450. package/dist/backend/target-cpu.js +4 -0
  451. package/dist/backend/target-cpu.js.map +1 -1
  452. package/dist/backend/target-diagnostics.js +1 -19
  453. package/dist/backend/target-diagnostics.js.map +1 -1
  454. package/dist/backend/target-diagnostics.test.js +1 -1
  455. package/dist/backend/target-diagnostics.test.js.map +1 -1
  456. package/dist/backend/targets.d.ts +28 -0
  457. package/dist/backend/targets.js +70 -0
  458. package/dist/backend/targets.js.map +1 -1
  459. package/dist/backend/targets.test.js +75 -1
  460. package/dist/backend/targets.test.js.map +1 -1
  461. package/dist/backend/vendor-archives.d.ts +1 -1
  462. package/dist/backend/vendor-archives.js +25 -12
  463. package/dist/backend/vendor-archives.js.map +1 -1
  464. package/dist/backend/vendor-inputs.d.ts +15 -2
  465. package/dist/backend/vendor-inputs.js +59 -3
  466. package/dist/backend/vendor-inputs.js.map +1 -1
  467. package/dist/backend/vendor-inputs.test.d.ts +1 -0
  468. package/dist/backend/vendor-inputs.test.js +74 -0
  469. package/dist/backend/vendor-inputs.test.js.map +1 -0
  470. package/dist/cli/command.js +95 -5
  471. package/dist/cli/command.js.map +1 -1
  472. package/dist/cli/host.d.ts +3 -0
  473. package/dist/cli/output-options.d.ts +3 -0
  474. package/dist/cli/output-options.js +8 -2
  475. package/dist/cli/output-options.js.map +1 -1
  476. package/dist/cli/usage.d.ts +28 -1
  477. package/dist/cli/usage.js +56 -6
  478. package/dist/cli/usage.js.map +1 -1
  479. package/dist/compat/fetch-profile.d.ts +3 -0
  480. package/dist/compat/fetch-profile.js +23 -3
  481. package/dist/compat/fetch-profile.js.map +1 -1
  482. package/dist/compile-types.d.ts +45 -0
  483. package/dist/contracts/check.js +70 -2
  484. package/dist/contracts/check.js.map +1 -1
  485. package/dist/contracts/int32-elements.d.ts +2 -1
  486. package/dist/contracts/int32-elements.js.map +1 -1
  487. package/dist/coverage/report.d.ts +5 -1
  488. package/dist/coverage/report.js +83 -2
  489. package/dist/coverage/report.js.map +1 -1
  490. package/dist/coverage/verdict-cache.d.ts +2 -0
  491. package/dist/coverage/verdict-cache.js +5 -10
  492. package/dist/coverage/verdict-cache.js.map +1 -1
  493. package/dist/diagnostics/codes.d.ts +145 -0
  494. package/dist/diagnostics/codes.js +159 -0
  495. package/dist/diagnostics/codes.js.map +1 -0
  496. package/dist/diagnostics/codes.test.d.ts +1 -0
  497. package/dist/diagnostics/codes.test.js +78 -0
  498. package/dist/diagnostics/codes.test.js.map +1 -0
  499. package/dist/diagnostics/diagnostic.d.ts +101 -2
  500. package/dist/diagnostics/diagnostic.js +155 -0
  501. package/dist/diagnostics/diagnostic.js.map +1 -1
  502. package/dist/diagnostics/dynamic-slots.d.ts +23 -0
  503. package/dist/diagnostics/dynamic-slots.js +29 -0
  504. package/dist/diagnostics/dynamic-slots.js.map +1 -0
  505. package/dist/diagnostics/dynamic-tier.d.ts +6 -0
  506. package/dist/diagnostics/dynamic-tier.js +8 -1
  507. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  508. package/dist/diagnostics/envelope.d.ts +43 -1
  509. package/dist/diagnostics/envelope.js +19 -1
  510. package/dist/diagnostics/envelope.js.map +1 -1
  511. package/dist/diagnostics/envelope.test.js.map +1 -1
  512. package/dist/diagnostics/render.d.ts +3 -1
  513. package/dist/diagnostics/render.js +27 -6
  514. package/dist/diagnostics/render.js.map +1 -1
  515. package/dist/executable/executable-cache.d.ts +41 -0
  516. package/dist/executable/executable-cache.js +39 -1
  517. package/dist/executable/executable-cache.js.map +1 -1
  518. package/dist/executable/executable-cache.test.js +4 -1
  519. package/dist/executable/executable-cache.test.js.map +1 -1
  520. package/dist/executable/prepare.d.ts +2 -1
  521. package/dist/executable/prepare.js +421 -10
  522. package/dist/executable/prepare.js.map +1 -1
  523. package/dist/frontend/analysis.js +1 -0
  524. package/dist/frontend/analysis.js.map +1 -1
  525. package/dist/frontend/canon-map.d.ts +17 -0
  526. package/dist/frontend/canon-map.js +177 -0
  527. package/dist/frontend/canon-map.js.map +1 -0
  528. package/dist/frontend/canon.d.ts +122 -0
  529. package/dist/frontend/canon.js +462 -0
  530. package/dist/frontend/canon.js.map +1 -0
  531. package/dist/frontend/contract-types.d.ts +9 -1
  532. package/dist/frontend/contract-types.js +46 -4
  533. package/dist/frontend/contract-types.js.map +1 -1
  534. package/dist/frontend/decl-projection.d.ts +3 -0
  535. package/dist/frontend/decl-projection.js +121 -3
  536. package/dist/frontend/decl-projection.js.map +1 -1
  537. package/dist/frontend/dts-paths.d.ts +17 -4
  538. package/dist/frontend/dts-paths.js +149 -5
  539. package/dist/frontend/dts-paths.js.map +1 -1
  540. package/dist/frontend/fork-target.js +4 -4
  541. package/dist/frontend/fork-target.js.map +1 -1
  542. package/dist/frontend/fork-target.test.js +3 -3
  543. package/dist/frontend/fork-target.test.js.map +1 -1
  544. package/dist/frontend/heritage-elements.d.ts +15 -0
  545. package/dist/frontend/heritage-elements.js +18 -0
  546. package/dist/frontend/heritage-elements.js.map +1 -0
  547. package/dist/frontend/heritage-elements.test.d.ts +1 -0
  548. package/dist/frontend/heritage-elements.test.js +68 -0
  549. package/dist/frontend/heritage-elements.test.js.map +1 -0
  550. package/dist/frontend/input-tracker.d.ts +20 -0
  551. package/dist/frontend/input-tracker.js +74 -4
  552. package/dist/frontend/input-tracker.js.map +1 -1
  553. package/dist/frontend/input-tracker.test.js +66 -0
  554. package/dist/frontend/input-tracker.test.js.map +1 -1
  555. package/dist/frontend/lowering/any-collection-residue.d.ts +9 -0
  556. package/dist/frontend/lowering/any-collection-residue.js +42 -0
  557. package/dist/frontend/lowering/any-collection-residue.js.map +1 -0
  558. package/dist/frontend/lowering/array-values.d.ts +44 -2
  559. package/dist/frontend/lowering/array-values.js +193 -3
  560. package/dist/frontend/lowering/array-values.js.map +1 -1
  561. package/dist/frontend/lowering/builtin-namespaces.d.ts +6 -2
  562. package/dist/frontend/lowering/builtin-namespaces.js +28 -6
  563. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  564. package/dist/frontend/lowering/builtins/array-classes.d.ts +69 -0
  565. package/dist/frontend/lowering/builtins/array-classes.js +729 -0
  566. package/dist/frontend/lowering/builtins/array-classes.js.map +1 -0
  567. package/dist/frontend/lowering/builtins/callable-aliases.js +4 -0
  568. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  569. package/dist/frontend/lowering/builtins/child-process-methods.js +34 -0
  570. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  571. package/dist/frontend/lowering/builtins/disposable-stack.js +1 -3
  572. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  573. package/dist/frontend/lowering/builtins/errors.d.ts +13 -9
  574. package/dist/frontend/lowering/builtins/errors.js +136 -56
  575. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  576. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  577. package/dist/frontend/lowering/builtins/filesystem-calls.js +85 -4
  578. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  579. package/dist/frontend/lowering/builtins/filesystem.d.ts +11 -6
  580. package/dist/frontend/lowering/builtins/filesystem.js +270 -24
  581. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  582. package/dist/frontend/lowering/builtins/json.js +7 -1
  583. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  584. package/dist/frontend/lowering/builtins/mime.d.ts +25 -0
  585. package/dist/frontend/lowering/builtins/mime.js +167 -0
  586. package/dist/frontend/lowering/builtins/mime.js.map +1 -0
  587. package/dist/frontend/lowering/builtins/module-bindings.d.ts +3 -0
  588. package/dist/frontend/lowering/builtins/module-bindings.js +6 -0
  589. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  590. package/dist/frontend/lowering/builtins/module-calls.js +79 -12
  591. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  592. package/dist/frontend/lowering/builtins/module-resolution.d.ts +7 -4
  593. package/dist/frontend/lowering/builtins/module-resolution.js +115 -13
  594. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  595. package/dist/frontend/lowering/builtins/navigator.d.ts +3 -1
  596. package/dist/frontend/lowering/builtins/navigator.js +22 -8
  597. package/dist/frontend/lowering/builtins/navigator.js.map +1 -1
  598. package/dist/frontend/lowering/builtins/process.js +49 -9
  599. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  600. package/dist/frontend/lowering/builtins/promises.js +18 -3
  601. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  602. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +6 -2
  603. package/dist/frontend/lowering/builtins/promisify-callback.js +19 -6
  604. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  605. package/dist/frontend/lowering/builtins/properties.js +23 -5
  606. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  607. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +42 -0
  608. package/dist/frontend/lowering/builtins/web-streams-dyn.js +321 -0
  609. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -0
  610. package/dist/frontend/lowering/builtins/x509.js +35 -5
  611. package/dist/frontend/lowering/builtins/x509.js.map +1 -1
  612. package/dist/frontend/lowering/call-arguments.d.ts +14 -1
  613. package/dist/frontend/lowering/call-arguments.js +84 -70
  614. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  615. package/dist/frontend/lowering/call-signatures.js +108 -24
  616. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  617. package/dist/frontend/lowering/class-attributes.js +6 -5
  618. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  619. package/dist/frontend/lowering/class-dynamic-dispatch.js +40 -19
  620. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  621. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  622. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  623. package/dist/frontend/lowering/class-protocol-dispatch.js +4 -0
  624. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  625. package/dist/frontend/lowering/class-protocols.d.ts +61 -1
  626. package/dist/frontend/lowering/class-protocols.js +297 -21
  627. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  628. package/dist/frontend/lowering/class-to-primitive.d.ts +3 -2
  629. package/dist/frontend/lowering/class-to-primitive.js +15 -5
  630. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  631. package/dist/frontend/lowering/coercions/asserted.d.ts +16 -0
  632. package/dist/frontend/lowering/coercions/asserted.js +79 -0
  633. package/dist/frontend/lowering/coercions/asserted.js.map +1 -0
  634. package/dist/frontend/lowering/coercions/function-adapters.d.ts +13 -0
  635. package/dist/frontend/lowering/coercions/function-adapters.js +70 -3
  636. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  637. package/dist/frontend/lowering/coercions/state.d.ts +23 -0
  638. package/dist/frontend/lowering/coercions/state.js +9 -0
  639. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  640. package/dist/frontend/lowering/coercions/structural-plans.js +67 -1
  641. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  642. package/dist/frontend/lowering/coercions/structural.d.ts +10 -0
  643. package/dist/frontend/lowering/coercions/structural.js +134 -4
  644. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  645. package/dist/frontend/lowering/coercions/unions.d.ts +11 -0
  646. package/dist/frontend/lowering/coercions/unions.js +83 -4
  647. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  648. package/dist/frontend/lowering/completion-callbacks.js +3 -2
  649. package/dist/frontend/lowering/completion-callbacks.js.map +1 -1
  650. package/dist/frontend/lowering/containers/array-callbacks.d.ts +10 -0
  651. package/dist/frontend/lowering/containers/array-callbacks.js +224 -81
  652. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  653. package/dist/frontend/lowering/containers/array-concat.d.ts +5 -2
  654. package/dist/frontend/lowering/containers/array-concat.js +76 -7
  655. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  656. package/dist/frontend/lowering/containers/array-construction.d.ts +9 -4
  657. package/dist/frontend/lowering/containers/array-construction.js +112 -100
  658. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  659. package/dist/frontend/lowering/containers/array-methods.js +193 -45
  660. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  661. package/dist/frontend/lowering/containers/array-pipelines.d.ts +3 -0
  662. package/dist/frontend/lowering/containers/array-pipelines.js +81 -13
  663. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  664. package/dist/frontend/lowering/containers/callback-arguments.d.ts +1 -0
  665. package/dist/frontend/lowering/containers/callback-arguments.js +28 -2
  666. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  667. package/dist/frontend/lowering/containers/collection-methods.js +13 -3
  668. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  669. package/dist/frontend/lowering/containers/filter-predicates.js +34 -3
  670. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  671. package/dist/frontend/lowering/containers/indexed-objects.d.ts +34 -1
  672. package/dist/frontend/lowering/containers/indexed-objects.js +131 -72
  673. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  674. package/dist/frontend/lowering/cycle-initialization.js +43 -6
  675. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  676. package/dist/frontend/lowering/decl-origin.d.ts +49 -0
  677. package/dist/frontend/lowering/decl-origin.js +402 -0
  678. package/dist/frontend/lowering/decl-origin.js.map +1 -0
  679. package/dist/frontend/lowering/deferred-module-initializers.d.ts +2 -0
  680. package/dist/frontend/lowering/deferred-module-initializers.js +7 -0
  681. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  682. package/dist/frontend/lowering/divergences.js +5 -0
  683. package/dist/frontend/lowering/divergences.js.map +1 -1
  684. package/dist/frontend/lowering/dynamic-tier.d.ts +8 -2
  685. package/dist/frontend/lowering/dynamic-tier.js +111 -3
  686. package/dist/frontend/lowering/dynamic-tier.js.map +1 -1
  687. package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -1
  688. package/dist/frontend/lowering/expressions/array-literals.js +43 -5
  689. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  690. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +48 -0
  691. package/dist/frontend/lowering/expressions/asserted-receiver.js +233 -0
  692. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -0
  693. package/dist/frontend/lowering/expressions/binary.js +136 -1
  694. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  695. package/dist/frontend/lowering/expressions/element-access.d.ts +7 -0
  696. package/dist/frontend/lowering/expressions/element-access.js +363 -12
  697. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  698. package/dist/frontend/lowering/expressions/identifiers.d.ts +3 -0
  699. package/dist/frontend/lowering/expressions/identifiers.js +78 -62
  700. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  701. package/dist/frontend/lowering/expressions/message-listeners.d.ts +3 -0
  702. package/dist/frontend/lowering/expressions/message-listeners.js +19 -0
  703. package/dist/frontend/lowering/expressions/message-listeners.js.map +1 -0
  704. package/dist/frontend/lowering/expressions/narrowing.js +224 -6
  705. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  706. package/dist/frontend/lowering/expressions/nullish-assignment.js +5 -2
  707. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  708. package/dist/frontend/lowering/expressions/object-literals.d.ts +1 -1
  709. package/dist/frontend/lowering/expressions/object-literals.js +282 -24
  710. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  711. package/dist/frontend/lowering/expressions/property-access.d.ts +15 -3
  712. package/dist/frontend/lowering/expressions/property-access.js +397 -74
  713. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  714. package/dist/frontend/lowering/expressions/relational.js +202 -70
  715. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  716. package/dist/frontend/lowering/expressions/typeof.js +9 -1
  717. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  718. package/dist/frontend/lowering/expressions/union-fields.d.ts +28 -8
  719. package/dist/frontend/lowering/expressions/union-fields.js +168 -14
  720. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  721. package/dist/frontend/lowering/frozen-records.d.ts +8 -0
  722. package/dist/frontend/lowering/frozen-records.js +56 -9
  723. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  724. package/dist/frontend/lowering/function-context.d.ts +3 -0
  725. package/dist/frontend/lowering/function-context.js +4 -1
  726. package/dist/frontend/lowering/function-context.js.map +1 -1
  727. package/dist/frontend/lowering/function-returns.d.ts +4 -0
  728. package/dist/frontend/lowering/function-returns.js +231 -2
  729. package/dist/frontend/lowering/function-returns.js.map +1 -1
  730. package/dist/frontend/lowering/generator-delegation.js +3 -2
  731. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  732. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +26 -0
  733. package/dist/frontend/lowering/generator-dynamic-dispatch.js +294 -2
  734. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  735. package/dist/frontend/lowering/generic-functions.d.ts +10 -0
  736. package/dist/frontend/lowering/generic-functions.js +67 -7
  737. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  738. package/dist/frontend/lowering/global-values.d.ts +37 -0
  739. package/dist/frontend/lowering/global-values.js +395 -0
  740. package/dist/frontend/lowering/global-values.js.map +1 -0
  741. package/dist/frontend/lowering/handle-properties.js +3 -2
  742. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  743. package/dist/frontend/lowering/handle-properties.test.d.ts +1 -0
  744. package/dist/frontend/lowering/handle-properties.test.js +25 -0
  745. package/dist/frontend/lowering/handle-properties.test.js.map +1 -0
  746. package/dist/frontend/lowering/import-meta.d.ts +3 -0
  747. package/dist/frontend/lowering/import-meta.js +8 -3
  748. package/dist/frontend/lowering/import-meta.js.map +1 -1
  749. package/dist/frontend/lowering/iterator-adapters.js +3 -3
  750. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  751. package/dist/frontend/lowering/key-order-witness.d.ts +2 -0
  752. package/dist/frontend/lowering/key-order-witness.js +10 -0
  753. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  754. package/dist/frontend/lowering/lower-array-sort.d.ts +5 -1
  755. package/dist/frontend/lowering/lower-array-sort.js +16 -2
  756. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  757. package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -0
  758. package/dist/frontend/lowering/lower-builtin-values.js +65 -16
  759. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  760. package/dist/frontend/lowering/lower-calls.js +222 -24
  761. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  762. package/dist/frontend/lowering/lower-classes.d.ts +6 -0
  763. package/dist/frontend/lowering/lower-classes.js +154 -20
  764. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  765. package/dist/frontend/lowering/lower-console.js +25 -2
  766. package/dist/frontend/lowering/lower-console.js.map +1 -1
  767. package/dist/frontend/lowering/lower-exprs.d.ts +29 -0
  768. package/dist/frontend/lowering/lower-exprs.js +544 -24
  769. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  770. package/dist/frontend/lowering/lower-functions.js +93 -18
  771. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  772. package/dist/frontend/lowering/lower-global-value.d.ts +4 -1
  773. package/dist/frontend/lowering/lower-global-value.js +10 -3
  774. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  775. package/dist/frontend/lowering/lower-inspect.d.ts +44 -4
  776. package/dist/frontend/lowering/lower-inspect.js +723 -26
  777. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  778. package/dist/frontend/lowering/lower-modules.d.ts +3 -1
  779. package/dist/frontend/lowering/lower-modules.js +189 -24
  780. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  781. package/dist/frontend/lowering/lower-namespaces.d.ts +7 -0
  782. package/dist/frontend/lowering/lower-namespaces.js +23 -0
  783. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  784. package/dist/frontend/lowering/lower-node-island.d.ts +74 -0
  785. package/dist/frontend/lowering/lower-node-island.js +1931 -0
  786. package/dist/frontend/lowering/lower-node-island.js.map +1 -0
  787. package/dist/frontend/lowering/lower-server.js +44 -0
  788. package/dist/frontend/lowering/lower-server.js.map +1 -1
  789. package/dist/frontend/lowering/lower-shared-modules.d.ts +27 -0
  790. package/dist/frontend/lowering/lower-shared-modules.js +611 -0
  791. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -0
  792. package/dist/frontend/lowering/lower-stdlib.js +85 -9
  793. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  794. package/dist/frontend/lowering/lower-stmts.d.ts +2 -6
  795. package/dist/frontend/lowering/lower-stmts.js +781 -143
  796. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  797. package/dist/frontend/lowering/lower-stream.js +548 -36
  798. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  799. package/dist/frontend/lowering/lower-timers.js +9 -0
  800. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  801. package/dist/frontend/lowering/lowerer.d.ts +514 -10
  802. package/dist/frontend/lowering/lowerer.js +2667 -163
  803. package/dist/frontend/lowering/lowerer.js.map +1 -1
  804. package/dist/frontend/lowering/lowerer.test.js +44 -1
  805. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  806. package/dist/frontend/lowering/maybe-promise.d.ts +6 -0
  807. package/dist/frontend/lowering/maybe-promise.js +13 -0
  808. package/dist/frontend/lowering/maybe-promise.js.map +1 -1
  809. package/dist/frontend/lowering/module-namespace-elements.d.ts +12 -0
  810. package/dist/frontend/lowering/module-namespace-elements.js +114 -18
  811. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  812. package/dist/frontend/lowering/nan-coded-reads.d.ts +11 -0
  813. package/dist/frontend/lowering/nan-coded-reads.js +45 -2
  814. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  815. package/dist/frontend/lowering/narrowing-stability.d.ts +4 -0
  816. package/dist/frontend/lowering/narrowing-stability.js +14 -6
  817. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  818. package/dist/frontend/lowering/receiver-returns.d.ts +3 -0
  819. package/dist/frontend/lowering/receiver-returns.js +134 -0
  820. package/dist/frontend/lowering/receiver-returns.js.map +1 -0
  821. package/dist/frontend/lowering/record-inherited.d.ts +26 -0
  822. package/dist/frontend/lowering/record-inherited.js +807 -0
  823. package/dist/frontend/lowering/record-inherited.js.map +1 -0
  824. package/dist/frontend/lowering/runtime-optional-elements.d.ts +31 -1
  825. package/dist/frontend/lowering/runtime-optional-elements.js +105 -13
  826. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  827. package/dist/frontend/lowering/runtime-optional-guards.d.ts +3 -0
  828. package/dist/frontend/lowering/runtime-optional-guards.js +35 -7
  829. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  830. package/dist/frontend/lowering/runtime-optional-guards.test.js +59 -1
  831. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  832. package/dist/frontend/lowering/stable-names.d.ts +8 -0
  833. package/dist/frontend/lowering/stable-names.js +22 -0
  834. package/dist/frontend/lowering/stable-names.js.map +1 -1
  835. package/dist/frontend/lowering/stable-names.test.d.ts +1 -0
  836. package/dist/frontend/lowering/stable-names.test.js +16 -0
  837. package/dist/frontend/lowering/stable-names.test.js.map +1 -0
  838. package/dist/frontend/lowering/static-typeof.d.ts +5 -4
  839. package/dist/frontend/lowering/static-typeof.js +10 -4
  840. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  841. package/dist/frontend/lowering/structural-instances.d.ts +22 -0
  842. package/dist/frontend/lowering/structural-instances.js +282 -0
  843. package/dist/frontend/lowering/structural-instances.js.map +1 -0
  844. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  845. package/dist/frontend/lowering/surfaces.js +108 -12
  846. package/dist/frontend/lowering/surfaces.js.map +1 -1
  847. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  848. package/dist/frontend/lowering/symbol-fields.js +32 -0
  849. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  850. package/dist/frontend/lowering/type-failure.d.ts +17 -0
  851. package/dist/frontend/lowering/type-failure.js +163 -0
  852. package/dist/frontend/lowering/type-failure.js.map +1 -0
  853. package/dist/frontend/lowering/typed-arguments.d.ts +5 -6
  854. package/dist/frontend/lowering/typed-arguments.js +10 -2
  855. package/dist/frontend/lowering/typed-arguments.js.map +1 -1
  856. package/dist/frontend/lowering/union-narrow.d.ts +9 -1
  857. package/dist/frontend/lowering/union-narrow.js +31 -2
  858. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  859. package/dist/frontend/lowering/union-retag.test.js +42 -2
  860. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  861. package/dist/frontend/lowering/unit-journal.d.ts +194 -0
  862. package/dist/frontend/lowering/unit-journal.js +556 -0
  863. package/dist/frontend/lowering/unit-journal.js.map +1 -0
  864. package/dist/frontend/lowering/unit-journal.test.d.ts +1 -0
  865. package/dist/frontend/lowering/unit-journal.test.js +335 -0
  866. package/dist/frontend/lowering/unit-journal.test.js.map +1 -0
  867. package/dist/frontend/lowering/width-lift.d.ts +19 -0
  868. package/dist/frontend/node-api-import.d.ts +21 -0
  869. package/dist/frontend/node-api-import.js +88 -0
  870. package/dist/frontend/node-api-import.js.map +1 -0
  871. package/dist/frontend/npm-static-type-exports-host.js +4 -3
  872. package/dist/frontend/npm-static-type-exports-host.js.map +1 -1
  873. package/dist/frontend/npm-static.js +9 -2
  874. package/dist/frontend/npm-static.js.map +1 -1
  875. package/dist/frontend/package-shims.d.ts +6 -2
  876. package/dist/frontend/package-shims.js +13 -2
  877. package/dist/frontend/package-shims.js.map +1 -1
  878. package/dist/frontend/pipeline.d.ts +11 -4
  879. package/dist/frontend/pipeline.js +249 -26
  880. package/dist/frontend/pipeline.js.map +1 -1
  881. package/dist/frontend/process-fork.d.ts +3 -0
  882. package/dist/frontend/process-fork.js.map +1 -1
  883. package/dist/frontend/program-analysis.d.ts +6 -0
  884. package/dist/frontend/program-analysis.js +4 -0
  885. package/dist/frontend/program-analysis.js.map +1 -1
  886. package/dist/frontend/program.d.ts +12 -1
  887. package/dist/frontend/program.js +256 -36
  888. package/dist/frontend/program.js.map +1 -1
  889. package/dist/frontend/resolve.js +8 -2
  890. package/dist/frontend/resolve.js.map +1 -1
  891. package/dist/frontend/shape-inference/analyze.d.ts +23 -1
  892. package/dist/frontend/shape-inference/analyze.js +982 -97
  893. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  894. package/dist/frontend/shape-inference/constant-graphs.d.ts +2 -0
  895. package/dist/frontend/shape-inference/constant-graphs.js +39 -4
  896. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -1
  897. package/dist/frontend/shape-inference/domain.d.ts +2 -0
  898. package/dist/frontend/shape-inference/domain.js.map +1 -1
  899. package/dist/frontend/shape-inference/fallback.d.ts +17 -0
  900. package/dist/frontend/shape-inference/fallback.js +303 -0
  901. package/dist/frontend/shape-inference/fallback.js.map +1 -0
  902. package/dist/frontend/shape-inference/index.d.ts +75 -1
  903. package/dist/frontend/shape-inference/index.js +531 -2
  904. package/dist/frontend/shape-inference/index.js.map +1 -1
  905. package/dist/frontend/shape-inference/inferred-checks.d.ts +2 -0
  906. package/dist/frontend/shape-inference/inferred-checks.js +90 -0
  907. package/dist/frontend/shape-inference/inferred-checks.js.map +1 -0
  908. package/dist/frontend/shape-inference/memo.d.ts +30 -0
  909. package/dist/frontend/shape-inference/memo.js +99 -0
  910. package/dist/frontend/shape-inference/memo.js.map +1 -0
  911. package/dist/frontend/shape-inference/overlay.d.ts +81 -0
  912. package/dist/frontend/shape-inference/overlay.js +1160 -0
  913. package/dist/frontend/shape-inference/overlay.js.map +1 -0
  914. package/dist/frontend/shape-inference/registry.test.d.ts +1 -0
  915. package/dist/frontend/shape-inference/registry.test.js +34 -0
  916. package/dist/frontend/shape-inference/registry.test.js.map +1 -0
  917. package/dist/frontend/shape-inference/report.js +42 -8
  918. package/dist/frontend/shape-inference/report.js.map +1 -1
  919. package/dist/frontend/shape-inference/static-objects.d.ts +29 -0
  920. package/dist/frontend/shape-inference/static-objects.js +1951 -0
  921. package/dist/frontend/shape-inference/static-objects.js.map +1 -0
  922. package/dist/frontend/tier-analysis.d.ts +53 -1
  923. package/dist/frontend/tier-analysis.js +133 -0
  924. package/dist/frontend/tier-analysis.js.map +1 -1
  925. package/dist/frontend/ts7/api.js +4 -2
  926. package/dist/frontend/ts7/api.js.map +1 -1
  927. package/dist/frontend/ts7/ast-node.d.ts +9 -0
  928. package/dist/frontend/ts7/ast-node.js +42 -10
  929. package/dist/frontend/ts7/ast-node.js.map +1 -1
  930. package/dist/frontend/ts7/ast-node.test.js +23 -0
  931. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  932. package/dist/frontend/ts7/ast-wire-protocols.test.d.ts +1 -0
  933. package/dist/frontend/ts7/ast-wire-protocols.test.js +93 -0
  934. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -0
  935. package/dist/frontend/ts7/ast-wire.d.ts +18 -0
  936. package/dist/frontend/ts7/ast-wire.js +66 -4
  937. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  938. package/dist/frontend/ts7/checker-server.d.ts +12 -11
  939. package/dist/frontend/ts7/checker-server.js +28 -12
  940. package/dist/frontend/ts7/checker-server.js.map +1 -1
  941. package/dist/frontend/ts7/checker-server.test.js +8 -3
  942. package/dist/frontend/ts7/checker-server.test.js.map +1 -1
  943. package/dist/frontend/ts7/checker.d.ts +4 -0
  944. package/dist/frontend/ts7/checker.js +9 -0
  945. package/dist/frontend/ts7/checker.js.map +1 -1
  946. package/dist/frontend/ts7/checker.test.js +216 -205
  947. package/dist/frontend/ts7/checker.test.js.map +1 -1
  948. package/dist/frontend/ts7/lib-diagnostics.d.ts +71 -4
  949. package/dist/frontend/ts7/lib-diagnostics.js +337 -20
  950. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  951. package/dist/frontend/ts7/lib-diagnostics.test.js +268 -5
  952. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  953. package/dist/frontend/ts7/native-api.d.ts +4 -0
  954. package/dist/frontend/ts7/native-api.js +36 -1
  955. package/dist/frontend/ts7/native-api.js.map +1 -1
  956. package/dist/frontend/ts7/program-host.d.ts +19 -2
  957. package/dist/frontend/ts7/program-host.js +69 -9
  958. package/dist/frontend/ts7/program-host.js.map +1 -1
  959. package/dist/frontend/ts7/program-host.test.js +42 -1
  960. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  961. package/dist/frontend/ts7/rpc-filesystem.d.ts +4 -2
  962. package/dist/frontend/ts7/rpc-filesystem.js +23 -2
  963. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
  964. package/dist/frontend/ts7/rpc-filesystem.test.js +28 -2
  965. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
  966. package/dist/frontend/ts7/semantic-checker.js +73 -5
  967. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  968. package/dist/frontend/ts7/semantic-checker.test.js +106 -74
  969. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  970. package/dist/frontend/ts7/semantic-json.d.ts +2 -6
  971. package/dist/frontend/ts7/semantic-model-71.test.d.ts +1 -0
  972. package/dist/frontend/ts7/semantic-model-71.test.js +131 -0
  973. package/dist/frontend/ts7/semantic-model-71.test.js.map +1 -0
  974. package/dist/frontend/ts7/semantic-model.d.ts +121 -3
  975. package/dist/frontend/ts7/semantic-model.js +245 -8
  976. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  977. package/dist/frontend/ts7/session.d.ts +19 -1
  978. package/dist/frontend/ts7/session.js +111 -11
  979. package/dist/frontend/ts7/session.js.map +1 -1
  980. package/dist/frontend/ts7/session.test.js +259 -239
  981. package/dist/frontend/ts7/session.test.js.map +1 -1
  982. package/dist/frontend/ts7/test-servers.d.ts +12 -0
  983. package/dist/frontend/ts7/test-servers.js +16 -0
  984. package/dist/frontend/ts7/test-servers.js.map +1 -0
  985. package/dist/frontend/tsc-codes.js +6 -3
  986. package/dist/frontend/tsc-codes.js.map +1 -1
  987. package/dist/frontend/type-mapper.d.ts +61 -1
  988. package/dist/frontend/type-mapper.js +577 -28
  989. package/dist/frontend/type-mapper.js.map +1 -1
  990. package/dist/frontend/type-patches/command.d.ts +19 -0
  991. package/dist/frontend/type-patches/command.js +352 -0
  992. package/dist/frontend/type-patches/command.js.map +1 -0
  993. package/dist/frontend/type-patches/layer.d.ts +45 -0
  994. package/dist/frontend/type-patches/layer.js +409 -0
  995. package/dist/frontend/type-patches/layer.js.map +1 -0
  996. package/dist/frontend/type-patches/locate.d.ts +41 -0
  997. package/dist/frontend/type-patches/locate.js +914 -0
  998. package/dist/frontend/type-patches/locate.js.map +1 -0
  999. package/dist/frontend/type-patches/locate.test.d.ts +1 -0
  1000. package/dist/frontend/type-patches/locate.test.js +179 -0
  1001. package/dist/frontend/type-patches/locate.test.js.map +1 -0
  1002. package/dist/frontend/type-patches/selector.d.ts +43 -0
  1003. package/dist/frontend/type-patches/selector.js +126 -0
  1004. package/dist/frontend/type-patches/selector.js.map +1 -0
  1005. package/dist/frontend/type-patches/selector.test.d.ts +1 -0
  1006. package/dist/frontend/type-patches/selector.test.js +56 -0
  1007. package/dist/frontend/type-patches/selector.test.js.map +1 -0
  1008. package/dist/frontend/type-patches/semver.d.ts +19 -0
  1009. package/dist/frontend/type-patches/semver.js +221 -0
  1010. package/dist/frontend/type-patches/semver.js.map +1 -0
  1011. package/dist/frontend/type-patches/semver.test.d.ts +1 -0
  1012. package/dist/frontend/type-patches/semver.test.js +47 -0
  1013. package/dist/frontend/type-patches/semver.test.js.map +1 -0
  1014. package/dist/frontend/worker-target.test.js +2 -2
  1015. package/dist/frontend/worker-target.test.js.map +1 -1
  1016. package/dist/index.d.ts +4 -1
  1017. package/dist/index.js +292 -27
  1018. package/dist/index.js.map +1 -1
  1019. package/dist/ir/builtin-effects.js +51 -5
  1020. package/dist/ir/builtin-effects.js.map +1 -1
  1021. package/dist/ir/builtin-signatures.d.ts +4 -3
  1022. package/dist/ir/builtin-signatures.js +277 -12
  1023. package/dist/ir/builtin-signatures.js.map +1 -1
  1024. package/dist/ir/callback-specialization.js +108 -67
  1025. package/dist/ir/callback-specialization.js.map +1 -1
  1026. package/dist/ir/capture-values.d.ts +7 -1
  1027. package/dist/ir/capture-values.js +28 -5
  1028. package/dist/ir/capture-values.js.map +1 -1
  1029. package/dist/ir/char-unit-locals.js +38 -42
  1030. package/dist/ir/char-unit-locals.js.map +1 -1
  1031. package/dist/ir/expression-inlining.js +12 -6
  1032. package/dist/ir/expression-inlining.js.map +1 -1
  1033. package/dist/ir/fields.generated.d.ts +751 -0
  1034. package/dist/ir/fields.generated.js +2071 -0
  1035. package/dist/ir/fields.generated.js.map +1 -0
  1036. package/dist/ir/fields.test.d.ts +1 -0
  1037. package/dist/ir/fields.test.js +113 -0
  1038. package/dist/ir/fields.test.js.map +1 -0
  1039. package/dist/ir/function-references.js +4 -0
  1040. package/dist/ir/function-references.js.map +1 -1
  1041. package/dist/ir/function-references.test.js +25 -0
  1042. package/dist/ir/function-references.test.js.map +1 -1
  1043. package/dist/ir/inline-array-sources.d.ts +15 -0
  1044. package/dist/ir/inline-array-sources.js +1825 -0
  1045. package/dist/ir/inline-array-sources.js.map +1 -0
  1046. package/dist/ir/inline-arrays.d.ts +41 -0
  1047. package/dist/ir/inline-arrays.js +533 -0
  1048. package/dist/ir/inline-arrays.js.map +1 -0
  1049. package/dist/ir/inline-arrays.test.d.ts +1 -0
  1050. package/dist/ir/inline-arrays.test.js +225 -0
  1051. package/dist/ir/inline-arrays.test.js.map +1 -0
  1052. package/dist/ir/int32-slots.d.ts +6 -0
  1053. package/dist/ir/int32-slots.js +154 -16
  1054. package/dist/ir/int32-slots.js.map +1 -1
  1055. package/dist/ir/int32-slots.test.js +48 -0
  1056. package/dist/ir/int32-slots.test.js.map +1 -1
  1057. package/dist/ir/integer-loops.d.ts +12 -0
  1058. package/dist/ir/integer-loops.js +23 -0
  1059. package/dist/ir/integer-loops.js.map +1 -1
  1060. package/dist/ir/integer-ranges.d.ts +7 -1
  1061. package/dist/ir/integer-ranges.js +29 -2
  1062. package/dist/ir/integer-ranges.js.map +1 -1
  1063. package/dist/ir/intrinsic-signatures.js +2 -1
  1064. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1065. package/dist/ir/ir.d.ts +103 -5
  1066. package/dist/ir/ir.js +38 -4
  1067. package/dist/ir/ir.js.map +1 -1
  1068. package/dist/ir/ir.test.js +134 -1
  1069. package/dist/ir/ir.test.js.map +1 -1
  1070. package/dist/ir/jsval.js +211 -29
  1071. package/dist/ir/jsval.js.map +1 -1
  1072. package/dist/ir/jsval.test.js +120 -0
  1073. package/dist/ir/jsval.test.js.map +1 -1
  1074. package/dist/ir/loop-entry-ranges.d.ts +38 -0
  1075. package/dist/ir/loop-entry-ranges.js +259 -0
  1076. package/dist/ir/loop-entry-ranges.js.map +1 -0
  1077. package/dist/ir/loop-entry-ranges.test.d.ts +1 -0
  1078. package/dist/ir/loop-entry-ranges.test.js +191 -0
  1079. package/dist/ir/loop-entry-ranges.test.js.map +1 -0
  1080. package/dist/ir/node-index.d.ts +3 -0
  1081. package/dist/ir/node-index.js +6 -0
  1082. package/dist/ir/node-index.js.map +1 -1
  1083. package/dist/ir/numeric-call-specialization.d.ts +9 -6
  1084. package/dist/ir/numeric-call-specialization.js +164 -34
  1085. package/dist/ir/numeric-call-specialization.js.map +1 -1
  1086. package/dist/ir/paired-while-loops.js +23 -19
  1087. package/dist/ir/paired-while-loops.js.map +1 -1
  1088. package/dist/ir/parameter-versions.js +6 -3
  1089. package/dist/ir/parameter-versions.js.map +1 -1
  1090. package/dist/ir/receiver-readers.d.ts +10 -0
  1091. package/dist/ir/receiver-readers.js +65 -28
  1092. package/dist/ir/receiver-readers.js.map +1 -1
  1093. package/dist/ir/row-pairs.d.ts +9 -1
  1094. package/dist/ir/row-pairs.js +136 -43
  1095. package/dist/ir/row-pairs.js.map +1 -1
  1096. package/dist/ir/row-pairs.test.js +25 -5
  1097. package/dist/ir/row-pairs.test.js.map +1 -1
  1098. package/dist/ir/runtime-features.d.ts +33 -1
  1099. package/dist/ir/runtime-features.js +104 -6
  1100. package/dist/ir/runtime-features.js.map +1 -1
  1101. package/dist/ir/runtime-features.test.js +13 -0
  1102. package/dist/ir/runtime-features.test.js.map +1 -1
  1103. package/dist/ir/saturating-loop-jams.d.ts +24 -0
  1104. package/dist/ir/saturating-loop-jams.js +420 -0
  1105. package/dist/ir/saturating-loop-jams.js.map +1 -0
  1106. package/dist/ir/saturating-loop-jams.test.d.ts +1 -0
  1107. package/dist/ir/saturating-loop-jams.test.js +196 -0
  1108. package/dist/ir/saturating-loop-jams.test.js.map +1 -0
  1109. package/dist/ir/scalar-records.js +9 -3
  1110. package/dist/ir/scalar-records.js.map +1 -1
  1111. package/dist/ir/self-captures.js +2 -1
  1112. package/dist/ir/self-captures.js.map +1 -1
  1113. package/dist/ir/serialize.d.ts +5 -1
  1114. package/dist/ir/serialize.js +7 -1
  1115. package/dist/ir/serialize.js.map +1 -1
  1116. package/dist/ir/traverse.js +3 -0
  1117. package/dist/ir/traverse.js.map +1 -1
  1118. package/dist/ir/validate.js +91 -9
  1119. package/dist/ir/validate.js.map +1 -1
  1120. package/dist/library/ir-policy.js +1 -0
  1121. package/dist/library/ir-policy.js.map +1 -1
  1122. package/dist/native/cache.js +2 -0
  1123. package/dist/native/cache.js.map +1 -1
  1124. package/dist/native/cli.js +54 -7
  1125. package/dist/native/cli.js.map +1 -1
  1126. package/dist/native/compiler.d.ts +3 -0
  1127. package/dist/native/compiler.js +173 -36
  1128. package/dist/native/compiler.js.map +1 -1
  1129. package/dist/native/compiler.test.js +86 -3
  1130. package/dist/native/compiler.test.js.map +1 -1
  1131. package/dist/native/executable-cache.d.ts +20 -2
  1132. package/dist/native/executable-cache.js +17 -10
  1133. package/dist/native/executable-cache.js.map +1 -1
  1134. package/dist/native/executable-cache.test.js +38 -1
  1135. package/dist/native/executable-cache.test.js.map +1 -1
  1136. package/dist/native/linker-job.d.ts +71 -0
  1137. package/dist/native/linker-job.js +242 -0
  1138. package/dist/native/linker-job.js.map +1 -0
  1139. package/dist/native/linker-job.test.d.ts +1 -0
  1140. package/dist/native/linker-job.test.js +349 -0
  1141. package/dist/native/linker-job.test.js.map +1 -0
  1142. package/dist/native/prepare.js +15 -2
  1143. package/dist/native/prepare.js.map +1 -1
  1144. package/dist/native/sanitizer.js +10 -15
  1145. package/dist/native/sanitizer.js.map +1 -1
  1146. package/dist/native/sanitizer.test.js +152 -66
  1147. package/dist/native/sanitizer.test.js.map +1 -1
  1148. package/dist/native/toolchain.d.ts +11 -2
  1149. package/dist/native/toolchain.js +43 -17
  1150. package/dist/native/toolchain.js.map +1 -1
  1151. package/dist/native/toolchain.test.js +75 -0
  1152. package/dist/native/toolchain.test.js.map +1 -1
  1153. package/dist/node-islands/boundary.d.ts +37 -0
  1154. package/dist/node-islands/boundary.js +135 -0
  1155. package/dist/node-islands/boundary.js.map +1 -0
  1156. package/dist/node-islands/classify.js +1 -1
  1157. package/dist/node-islands/classify.js.map +1 -1
  1158. package/dist/node-islands/effect-gate.d.ts +11 -0
  1159. package/dist/node-islands/effect-gate.js +746 -0
  1160. package/dist/node-islands/effect-gate.js.map +1 -0
  1161. package/dist/node-islands/effect-gate.test.d.ts +1 -0
  1162. package/dist/node-islands/effect-gate.test.js +152 -0
  1163. package/dist/node-islands/effect-gate.test.js.map +1 -0
  1164. package/dist/node-islands/libnode-pack.d.ts +68 -0
  1165. package/dist/node-islands/libnode-pack.js +199 -0
  1166. package/dist/node-islands/libnode-pack.js.map +1 -0
  1167. package/dist/node-islands/libnode-pack.test.d.ts +1 -0
  1168. package/dist/node-islands/libnode-pack.test.js +258 -0
  1169. package/dist/node-islands/libnode-pack.test.js.map +1 -0
  1170. package/dist/node-islands/libnode.d.ts +32 -0
  1171. package/dist/node-islands/libnode.js +212 -0
  1172. package/dist/node-islands/libnode.js.map +1 -0
  1173. package/dist/node-islands/libnode.test.d.ts +1 -0
  1174. package/dist/node-islands/libnode.test.js +170 -0
  1175. package/dist/node-islands/libnode.test.js.map +1 -0
  1176. package/dist/node-islands/modules.d.ts +96 -0
  1177. package/dist/node-islands/modules.js +803 -0
  1178. package/dist/node-islands/modules.js.map +1 -0
  1179. package/dist/node-islands/modules.test.d.ts +1 -0
  1180. package/dist/node-islands/modules.test.js +276 -0
  1181. package/dist/node-islands/modules.test.js.map +1 -0
  1182. package/dist/node-islands/resolve.d.ts +8 -0
  1183. package/dist/node-islands/resolve.js +10 -0
  1184. package/dist/node-islands/resolve.js.map +1 -0
  1185. package/dist/node-islands/snapshot.d.ts +16 -0
  1186. package/dist/node-islands/snapshot.js +486 -0
  1187. package/dist/node-islands/snapshot.js.map +1 -0
  1188. package/dist/node-islands/snapshot.test.d.ts +1 -0
  1189. package/dist/node-islands/snapshot.test.js +56 -0
  1190. package/dist/node-islands/snapshot.test.js.map +1 -0
  1191. package/dist/project-config.d.ts +37 -1
  1192. package/dist/project-config.js +159 -7
  1193. package/dist/project-config.js.map +1 -1
  1194. package/dist/project-config.test.js +153 -0
  1195. package/dist/project-config.test.js.map +1 -1
  1196. package/dist/startup-cache.d.ts +1 -0
  1197. package/dist/startup-cache.js +1 -0
  1198. package/dist/startup-cache.js.map +1 -1
  1199. package/package.json +24 -21
  1200. package/surface-manifest.json +47 -7
@@ -0,0 +1,1825 @@
1
+ /* Where the arrays of InlineArray fields come from, and who writes them
2
+ * (ir/inline-arrays.ts plans the layout; contracts/check.ts reports).
3
+ *
4
+ * The constructor copies the elements of the array it is passed into the
5
+ * instance, and other reads of the field give a new array over them. Under
6
+ * Node.js the field holds that array itself. The two agree as long as no
7
+ * write ever reaches an array a field holds, either through a read of the
8
+ * field or through another reference to the array the constructor stored:
9
+ *
10
+ * - every array that may be (a read of) an inline field is never written,
11
+ * and never reaches code whose writes this analysis cannot see (dynamic
12
+ * values, calls through function values, the runtime library). A
13
+ * whole-program graph of where arrays are held (see "Arrays fields
14
+ * hold") follows them from the field reads;
15
+ * - the array passed to a constructor where the field takes its length is
16
+ * one nothing else keeps: a fresh array (a literal, a copy, the result of
17
+ * a function that returns only such arrays or its arguments), a local
18
+ * array at its last use (a local built here, moved into the constructor;
19
+ * calls that only read or write it in place may come first), a parameter
20
+ * that is itself moved (its every caller passes such an array), an array
21
+ * that is already a field's, or a `const` array that is never written,
22
+ * which is then followed like a field's array.
23
+ *
24
+ * Arrays are followed shallowly: only the array objects matter, not the
25
+ * elements, which stay ordinary mutable instances. */
26
+ import { typeKey } from "./ir.js";
27
+ import { readsArguments } from "./inline-arrays.js";
28
+ import { everyExprChild, everyStmtChild } from "./traverse.js";
29
+ /** Array methods that leave their receiver unchanged. */
30
+ const ARR_READS = new Set([
31
+ "length",
32
+ "getNumber",
33
+ "indexEq",
34
+ "indexOf",
35
+ "includes",
36
+ "nextPresent",
37
+ "join",
38
+ "slice",
39
+ "flatCopy",
40
+ "flatOne",
41
+ "toReversed",
42
+ "toSpliced",
43
+ "toSortedPrimitive",
44
+ "concatSpread",
45
+ "with",
46
+ "withUndefined",
47
+ ]);
48
+ /** Array methods whose arguments are arrays of the receiver's type, whose
49
+ * elements they add. */
50
+ const SPREADS = new Set(["pushSpread", "unshiftSpread", "concatSpread"]);
51
+ /** Array methods whose result is a new array. */
52
+ const ARR_COPIES = new Set([
53
+ "slice",
54
+ "flatCopy",
55
+ "flatOne",
56
+ "toReversed",
57
+ "toSpliced",
58
+ "toSortedPrimitive",
59
+ "concatSpread",
60
+ "with",
61
+ "withUndefined",
62
+ ]);
63
+ /** Array methods that write their receiver and return it. */
64
+ const RETURNS_RECEIVER = new Set([
65
+ "reverse",
66
+ "sortPrimitive",
67
+ "fill",
68
+ "fillUndefined",
69
+ "copyWithin",
70
+ ]);
71
+ /** Expressions whose value is one of their children's. */
72
+ const PASS_THROUGH = new Set([
73
+ "upcast",
74
+ "downcast",
75
+ "unionWrap",
76
+ "unionRetype",
77
+ "unionNarrow",
78
+ "ternary",
79
+ "logical",
80
+ "nullish",
81
+ "orDefault",
82
+ "seqExpr",
83
+ "chainRecv",
84
+ "optChain",
85
+ ]);
86
+ /** Expressions that only look at their children. */
87
+ const OBSERVE = new Set([
88
+ "toBool",
89
+ "strEq",
90
+ "unionEq",
91
+ "unionFuncEq",
92
+ "unionIsTag",
93
+ "unionDisc",
94
+ "instanceOf",
95
+ "instanceOfValue",
96
+ "dynScalarEq",
97
+ "fieldAbsent",
98
+ "recordHas",
99
+ "recordOvfHas",
100
+ "bin",
101
+ "unary",
102
+ ]);
103
+ /** Expressions this analysis follows: reads, the stores and calls it
104
+ * tracks, and the escapes it reports. */
105
+ const MODELLED = new Set([
106
+ ...PASS_THROUGH,
107
+ ...OBSERVE,
108
+ "varRef",
109
+ "assignExpr",
110
+ "call",
111
+ "new",
112
+ "virtualCall",
113
+ "arrIntrinsic",
114
+ "arrayGet",
115
+ "arrayHas",
116
+ "arrayState",
117
+ "fieldGet",
118
+ "recordGet",
119
+ "mapIntrinsic",
120
+ "setIntrinsic",
121
+ "setNew",
122
+ "mapNew",
123
+ "arrayLit",
124
+ "recordLit",
125
+ "closure",
126
+ "dynFrom",
127
+ "caughtToDyn",
128
+ "callValue",
129
+ "libCall",
130
+ "intrinsic",
131
+ ]);
132
+ /** Array methods that compare their arguments with the elements by
133
+ * identity. */
134
+ const IDENTITY_SEARCHES = new Set(["indexOf", "includes"]);
135
+ /** Each read of an inline field may give another array, where Node.js
136
+ * gives the field's one array every time. */
137
+ const IDENTITY_REASON = "an array that may be an InlineArray field's is compared by identity, and each read of the field may give another array (compare a copy made with slice(), or compare the elements)";
138
+ /** Map and Set methods whose first argument is a key (or a Set element). */
139
+ const KEYED = new Set(["get", "set", "has", "delete", "add"]);
140
+ const NO_SLOTS = new Set();
141
+ const NO_INDEXES = new Set();
142
+ /** Whether two occurrences sit in different arms of one conditional. */
143
+ function exclusive(a, b) {
144
+ const n = Math.min(a.branches.length, b.branches.length);
145
+ for (let i = 0; i < n; i++) {
146
+ const x = a.branches[i], y = b.branches[i];
147
+ if (x === y)
148
+ continue;
149
+ return x.slice(0, x.indexOf(":")) === y.slice(0, y.indexOf(":"));
150
+ }
151
+ return false;
152
+ }
153
+ /** Whether a statement list always leaves the block it ends (return, throw,
154
+ * break or continue on every path). */
155
+ function exits(stmts) {
156
+ const last = stmts[stmts.length - 1];
157
+ if (last === undefined)
158
+ return false;
159
+ switch (last.kind) {
160
+ case "return":
161
+ case "throw":
162
+ case "break":
163
+ case "continue":
164
+ return true;
165
+ case "if":
166
+ return last.else_ !== null && exits(last.then) && exits(last.else_);
167
+ case "block":
168
+ return exits(last.body);
169
+ default:
170
+ return false;
171
+ }
172
+ }
173
+ /** Every local's occurrences in a function, with each node's parent. */
174
+ class FunctionIndex {
175
+ fn;
176
+ occurrences = new Map();
177
+ declarations = new Map();
178
+ /** Assignment statements, by local (globals are defined by these). */
179
+ assignments = new Map();
180
+ assigned = new Set();
181
+ assignedByExpr = new Set();
182
+ /** The parent of every expression. */
183
+ parents = new Map();
184
+ /** The statement after each statement of a block. */
185
+ next = new Map();
186
+ /** The position of each statement among the occurrences. */
187
+ positions = new Map();
188
+ captured = new Set();
189
+ constructor(fn) {
190
+ this.fn = fn;
191
+ let order = 0;
192
+ let conditionals = 0;
193
+ const loops = [];
194
+ // The statements being visited, innermost last.
195
+ const enclosing = [];
196
+ const branches = [];
197
+ const define = (map, id, stmt) => {
198
+ let list = map.get(id);
199
+ if (!list)
200
+ map.set(id, (list = []));
201
+ list.push({ stmt, loops: [...loops] });
202
+ };
203
+ const arm = (id, which, visit) => {
204
+ branches.push(`${id}:${which}`);
205
+ visit();
206
+ branches.pop();
207
+ };
208
+ const visitExpr = (e, parent) => {
209
+ this.parents.set(e, parent);
210
+ if (e.kind === "varRef") {
211
+ let list = this.occurrences.get(e.localId);
212
+ if (!list)
213
+ this.occurrences.set(e.localId, (list = []));
214
+ list.push({
215
+ index: this,
216
+ ref: e,
217
+ parent,
218
+ stmt: enclosing[enclosing.length - 1],
219
+ order: order++,
220
+ loops: [...loops],
221
+ branches: [...branches],
222
+ });
223
+ return;
224
+ }
225
+ if (e.kind === "assignExpr" || e.kind === "incDec") {
226
+ this.assigned.add(e.localId);
227
+ this.assignedByExpr.add(e.localId);
228
+ }
229
+ if (e.kind === "closure")
230
+ for (const id of e.captures)
231
+ this.captured.add(id);
232
+ if (e.kind === "ternary") {
233
+ const id = conditionals++;
234
+ visitExpr(e.cond, e);
235
+ arm(id, "t", () => visitExpr(e.then, e));
236
+ arm(id, "e", () => visitExpr(e.else_, e));
237
+ return;
238
+ }
239
+ everyExprChild(e, (child) => {
240
+ visitExpr(child, e);
241
+ return true;
242
+ }, (child) => {
243
+ visitStmt(child);
244
+ return true;
245
+ });
246
+ };
247
+ // The statements of a block after an `if` whose one arm always leaves
248
+ // the block run only when the other arm ran.
249
+ const visitBlock = (stmts) => {
250
+ const depth = branches.length;
251
+ for (let i = 0; i + 1 < stmts.length; i++)
252
+ this.next.set(stmts[i], stmts[i + 1]);
253
+ for (const s of stmts) {
254
+ const id = visitStmt(s);
255
+ if (s.kind !== "if" || id === null)
256
+ continue;
257
+ if (exits(s.then))
258
+ branches.push(`${id}:e`);
259
+ else if (s.else_ !== null && exits(s.else_))
260
+ branches.push(`${id}:t`);
261
+ }
262
+ branches.length = depth;
263
+ };
264
+ const inLoop = (s, visit) => {
265
+ loops.push(s);
266
+ visit();
267
+ loops.pop();
268
+ };
269
+ /** Visits `s`; returns the conditional id of an `if`. */
270
+ const visitStmt = (s) => {
271
+ enclosing.push(s);
272
+ const id = visitStmtIn(s);
273
+ enclosing.pop();
274
+ return id;
275
+ };
276
+ const visitStmtIn = (s) => {
277
+ this.positions.set(s, order);
278
+ switch (s.kind) {
279
+ case "varDecl":
280
+ define(this.declarations, s.localId, s);
281
+ break;
282
+ case "assign":
283
+ this.assigned.add(s.localId);
284
+ define(this.assignments, s.localId, s);
285
+ break;
286
+ case "if": {
287
+ visitExpr(s.cond, s);
288
+ const id = conditionals++;
289
+ arm(id, "t", () => visitBlock(s.then));
290
+ arm(id, "e", () => visitBlock(s.else_ ?? []));
291
+ return id;
292
+ }
293
+ case "switch": {
294
+ // Case tests run in order until one matches; a case's body runs
295
+ // after it, or after the case before falls through into it.
296
+ visitExpr(s.disc, s);
297
+ for (const c of s.cases)
298
+ if (c.test)
299
+ visitExpr(c.test, s);
300
+ const id = conditionals++;
301
+ let entry = 0;
302
+ s.cases.forEach((c, i) => {
303
+ if (i > 0 && exits(s.cases[i - 1].body))
304
+ entry = i;
305
+ arm(id, String(entry), () => visitBlock(c.body));
306
+ });
307
+ return null;
308
+ }
309
+ case "block":
310
+ visitBlock(s.body);
311
+ return null;
312
+ case "while":
313
+ inLoop(s, () => {
314
+ visitExpr(s.cond, s);
315
+ visitBlock(s.body);
316
+ });
317
+ return null;
318
+ case "doWhile":
319
+ inLoop(s, () => {
320
+ visitBlock(s.body);
321
+ visitExpr(s.cond, s);
322
+ });
323
+ return null;
324
+ case "for":
325
+ if (s.init)
326
+ visitStmt(s.init);
327
+ inLoop(s, () => {
328
+ if (s.cond)
329
+ visitExpr(s.cond, s);
330
+ visitBlock(s.body);
331
+ if (s.update)
332
+ visitStmt(s.update);
333
+ });
334
+ return null;
335
+ case "forOf":
336
+ this.assigned.add(s.localId);
337
+ visitExpr(s.iterable, s);
338
+ inLoop(s, () => visitBlock(s.body));
339
+ return null;
340
+ }
341
+ everyStmtChild(s, (child) => {
342
+ visitExpr(child, s);
343
+ return true;
344
+ }, (child) => {
345
+ visitStmt(child);
346
+ return true;
347
+ });
348
+ return null;
349
+ };
350
+ visitBlock(fn.body);
351
+ }
352
+ }
353
+ /** Where the value of an occurrence goes: up through the expressions whose
354
+ * value it may be. */
355
+ function valueUse(o) {
356
+ let child = o.ref;
357
+ let parent = o.parent;
358
+ while (parent !== undefined && givesValueOf(parent, child)) {
359
+ child = parent;
360
+ parent = o.index.parents.get(child);
361
+ }
362
+ return { parent, child };
363
+ }
364
+ /** Whether `e` is `undefined` or `null`, as itself or as a union arm. */
365
+ function isUndefined(e) {
366
+ while (e.kind === "unionWrap" || e.kind === "upcast")
367
+ e = e.value;
368
+ return e.kind === "unitLit";
369
+ }
370
+ /** Whether an occurrence is (the value of) a returned expression. */
371
+ function returned(o) {
372
+ return valueUse(o).parent?.kind === "return";
373
+ }
374
+ /** Whether the value of `parent` may be that of its child `child`. */
375
+ function givesValueOf(parent, child) {
376
+ switch (parent.kind) {
377
+ case "ternary":
378
+ return parent.then === child || parent.else_ === child;
379
+ case "seqExpr":
380
+ return parent.result === child;
381
+ case "upcast":
382
+ case "downcast":
383
+ case "unionWrap":
384
+ case "unionRetype":
385
+ case "unionNarrow":
386
+ return parent.value === child;
387
+ case "logical":
388
+ case "nullish":
389
+ case "orDefault":
390
+ return true;
391
+ default:
392
+ return false;
393
+ }
394
+ }
395
+ /** Whether `parent` only reads its array child `ref` without keeping or
396
+ * writing it. */
397
+ function readsOnly(parent, ref) {
398
+ switch (parent.kind) {
399
+ case "arrayGet":
400
+ case "arrayHas":
401
+ case "arrayState":
402
+ return parent.arr === ref;
403
+ case "arrIntrinsic":
404
+ if (parent.receiver === ref)
405
+ return ARR_READS.has(parent.method);
406
+ // A spread argument gives its elements.
407
+ return SPREADS.has(parent.method) && typeKey(ref.type) === typeKey(parent.receiver.type);
408
+ case "forOf":
409
+ return parent.iterable === ref;
410
+ default:
411
+ return OBSERVE.has(parent.kind);
412
+ }
413
+ }
414
+ /** Whether `parent` writes its array child `ref` in place (and keeps no
415
+ * reference to it). */
416
+ function writesInPlace(parent, ref) {
417
+ switch (parent.kind) {
418
+ case "arraySet":
419
+ case "arraySetLength":
420
+ case "arraySetUndefined":
421
+ case "arrayDelete":
422
+ return parent.arr === ref;
423
+ case "arrIntrinsic":
424
+ return parent.receiver === ref && !ARR_READS.has(parent.method);
425
+ default:
426
+ return false;
427
+ }
428
+ }
429
+ export function checkInlineArraySources(mod, plan) {
430
+ if (plan.classes.size === 0)
431
+ return [];
432
+ return new SourceAnalysis(mod, plan).run();
433
+ }
434
+ class SourceAnalysis {
435
+ mod;
436
+ plan;
437
+ functions = new Map();
438
+ indexes = new Map();
439
+ /** Functions that are called other than directly (function values,
440
+ * library exports): their callers are not all known. */
441
+ escapedFunctions = new Set();
442
+ methodImpls = new Map();
443
+ /** The hierarchy roots of the planned fields' element classes: arrays of
444
+ * any class in those hierarchies may be a field's (a cast can retype
445
+ * one). */
446
+ elementRoots = new Set();
447
+ bases = new Map();
448
+ classDefs = new Map();
449
+ subclasses = new Map();
450
+ globals = new Map();
451
+ /** The slot graph (see "Arrays fields hold"). */
452
+ edges = new Map();
453
+ sites = new Map();
454
+ /** The slots of inline field reads, with the reads' locations. */
455
+ seeds = new Map();
456
+ /** The field each read reads. */
457
+ origins = new Map();
458
+ /** Slots that may hold an inline field's array, with the field read it
459
+ * may come from. */
460
+ pinned = new Map();
461
+ /** `followed` by type key. */
462
+ followedTypes = new Map();
463
+ /** Parameters (`fn\0index`) whose array moves into an inline field. */
464
+ moved = new Set();
465
+ /** Functions whose every result is an array nothing else keeps, a
466
+ * field's, or one of the `passed` parameters. */
467
+ factories = new Set();
468
+ passed = new Map();
469
+ /** The locals `freshLocal` is answering for. */
470
+ inProgress = new Set();
471
+ /** Where `share` records the slots it shares, with their definitions;
472
+ * null when sharing is not allowed. */
473
+ shareSink = null;
474
+ /** The slots each factory's results may share. */
475
+ factoryShares = new Map();
476
+ /** Parameters (by index) a function may return as they came: a call's
477
+ * value may be the array passed there. */
478
+ returnedParams = new Map();
479
+ /** The slots that carry a returned parameter to a function's returns:
480
+ * the parameter's own and the locals between. Their other values reach
481
+ * the function's result slot directly. */
482
+ returnCarriers = new Map();
483
+ issues = [];
484
+ reported = new Set();
485
+ constructor(mod, plan) {
486
+ this.mod = mod;
487
+ this.plan = plan;
488
+ for (const fn of mod.functions)
489
+ this.functions.set(fn.name, fn);
490
+ for (const cls of mod.classes ?? [])
491
+ for (const m of cls.methods ?? []) {
492
+ let list = this.methodImpls.get(m);
493
+ if (!list)
494
+ this.methodImpls.set(m, (list = []));
495
+ list.push(`%${cls.name}.${m}`);
496
+ }
497
+ for (const cls of mod.classes ?? []) {
498
+ this.bases.set(cls.name, cls.base);
499
+ this.classDefs.set(cls.name, cls);
500
+ if (cls.base !== undefined) {
501
+ const list = this.subclasses.get(cls.base);
502
+ if (list === undefined)
503
+ this.subclasses.set(cls.base, [cls.name]);
504
+ else
505
+ list.push(cls.name);
506
+ }
507
+ }
508
+ for (const g of mod.globals ?? [])
509
+ this.globals.set(g.id, g);
510
+ for (const cls of plan.classes.values())
511
+ this.elementRoots.add(this.rootOf(cls.elemClass));
512
+ }
513
+ rootOf(className) {
514
+ let name = className;
515
+ for (let base = this.bases.get(name); base !== undefined; base = this.bases.get(name))
516
+ name = base;
517
+ return name;
518
+ }
519
+ index(fn) {
520
+ let index = this.indexes.get(fn.name);
521
+ if (!index)
522
+ this.indexes.set(fn.name, (index = new FunctionIndex(fn)));
523
+ return index;
524
+ }
525
+ run() {
526
+ this.collectCalls();
527
+ this.computeLent();
528
+ this.computeMoves();
529
+ this.computeFactories();
530
+ this.computePinned();
531
+ this.checkSources();
532
+ this.checkWrites();
533
+ return this.issues;
534
+ }
535
+ /** The planned class of the first hierarchy, for issues not tied to one. */
536
+ anyField() {
537
+ const cls = this.plan.classes.values().next().value;
538
+ return { declaringClass: cls.declaringClass, field: cls.field };
539
+ }
540
+ report(issue, owner = (issue.origin && this.origins.get(issue.origin)) ?? this.anyField()) {
541
+ // One issue per site.
542
+ const key = `${issue.loc.file}:${issue.loc.start}`;
543
+ if (this.reported.has(key))
544
+ return;
545
+ this.reported.add(key);
546
+ this.issues.push({ ...owner, ...issue });
547
+ }
548
+ // ── Calls ──
549
+ collectCalls() {
550
+ for (const e of this.mod.lib?.exports ?? [])
551
+ this.escapedFunctions.add(e.fnName);
552
+ for (const fn of this.mod.functions)
553
+ this.eachExpr(fn, (e) => {
554
+ if (e.kind === "closure")
555
+ this.escapedFunctions.add(e.fnName);
556
+ });
557
+ }
558
+ /** The functions a call, construction or method call may run, with the
559
+ * offset of its first argument in their parameters (a construction's
560
+ * arguments follow `this`). */
561
+ callees(e) {
562
+ switch (e.kind) {
563
+ case "call":
564
+ return [{ callee: e.callee, offset: 0 }];
565
+ case "new":
566
+ return [{ callee: `%${e.className}.constructor`, offset: 1 }];
567
+ case "virtualCall": {
568
+ // `targets` are the classes whose own declaration may run.
569
+ const method = e.method;
570
+ const targets = e.targets;
571
+ const impls = targets !== undefined
572
+ ? targets.map((c) => `%${c}.${method}`)
573
+ : (this.methodImpls.get(method) ?? []);
574
+ return impls.map((callee) => ({ callee, offset: 0 }));
575
+ }
576
+ default:
577
+ return [];
578
+ }
579
+ }
580
+ eachExpr(fn, visit) {
581
+ const expr = (e) => {
582
+ visit(e);
583
+ return everyExprChild(e, expr, stmt);
584
+ };
585
+ const stmt = (s) => everyStmtChild(s, expr, stmt);
586
+ for (const s of fn.body)
587
+ stmt(s);
588
+ }
589
+ /** The planned class an inline `new` constructs, with the argument the
590
+ * field takes its length from. */
591
+ inlineNew(e) {
592
+ if (e.kind !== "new")
593
+ return null;
594
+ const cls = this.plan.classes.get(e.className);
595
+ return cls === undefined ? null : { arg: cls.lengthArg };
596
+ }
597
+ /** Whether passing `arg` in `call` hands it to a parameter that moves it
598
+ * into an inline field. */
599
+ consumes(call, index) {
600
+ const inline = this.inlineNew(call);
601
+ if (inline !== null)
602
+ return index === inline.arg;
603
+ return this.callees(call).some(({ callee, offset }) => this.moved.has(`${callee}\0${index + offset}`));
604
+ }
605
+ // ── Lent arrays ──
606
+ /** Array parameters (`fn\0index`) whose function reads the array or
607
+ * writes it in place and keeps no reference to it: passing an array there
608
+ * lends it for the call. */
609
+ lent = new Set();
610
+ /** The lent parameters whose function only reads the array. */
611
+ readParams = new Set();
612
+ /** How an occurrence uses its array: it only reads it, writes it in
613
+ * place, or does something else (keeps it, hands it on). */
614
+ use(o, depth = 0) {
615
+ // The expression whose value it is, such as a narrowing of it.
616
+ const { parent: p, child } = valueUse(o);
617
+ if (p === undefined)
618
+ return "other";
619
+ if (readsOnly(p, child))
620
+ return "read";
621
+ if (writesInPlace(p, child))
622
+ return "write";
623
+ // A `const` copy of the reference (as `for...of` makes) uses the array
624
+ // as its own uses do.
625
+ const copy = this.copyUses(o, depth);
626
+ if (copy !== null) {
627
+ const uses = copy.map((u) => this.use(u, depth + 1));
628
+ if (uses.includes("other"))
629
+ return "other";
630
+ return uses.includes("write") ? "write" : "read";
631
+ }
632
+ if (p.kind !== "call" && p.kind !== "new" && p.kind !== "virtualCall")
633
+ return "other";
634
+ const i = p.args.indexOf(child);
635
+ const params = this.callees(p).map(({ callee, offset }) => `${callee}\0${i + offset}`);
636
+ if (i < 0 || params.length === 0)
637
+ return "other";
638
+ if (params.every((k) => this.readParams.has(k)))
639
+ return "read";
640
+ if (params.every((k) => this.lent.has(k)))
641
+ return "write";
642
+ return "other";
643
+ }
644
+ /** The occurrences of the `const` local an occurrence initializes, or
645
+ * null when it initializes none (or one written again). */
646
+ copyUses(o, depth) {
647
+ const { parent: p, child } = valueUse(o);
648
+ if (p?.kind !== "varDecl" || p.init !== child || depth >= 4)
649
+ return null;
650
+ const index = o.index;
651
+ if (index.assigned.has(p.localId) || index.captured.has(p.localId))
652
+ return null;
653
+ if ((index.declarations.get(p.localId) ?? []).length !== 1)
654
+ return null;
655
+ return index.occurrences.get(p.localId) ?? [];
656
+ }
657
+ /** The position of the last use an occurrence makes, through `const`
658
+ * copies. */
659
+ lastPosition(o, depth = 0) {
660
+ const copy = this.copyUses(o, depth);
661
+ if (copy === null)
662
+ return o.order;
663
+ return Math.max(o.order, ...copy.map((u) => this.lastPosition(u, depth + 1)));
664
+ }
665
+ /** Whether `last` hands the array on for good: every other occurrence that
666
+ * can run with it only reads the array, or writes it in place before. */
667
+ lastUse(occurrences, last) {
668
+ for (const o of occurrences) {
669
+ if (o === last || exclusive(o, last))
670
+ continue;
671
+ const use = this.use(o);
672
+ if (use === "other" || (use === "write" && this.lastPosition(o) > last.order))
673
+ return false;
674
+ }
675
+ return true;
676
+ }
677
+ /** The largest sets of lent and read-only parameters: start from every
678
+ * array parameter and drop those with another use, to a fixpoint. */
679
+ computeLent() {
680
+ for (const fn of this.mod.functions)
681
+ fn.params.forEach((p, i) => {
682
+ if (!this.holdsFieldArray(p.type))
683
+ return;
684
+ const index = this.index(fn);
685
+ const local = fn.locals.find((l) => l.id === p.localId);
686
+ if (index.assigned.has(p.localId) || index.captured.has(p.localId) || local?.boxed === true)
687
+ return;
688
+ this.lent.add(`${fn.name}\0${i}`);
689
+ this.readParams.add(`${fn.name}\0${i}`);
690
+ });
691
+ for (let changed = true; changed;) {
692
+ changed = false;
693
+ for (const fn of this.mod.functions)
694
+ fn.params.forEach((p, i) => {
695
+ const key = `${fn.name}\0${i}`;
696
+ if (!this.lent.has(key))
697
+ return;
698
+ const uses = (this.index(fn).occurrences.get(p.localId) ?? []).map((o) => this.use(o));
699
+ if (uses.includes("other")) {
700
+ this.lent.delete(key);
701
+ this.readParams.delete(key);
702
+ changed = true;
703
+ }
704
+ else if (uses.includes("write") && this.readParams.delete(key))
705
+ changed = true;
706
+ });
707
+ }
708
+ }
709
+ // ── Moves ──
710
+ /** Parameters that only reach an inline field: each is used only to be
711
+ * read, written in place, and finally passed where an inline field takes
712
+ * its array; every caller then passes an array nothing else keeps. */
713
+ computeMoves() {
714
+ // Subclass constructors forward their parameter to the base's: start
715
+ // from the constructors' own length parameters.
716
+ for (const [name, cls] of this.plan.classes)
717
+ this.moved.add(`%${name}.constructor\0${cls.lengthArg + 1}`);
718
+ // Grow: parameters whose last use moves them.
719
+ for (let changed = true; changed;) {
720
+ changed = false;
721
+ for (const fn of this.mod.functions) {
722
+ if (this.escapedFunctions.has(fn.name))
723
+ continue;
724
+ fn.params.forEach((p, i) => {
725
+ const key = `${fn.name}\0${i}`;
726
+ if (this.moved.has(key))
727
+ return;
728
+ if (this.movedAtLastUse(fn, p.localId)) {
729
+ this.moved.add(key);
730
+ changed = true;
731
+ }
732
+ });
733
+ }
734
+ }
735
+ }
736
+ /** Whether the parameter `localId` moves into an inline field: every use
737
+ * reads it, writes it in place, or passes it on where an inline field
738
+ * takes its array as its last use on that path, outside any loop. */
739
+ movedAtLastUse(fn, localId) {
740
+ const index = this.index(fn);
741
+ if (index.assigned.has(localId) || index.captured.has(localId))
742
+ return false;
743
+ const local = fn.locals.find((l) => l.id === localId);
744
+ if (local === undefined || local.boxed === true)
745
+ return false;
746
+ const occurrences = index.occurrences.get(localId) ?? [];
747
+ const moves = occurrences.filter((o) => this.isMove(o));
748
+ if (moves.length === 0)
749
+ return false;
750
+ return moves.every((m) => m.loops.length === 0 && this.lastUse(occurrences, m));
751
+ }
752
+ /** Whether the occurrence hands the array on to an inline field. */
753
+ isMove(o) {
754
+ const { parent: p, child } = valueUse(o);
755
+ if (p === undefined || (p.kind !== "new" && p.kind !== "call" && p.kind !== "virtualCall"))
756
+ return false;
757
+ const i = p.args.indexOf(child);
758
+ return i >= 0 && this.consumes(p, i);
759
+ }
760
+ // ── Fresh values ──
761
+ /** Whether `e` (in `fn`) is an array nothing else keeps, or one an
762
+ * inline field already holds. */
763
+ fresh(fn, e) {
764
+ switch (e.kind) {
765
+ case "arrayLit":
766
+ return true;
767
+ case "arrIntrinsic":
768
+ if (RETURNS_RECEIVER.has(e.method))
769
+ return this.fresh(fn, e.receiver);
770
+ return ARR_COPIES.has(e.method);
771
+ case "call":
772
+ case "virtualCall": {
773
+ // A factory's result, and the arrays it may give back as they came.
774
+ const callees = this.callees(e);
775
+ return (callees.length > 0 &&
776
+ callees.every(({ callee, offset }) => this.factories.has(callee) &&
777
+ this.shareAll(this.factoryShares.get(callee)) &&
778
+ [...(this.passed.get(callee) ?? NO_INDEXES)].every((i) => {
779
+ const arg = e.args[i - offset];
780
+ return arg !== undefined && this.fresh(fn, arg);
781
+ })));
782
+ }
783
+ case "varRef": {
784
+ if (e.localId.startsWith("%g."))
785
+ return this.fieldArray(fn, e) || this.freshGlobal(fn, e) || this.share(fn, e);
786
+ const param = fn.params.findIndex((p) => p.localId === e.localId);
787
+ if (param >= 0)
788
+ return this.moved.has(`${fn.name}\0${param}`);
789
+ return this.fieldArray(fn, e) || this.freshLocal(fn, e) || this.share(fn, e);
790
+ }
791
+ case "fieldGet":
792
+ return this.isFieldRead(e);
793
+ case "seqExpr":
794
+ return this.fresh(fn, e.result);
795
+ case "ternary":
796
+ return this.fresh(fn, e.then) && this.fresh(fn, e.else_);
797
+ case "logical":
798
+ case "nullish":
799
+ case "orDefault":
800
+ return everyExprChild(e, (child) => this.fresh(fn, child), () => false);
801
+ case "upcast":
802
+ case "downcast":
803
+ case "unionWrap":
804
+ case "unionRetype":
805
+ case "unionNarrow":
806
+ return this.fresh(fn, e.value);
807
+ default:
808
+ return false;
809
+ }
810
+ }
811
+ /** A local whose only definition is a fresh array and whose occurrence
812
+ * `ref` is its last use on every path, outside any loop the declaration
813
+ * is not in. */
814
+ freshLocal(fn, ref) {
815
+ const id = ref.localId;
816
+ const index = this.index(fn);
817
+ if (index.assignedByExpr.has(id) || index.captured.has(id))
818
+ return false;
819
+ const declarations = index.declarations.get(id) ?? [];
820
+ if (declarations.length !== 1 || !this.movedAt(index, ref, declarations[0]))
821
+ return false;
822
+ // Every value the local takes (a `let` may be assigned again) is fresh,
823
+ // or undefined.
824
+ const key = `${fn.name}\0${id}`;
825
+ if (this.inProgress.has(key))
826
+ return false;
827
+ this.inProgress.add(key);
828
+ try {
829
+ const init = declarations[0].stmt.init;
830
+ const values = [
831
+ init,
832
+ ...(index.assignments.get(id) ?? []).map((d) => d.stmt.value),
833
+ ];
834
+ return values.every((v) => v === null ? index.assignments.has(id) : isUndefined(v) || this.fresh(fn, v));
835
+ }
836
+ finally {
837
+ this.inProgress.delete(key);
838
+ }
839
+ }
840
+ /** Whether `ref` is the last use of its local or global on every path,
841
+ * outside any loop its definition is not in. */
842
+ movedAt(index, ref, def) {
843
+ const occurrences = index.occurrences.get(ref.localId) ?? [];
844
+ const at = occurrences.find((o) => o.ref === ref);
845
+ if (at === undefined)
846
+ return false;
847
+ // A move followed by a fresh value for the local (in a loop that builds
848
+ // one array per pass): later uses see the new array.
849
+ const kill = this.killAfter(at);
850
+ if (kill !== null)
851
+ return this.lastUse(occurrences.filter((o) => o.order < kill), at);
852
+ return at.loops.length <= def.loops.length && this.lastUse(occurrences, at);
853
+ }
854
+ /** The position of an assignment of a fresh array (or undefined) to the
855
+ * occurrence's local by the statement right after the occurrence's. */
856
+ killAfter(at) {
857
+ const index = at.index;
858
+ const next = at.stmt === undefined ? undefined : index.next.get(at.stmt);
859
+ if (next?.kind !== "assign" || next.localId !== at.ref.localId)
860
+ return null;
861
+ if (!isUndefined(next.value) && !this.fresh(index.fn, next.value))
862
+ return null;
863
+ return index.positions.get(next) ?? null;
864
+ }
865
+ /** Whether `ref` is a `const` local or global from a fresh array that is
866
+ * only read or passed where an inline field takes it: such an array may
867
+ * be shared, and is followed like a field's, so that writes to it through
868
+ * other references are reported. Only while `shareSink` collects them. */
869
+ share(fn, ref) {
870
+ if (this.shareSink === null)
871
+ return false;
872
+ const id = ref.localId;
873
+ let def;
874
+ if (id.startsWith("%g.")) {
875
+ const source = this.globalSource(id);
876
+ if (source === null)
877
+ return false;
878
+ def = {
879
+ fn: source.fn,
880
+ value: source.def.stmt.value,
881
+ loc: source.def.stmt.loc,
882
+ };
883
+ }
884
+ else {
885
+ const index = this.index(fn);
886
+ if (index.assigned.has(id) || index.captured.has(id))
887
+ return false;
888
+ const declarations = index.declarations.get(id) ?? [];
889
+ const decl = declarations[0]?.stmt;
890
+ if (declarations.length !== 1 || !decl?.init)
891
+ return false;
892
+ def = { fn, value: decl.init, loc: decl.loc };
893
+ }
894
+ const slot = this.localSlot(fn, id);
895
+ if (!this.shareSink.has(slot)) {
896
+ const functions = id.startsWith("%g.") ? this.mod.functions : [fn];
897
+ const constant = functions.every((f) => (this.index(f).occurrences.get(id) ?? []).every((o) => this.use(o) === "read" || this.isMove(o) || returned(o)));
898
+ if (!constant || !this.fresh(def.fn, def.value))
899
+ return false;
900
+ }
901
+ this.shareSink.set(slot, def.loc);
902
+ return true;
903
+ }
904
+ /** Shares the arrays a factory's results may be (see `share`). */
905
+ shareAll(shares) {
906
+ if (shares === undefined)
907
+ return true;
908
+ if (this.shareSink === null)
909
+ return false;
910
+ for (const [slot, loc] of shares)
911
+ this.shareSink.set(slot, loc);
912
+ return true;
913
+ }
914
+ /** Whether `e` is always an array a field already holds: a read of an
915
+ * inline field, or a `const` local or global initialized from one. Such
916
+ * an array may be shared: every reference to it is followed. */
917
+ fieldArray(fn, e, depth = 0) {
918
+ if (depth > 16)
919
+ return false;
920
+ switch (e.kind) {
921
+ case "fieldGet":
922
+ return this.isFieldRead(e);
923
+ case "varRef": {
924
+ if (e.localId.startsWith("%g.")) {
925
+ const source = this.globalSource(e.localId);
926
+ if (source === null)
927
+ return false;
928
+ const value = source.def.stmt.value;
929
+ return this.fieldArray(source.fn, value, depth + 1);
930
+ }
931
+ if (fn.params.some((p) => p.localId === e.localId))
932
+ return false;
933
+ const index = this.index(fn);
934
+ if (index.assigned.has(e.localId) || index.captured.has(e.localId))
935
+ return false;
936
+ const declarations = index.declarations.get(e.localId) ?? [];
937
+ if (declarations.length !== 1)
938
+ return false;
939
+ const init = declarations[0].stmt.init;
940
+ return init !== null && this.fieldArray(fn, init, depth + 1);
941
+ }
942
+ case "seqExpr":
943
+ return this.fieldArray(fn, e.result, depth + 1);
944
+ case "ternary":
945
+ return this.fieldArray(fn, e.then, depth + 1) && this.fieldArray(fn, e.else_, depth + 1);
946
+ case "upcast":
947
+ case "downcast":
948
+ case "unionWrap":
949
+ case "unionRetype":
950
+ case "unionNarrow":
951
+ return this.fieldArray(fn, e.value, depth + 1);
952
+ default:
953
+ return false;
954
+ }
955
+ }
956
+ /** A `const` global from a fresh array, read here for the last time, in
957
+ * the function that defines it, and only read elsewhere. */
958
+ freshGlobal(fn, ref) {
959
+ const source = this.globalSource(ref.localId);
960
+ if (source === null)
961
+ return false;
962
+ const value = source.def.stmt.value;
963
+ if (!this.fresh(source.fn, value))
964
+ return false;
965
+ if (fn !== source.fn || !this.movedAt(this.index(fn), ref, source.def))
966
+ return false;
967
+ return this.mod.functions.every((other) => other === fn ||
968
+ (this.index(other).occurrences.get(ref.localId) ?? []).every((o) => this.use(o) === "read"));
969
+ }
970
+ /** The one assignment of an immutable global. */
971
+ globalSource(id) {
972
+ if (this.globals.get(id)?.mutable !== false)
973
+ return null;
974
+ let source = null;
975
+ for (const fn of this.mod.functions) {
976
+ const index = this.index(fn);
977
+ if (index.assignedByExpr.has(id))
978
+ return null;
979
+ for (const def of index.assignments.get(id) ?? []) {
980
+ if (source !== null)
981
+ return null;
982
+ source = { fn, def };
983
+ }
984
+ }
985
+ return source;
986
+ }
987
+ isFieldRead(e) {
988
+ if (e.kind !== "fieldGet")
989
+ return false;
990
+ const cls = this.plan.classes.get(e.className);
991
+ return cls !== undefined && cls.field === e.field;
992
+ }
993
+ // ── Arrays fields hold ──
994
+ //
995
+ // A whole-program graph of slots: locals and parameters (`l:fn\0local`),
996
+ // globals (`g:global`), results (`r:fn`), the fields of a class hierarchy
997
+ // (`f:root\0field`), record fields (`s:shape\0field`), arrays, Maps and
998
+ // Sets made at one expression (`a:fn\0n`), and reads of an inline field
999
+ // (`v:n`). An edge says that a value in one slot may reach another.
1000
+ // `c:<slot>` is the elements (keys and values) of the arrays, Maps and
1001
+ // Sets in a slot: an edge from one slot to another is one between their
1002
+ // elements too. The slots a field read reaches may hold a field's array.
1003
+ /** A field of every class in a hierarchy. */
1004
+ fieldSlot(className, field) {
1005
+ return `f:${this.rootOf(className)}\0${field}`;
1006
+ }
1007
+ localSlot(fn, id) {
1008
+ return id.startsWith("%g.") ? `g:${id}` : `l:${fn.name}\0${id}`;
1009
+ }
1010
+ /** The slot of the array, Map or Set an expression makes. */
1011
+ site(fn, e) {
1012
+ let slot = this.sites.get(e);
1013
+ if (slot === undefined)
1014
+ this.sites.set(e, (slot = `a:${fn.name}\0${this.sites.size}`));
1015
+ return slot;
1016
+ }
1017
+ /** Whether values of `t` can be arrays a planned field holds: arrays of
1018
+ * a class in the element classes' hierarchies, directly or as a union
1019
+ * arm. */
1020
+ holdsFieldArray(t) {
1021
+ if (t.kind === "array")
1022
+ return t.elem.kind === "object" && this.elementRoots.has(this.rootOf(t.elem.className));
1023
+ if (t.kind === "union")
1024
+ return this.arms(t).some((arm) => this.holdsFieldArray(arm));
1025
+ return false;
1026
+ }
1027
+ /** Whether values of `t` can be, or be arrays, Maps or Sets that contain,
1028
+ * arrays a planned field holds: the values the graph follows. */
1029
+ followed(t, depth = 0) {
1030
+ if (depth > 4)
1031
+ return false;
1032
+ const key = typeKey(t);
1033
+ const known = this.followedTypes.get(key);
1034
+ if (known !== undefined)
1035
+ return known;
1036
+ let result;
1037
+ switch (t.kind) {
1038
+ case "array":
1039
+ result = this.holdsFieldArray(t) || this.followed(t.elem, depth + 1);
1040
+ break;
1041
+ case "set":
1042
+ result = this.followed(t.elem, depth + 1);
1043
+ break;
1044
+ case "map":
1045
+ result = this.followed(t.key, depth + 1) || this.followed(t.value, depth + 1);
1046
+ break;
1047
+ case "union":
1048
+ result = this.arms(t).some((arm) => this.followed(arm, depth + 1));
1049
+ break;
1050
+ default:
1051
+ result = false;
1052
+ }
1053
+ this.followedTypes.set(key, result);
1054
+ return result;
1055
+ }
1056
+ arms(t) {
1057
+ return (this.mod.unions ?? []).find((u) => u.id === t.unionId)?.arms ?? [];
1058
+ }
1059
+ /** The slots the value of `e` may come from. */
1060
+ slotsOf(fn, e) {
1061
+ const contents = (inner) => this.slotsOf(fn, inner).map((s) => `c:${s}`);
1062
+ const children = () => {
1063
+ const out = [];
1064
+ everyExprChild(e, (child) => {
1065
+ out.push(...this.slotsOf(fn, child));
1066
+ return true;
1067
+ }, () => true);
1068
+ return out;
1069
+ };
1070
+ switch (e.kind) {
1071
+ case "fieldGet":
1072
+ if (!this.isFieldRead(e))
1073
+ return [this.fieldSlot(e.className, e.field)];
1074
+ return [this.seed(fn, e)];
1075
+ case "varRef":
1076
+ return [this.localSlot(fn, e.localId)];
1077
+ case "call":
1078
+ case "virtualCall": {
1079
+ const slots = [];
1080
+ for (const { callee, offset } of this.callees(e)) {
1081
+ slots.push(`r:${callee}`);
1082
+ for (const i of this.returnedParams.get(callee) ?? NO_INDEXES) {
1083
+ const arg = e.args[i - offset];
1084
+ if (arg !== undefined)
1085
+ slots.push(...this.slotsOf(fn, arg));
1086
+ }
1087
+ }
1088
+ return slots;
1089
+ }
1090
+ case "recordGet":
1091
+ return e.obj.type.kind === "record" ? [`s:${e.obj.type.shapeId}\0${e.field}`] : [];
1092
+ case "arrayGet":
1093
+ return contents(e.arr);
1094
+ case "mapIntrinsic":
1095
+ case "setIntrinsic":
1096
+ if (e.method === "set" || e.method === "add")
1097
+ return this.slotsOf(fn, e.receiver);
1098
+ if (e.method === "clone" || e.method === "keySet" || e.method === "valueSet")
1099
+ return [this.site(fn, e)];
1100
+ return contents(e.receiver);
1101
+ case "arrIntrinsic":
1102
+ if (RETURNS_RECEIVER.has(e.method))
1103
+ return this.slotsOf(fn, e.receiver);
1104
+ if (e.method === "pop" || e.method === "shift")
1105
+ return contents(e.receiver);
1106
+ if (ARR_COPIES.has(e.method) || e.method === "splice" || e.method === "spliceInsert")
1107
+ return [this.site(fn, e)];
1108
+ return [];
1109
+ case "arrayLit":
1110
+ case "setNew":
1111
+ case "mapNew":
1112
+ return [this.site(fn, e)];
1113
+ case "callValue":
1114
+ return ["r:*"];
1115
+ case "seqExpr":
1116
+ return this.slotsOf(fn, e.result);
1117
+ case "ternary":
1118
+ return [...this.slotsOf(fn, e.then), ...this.slotsOf(fn, e.else_)];
1119
+ case "logical":
1120
+ case "nullish":
1121
+ case "orDefault":
1122
+ return children();
1123
+ default:
1124
+ return PASS_THROUGH.has(e.kind) ? children() : [];
1125
+ }
1126
+ }
1127
+ /** The slot of a read of an inline field. */
1128
+ seed(fn, e) {
1129
+ const slot = this.site(fn, e).replace(/^a:/, "v:");
1130
+ if (!this.seeds.has(slot)) {
1131
+ this.seeds.set(slot, e.loc);
1132
+ this.pinned.set(slot, e.loc);
1133
+ if (e.kind === "fieldGet")
1134
+ this.origins.set(e.loc, this.ownerOf(e.className));
1135
+ }
1136
+ return slot;
1137
+ }
1138
+ edge(from, to) {
1139
+ let list = this.edges.get(from);
1140
+ if (!list)
1141
+ this.edges.set(from, (list = new Set()));
1142
+ list.add(to);
1143
+ }
1144
+ /** Whether `e` may evaluate to an array an inline field holds. */
1145
+ pinnedExpr(fn, e) {
1146
+ return this.origin(fn, e) !== undefined;
1147
+ }
1148
+ /** The field read whose array `e` may be. */
1149
+ origin(fn, e) {
1150
+ if (!this.holdsFieldArray(e.type))
1151
+ return undefined;
1152
+ for (const slot of this.slotsOf(fn, e)) {
1153
+ const origin = this.pinned.get(slot);
1154
+ if (origin !== undefined)
1155
+ return origin;
1156
+ }
1157
+ return undefined;
1158
+ }
1159
+ /** The field read whose array values of type `t` in `slots`, or the
1160
+ * arrays, Maps, Sets and records inside them, may hold. */
1161
+ originWithin(slots, t, objects, depth = 0) {
1162
+ if (depth > 4)
1163
+ return undefined;
1164
+ if (depth > 0 && this.holdsFieldArray(t))
1165
+ for (const slot of slots) {
1166
+ const origin = this.pinned.get(slot);
1167
+ if (origin !== undefined)
1168
+ return origin;
1169
+ }
1170
+ const elements = slots.map((s) => `c:${s}`);
1171
+ switch (t.kind) {
1172
+ case "array":
1173
+ case "set":
1174
+ return this.originWithin(elements, t.elem, objects, depth + 1);
1175
+ case "map":
1176
+ return (this.originWithin(elements, t.key, objects, depth + 1) ??
1177
+ this.originWithin(elements, t.value, objects, depth + 1));
1178
+ case "union":
1179
+ for (const arm of this.arms(t)) {
1180
+ const origin = this.originWithin(slots, arm, objects, depth + 1);
1181
+ if (origin !== undefined)
1182
+ return origin;
1183
+ }
1184
+ return undefined;
1185
+ case "record":
1186
+ for (const f of (this.mod.records ?? []).find((r) => r.id === t.shapeId)?.fields ?? []) {
1187
+ const origin = this.originWithin([`s:${t.shapeId}\0${f.name}`], f.type, objects, depth + 1);
1188
+ if (origin !== undefined)
1189
+ return origin;
1190
+ }
1191
+ return undefined;
1192
+ // Code that reads an instance's fields by name (a dynamic view) can
1193
+ // reach the arrays they hold. Other code reads them through field
1194
+ // reads, which the graph follows.
1195
+ case "object":
1196
+ return objects ? this.objectOrigin(t.className, depth) : undefined;
1197
+ default:
1198
+ return undefined;
1199
+ }
1200
+ }
1201
+ /** `originWithin` through objects for an instance of `className` or of a
1202
+ * subclass: the arrays its fields may hold. An inline field is left out: its reads are
1203
+ * followed where they are. By `className\0depth`. */
1204
+ objectOrigins = new Map();
1205
+ objectOrigin(className, depth) {
1206
+ const key = `${className}\0${depth}`;
1207
+ const known = this.objectOrigins.get(key);
1208
+ if (known !== undefined)
1209
+ return known ?? undefined;
1210
+ // A cycle through fields finds nothing new.
1211
+ this.objectOrigins.set(key, null);
1212
+ let found;
1213
+ const visit = (name) => {
1214
+ const cls = this.classDefs.get(name);
1215
+ if (cls === undefined)
1216
+ return;
1217
+ const inline = this.plan.classes.get(name)?.field;
1218
+ for (const f of cls.fields) {
1219
+ if (found !== undefined)
1220
+ return;
1221
+ if (f.name === inline)
1222
+ continue;
1223
+ found = this.originWithin([this.fieldSlot(name, f.name)], f.type, true, depth + 1);
1224
+ }
1225
+ for (const sub of this.subclasses.get(name) ?? [])
1226
+ if (found === undefined)
1227
+ visit(sub);
1228
+ };
1229
+ visit(className);
1230
+ this.objectOrigins.set(key, found ?? null);
1231
+ return found;
1232
+ }
1233
+ /** The slots of the parameters of `fn` that only ever hold the caller's
1234
+ * arguments (never assigned or captured), by index. */
1235
+ ownParams(fn) {
1236
+ const index = this.index(fn);
1237
+ const own = new Map();
1238
+ if (fn.async || fn.generator)
1239
+ return own;
1240
+ fn.params.forEach((p, i) => {
1241
+ if (!index.assigned.has(p.localId) && !index.captured.has(p.localId))
1242
+ own.set(this.localSlot(fn, p.localId), i);
1243
+ });
1244
+ return own;
1245
+ }
1246
+ /** The parameters each function may return as they came, directly or
1247
+ * through its locals, to a fixpoint (a returned call gives back what its
1248
+ * callee does). A call's value is then the arguments passed there, not a
1249
+ * result every caller shares. */
1250
+ computeReturnedParams() {
1251
+ for (let changed = true; changed;) {
1252
+ changed = false;
1253
+ for (const fn of this.mod.functions) {
1254
+ const own = this.ownParams(fn);
1255
+ if (own.size === 0 || !this.followed(fn.returnType))
1256
+ continue;
1257
+ // The function's locals that take a value from another of them.
1258
+ const local = `l:${fn.name}\0`;
1259
+ const aliases = new Map();
1260
+ const returned = new Set();
1261
+ const alias = (to, value) => {
1262
+ for (const from of this.slotsOf(fn, value)) {
1263
+ if (!from.startsWith(local))
1264
+ continue;
1265
+ let set = aliases.get(from);
1266
+ if (!set)
1267
+ aliases.set(from, (set = new Set()));
1268
+ set.add(to);
1269
+ }
1270
+ };
1271
+ const expr = (e) => {
1272
+ if (e.kind === "assignExpr")
1273
+ alias(this.localSlot(fn, e.localId), e.value);
1274
+ return everyExprChild(e, expr, stmt);
1275
+ };
1276
+ const stmt = (s) => {
1277
+ if (s.kind === "varDecl" && s.init)
1278
+ alias(this.localSlot(fn, s.localId), s.init);
1279
+ else if (s.kind === "assign")
1280
+ alias(this.localSlot(fn, s.localId), s.value);
1281
+ else if (s.kind === "return" && s.value)
1282
+ for (const slot of this.slotsOf(fn, s.value))
1283
+ returned.add(slot);
1284
+ return everyStmtChild(s, expr, stmt);
1285
+ };
1286
+ for (const s of fn.body)
1287
+ stmt(s);
1288
+ // From each parameter, the locals it reaches; those that reach a
1289
+ // return carry it back to the caller.
1290
+ const carriers = new Set();
1291
+ let set = this.returnedParams.get(fn.name);
1292
+ for (const [param, i] of own) {
1293
+ const reached = new Map([[param, null]]);
1294
+ const queue = [param];
1295
+ while (queue.length > 0)
1296
+ for (const to of aliases.get(queue.pop()) ?? NO_SLOTS)
1297
+ if (!reached.has(to)) {
1298
+ reached.set(to, null);
1299
+ queue.push(to);
1300
+ }
1301
+ const back = [...reached.keys()].filter((slot) => returned.has(slot));
1302
+ if (back.length === 0)
1303
+ continue;
1304
+ if (!set?.has(i)) {
1305
+ if (!set)
1306
+ this.returnedParams.set(fn.name, (set = new Set()));
1307
+ set.add(i);
1308
+ changed = true;
1309
+ }
1310
+ // The locals on the way from the parameter to a return.
1311
+ for (const slot of reached.keys())
1312
+ if (slot === param || this.reaches(aliases, slot, back))
1313
+ carriers.add(slot);
1314
+ }
1315
+ if (carriers.size > 0)
1316
+ this.returnCarriers.set(fn.name, carriers);
1317
+ }
1318
+ }
1319
+ }
1320
+ reaches(aliases, from, targets) {
1321
+ const seen = new Set([from]);
1322
+ const queue = [from];
1323
+ while (queue.length > 0) {
1324
+ const slot = queue.pop();
1325
+ if (targets.includes(slot))
1326
+ return true;
1327
+ for (const to of aliases.get(slot) ?? NO_SLOTS)
1328
+ if (!seen.has(to)) {
1329
+ seen.add(to);
1330
+ queue.push(to);
1331
+ }
1332
+ }
1333
+ return false;
1334
+ }
1335
+ /** Builds the graph and marks every slot a field read reaches. */
1336
+ computePinned() {
1337
+ this.computeReturnedParams();
1338
+ for (const fn of this.mod.functions)
1339
+ this.flow(fn, null);
1340
+ this.propagate([...this.seeds.keys()]);
1341
+ }
1342
+ /** Marks the slots the queued pinned slots reach. */
1343
+ propagate(queue) {
1344
+ const pin = (slot, origin) => {
1345
+ if (this.pinned.has(slot))
1346
+ return;
1347
+ this.pinned.set(slot, origin);
1348
+ queue.push(slot);
1349
+ };
1350
+ while (queue.length > 0) {
1351
+ const slot = queue.pop();
1352
+ const origin = this.pinned.get(slot);
1353
+ // The edges of the slot, and those of the slots whose elements it is.
1354
+ let prefix = "";
1355
+ for (let inner = slot;; inner = inner.slice(2)) {
1356
+ for (const to of this.edges.get(inner) ?? NO_SLOTS)
1357
+ pin(prefix + to, origin);
1358
+ if (!inner.startsWith("c:"))
1359
+ break;
1360
+ prefix += "c:";
1361
+ }
1362
+ }
1363
+ }
1364
+ /** Functions whose every result is an array nothing else keeps, or one
1365
+ * of their parameters (`passed`) that they only read, write in place and
1366
+ * return. */
1367
+ computeFactories() {
1368
+ for (let changed = true; changed;) {
1369
+ changed = false;
1370
+ for (const fn of this.mod.functions) {
1371
+ if (this.factories.has(fn.name) || fn.async || fn.generator)
1372
+ continue;
1373
+ if (!this.holdsFieldArray(fn.returnType))
1374
+ continue;
1375
+ let returns = 0;
1376
+ let ok = true;
1377
+ const passed = new Set();
1378
+ const shares = new Map();
1379
+ this.shareSink = shares;
1380
+ const visit = (s) => {
1381
+ if (s.kind === "return") {
1382
+ returns++;
1383
+ const local = s.value?.kind === "varRef" ? s.value.localId : null;
1384
+ const param = local !== null ? this.passedParam(fn, local) : -1;
1385
+ const carried = local !== null && param < 0 ? this.carrier(fn, local) : null;
1386
+ if (param >= 0)
1387
+ passed.add(param);
1388
+ else if (carried !== null && carried.size > 0)
1389
+ for (const i of carried) {
1390
+ if (this.passedParam(fn, fn.params[i].localId) < 0)
1391
+ ok = false;
1392
+ passed.add(i);
1393
+ }
1394
+ else if (!s.value || !this.fresh(fn, s.value))
1395
+ ok = false;
1396
+ }
1397
+ return ok && everyStmtChild(s, () => true, visit);
1398
+ };
1399
+ for (const s of fn.body)
1400
+ visit(s);
1401
+ this.shareSink = null;
1402
+ if (ok && returns > 0) {
1403
+ this.factories.add(fn.name);
1404
+ if (passed.size > 0)
1405
+ this.passed.set(fn.name, passed);
1406
+ if (shares.size > 0)
1407
+ this.factoryShares.set(fn.name, shares);
1408
+ changed = true;
1409
+ }
1410
+ }
1411
+ }
1412
+ }
1413
+ /** The index of the parameter `localId` when `fn` only reads it, writes
1414
+ * it in place and returns it, directly or through `carrier` locals; -1
1415
+ * otherwise. */
1416
+ passedParam(fn, localId) {
1417
+ const i = fn.params.findIndex((p) => p.localId === localId);
1418
+ if (i < 0)
1419
+ return -1;
1420
+ const index = this.index(fn);
1421
+ if (index.assigned.has(localId) || index.captured.has(localId))
1422
+ return -1;
1423
+ const uses = index.occurrences.get(localId) ?? [];
1424
+ const carried = (o) => {
1425
+ const { parent: p, child } = valueUse(o);
1426
+ if (p?.kind === "varDecl" && p.init === child)
1427
+ return this.carrier(fn, p.localId) !== null;
1428
+ if (p?.kind === "assign" && p.value === child)
1429
+ return this.carrier(fn, p.localId) !== null;
1430
+ return false;
1431
+ };
1432
+ return uses.every((o) => returned(o) || this.use(o) !== "other" || carried(o)) ? i : -1;
1433
+ }
1434
+ /** The parameters a local carries to a return when its values are fresh
1435
+ * arrays and parameters, and it is only read, written in place and
1436
+ * returned; null otherwise. */
1437
+ carrier(fn, localId) {
1438
+ if (fn.params.some((p) => p.localId === localId))
1439
+ return null;
1440
+ const index = this.index(fn);
1441
+ if (index.assignedByExpr.has(localId) || index.captured.has(localId))
1442
+ return null;
1443
+ const declarations = index.declarations.get(localId) ?? [];
1444
+ if (declarations.length !== 1)
1445
+ return null;
1446
+ const key = `carrier:${fn.name}\0${localId}`;
1447
+ if (this.inProgress.has(key))
1448
+ return null;
1449
+ this.inProgress.add(key);
1450
+ try {
1451
+ const init = declarations[0].stmt.init;
1452
+ const values = [
1453
+ init,
1454
+ ...(index.assignments.get(localId) ?? []).map((d) => d.stmt.value),
1455
+ ];
1456
+ const params = new Set();
1457
+ for (const v of values) {
1458
+ if (v === null || isUndefined(v))
1459
+ continue;
1460
+ const param = v.kind === "varRef" ? fn.params.findIndex((p) => p.localId === v.localId) : -1;
1461
+ if (param >= 0)
1462
+ params.add(param);
1463
+ else if (!this.fresh(fn, v))
1464
+ return null;
1465
+ }
1466
+ const uses = index.occurrences.get(localId) ?? [];
1467
+ return uses.every((o) => returned(o) || this.use(o) !== "other") ? params : null;
1468
+ }
1469
+ finally {
1470
+ this.inProgress.delete(key);
1471
+ }
1472
+ }
1473
+ /** One pass over `fn`: without `check`, the graph's edges; with it, the
1474
+ * writes and escapes of arrays fields may hold. */
1475
+ flow(fn, check) {
1476
+ const carriers = this.returnCarriers.get(fn.name);
1477
+ const hold = (to, value) => {
1478
+ if (check !== null || !this.followed(value.type))
1479
+ return;
1480
+ for (const from of this.slotsOf(fn, value)) {
1481
+ this.edge(from, to);
1482
+ if (carriers?.has(to) && !carriers.has(from))
1483
+ this.edge(from, `r:${fn.name}`);
1484
+ }
1485
+ };
1486
+ // Into the elements of the arrays, Maps or Sets `container` may be.
1487
+ const store = (container, value) => {
1488
+ const slots = typeof container === "string" ? [container] : this.slotsOf(fn, container);
1489
+ for (const slot of slots)
1490
+ hold(`c:${slot}`, value);
1491
+ };
1492
+ // The elements of `from` join those of `to`.
1493
+ const spread = (from, to) => {
1494
+ if (check !== null)
1495
+ return;
1496
+ const targets = typeof to === "string" ? [to] : this.slotsOf(fn, to);
1497
+ for (const a of this.slotsOf(fn, from))
1498
+ for (const b of targets)
1499
+ this.edge(`c:${a}`, `c:${b}`);
1500
+ };
1501
+ const write = (target, loc, what) => {
1502
+ if (check === null)
1503
+ return;
1504
+ const origin = this.origin(fn, target);
1505
+ if (origin !== undefined)
1506
+ check({
1507
+ loc,
1508
+ origin,
1509
+ reason: `${what} writes to an array that may be an InlineArray field's`,
1510
+ });
1511
+ };
1512
+ // `deep`: arrays inside the value escape too (dynamic and library code
1513
+ // reads them other than through the reads this pass follows).
1514
+ // `objects`: through the fields of class instances too (a dynamic view
1515
+ // reads them by name).
1516
+ const escape = (value, loc, what, deep = true, objects = false) => {
1517
+ if (check === null)
1518
+ return;
1519
+ const origin = this.origin(fn, value) ??
1520
+ (deep ? this.originWithin(this.slotsOf(fn, value), value.type, objects) : undefined);
1521
+ if (origin !== undefined)
1522
+ check({
1523
+ loc,
1524
+ origin,
1525
+ reason: `an array that may be an InlineArray field's reaches ${what}, where writes are not checked`,
1526
+ });
1527
+ };
1528
+ // Comparisons by identity of an array a field read may give.
1529
+ const identity = (value, loc) => {
1530
+ if (check === null)
1531
+ return;
1532
+ const origin = this.origin(fn, value);
1533
+ if (origin !== undefined)
1534
+ check({
1535
+ loc,
1536
+ origin,
1537
+ reason: IDENTITY_REASON,
1538
+ });
1539
+ };
1540
+ // The same for the elements of an array or Set, or the values of a Map,
1541
+ // that become a new Set's elements.
1542
+ const elementIdentity = (container, loc) => {
1543
+ if (check === null)
1544
+ return;
1545
+ const t = container.type;
1546
+ const elem = t.kind === "array" || t.kind === "set" ? t.elem : t.kind === "map" ? t.value : null;
1547
+ if (elem === null || !this.holdsFieldArray(elem))
1548
+ return;
1549
+ for (const slot of this.slotsOf(fn, container)) {
1550
+ const origin = this.pinned.get(`c:${slot}`);
1551
+ if (origin === undefined)
1552
+ continue;
1553
+ check({
1554
+ loc,
1555
+ origin,
1556
+ reason: IDENTITY_REASON,
1557
+ });
1558
+ return;
1559
+ }
1560
+ };
1561
+ const args = (call) => {
1562
+ const callees = this.callees(call);
1563
+ for (const { callee, offset } of callees) {
1564
+ const target = this.functions.get(callee);
1565
+ call.args.forEach((arg, i) => {
1566
+ const param = target?.params[i + offset];
1567
+ if (!target || !param)
1568
+ return escape(arg, call.loc, `a call to ${callee}`);
1569
+ hold(`l:${callee}\0${param.localId}`, arg);
1570
+ });
1571
+ }
1572
+ if (callees.length === 0)
1573
+ for (const arg of call.args)
1574
+ escape(arg, call.loc, "a method call");
1575
+ };
1576
+ // Dynamic values a library call that only reads them makes for it.
1577
+ const readSinks = new Set();
1578
+ const expr = (e) => {
1579
+ switch (e.kind) {
1580
+ case "assignExpr":
1581
+ hold(this.localSlot(fn, e.localId), e.value);
1582
+ break;
1583
+ case "call":
1584
+ case "new":
1585
+ case "virtualCall":
1586
+ args(e);
1587
+ break;
1588
+ case "bin":
1589
+ if (e.op === "===" || e.op === "!==") {
1590
+ identity(e.left, e.loc);
1591
+ identity(e.right, e.loc);
1592
+ }
1593
+ break;
1594
+ case "unionEq":
1595
+ identity(e.left, e.loc);
1596
+ identity(e.right, e.loc);
1597
+ break;
1598
+ case "arrIntrinsic": {
1599
+ if (!ARR_READS.has(e.method))
1600
+ write(e.receiver, e.loc, `'${e.method}'`);
1601
+ if (IDENTITY_SEARCHES.has(e.method))
1602
+ for (const a of e.args)
1603
+ identity(a, e.loc);
1604
+ // Copies hold the receiver's elements, and the arguments they add.
1605
+ const copy = ARR_COPIES.has(e.method) || e.method === "splice" || e.method === "spliceInsert";
1606
+ const into = copy ? this.site(fn, e) : e.receiver;
1607
+ if (copy)
1608
+ spread(e.receiver, into);
1609
+ for (const a of e.args)
1610
+ if (SPREADS.has(e.method) && typeKey(a.type) === typeKey(e.receiver.type))
1611
+ spread(a, into);
1612
+ else
1613
+ store(into, a);
1614
+ break;
1615
+ }
1616
+ case "mapIntrinsic":
1617
+ case "setIntrinsic":
1618
+ // Keys and Set elements are compared by identity, and so are a
1619
+ // Map's values when they become a Set's elements.
1620
+ if (e.args[0] !== undefined && KEYED.has(e.method))
1621
+ identity(e.args[0], e.loc);
1622
+ if (e.method === "valueSet")
1623
+ elementIdentity(e.receiver, e.loc);
1624
+ if (e.method === "set" || e.method === "add")
1625
+ for (const a of e.args)
1626
+ store(e.receiver, a);
1627
+ else if (e.method === "clone" || e.method === "keySet" || e.method === "valueSet")
1628
+ spread(e.receiver, this.site(fn, e));
1629
+ break;
1630
+ case "arrayLit":
1631
+ e.elems.forEach((x, i) => {
1632
+ if (e.spreads?.includes(i))
1633
+ spread(x, this.site(fn, e));
1634
+ else
1635
+ store(this.site(fn, e), x);
1636
+ });
1637
+ break;
1638
+ case "setNew":
1639
+ if (e.seed) {
1640
+ // The seed's elements become Set elements.
1641
+ elementIdentity(e.seed, e.loc);
1642
+ spread(e.seed, this.site(fn, e));
1643
+ }
1644
+ break;
1645
+ case "mapNew":
1646
+ for (const { key, value } of e.seed ?? []) {
1647
+ identity(key, e.loc);
1648
+ store(this.site(fn, e), key);
1649
+ store(this.site(fn, e), value);
1650
+ }
1651
+ break;
1652
+ case "recordLit":
1653
+ if (e.type.kind === "record") {
1654
+ const shape = e.type.shapeId;
1655
+ for (const f of e.fields)
1656
+ hold(`s:${shape}\0${f.name}`, f.value);
1657
+ }
1658
+ break;
1659
+ case "closure": {
1660
+ const lifted = this.functions.get(e.fnName);
1661
+ // A captured local is one binding on both sides.
1662
+ if (check === null)
1663
+ e.captures.forEach((id, i) => {
1664
+ const inner = lifted?.captures?.[i];
1665
+ if (inner === undefined)
1666
+ return;
1667
+ const outer = this.localSlot(fn, id);
1668
+ const captured = `l:${lifted.name}\0${inner.localId}`;
1669
+ this.edge(outer, captured);
1670
+ this.edge(captured, outer);
1671
+ });
1672
+ break;
1673
+ }
1674
+ case "dynFrom":
1675
+ case "caughtToDyn":
1676
+ if (!readSinks.has(e))
1677
+ escape(e.value, e.loc, "a dynamic value", true, true);
1678
+ break;
1679
+ case "callValue":
1680
+ for (const a of e.args)
1681
+ escape(a, e.loc, "a call through a function value");
1682
+ break;
1683
+ case "intrinsic":
1684
+ // Printing reads its arguments; publishing freezes them.
1685
+ if (e.name.startsWith("console.") || e.name === "threads.publish") {
1686
+ for (const a of e.args)
1687
+ if (a.kind === "dynFrom")
1688
+ readSinks.add(a);
1689
+ }
1690
+ else
1691
+ for (const a of e.args)
1692
+ escape(a, e.loc, `'${e.name}'`);
1693
+ break;
1694
+ case "libCall":
1695
+ if (readsArguments(e)) {
1696
+ for (const a of e.args)
1697
+ if (a.kind === "dynFrom")
1698
+ readSinks.add(a);
1699
+ }
1700
+ else
1701
+ for (const a of e.args)
1702
+ escape(a, e.loc, `the library call ${e.fn}`);
1703
+ break;
1704
+ default:
1705
+ // Any other parent takes its child somewhere this pass does not
1706
+ // follow.
1707
+ if (!MODELLED.has(e.kind))
1708
+ everyExprChild(e, (child) => {
1709
+ escape(child, e.loc, `a '${e.kind}' expression`);
1710
+ return true;
1711
+ }, () => true);
1712
+ }
1713
+ return everyExprChild(e, expr, stmt);
1714
+ };
1715
+ const stmt = (s) => {
1716
+ switch (s.kind) {
1717
+ case "varDecl":
1718
+ if (s.init)
1719
+ hold(this.localSlot(fn, s.localId), s.init);
1720
+ break;
1721
+ case "assign":
1722
+ hold(this.localSlot(fn, s.localId), s.value);
1723
+ break;
1724
+ case "return":
1725
+ if (s.value === null)
1726
+ break;
1727
+ // A promise or iterator holds the value.
1728
+ if (fn.async || fn.generator)
1729
+ escape(s.value, s.loc, "the result of an async function or generator");
1730
+ // A parameter returned as it came is the caller's argument. The
1731
+ // result of a function value may be any such function's.
1732
+ else if (check === null && this.followed(s.value.type))
1733
+ for (const from of this.slotsOf(fn, s.value)) {
1734
+ if (carriers?.has(from))
1735
+ continue;
1736
+ this.edge(from, `r:${fn.name}`);
1737
+ if (this.escapedFunctions.has(fn.name))
1738
+ this.edge(from, "r:*");
1739
+ }
1740
+ break;
1741
+ case "fieldSet":
1742
+ hold(this.fieldSlot(s.className, s.field), s.value);
1743
+ break;
1744
+ case "recordSet":
1745
+ hold(`s:${s.shapeId}\0${s.field}`, s.value);
1746
+ break;
1747
+ case "arraySet":
1748
+ write(s.arr, s.loc, "an element assignment");
1749
+ store(s.arr, s.value);
1750
+ break;
1751
+ case "arraySetLength":
1752
+ write(s.arr, s.loc, "a 'length' assignment");
1753
+ break;
1754
+ case "arraySetUndefined":
1755
+ case "arrayDelete":
1756
+ write(s.arr, s.loc, "an element assignment");
1757
+ break;
1758
+ case "forOf":
1759
+ // The binding takes the elements of an array, Map or Set.
1760
+ if (check === null)
1761
+ for (const from of this.slotsOf(fn, s.iterable))
1762
+ this.edge(`c:${from}`, this.localSlot(fn, s.localId));
1763
+ break;
1764
+ case "throw":
1765
+ escape(s.value, s.loc, "a throw");
1766
+ break;
1767
+ case "recordKeySet":
1768
+ escape(s.value, s.loc, "a dynamically keyed property");
1769
+ break;
1770
+ }
1771
+ return everyStmtChild(s, expr, stmt);
1772
+ };
1773
+ for (const s of fn.body)
1774
+ stmt(s);
1775
+ }
1776
+ // ── Checks ──
1777
+ /** Every inline `new` passes an array nothing else keeps (or a field's). */
1778
+ checkSources() {
1779
+ const shared = new Map();
1780
+ this.shareSink = shared;
1781
+ this.checkConstructions();
1782
+ this.shareSink = null;
1783
+ // The shared arrays are followed from their definitions.
1784
+ const queue = [];
1785
+ for (const [slot, loc] of shared)
1786
+ if (!this.pinned.has(slot)) {
1787
+ this.pinned.set(slot, loc);
1788
+ queue.push(slot);
1789
+ }
1790
+ this.propagate(queue);
1791
+ }
1792
+ checkConstructions() {
1793
+ for (const fn of this.mod.functions)
1794
+ this.eachExpr(fn, (e) => {
1795
+ const inline = this.inlineNew(e);
1796
+ if (inline !== null && e.kind === "new") {
1797
+ const arg = e.args[inline.arg];
1798
+ if (arg !== undefined && !this.fresh(fn, arg))
1799
+ this.report({
1800
+ loc: arg.loc,
1801
+ reason: "the array passed to the constructor may be kept elsewhere (pass a new array, a copy, or a local array's last use)",
1802
+ }, this.ownerOf(e.className));
1803
+ }
1804
+ if (inline !== null || (e.kind !== "call" && e.kind !== "new" && e.kind !== "virtualCall"))
1805
+ return;
1806
+ e.args.forEach((arg, i) => {
1807
+ if (!this.consumes(e, i) || this.fresh(fn, arg))
1808
+ return;
1809
+ this.report({
1810
+ loc: arg.loc,
1811
+ reason: "the array passed here moves into an InlineArray field but may be kept elsewhere (pass a new array, a copy, or a local array's last use)",
1812
+ });
1813
+ });
1814
+ });
1815
+ }
1816
+ checkWrites() {
1817
+ for (const fn of this.mod.functions)
1818
+ this.flow(fn, (issue) => this.report(issue));
1819
+ }
1820
+ ownerOf(className) {
1821
+ const cls = this.plan.classes.get(className);
1822
+ return { declaringClass: cls.declaringClass, field: cls.field };
1823
+ }
1824
+ }
1825
+ //# sourceMappingURL=inline-array-sources.js.map