@scriptc/compiler 0.4.1 → 0.4.3

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 (999) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +977 -113
  2. package/dist/backend/cycle-analysis.d.ts +5 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +9 -1
  8. package/dist/backend/cycle-mutability.js +21 -3
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +6 -1
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +7 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +5 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +23 -4
  18. package/dist/backend/llvm/alloc.js +61 -8
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +23 -10
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
  37. package/dist/backend/llvm/bytes-loop-versions.js +567 -30
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +74 -1
  44. package/dist/backend/llvm/classes.js +364 -54
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +384 -17
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +10 -6
  49. package/dist/backend/llvm/common.js +10 -6
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +91 -56
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  55. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  56. package/dist/backend/llvm/counted-loops.d.ts +11 -1
  57. package/dist/backend/llvm/counted-loops.js +80 -23
  58. package/dist/backend/llvm/counted-loops.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
  65. package/dist/backend/llvm/dense-array-loops.js +237 -12
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +140 -15
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +51 -1
  72. package/dist/backend/llvm/dyn.js +683 -69
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +33 -26
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +208 -34
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -27
  82. package/dist/backend/llvm/emit-statements.js +577 -93
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +314 -49
  88. package/dist/backend/llvm/emitter.js +1241 -129
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +54 -5
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +19 -0
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  95. package/dist/backend/llvm/expr-bytes.js +144 -52
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.js +47 -0
  98. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  99. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  100. package/dist/backend/llvm/expr-calls.js +62 -36
  101. package/dist/backend/llvm/expr-calls.js.map +1 -1
  102. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  103. package/dist/backend/llvm/expr-containers.js +148 -40
  104. package/dist/backend/llvm/expr-containers.js.map +1 -1
  105. package/dist/backend/llvm/expr-context.d.ts +14 -0
  106. package/dist/backend/llvm/expr-control.js +2 -3
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dynamic.js +71 -16
  109. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  110. package/dist/backend/llvm/expr-primitives.js +126 -36
  111. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  112. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  113. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-records.d.ts +12 -0
  115. package/dist/backend/llvm/expr-records.js +106 -0
  116. package/dist/backend/llvm/expr-records.js.map +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  118. package/dist/backend/llvm/expr-stream-bridges.js +225 -64
  119. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  121. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  126. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  127. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  128. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  129. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  130. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  131. package/dist/backend/llvm/integer-values.d.ts +20 -1
  132. package/dist/backend/llvm/integer-values.js +71 -0
  133. package/dist/backend/llvm/integer-values.js.map +1 -1
  134. package/dist/backend/llvm/js-ic.d.ts +1 -1
  135. package/dist/backend/llvm/js-ic.js +1 -1
  136. package/dist/backend/llvm/js-ic.js.map +1 -1
  137. package/dist/backend/llvm/key-orders.d.ts +7 -0
  138. package/dist/backend/llvm/key-orders.js +33 -0
  139. package/dist/backend/llvm/key-orders.js.map +1 -0
  140. package/dist/backend/llvm/lib-connect.js +4 -0
  141. package/dist/backend/llvm/lib-connect.js.map +1 -1
  142. package/dist/backend/llvm/lib-datagram.js +11 -0
  143. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  144. package/dist/backend/llvm/lib-dispatch.js +90 -2
  145. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  146. package/dist/backend/llvm/lib-filesystem.js +65 -4
  147. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  148. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  149. package/dist/backend/llvm/lib-http2.js +24 -17
  150. package/dist/backend/llvm/lib-http2.js.map +1 -1
  151. package/dist/backend/llvm/lib-lookup.js +16 -6
  152. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  153. package/dist/backend/llvm/lib-process.js +65 -14
  154. package/dist/backend/llvm/lib-process.js.map +1 -1
  155. package/dist/backend/llvm/lib-shared.js +126 -3
  156. package/dist/backend/llvm/lib-shared.js.map +1 -1
  157. package/dist/backend/llvm/lib-stream.js +97 -30
  158. package/dist/backend/llvm/lib-stream.js.map +1 -1
  159. package/dist/backend/llvm/lib-tls.js +23 -0
  160. package/dist/backend/llvm/lib-tls.js.map +1 -1
  161. package/dist/backend/llvm/local-array-reads.js +181 -64
  162. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  163. package/dist/backend/llvm/local-array-reads.test.js +28 -0
  164. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  165. package/dist/backend/llvm/loop-state.d.ts +33 -0
  166. package/dist/backend/llvm/loop-state.js +42 -0
  167. package/dist/backend/llvm/loop-state.js.map +1 -0
  168. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  169. package/dist/backend/llvm/map-number-lookup.js +91 -31
  170. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  171. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  172. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  173. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  176. package/dist/backend/llvm/nullable-unions.js +15 -3
  177. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  178. package/dist/backend/llvm/publish.d.ts +18 -1
  179. package/dist/backend/llvm/publish.js +76 -25
  180. package/dist/backend/llvm/publish.js.map +1 -1
  181. package/dist/backend/llvm/publish.test.js +3 -0
  182. package/dist/backend/llvm/publish.test.js.map +1 -1
  183. package/dist/backend/llvm/receivers.js +7 -2
  184. package/dist/backend/llvm/receivers.js.map +1 -1
  185. package/dist/backend/llvm/record-results.d.ts +1 -9
  186. package/dist/backend/llvm/record-results.js +2 -11
  187. package/dist/backend/llvm/record-results.js.map +1 -1
  188. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  189. package/dist/backend/llvm/reference-writes.js +91 -72
  190. package/dist/backend/llvm/reference-writes.js.map +1 -1
  191. package/dist/backend/llvm/regex-matchers.js +161 -14
  192. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  193. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  194. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  195. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  196. package/dist/backend/llvm/running-extrema.js +115 -0
  197. package/dist/backend/llvm/running-extrema.js.map +1 -0
  198. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  199. package/dist/backend/llvm/running-extrema.test.js +89 -0
  200. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  201. package/dist/backend/llvm/shapes.d.ts +79 -21
  202. package/dist/backend/llvm/shapes.js +233 -42
  203. package/dist/backend/llvm/shapes.js.map +1 -1
  204. package/dist/backend/llvm/shapes.test.js +53 -7
  205. package/dist/backend/llvm/shapes.test.js.map +1 -1
  206. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  207. package/dist/backend/llvm/speculative-integers.js +2 -2
  208. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  209. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  210. package/dist/backend/llvm/stack-objects.js +5 -2
  211. package/dist/backend/llvm/stack-objects.js.map +1 -1
  212. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  213. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  214. package/dist/backend/llvm/string-reads.d.ts +15 -0
  215. package/dist/backend/llvm/string-reads.js +128 -0
  216. package/dist/backend/llvm/string-reads.js.map +1 -1
  217. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  218. package/dist/backend/llvm/walk-borrows.js +46 -41
  219. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  220. package/dist/backend/llvm/walkers.d.ts +3 -0
  221. package/dist/backend/llvm/walkers.js +88 -65
  222. package/dist/backend/llvm/walkers.js.map +1 -1
  223. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  224. package/dist/backend/llvm/wasm-modules.js +32 -9
  225. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  226. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  227. package/dist/backend/llvm/wrapping-sums.js +126 -0
  228. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  229. package/dist/backend/mangle.d.ts +3 -0
  230. package/dist/backend/mangle.js +5 -0
  231. package/dist/backend/mangle.js.map +1 -1
  232. package/dist/backend/may-throw.d.ts +8 -10
  233. package/dist/backend/may-throw.js +14 -10
  234. package/dist/backend/may-throw.js.map +1 -1
  235. package/dist/backend/native/contracts.d.ts +27 -4
  236. package/dist/backend/native/executable.js +31 -8
  237. package/dist/backend/native/executable.js.map +1 -1
  238. package/dist/backend/native/library.js +1 -0
  239. package/dist/backend/native/library.js.map +1 -1
  240. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  241. package/dist/backend/native/runtime-inputs.js +1 -0
  242. package/dist/backend/native/runtime-inputs.js.map +1 -1
  243. package/dist/backend/native-codegen.d.ts +11 -6
  244. package/dist/backend/native-codegen.js +36 -9
  245. package/dist/backend/native-codegen.js.map +1 -1
  246. package/dist/backend/native-codegen.test.js +0 -23
  247. package/dist/backend/native-codegen.test.js.map +1 -1
  248. package/dist/backend/native-link-info-core.d.ts +18 -4
  249. package/dist/backend/native-link-info-core.js.map +1 -1
  250. package/dist/backend/optimization.d.ts +2 -2
  251. package/dist/backend/publication.d.ts +12 -1
  252. package/dist/backend/publication.js +37 -14
  253. package/dist/backend/publication.js.map +1 -1
  254. package/dist/backend/publication.test.js +30 -0
  255. package/dist/backend/publication.test.js.map +1 -1
  256. package/dist/backend/result-slots.d.ts +16 -0
  257. package/dist/backend/result-slots.js +23 -0
  258. package/dist/backend/result-slots.js.map +1 -0
  259. package/dist/backend/runtime-abi.d.ts +2 -2
  260. package/dist/backend/runtime-abi.js +2 -2
  261. package/dist/backend/runtime-pack-core.d.ts +2 -1
  262. package/dist/backend/runtime-pack-core.js +2 -1
  263. package/dist/backend/runtime-pack-core.js.map +1 -1
  264. package/dist/backend/runtime-pack-targets.test.js +5 -1
  265. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  266. package/dist/backend/runtime-pack.d.ts +0 -21
  267. package/dist/backend/runtime-pack.js +0 -29
  268. package/dist/backend/runtime-pack.js.map +1 -1
  269. package/dist/backend/runtime-pack.test.js +10 -69
  270. package/dist/backend/runtime-pack.test.js.map +1 -1
  271. package/dist/backend/stack-observations.d.ts +2 -1
  272. package/dist/backend/stack-observations.js +67 -42
  273. package/dist/backend/stack-observations.js.map +1 -1
  274. package/dist/backend/target-diagnostics.js +33 -1
  275. package/dist/backend/target-diagnostics.js.map +1 -1
  276. package/dist/backend/warm-cache.js +4 -0
  277. package/dist/backend/warm-cache.js.map +1 -1
  278. package/dist/cli/command.js +26 -6
  279. package/dist/cli/command.js.map +1 -1
  280. package/dist/cli/usage.d.ts +5 -1
  281. package/dist/cli/usage.js +10 -5
  282. package/dist/cli/usage.js.map +1 -1
  283. package/dist/compat/fetch-profile.js +1 -1
  284. package/dist/compat/fetch-profile.js.map +1 -1
  285. package/dist/contracts/check.js +5 -4
  286. package/dist/contracts/check.js.map +1 -1
  287. package/dist/contracts/int32-elements.js +10 -2
  288. package/dist/contracts/int32-elements.js.map +1 -1
  289. package/dist/coverage/report.d.ts +7 -2
  290. package/dist/coverage/report.js +30 -3
  291. package/dist/coverage/report.js.map +1 -1
  292. package/dist/coverage/verdict-cache.d.ts +1 -0
  293. package/dist/coverage/verdict-cache.js +4 -0
  294. package/dist/coverage/verdict-cache.js.map +1 -1
  295. package/dist/coverage/verdict-semantic.js +4 -0
  296. package/dist/coverage/verdict-semantic.js.map +1 -1
  297. package/dist/diagnostics/diagnostic.d.ts +4 -0
  298. package/dist/diagnostics/diagnostic.js.map +1 -1
  299. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  300. package/dist/diagnostics/dynamic-tier.js +57 -0
  301. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  302. package/dist/diagnostics/envelope.d.ts +5 -1
  303. package/dist/diagnostics/envelope.js +6 -2
  304. package/dist/diagnostics/envelope.js.map +1 -1
  305. package/dist/executable/executable-cache.d.ts +25 -1
  306. package/dist/executable/executable-cache.js +60 -7
  307. package/dist/executable/executable-cache.js.map +1 -1
  308. package/dist/executable/executable-cache.test.js +46 -3
  309. package/dist/executable/executable-cache.test.js.map +1 -1
  310. package/dist/executable/prepare.js +3 -1
  311. package/dist/executable/prepare.js.map +1 -1
  312. package/dist/frontend/analysis.js +1 -0
  313. package/dist/frontend/analysis.js.map +1 -1
  314. package/dist/frontend/decl-projection.d.ts +41 -0
  315. package/dist/frontend/decl-projection.js +854 -0
  316. package/dist/frontend/decl-projection.js.map +1 -0
  317. package/dist/frontend/decl-projection.test.d.ts +1 -0
  318. package/dist/frontend/decl-projection.test.js +30 -0
  319. package/dist/frontend/decl-projection.test.js.map +1 -0
  320. package/dist/frontend/dispose-hook.d.ts +2 -0
  321. package/dist/frontend/dispose-hook.js +14 -0
  322. package/dist/frontend/dispose-hook.js.map +1 -0
  323. package/dist/frontend/dts-paths.d.ts +15 -0
  324. package/dist/frontend/dts-paths.js +25 -0
  325. package/dist/frontend/dts-paths.js.map +1 -1
  326. package/dist/frontend/input-tracker.d.ts +6 -0
  327. package/dist/frontend/input-tracker.js +51 -28
  328. package/dist/frontend/input-tracker.js.map +1 -1
  329. package/dist/frontend/input-tracker.test.js +19 -0
  330. package/dist/frontend/input-tracker.test.js.map +1 -1
  331. package/dist/frontend/jsx-entities.d.ts +4 -0
  332. package/dist/frontend/jsx-entities.js +259 -0
  333. package/dist/frontend/jsx-entities.js.map +1 -0
  334. package/dist/frontend/jsx-source.d.ts +71 -0
  335. package/dist/frontend/jsx-source.js +781 -0
  336. package/dist/frontend/jsx-source.js.map +1 -0
  337. package/dist/frontend/jsx-source.test.d.ts +1 -0
  338. package/dist/frontend/jsx-source.test.js +200 -0
  339. package/dist/frontend/jsx-source.test.js.map +1 -0
  340. package/dist/frontend/literal-values.test.js +8 -9
  341. package/dist/frontend/literal-values.test.js.map +1 -1
  342. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  343. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  344. package/dist/frontend/lowering/array-values.js +103 -4
  345. package/dist/frontend/lowering/array-values.js.map +1 -1
  346. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  347. package/dist/frontend/lowering/binding-analysis.js +2 -2
  348. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  350. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  351. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  353. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  355. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  356. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  357. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  358. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  359. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  361. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  362. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  363. package/dist/frontend/lowering/builtins/crypto.js +136 -5
  364. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  366. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  367. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  368. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  369. package/dist/frontend/lowering/builtins/dates.js +55 -26
  370. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  372. package/dist/frontend/lowering/builtins/dh.js +151 -0
  373. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  374. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  375. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  376. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  377. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  378. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  380. package/dist/frontend/lowering/builtins/errors.js +110 -0
  381. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  382. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  383. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  384. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  385. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  386. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  387. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  388. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  389. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  390. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  391. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  392. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  393. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  394. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  395. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/json.js +2 -1
  397. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  398. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  399. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  400. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  401. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  402. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  403. package/dist/frontend/lowering/builtins/numbers.js +18 -6
  404. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  405. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  406. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  407. package/dist/frontend/lowering/builtins/performance.js +3 -2
  408. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  409. package/dist/frontend/lowering/builtins/process.js +3 -2
  410. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  411. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  412. package/dist/frontend/lowering/builtins/promises.js +91 -4
  413. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  414. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  415. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  416. package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
  417. package/dist/frontend/lowering/builtins/readline.js +58 -9
  418. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/strings.js +13 -5
  420. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  421. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  422. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  423. package/dist/frontend/lowering/builtins/timers.js +1 -1
  424. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  425. package/dist/frontend/lowering/builtins/url.js +28 -4
  426. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/v8.js +2 -1
  428. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  429. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  430. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  431. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  432. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  433. package/dist/frontend/lowering/call-arguments.js +2 -1
  434. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  435. package/dist/frontend/lowering/call-signatures.js +13 -6
  436. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  437. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  438. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  439. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  440. package/dist/frontend/lowering/class-assertions.js +3 -2
  441. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  442. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  443. package/dist/frontend/lowering/class-callbacks.js +82 -12
  444. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  445. package/dist/frontend/lowering/class-construction.d.ts +6 -2
  446. package/dist/frontend/lowering/class-construction.js +25 -16
  447. package/dist/frontend/lowering/class-construction.js.map +1 -1
  448. package/dist/frontend/lowering/class-descriptors.js +1 -1
  449. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  450. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
  451. package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
  452. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  453. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
  454. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  455. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  456. package/dist/frontend/lowering/class-iterables.js +9 -1
  457. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  458. package/dist/frontend/lowering/class-method-mutations.js +35 -9
  459. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  460. package/dist/frontend/lowering/class-method-values.js +1 -1
  461. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  462. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  463. package/dist/frontend/lowering/class-protocols.js +64 -4
  464. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  465. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  466. package/dist/frontend/lowering/class-prototypes.js +67 -5
  467. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  468. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  469. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  470. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  471. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  472. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  473. package/dist/frontend/lowering/class-unions.js +2 -1
  474. package/dist/frontend/lowering/class-unions.js.map +1 -1
  475. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  476. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  477. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  478. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  479. package/dist/frontend/lowering/coercions/structural.js +99 -8
  480. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  481. package/dist/frontend/lowering/coercions/unions.js +8 -7
  482. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  483. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  484. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  485. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  486. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  487. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  488. package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
  489. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  490. package/dist/frontend/lowering/containers/array-concat.js +12 -1
  491. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  492. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  493. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  494. package/dist/frontend/lowering/containers/array-methods.js +21 -5
  495. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  496. package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
  497. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  498. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  499. package/dist/frontend/lowering/containers/bytes.js +131 -29
  500. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  501. package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
  502. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  503. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  504. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  505. package/dist/frontend/lowering/containers/collection-methods.js +15 -9
  506. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  507. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  508. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  509. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  510. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  511. package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
  512. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  513. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  514. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  515. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  516. package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
  517. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  518. package/dist/frontend/lowering/containers/string-replacement.js +45 -20
  519. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  520. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  521. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  522. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  523. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  524. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  525. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  526. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  527. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  528. package/dist/frontend/lowering/dispatch-sites.js +218 -0
  529. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  530. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  531. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  532. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  533. package/dist/frontend/lowering/divergences.js +9 -1
  534. package/dist/frontend/lowering/divergences.js.map +1 -1
  535. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  536. package/dist/frontend/lowering/dyn-streams.js +1 -1
  537. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  538. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  539. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  540. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  541. package/dist/frontend/lowering/error-methods.js +51 -2
  542. package/dist/frontend/lowering/error-methods.js.map +1 -1
  543. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  544. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  545. package/dist/frontend/lowering/expressions/binary.js +81 -5
  546. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  547. package/dist/frontend/lowering/expressions/element-access.js +107 -14
  548. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  549. package/dist/frontend/lowering/expressions/identifiers.js +79 -11
  550. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  551. package/dist/frontend/lowering/expressions/narrowing.js +130 -6
  552. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  553. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  554. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  555. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
  556. package/dist/frontend/lowering/expressions/object-literals.js +164 -56
  557. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  558. package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
  559. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  560. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  561. package/dist/frontend/lowering/expressions/property-access.js +211 -17
  562. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  563. package/dist/frontend/lowering/expressions/relational.js +267 -30
  564. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  565. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  566. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  567. package/dist/frontend/lowering/expressions/updates.js +85 -12
  568. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  569. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  570. package/dist/frontend/lowering/frozen-records.js +322 -0
  571. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  572. package/dist/frontend/lowering/function-returns.js +49 -0
  573. package/dist/frontend/lowering/function-returns.js.map +1 -1
  574. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  575. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  576. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  577. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  578. package/dist/frontend/lowering/generic-functions.js +455 -20
  579. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  580. package/dist/frontend/lowering/intern-tables.js +2 -1
  581. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  582. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  583. package/dist/frontend/lowering/iterable-values.js +297 -0
  584. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  585. package/dist/frontend/lowering/iterator-adapters.js +195 -9
  586. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  587. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  588. package/dist/frontend/lowering/js-class-fields.js +45 -10
  589. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  590. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  591. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  592. package/dist/frontend/lowering/json-require.js +2 -1
  593. package/dist/frontend/lowering/json-require.js.map +1 -1
  594. package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
  595. package/dist/frontend/lowering/key-order-witness.js +790 -25
  596. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  597. package/dist/frontend/lowering/key-order-witness.test.js +466 -10
  598. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  599. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  600. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  601. package/dist/frontend/lowering/lower-assert.js +6 -5
  602. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  603. package/dist/frontend/lowering/lower-async-iteration.js +7 -2
  604. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  605. package/dist/frontend/lowering/lower-calls.d.ts +11 -0
  606. package/dist/frontend/lowering/lower-calls.js +776 -126
  607. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  608. package/dist/frontend/lowering/lower-classes.d.ts +29 -2
  609. package/dist/frontend/lowering/lower-classes.js +581 -46
  610. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  611. package/dist/frontend/lowering/lower-dgram.js +6 -3
  612. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  613. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  614. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  615. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  616. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  617. package/dist/frontend/lowering/lower-exprs.js +126 -13
  618. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  619. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  620. package/dist/frontend/lowering/lower-functions.js +387 -72
  621. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  622. package/dist/frontend/lowering/lower-generators.js +41 -31
  623. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  624. package/dist/frontend/lowering/lower-global-value.js +6 -3
  625. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  626. package/dist/frontend/lowering/lower-inspect.js +28 -12
  627. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  628. package/dist/frontend/lowering/lower-mixins.js +2 -1
  629. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  630. package/dist/frontend/lowering/lower-mock.js +2 -1
  631. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  632. package/dist/frontend/lowering/lower-modules.js +47 -5
  633. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  634. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  635. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  636. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  637. package/dist/frontend/lowering/lower-namespaces.js +9 -4
  638. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  639. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  640. package/dist/frontend/lowering/lower-server.js +239 -61
  641. package/dist/frontend/lowering/lower-server.js.map +1 -1
  642. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  643. package/dist/frontend/lowering/lower-stdlib.js +42 -10
  644. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  645. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  646. package/dist/frontend/lowering/lower-stmts.js +622 -68
  647. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  648. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  649. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  650. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  651. package/dist/frontend/lowering/lower-stream.js +2055 -318
  652. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  653. package/dist/frontend/lowering/lower-timers.js +4 -3
  654. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  655. package/dist/frontend/lowering/lowerer.d.ts +197 -29
  656. package/dist/frontend/lowering/lowerer.js +862 -84
  657. package/dist/frontend/lowering/lowerer.js.map +1 -1
  658. package/dist/frontend/lowering/lowerer.test.js +21 -9
  659. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  660. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  661. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  662. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  663. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  664. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  665. package/dist/frontend/lowering/native-ffi.js +1 -1
  666. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  667. package/dist/frontend/lowering/new-target.d.ts +12 -0
  668. package/dist/frontend/lowering/new-target.js +280 -0
  669. package/dist/frontend/lowering/new-target.js.map +1 -0
  670. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  671. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  672. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  673. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  674. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  675. package/dist/frontend/lowering/private-brands.js +66 -15
  676. package/dist/frontend/lowering/private-brands.js.map +1 -1
  677. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  678. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  679. package/dist/frontend/lowering/require-initialization.js +2 -1
  680. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  681. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  682. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  683. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  684. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  685. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  686. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  687. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  688. package/dist/frontend/lowering/site-dependencies.js +84 -0
  689. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  690. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  691. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  692. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  693. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  694. package/dist/frontend/lowering/stable-names.js +35 -0
  695. package/dist/frontend/lowering/stable-names.js.map +1 -0
  696. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  697. package/dist/frontend/lowering/static-typeof.js +42 -3
  698. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  699. package/dist/frontend/lowering/strict-equality.js +2 -1
  700. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  701. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  702. package/dist/frontend/lowering/structural-positions.js +108 -0
  703. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  704. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  705. package/dist/frontend/lowering/surfaces.js +60 -32
  706. package/dist/frontend/lowering/surfaces.js.map +1 -1
  707. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  708. package/dist/frontend/lowering/undefined-index.js +82 -0
  709. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  710. package/dist/frontend/lowering/var-hoisting.js +66 -16
  711. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  712. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  713. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  714. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  715. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  716. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  717. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  718. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  719. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  720. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  721. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  722. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  723. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  724. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  725. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  726. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  727. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  728. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  729. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  730. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  731. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  732. package/dist/frontend/npm-static-type-exports.js +261 -0
  733. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  734. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  735. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  736. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  737. package/dist/frontend/npm-static-umd.d.ts +6 -0
  738. package/dist/frontend/npm-static-umd.js +203 -0
  739. package/dist/frontend/npm-static-umd.js.map +1 -0
  740. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  741. package/dist/frontend/npm-static-umd.test.js +105 -0
  742. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  743. package/dist/frontend/npm-static.d.ts +8 -0
  744. package/dist/frontend/npm-static.js +51 -22
  745. package/dist/frontend/npm-static.js.map +1 -1
  746. package/dist/frontend/package-shims.d.ts +3 -0
  747. package/dist/frontend/package-shims.js +71 -8
  748. package/dist/frontend/package-shims.js.map +1 -1
  749. package/dist/frontend/pipeline.js +18 -10
  750. package/dist/frontend/pipeline.js.map +1 -1
  751. package/dist/frontend/process-fork.d.ts +25 -0
  752. package/dist/frontend/process-fork.js +2 -0
  753. package/dist/frontend/process-fork.js.map +1 -0
  754. package/dist/frontend/program.d.ts +21 -1
  755. package/dist/frontend/program.js +586 -74
  756. package/dist/frontend/program.js.map +1 -1
  757. package/dist/frontend/program.test.js +44 -4
  758. package/dist/frontend/program.test.js.map +1 -1
  759. package/dist/frontend/services.d.ts +6 -0
  760. package/dist/frontend/services.js +18 -0
  761. package/dist/frontend/services.js.map +1 -1
  762. package/dist/frontend/token-equivalence.d.ts +3 -0
  763. package/dist/frontend/token-equivalence.js +409 -0
  764. package/dist/frontend/token-equivalence.js.map +1 -0
  765. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  766. package/dist/frontend/token-equivalence.test.js +67 -0
  767. package/dist/frontend/token-equivalence.test.js.map +1 -0
  768. package/dist/frontend/ts7/ast-node.d.ts +43 -7
  769. package/dist/frontend/ts7/ast-node.js +1176 -129
  770. package/dist/frontend/ts7/ast-node.js.map +1 -1
  771. package/dist/frontend/ts7/ast-node.test.js +84 -0
  772. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  773. package/dist/frontend/ts7/ast-wire.d.ts +29 -3
  774. package/dist/frontend/ts7/ast-wire.js +144 -31
  775. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  776. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  777. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  778. package/dist/frontend/ts7/ast.d.ts +23 -2
  779. package/dist/frontend/ts7/ast.js +143 -2
  780. package/dist/frontend/ts7/ast.js.map +1 -1
  781. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  782. package/dist/frontend/ts7/checker-backend.js +2 -2
  783. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  784. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  785. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  786. package/dist/frontend/ts7/checker.d.ts +17 -1
  787. package/dist/frontend/ts7/checker.js +82 -1
  788. package/dist/frontend/ts7/checker.js.map +1 -1
  789. package/dist/frontend/ts7/checker.test.js +9 -6
  790. package/dist/frontend/ts7/checker.test.js.map +1 -1
  791. package/dist/frontend/ts7/enums.d.ts +3 -3
  792. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  793. package/dist/frontend/ts7/enums.generated.js +21 -0
  794. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  795. package/dist/frontend/ts7/enums.js +19 -0
  796. package/dist/frontend/ts7/enums.js.map +1 -1
  797. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  798. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  799. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  800. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  801. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  802. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  803. package/dist/frontend/ts7/program-host.d.ts +7 -0
  804. package/dist/frontend/ts7/program-host.js +30 -4
  805. package/dist/frontend/ts7/program-host.js.map +1 -1
  806. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  807. package/dist/frontend/ts7/semantic-checker.js +25 -20
  808. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  809. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  810. package/dist/frontend/ts7/semantic-json.js +146 -0
  811. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  812. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  813. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  814. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  815. package/dist/frontend/ts7/semantic-model.js +67 -19
  816. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  817. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  818. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  819. package/dist/frontend/ts7/session.d.ts +14 -1
  820. package/dist/frontend/ts7/session.js +23 -1
  821. package/dist/frontend/ts7/session.js.map +1 -1
  822. package/dist/frontend/tsc-codes.d.ts +1 -1
  823. package/dist/frontend/tsc-codes.js +7 -0
  824. package/dist/frontend/tsc-codes.js.map +1 -1
  825. package/dist/frontend/type-mapper.d.ts +51 -7
  826. package/dist/frontend/type-mapper.js +456 -43
  827. package/dist/frontend/type-mapper.js.map +1 -1
  828. package/dist/frontend/type-mapper.test.js +1 -1
  829. package/dist/frontend/type-mapper.test.js.map +1 -1
  830. package/dist/frontend-process-args.d.ts +4 -0
  831. package/dist/frontend-process-args.js +52 -0
  832. package/dist/frontend-process-args.js.map +1 -0
  833. package/dist/frontend-process-args.test.d.ts +1 -0
  834. package/dist/frontend-process-args.test.js +47 -0
  835. package/dist/frontend-process-args.test.js.map +1 -0
  836. package/dist/frontend-process.d.ts +1 -0
  837. package/dist/frontend-process.js +23 -0
  838. package/dist/frontend-process.js.map +1 -0
  839. package/dist/heap-collection.d.ts +16 -0
  840. package/dist/heap-collection.js +42 -0
  841. package/dist/heap-collection.js.map +1 -0
  842. package/dist/heap-collection.test.d.ts +1 -0
  843. package/dist/heap-collection.test.js +59 -0
  844. package/dist/heap-collection.test.js.map +1 -0
  845. package/dist/heap-pressure.d.ts +2 -0
  846. package/dist/heap-pressure.js +12 -0
  847. package/dist/heap-pressure.js.map +1 -0
  848. package/dist/index.d.ts +2 -0
  849. package/dist/index.js +435 -89
  850. package/dist/index.js.map +1 -1
  851. package/dist/ir/analysis.js +5 -3
  852. package/dist/ir/analysis.js.map +1 -1
  853. package/dist/ir/array-length-stability.d.ts +4 -0
  854. package/dist/ir/array-length-stability.js +26 -6
  855. package/dist/ir/array-length-stability.js.map +1 -1
  856. package/dist/ir/array-length-stability.test.js +49 -0
  857. package/dist/ir/array-length-stability.test.js.map +1 -1
  858. package/dist/ir/builtin-effects.d.ts +7 -0
  859. package/dist/ir/builtin-effects.js +80 -0
  860. package/dist/ir/builtin-effects.js.map +1 -1
  861. package/dist/ir/builtin-signatures.d.ts +7 -1
  862. package/dist/ir/builtin-signatures.js +303 -21
  863. package/dist/ir/builtin-signatures.js.map +1 -1
  864. package/dist/ir/callback-specialization.d.ts +2 -1
  865. package/dist/ir/callback-specialization.js +23 -18
  866. package/dist/ir/callback-specialization.js.map +1 -1
  867. package/dist/ir/char-unit-locals.d.ts +19 -0
  868. package/dist/ir/char-unit-locals.js +185 -0
  869. package/dist/ir/char-unit-locals.js.map +1 -0
  870. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  871. package/dist/ir/char-unit-locals.test.js +94 -0
  872. package/dist/ir/char-unit-locals.test.js.map +1 -0
  873. package/dist/ir/final-fields.d.ts +3 -1
  874. package/dist/ir/final-fields.js +15 -17
  875. package/dist/ir/final-fields.js.map +1 -1
  876. package/dist/ir/function-references.d.ts +2 -0
  877. package/dist/ir/function-references.js +2 -0
  878. package/dist/ir/function-references.js.map +1 -1
  879. package/dist/ir/function-references.test.js +5 -0
  880. package/dist/ir/function-references.test.js.map +1 -1
  881. package/dist/ir/initializer-bindings.d.ts +2 -1
  882. package/dist/ir/initializer-bindings.js +27 -20
  883. package/dist/ir/initializer-bindings.js.map +1 -1
  884. package/dist/ir/int32-arrays.d.ts +108 -0
  885. package/dist/ir/int32-arrays.js +831 -0
  886. package/dist/ir/int32-arrays.js.map +1 -0
  887. package/dist/ir/int32-slots.d.ts +36 -6
  888. package/dist/ir/int32-slots.js +370 -171
  889. package/dist/ir/int32-slots.js.map +1 -1
  890. package/dist/ir/int32-slots.test.js +3 -1
  891. package/dist/ir/int32-slots.test.js.map +1 -1
  892. package/dist/ir/integer-loop-facts.d.ts +9 -4
  893. package/dist/ir/integer-loop-facts.js +93 -18
  894. package/dist/ir/integer-loop-facts.js.map +1 -1
  895. package/dist/ir/integer-loops.d.ts +49 -0
  896. package/dist/ir/integer-loops.js +202 -40
  897. package/dist/ir/integer-loops.js.map +1 -1
  898. package/dist/ir/integer-loops.test.js +211 -1
  899. package/dist/ir/integer-loops.test.js.map +1 -1
  900. package/dist/ir/integer-ranges.d.ts +5 -0
  901. package/dist/ir/integer-ranges.js +125 -12
  902. package/dist/ir/integer-ranges.js.map +1 -1
  903. package/dist/ir/integer-ranges.test.js +94 -0
  904. package/dist/ir/integer-ranges.test.js.map +1 -1
  905. package/dist/ir/ir.d.ts +87 -9
  906. package/dist/ir/ir.js +61 -2
  907. package/dist/ir/ir.js.map +1 -1
  908. package/dist/ir/ir.test.js +21 -1
  909. package/dist/ir/ir.test.js.map +1 -1
  910. package/dist/ir/js-ic.d.ts +19 -2
  911. package/dist/ir/js-ic.js +95 -11
  912. package/dist/ir/js-ic.js.map +1 -1
  913. package/dist/ir/js-ic.test.js +188 -0
  914. package/dist/ir/js-ic.test.js.map +1 -1
  915. package/dist/ir/node-index.d.ts +57 -0
  916. package/dist/ir/node-index.js +215 -0
  917. package/dist/ir/node-index.js.map +1 -0
  918. package/dist/ir/paired-while-loops.d.ts +25 -0
  919. package/dist/ir/paired-while-loops.js +335 -0
  920. package/dist/ir/paired-while-loops.js.map +1 -0
  921. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  922. package/dist/ir/paired-while-loops.test.js +163 -0
  923. package/dist/ir/paired-while-loops.test.js.map +1 -0
  924. package/dist/ir/parameter-versions.d.ts +25 -0
  925. package/dist/ir/parameter-versions.js +300 -0
  926. package/dist/ir/parameter-versions.js.map +1 -0
  927. package/dist/ir/runtime-features.d.ts +60 -15
  928. package/dist/ir/runtime-features.js +276 -35
  929. package/dist/ir/runtime-features.js.map +1 -1
  930. package/dist/ir/serialize.d.ts +12 -2
  931. package/dist/ir/serialize.js +16 -3
  932. package/dist/ir/serialize.js.map +1 -1
  933. package/dist/ir/serialize.test.js +17 -0
  934. package/dist/ir/serialize.test.js.map +1 -1
  935. package/dist/ir/tiers.js +1 -0
  936. package/dist/ir/tiers.js.map +1 -1
  937. package/dist/ir/traverse.d.ts +2 -0
  938. package/dist/ir/traverse.js +29 -5
  939. package/dist/ir/traverse.js.map +1 -1
  940. package/dist/ir/validate.js +171 -45
  941. package/dist/ir/validate.js.map +1 -1
  942. package/dist/library/ir-policy.js +12 -0
  943. package/dist/library/ir-policy.js.map +1 -1
  944. package/dist/library/library-cache.d.ts +2 -0
  945. package/dist/library/library-cache.js.map +1 -1
  946. package/dist/library/prepare.js +2 -0
  947. package/dist/library/prepare.js.map +1 -1
  948. package/dist/native/cache.d.ts +6 -1
  949. package/dist/native/cache.js +28 -5
  950. package/dist/native/cache.js.map +1 -1
  951. package/dist/native/cache.test.js +16 -2
  952. package/dist/native/cache.test.js.map +1 -1
  953. package/dist/native/cli.js +26 -1
  954. package/dist/native/cli.js.map +1 -1
  955. package/dist/native/compiler.js +8 -6
  956. package/dist/native/compiler.js.map +1 -1
  957. package/dist/native/executable-cache.d.ts +1 -1
  958. package/dist/native/executable-cache.js +2 -2
  959. package/dist/native/executable-cache.js.map +1 -1
  960. package/dist/native/prepare.d.ts +3 -1
  961. package/dist/native/prepare.js +123 -31
  962. package/dist/native/prepare.js.map +1 -1
  963. package/dist/native/prepare.test.js +78 -18
  964. package/dist/native/prepare.test.js.map +1 -1
  965. package/dist/native/sanitizer.test.js +6 -1
  966. package/dist/native/sanitizer.test.js.map +1 -1
  967. package/dist/native/text-file.d.ts +13 -3
  968. package/dist/native/text-file.js +63 -9
  969. package/dist/native/text-file.js.map +1 -1
  970. package/dist/native/text-file.test.d.ts +1 -0
  971. package/dist/native/text-file.test.js +49 -0
  972. package/dist/native/text-file.test.js.map +1 -0
  973. package/dist/native/toolchain.js +4 -4
  974. package/dist/native/toolchain.js.map +1 -1
  975. package/dist/native/toolchain.test.js +3 -3
  976. package/dist/native/toolchain.test.js.map +1 -1
  977. package/dist/startup-cache.d.ts +1 -0
  978. package/dist/startup-cache.js +1 -0
  979. package/dist/startup-cache.js.map +1 -1
  980. package/dist/text-parts.d.ts +7 -0
  981. package/dist/text-parts.js +44 -0
  982. package/dist/text-parts.js.map +1 -1
  983. package/dist/text-parts.test.d.ts +1 -0
  984. package/dist/text-parts.test.js +46 -0
  985. package/dist/text-parts.test.js.map +1 -0
  986. package/dist/timing.d.ts +9 -2
  987. package/dist/timing.js +7 -4
  988. package/dist/timing.js.map +1 -1
  989. package/dist/wasm/translate.d.ts +4 -0
  990. package/dist/wasm/translate.js +2 -2
  991. package/dist/wasm/translate.js.map +1 -1
  992. package/package.json +21 -21
  993. package/shims/chalk/v5.ts +688 -0
  994. package/shims/hono-node-server/v2.ts +645 -0
  995. package/shims/hot-shots/client.ts +1126 -0
  996. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  997. package/shims/hot-shots/v8.ts +8 -0
  998. package/shims/undici/core/client.ts +4 -4
  999. package/surface-manifest.json +44 -52
@@ -1,7 +1,9 @@
1
1
  import { analyzeIntegerRanges, INT32_RANGE, NON_NEGATIVE_INT32_RANGE, withinInt32, } from "./integer-ranges.js";
2
- import { exprFunctionReference, moduleFunctionReferences } from "./function-references.js";
2
+ import { exprFunctionReference, FUNCTION_REFERENCE_KINDS, moduleFunctionReferences, } from "./function-references.js";
3
+ import { eachNodeOfKinds, } from "./node-index.js";
3
4
  import { findInitializerBindings, withInitializerBindings } from "./initializer-bindings.js";
4
- import { everyExprChild, everyStmtChild, everyStmtList, everyTypeChild } from "./traverse.js";
5
+ import { checkableInt32Allocations, int32ArrayGroups, int32ArrayKey, int32ArraySlot, int32ArrayStores, } from "./int32-arrays.js";
6
+ import { everyExprChild, everyStmtChild, everyTypeChild } from "./traverse.js";
5
7
  /** The storage slot an array-valued expression reads, as an
6
8
  * IrContracts.int32Elements key: a local or parameter
7
9
  * (`l:${function}\0${localId}`), a module global (`g:${globalId}`), a class
@@ -151,8 +153,11 @@ export class Int32Slots {
151
153
  result.locals = (localId) => this.int32Locals.has(`${fnName}\0${localId}`) || this.int32Locals.has(`\0${localId}`)
152
154
  ? INT32_RANGE
153
155
  : null;
154
- if (this.int32Elements.size > 0)
156
+ if (this.int32Elements.size > 0) {
155
157
  result.elements = (arr) => this.hasInt32Elements(fnName, arr);
158
+ if (this.narrowedReads)
159
+ result.narrowedReads = true;
160
+ }
156
161
  const params = this.paramFacts.get(fnName);
157
162
  if (params)
158
163
  result.params =
@@ -212,6 +217,29 @@ export class Int32Slots {
212
217
  addInt32Elements(key) {
213
218
  this.int32Elements.add(key);
214
219
  }
220
+ dropInt32Elements(key) {
221
+ return this.int32Elements.delete(key);
222
+ }
223
+ hasInt32ElementSlot(key) {
224
+ return this.int32Elements.has(key);
225
+ }
226
+ /** Whether the module has int32 array candidates (the narrowedReads
227
+ * range fact). */
228
+ narrowedReads = false;
229
+ /** Number arrays stored as int32 slots (int32ArrayKey keys: locals and
230
+ * parameters as `function\0local`, globals as `\0global`): the module's
231
+ * int32 array candidates whose every stored element, through every
232
+ * binding that can hold the same array, the fixpoint proved an int32. */
233
+ int32Arrays = new Set();
234
+ /** Local number arrays that may hold int32 slots with checked stores: the
235
+ * candidates whose element stores the fixpoint proved exact integers but
236
+ * not int32s, allocated only by fills that may be long. A fill of at least
237
+ * CHECKED_INT32_MIN_LENGTH elements creates one with int32 slots and a
238
+ * shorter one with doubles. Their elements give no int32 facts; compiled
239
+ * accesses test the array's kind (once per innermost loop where they can,
240
+ * backend/llvm/int32-kind-loops.ts), and a store that is not an int32
241
+ * widens it first (scr_arr_widen_i32). */
242
+ checkedInt32Arrays = new Set();
215
243
  /** Whether every present element of the number array `arr` evaluates to
216
244
  * (read inside `fnName`) is an int32. */
217
245
  hasInt32Elements(fnName, arr) {
@@ -335,6 +363,7 @@ const DYN_READ_ONLY = new Set([
335
363
  "date.nativeNew",
336
364
  "date.nativeNewFields",
337
365
  "date.nativeNewValue",
366
+ "date.argumentsTime",
338
367
  // The dynamic operators run the ToPrimitive and coercion helpers of
339
368
  // dyn.compare, dyn.numberConstructor and dyn.toStringCoerce, then build a
340
369
  // fresh number, string or bigint. dyn.increment steps dyn.toNumeric's result.
@@ -350,6 +379,7 @@ const DYN_READ_ONLY = new Set([
350
379
  "dyn.forInStable",
351
380
  "dyn.getOwnPropertyNames",
352
381
  "dyn.getPrototype",
382
+ "dyn.getPrototypeForIdentity",
353
383
  "dyn.hasKey",
354
384
  "dyn.hasOwn",
355
385
  "dyn.in",
@@ -362,6 +392,7 @@ const DYN_READ_ONLY = new Set([
362
392
  "dyn.collectionIteratorIndex",
363
393
  "dyn.mapSeedEntries",
364
394
  "dyn.mapSeedEntry",
395
+ "dyn.nameClassPrototype",
365
396
  "dyn.numberConstructor",
366
397
  "dyn.objCreate",
367
398
  "dyn.objEntries",
@@ -424,7 +455,58 @@ const DYN_READ_ONLY = new Set([
424
455
  "text.decodeStream",
425
456
  "worker.new",
426
457
  ]);
427
- function walkFunction(fn, visit) {
458
+ /** The node kinds each walk below reads. */
459
+ const LIB_CALL_KINDS = ["libCall"];
460
+ const CALL_FACT_KINDS = [
461
+ ...FUNCTION_REFERENCE_KINDS,
462
+ "virtualCall",
463
+ "instanceOfValue",
464
+ "varRef",
465
+ "assignExpr",
466
+ "incDec",
467
+ "classRef",
468
+ "varDecl",
469
+ "assign",
470
+ "forOf",
471
+ ];
472
+ const CENSUS_KINDS = [
473
+ "call",
474
+ "new",
475
+ "varRef",
476
+ "fieldGet",
477
+ "fieldIncDec",
478
+ "closure",
479
+ "classRef",
480
+ "incDec",
481
+ "forOf",
482
+ "tryCatch",
483
+ ];
484
+ const DECLARATION_KINDS = ["varDecl"];
485
+ const CANDIDATE_WRITE_KINDS = [
486
+ "assign",
487
+ "varDecl",
488
+ "fieldSet",
489
+ "return",
490
+ "call",
491
+ "new",
492
+ "assignExpr",
493
+ ];
494
+ const CALL_KINDS = ["call", "new"];
495
+ const SLOT_WRITE_KINDS = ["return", "call", "new"];
496
+ const NARROW_WRITE_KINDS = ["assign", "varDecl", "fieldSet", "assignExpr"];
497
+ /** Visits the nodes of `fn` in walk order; with `scan`, only those of its
498
+ * kinds, read from the module's node index (the visitors must ignore the
499
+ * other kinds). */
500
+ function walkFunction(fn, scan, visit) {
501
+ if (scan !== undefined) {
502
+ eachNodeOfKinds(fn, scan, (node, statement) => {
503
+ if (statement)
504
+ visit.stmt?.(node);
505
+ else
506
+ visit.expr?.(node);
507
+ });
508
+ return;
509
+ }
428
510
  const expr = (e) => {
429
511
  visit.expr?.(e);
430
512
  return everyExprChild(e, expr, stmt);
@@ -436,12 +518,9 @@ function walkFunction(fn, visit) {
436
518
  for (const s of fn.body)
437
519
  stmt(s);
438
520
  }
439
- /** The class field names that runtime stores through live dynamic views
440
- * (typed-ref capsules) can write: every name when `all` (a dynamic store
441
- * whose key is not a literal), otherwise the
442
- * literal keys of `dyn.keySet`/`dyn.keyDelete`. A view commits a store back
443
- * into the instance's native field slots, which the IR does not show. */
444
- export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).map((r) => [r.id, r])), unions = new Map((mod.unions ?? []).map((u) => [u.id, u]))) {
521
+ /** Computes DynamicFieldStores with one walk of every function. Analyses of
522
+ * the same module accept the result so the emitter walks the module once. */
523
+ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).map((r) => [r.id, r])), unions = new Map((mod.unions ?? []).map((u) => [u.id, u])), nodes) {
445
524
  const dynTypes = new Map();
446
525
  const dynNamed = new Map();
447
526
  const dynish = (type) => {
@@ -481,8 +560,13 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
481
560
  };
482
561
  const dynWritten = new Set();
483
562
  let dynWritesAll = false;
484
- for (const fn of mod.functions)
485
- walkFunction(fn, {
563
+ // A store whose key is not a literal names every field: later stores add
564
+ // nothing, so the walk stops there.
565
+ const scan = nodes?.scan(LIB_CALL_KINDS);
566
+ for (const fn of mod.functions) {
567
+ if (dynWritesAll)
568
+ break;
569
+ walkFunction(fn, scan, {
486
570
  expr: (e) => {
487
571
  if (dynWritesAll)
488
572
  return;
@@ -497,13 +581,29 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
497
581
  }
498
582
  },
499
583
  });
584
+ }
500
585
  return { all: dynWritesAll, names: dynWritten };
501
586
  }
502
587
  /** The f64 class field families a runtime store through a live dynamic view
503
588
  * can write: the class reaches checked-dynamic code (directly or through
504
589
  * another exposed type), and some dynamic store in the program can name the
505
590
  * field. */
506
- export function dynamicallyStoredFamilies(mod, slots) {
591
+ export function dynamicallyStoredFamilies(mod, slots, stores) {
592
+ const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
593
+ const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
594
+ // A live dyn view (typed-ref capsule) of an instance writes back into
595
+ // its fields only after a runtime store into the capsule; the commit then
596
+ // writes every field from the view, which holds the exact snapshot value
597
+ // of any property no store named. So reaching dynamic code disqualifies
598
+ // exactly the field names some dynamic store in the program can name.
599
+ const { all: dynWritesAll, names: dynWritten } = stores ?? dynamicFieldStores(mod, records, unions);
600
+ const storable = (field) => field.type.kind === "f64" &&
601
+ !field.name.startsWith("%") &&
602
+ (dynWritesAll || dynWritten.has(field.name));
603
+ const families = new Set();
604
+ // Without a field some store can name, no class is worth exposing.
605
+ if (!(mod.classes ?? []).some((cls) => cls.fields.some(storable)))
606
+ return families;
507
607
  const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
508
608
  const children = new Map();
509
609
  for (const cls of classes.values())
@@ -525,8 +625,6 @@ export function dynamicallyStoredFamilies(mod, slots) {
525
625
  }
526
626
  return out;
527
627
  };
528
- const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
529
- const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
530
628
  const exposedClasses = new Set();
531
629
  const seenNamed = new Set();
532
630
  let exposeAll = false;
@@ -575,14 +673,8 @@ export function dynamicallyStoredFamilies(mod, slots) {
575
673
  });
576
674
  }
577
675
  };
578
- // A live dyn view (typed-ref capsule) of an instance writes back into
579
- // its fields only after a runtime store into the capsule; the commit then
580
- // writes every field from the view, which holds the exact snapshot value
581
- // of any property no store named. So reaching dynamic code disqualifies
582
- // exactly the field names some dynamic store in the program can name.
583
- const { all: dynWritesAll, names: dynWritten } = dynamicFieldStores(mod, records, unions);
584
676
  for (const fn of mod.functions)
585
- walkFunction(fn, {
677
+ walkFunction(fn, undefined, {
586
678
  expr: (e) => {
587
679
  const dynResult = DYN_KINDS.has(e.type.kind);
588
680
  const boundary = BOUNDARY_KINDS.has(e.kind);
@@ -605,14 +697,11 @@ export function dynamicallyStoredFamilies(mod, slots) {
605
697
  expose(s.value.type);
606
698
  },
607
699
  });
608
- const families = new Set();
609
700
  for (const cls of classes.values()) {
610
701
  if (!exposeAll && !exposedClasses.has(cls.name))
611
702
  continue;
612
703
  for (const field of cls.fields)
613
- if (field.type.kind === "f64" &&
614
- !field.name.startsWith("%") &&
615
- (dynWritesAll || dynWritten.has(field.name)))
704
+ if (storable(field))
616
705
  families.add(slots.family(cls.name, field.name));
617
706
  }
618
707
  return families;
@@ -621,7 +710,7 @@ export function dynamicallyStoredFamilies(mod, slots) {
621
710
  * the entry, constructors behind class values: `valueEscaped`), through
622
711
  * virtual dispatch (`virtualTargets`), or as vtable entries the runtime
623
712
  * calls (`runtimeVirtual`: methods of runtime-rooted hierarchies). */
624
- export function functionCallFacts(mod, classes, subtree) {
713
+ export function functionCallFacts(mod, classes, subtree, nodes) {
625
714
  const escaped = new Set(moduleFunctionReferences(mod));
626
715
  const virtualTargets = new Set();
627
716
  // Virtual dispatch: a `virtualCall` can reach the method's implementation
@@ -638,23 +727,11 @@ export function functionCallFacts(mod, classes, subtree) {
638
727
  for (const cls of classes.values())
639
728
  if (runtimeRooted(cls.name))
640
729
  runtimePrefixes.push(`%${cls.name}.`);
641
- for (const fn of mod.functions)
642
- walkFunction(fn, {
643
- expr: (e) => {
644
- const referenced = exprFunctionReference(e);
645
- if (referenced !== undefined)
646
- escaped.add(referenced);
647
- if (e.kind !== "virtualCall")
648
- return;
649
- for (const name of subtree(e.className))
650
- virtualTargets.add(`%${name}.${e.method}`);
651
- for (let c = classes.get(e.className); c; c = c.base ? classes.get(c.base) : undefined)
652
- virtualTargets.add(`%${c.name}.${e.method}`);
653
- },
654
- });
655
730
  // A class value can reach `new` through its construct thunk; one that
656
- // only feeds an instanceof interval check cannot.
731
+ // only feeds an instanceof interval check cannot. Class references are
732
+ // checked once every function has contributed its tested-only ones.
657
733
  const testedOnly = new Set();
734
+ const classRefs = [];
658
735
  for (const fn of mod.functions) {
659
736
  // Direct operands, and unboxed locals bound once to a class reference
660
737
  // and read only as instanceof operands (the lowering's temporary).
@@ -665,9 +742,18 @@ export function functionCallFacts(mod, classes, subtree) {
665
742
  const count = (map, id) => {
666
743
  map.set(id, (map.get(id) ?? 0) + 1);
667
744
  };
668
- walkFunction(fn, {
745
+ walkFunction(fn, nodes?.scan(CALL_FACT_KINDS), {
669
746
  expr: (e) => {
670
- if (e.kind === "instanceOfValue") {
747
+ const referenced = exprFunctionReference(e);
748
+ if (referenced !== undefined)
749
+ escaped.add(referenced);
750
+ if (e.kind === "virtualCall") {
751
+ for (const name of subtree(e.className))
752
+ virtualTargets.add(`%${name}.${e.method}`);
753
+ for (let c = classes.get(e.className); c; c = c.base ? classes.get(c.base) : undefined)
754
+ virtualTargets.add(`%${c.name}.${e.method}`);
755
+ }
756
+ else if (e.kind === "instanceOfValue") {
671
757
  if (e.classValue.kind === "classRef")
672
758
  testedOnly.add(e.classValue);
673
759
  else if (e.classValue.kind === "varRef")
@@ -677,6 +763,8 @@ export function functionCallFacts(mod, classes, subtree) {
677
763
  count(reads, e.localId);
678
764
  else if (e.kind === "assignExpr" || e.kind === "incDec")
679
765
  count(writes, e.localId);
766
+ else if (e.kind === "classRef")
767
+ classRefs.push(e);
680
768
  },
681
769
  stmt: (s) => {
682
770
  if (s.kind === "varDecl" && s.init?.kind === "classRef")
@@ -690,17 +778,14 @@ export function functionCallFacts(mod, classes, subtree) {
690
778
  if (!boxed.has(id) && writes.get(id) === 1 && reads.get(id) === tests.get(id))
691
779
  testedOnly.add(ref);
692
780
  }
693
- for (const fn of mod.functions)
694
- walkFunction(fn, {
695
- expr: (e) => {
696
- if (e.kind === "classRef" && !testedOnly.has(e))
697
- escaped.add(`%${e.className}.constructor`);
698
- },
699
- });
781
+ for (const e of classRefs)
782
+ if (!testedOnly.has(e))
783
+ escaped.add(`%${e.className}.constructor`);
700
784
  const runtimeVirtual = (name) => runtimePrefixes.some((prefix) => name.startsWith(prefix));
701
785
  return { valueEscaped: escaped, virtualTargets, runtimeVirtual };
702
786
  }
703
- export function analyzeInt32Slots(mod) {
787
+ export function analyzeInt32Slots(mod, inputs = {}) {
788
+ const nodes = inputs.nodes;
704
789
  const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
705
790
  const slots = new Int32Slots(classes);
706
791
  if (mod.lib)
@@ -729,6 +814,32 @@ export function analyzeInt32Slots(mod) {
729
814
  slots.addInt32Local(key);
730
815
  for (const key of contracts?.int32Elements ?? [])
731
816
  slots.addInt32Elements(key);
817
+ // Int32 array candidates (ir/int32-arrays.ts): assumed to hold int32
818
+ // elements until a store the fixpoint cannot prove drops one, with every
819
+ // candidate the same array can reach (its group).
820
+ const arrayCandidates = new Map();
821
+ const globalArrays = new Set();
822
+ const arrayKeys = new Set(mod.int32ArrayCandidates ?? []);
823
+ slots.narrowedReads = arrayKeys.size > 0;
824
+ for (const key of arrayKeys) {
825
+ const cut = key.indexOf("\0");
826
+ if (cut === 0)
827
+ globalArrays.add(key.slice(1));
828
+ else {
829
+ const fnName = key.slice(0, cut);
830
+ const set = arrayCandidates.get(fnName) ?? new Set();
831
+ set.add(key.slice(cut + 1));
832
+ arrayCandidates.set(fnName, set);
833
+ }
834
+ slots.addInt32Elements(int32ArraySlot(key));
835
+ }
836
+ const arrayGroups = arrayKeys.size > 0 ? int32ArrayGroups(mod, arrayKeys) : null;
837
+ // Functions that read or write a candidate global.
838
+ const globalArrayFunctions = new Set();
839
+ if (arrayGroups)
840
+ for (const names of arrayGroups.globalReaders.values())
841
+ for (const name of names)
842
+ globalArrayFunctions.add(name);
732
843
  /* ── candidate fields ── */
733
844
  const children = new Map();
734
845
  for (const cls of classes.values())
@@ -782,14 +893,14 @@ export function analyzeInt32Slots(mod) {
782
893
  dropFamily(family, "runtime-provided or generic class");
783
894
  }
784
895
  /* ── dynamic, reflective and runtime exposure ── */
785
- for (const family of dynamicallyStoredFamilies(mod, slots)) {
896
+ for (const family of dynamicallyStoredFamilies(mod, slots, inputs.dynamicStores)) {
786
897
  if (slots.isPinnedField(family))
787
898
  continue;
788
899
  dropFamily(family, "dynamic stores can name the field");
789
900
  }
790
901
  /* ── functions: escapes, parameter and return candidates ── */
791
902
  const functions = new Map(mod.functions.map((fn) => [fn.name, fn]));
792
- const calls = functionCallFacts(mod, classes, subtree);
903
+ const calls = functionCallFacts(mod, classes, subtree, nodes);
793
904
  const escaped = new Set([...calls.valueEscaped, ...calls.virtualTargets]);
794
905
  const virtual = calls.runtimeVirtual;
795
906
  const paramKey = (fnName, localId) => `param:${fnName}\0${localId}`;
@@ -801,57 +912,17 @@ export function analyzeInt32Slots(mod) {
801
912
  for (const param of fn.params)
802
913
  dropParam(fn.name, param.localId, why);
803
914
  };
804
- // Only functions some IR call reaches directly get parameter facts: one
805
- // the backend invokes by convention has no call site to prove against.
915
+ // One walk of every function collects what the steps below need: the
916
+ // functions IR calls reach directly, calls whose arity differs from their
917
+ // callee's, the captured bindings' boxes, and which functions read which
918
+ // slot facts. Facts that depend on earlier steps are applied in walk order
919
+ // where those steps complete.
806
920
  const called = slots.called;
807
- for (const fn of mod.functions)
808
- walkFunction(fn, {
809
- expr: (e) => {
810
- if (e.kind === "call")
811
- called.add(e.callee);
812
- else if (e.kind === "new")
813
- called.add(`%${e.className}.constructor`);
814
- },
815
- });
816
- for (const fn of mod.functions) {
817
- if (fn.returnType.kind === "f64" && !fn.async && !fn.generator) {
818
- slots.addReturn(fn.name);
819
- slots.assumeNonNegative(`ret:${fn.name}`);
820
- }
821
- if (fn.async ||
822
- fn.generator ||
823
- !called.has(fn.name) ||
824
- escaped.has(fn.name) ||
825
- virtual(fn.name))
826
- continue;
827
- for (const param of fn.params)
828
- if (param.type.kind === "f64" && !slots.isPinned(paramKey(fn.name, param.localId))) {
829
- slots.addParam(fn.name, param.localId);
830
- slots.assumeNonNegative(paramKey(fn.name, param.localId));
831
- }
832
- }
921
+ const arityMismatches = [];
833
922
  const arityChecked = (fn, args, offset) => {
834
923
  if (fn && fn.params.length !== args + offset)
835
- dropAllParams(fn, "call arity differs");
924
+ arityMismatches.push(fn);
836
925
  };
837
- for (const fn of mod.functions)
838
- walkFunction(fn, {
839
- expr: (e) => {
840
- if (e.kind === "call")
841
- arityChecked(functions.get(e.callee), e.args.length, 0);
842
- else if (e.kind === "new")
843
- arityChecked(functions.get(`%${e.className}.constructor`), e.args.length, 1);
844
- },
845
- });
846
- // Candidates the fixpoint may drop; rangedParameters retries some.
847
- const candidates = new Map();
848
- const retry = new Set();
849
- for (const fn of mod.functions) {
850
- const ids = fn.params.filter((p) => slots.hasParam(fn.name, p.localId)).map((p) => p.localId);
851
- if (ids.length > 0)
852
- candidates.set(fn.name, ids);
853
- }
854
- /* ── captured bindings ── */
855
926
  // A captured local lives in one box shared by its declaring function and
856
927
  // every closure that captures it (closure.captures[i] is the lifted
857
928
  // function's captures[i]). The box holds an int32 when every write to it
@@ -869,6 +940,18 @@ export function analyzeInt32Slots(mod) {
869
940
  const boxKey = (fnName, localId) => `${fnName}\0${localId}`;
870
941
  const boxMembers = new Set();
871
942
  const unstableBoxes = new Set();
943
+ // Readers: which functions depend on which slot facts. Reads of a boxed
944
+ // local resolve to its box once the boxes are known.
945
+ const readers = new Map();
946
+ const reads = (slot, fnName) => {
947
+ const set = readers.get(slot);
948
+ if (set)
949
+ set.add(fnName);
950
+ else
951
+ readers.set(slot, new Set([fnName]));
952
+ };
953
+ const boxedReads = [];
954
+ const incrementedFamilies = [];
872
955
  for (const fn of mod.functions) {
873
956
  for (const local of fn.locals)
874
957
  if (local.boxed) {
@@ -879,9 +962,34 @@ export function analyzeInt32Slots(mod) {
879
962
  }
880
963
  for (const capture of fn.classCaptures ?? [])
881
964
  unstableBoxes.add(boxKey(fn.name, capture.localId));
882
- walkFunction(fn, {
965
+ const read = new Set();
966
+ walkFunction(fn, nodes?.scan(CENSUS_KINDS), {
883
967
  expr: (e) => {
884
- if (e.kind === "closure") {
968
+ if (e.kind === "call") {
969
+ called.add(e.callee);
970
+ arityChecked(functions.get(e.callee), e.args.length, 0);
971
+ reads(`ret:${e.callee}`, fn.name);
972
+ }
973
+ else if (e.kind === "new") {
974
+ const constructor = `%${e.className}.constructor`;
975
+ called.add(constructor);
976
+ arityChecked(functions.get(constructor), e.args.length, 1);
977
+ // Constructors return nothing: this only records their callers.
978
+ reads(`ret:${constructor}`, fn.name);
979
+ }
980
+ else if (e.kind === "varRef")
981
+ read.add(e.localId);
982
+ else if (e.kind === "fieldGet") {
983
+ const family = slots.family(e.className, e.field);
984
+ if (family)
985
+ reads(`field:${family}`, fn.name);
986
+ }
987
+ else if (e.kind === "fieldIncDec") {
988
+ const family = slots.family(e.className, e.field);
989
+ if (family)
990
+ incrementedFamilies.push(family);
991
+ }
992
+ else if (e.kind === "closure") {
885
993
  const lifted = functions.get(e.fnName);
886
994
  e.captures.forEach((id, i) => {
887
995
  const inner = lifted?.captures?.[i];
@@ -908,7 +1016,39 @@ export function analyzeInt32Slots(mod) {
908
1016
  unstableBoxes.add(boxKey(fn.name, s.catchLocalId));
909
1017
  },
910
1018
  });
1019
+ if (read.size > 0)
1020
+ boxedReads.push([fn, read]);
911
1021
  }
1022
+ // Only functions some IR call reaches directly get parameter facts: one
1023
+ // the backend invokes by convention has no call site to prove against.
1024
+ for (const fn of mod.functions) {
1025
+ if (fn.returnType.kind === "f64" && !fn.async && !fn.generator) {
1026
+ slots.addReturn(fn.name);
1027
+ slots.assumeNonNegative(`ret:${fn.name}`);
1028
+ }
1029
+ if (fn.async ||
1030
+ fn.generator ||
1031
+ !called.has(fn.name) ||
1032
+ escaped.has(fn.name) ||
1033
+ virtual(fn.name))
1034
+ continue;
1035
+ for (const param of fn.params)
1036
+ if (param.type.kind === "f64" && !slots.isPinned(paramKey(fn.name, param.localId))) {
1037
+ slots.addParam(fn.name, param.localId);
1038
+ slots.assumeNonNegative(paramKey(fn.name, param.localId));
1039
+ }
1040
+ }
1041
+ for (const fn of arityMismatches)
1042
+ dropAllParams(fn, "call arity differs");
1043
+ // Candidates the fixpoint may drop; rangedParameters retries some.
1044
+ const candidates = new Map();
1045
+ const retry = new Set();
1046
+ for (const fn of mod.functions) {
1047
+ const ids = fn.params.filter((p) => slots.hasParam(fn.name, p.localId)).map((p) => p.localId);
1048
+ if (ids.length > 0)
1049
+ candidates.set(fn.name, ids);
1050
+ }
1051
+ /* ── captured bindings ── */
912
1052
  const groups = new Map();
913
1053
  for (const key of boxMembers) {
914
1054
  const root = boxRoot(key);
@@ -935,7 +1075,7 @@ export function analyzeInt32Slots(mod) {
935
1075
  let ids = initializedDeclarations.get(fn.name);
936
1076
  if (ids === undefined) {
937
1077
  const found = new Set();
938
- walkFunction(fn, {
1078
+ walkFunction(fn, nodes?.scan(DECLARATION_KINDS), {
939
1079
  stmt: (s) => {
940
1080
  if (s.kind === "varDecl" && s.init)
941
1081
  found.add(s.localId);
@@ -977,42 +1117,16 @@ export function analyzeInt32Slots(mod) {
977
1117
  reason(`box:${group}`, why);
978
1118
  return slots.dropBox(group);
979
1119
  };
980
- /* ── readers: which functions depend on which slot facts ── */
981
- const readers = new Map();
982
- const reads = (slot, fnName) => {
983
- const set = readers.get(slot);
984
- if (set)
985
- set.add(fnName);
986
- else
987
- readers.set(slot, new Set([fnName]));
988
- };
989
- for (const fn of mod.functions)
990
- walkFunction(fn, {
991
- expr: (e) => {
992
- if (e.kind === "fieldGet") {
993
- const family = slots.family(e.className, e.field);
994
- if (family)
995
- reads(`field:${family}`, fn.name);
996
- }
997
- else if (e.kind === "call")
998
- reads(`ret:${e.callee}`, fn.name);
999
- // Constructors return nothing: this only records their callers.
1000
- else if (e.kind === "new")
1001
- reads(`ret:%${e.className}.constructor`, fn.name);
1002
- else if (e.kind === "varRef") {
1003
- const group = slots.boxGroup(fn.name, e.localId);
1004
- if (group !== null)
1005
- reads(`box:${group}`, fn.name);
1006
- }
1007
- else if (e.kind === "fieldIncDec") {
1008
- const family = slots.family(e.className, e.field);
1009
- if (family)
1010
- dropFamily(family, "++/-- on the field");
1011
- }
1012
- },
1013
- });
1120
+ for (const [fn, read] of boxedReads)
1121
+ for (const localId of read) {
1122
+ const group = slots.boxGroup(fn.name, localId);
1123
+ if (group !== null)
1124
+ reads(`box:${group}`, fn.name);
1125
+ }
1126
+ for (const family of incrementedFamilies)
1127
+ dropFamily(family, "++/-- on the field");
1014
1128
  /* ── the optimistic fixpoint ── */
1015
- const bindings = findInitializerBindings(mod);
1129
+ const bindings = inputs.initializerBindings ?? findInitializerBindings(mod);
1016
1130
  const numeric = (fn) => withInitializerBindings(fn, bindings.get(fn.name) ?? []);
1017
1131
  const queue = mod.functions.map((fn) => fn.name);
1018
1132
  const queued = new Set(queue);
@@ -1035,31 +1149,44 @@ export function analyzeInt32Slots(mod) {
1035
1149
  }
1036
1150
  return false;
1037
1151
  };
1152
+ const candidateWrites = nodes?.scan(CANDIDATE_WRITE_KINDS);
1038
1153
  const hasCandidateWrite = (fn) => {
1154
+ if (arrayCandidates.has(fn.name))
1155
+ return true;
1156
+ if (globalArrayFunctions.has(fn.name))
1157
+ return true;
1039
1158
  const box = (localId) => slots.hasBox(slots.boxGroup(fn.name, localId));
1040
1159
  const returns = slots.hasReturn(fn.name);
1041
- return !everyStmtList(fn.body, {
1042
- stmt: (s) => {
1043
- if (s.kind === "assign")
1044
- return !box(s.localId);
1045
- if (s.kind === "varDecl")
1046
- return s.init === null || !box(s.localId);
1047
- if (s.kind === "fieldSet") {
1048
- const family = slots.family(s.className, s.field);
1049
- return !family || !slots.hasFamily(family);
1160
+ let found = false;
1161
+ eachNodeOfKinds(fn, candidateWrites, (node) => {
1162
+ switch (node.kind) {
1163
+ case "assign":
1164
+ found = box(node.localId);
1165
+ break;
1166
+ case "varDecl":
1167
+ found = node.init !== null && box(node.localId);
1168
+ break;
1169
+ case "fieldSet": {
1170
+ const family = slots.family(node.className, node.field);
1171
+ found = !!family && slots.hasFamily(family);
1172
+ break;
1050
1173
  }
1051
- return !(s.kind === "return" && returns);
1052
- },
1053
- expr: (e) => {
1054
- if (e.kind === "call")
1055
- return !candidateArgs(functions.get(e.callee), e.args.length, 0);
1056
- if (e.kind === "new")
1057
- return !candidateArgs(functions.get(`%${e.className}.constructor`), e.args.length, 1);
1058
- if (e.kind === "assignExpr")
1059
- return !box(e.localId);
1060
- return true;
1061
- },
1174
+ case "return":
1175
+ found = returns;
1176
+ break;
1177
+ case "call":
1178
+ found = candidateArgs(functions.get(node.callee), node.args.length, 0);
1179
+ break;
1180
+ case "new":
1181
+ found = candidateArgs(functions.get(`%${node.className}.constructor`), node.args.length, 1);
1182
+ break;
1183
+ case "assignExpr":
1184
+ found = box(node.localId);
1185
+ break;
1186
+ }
1187
+ return !found;
1062
1188
  });
1189
+ return found;
1063
1190
  };
1064
1191
  const provenByFunction = new Map();
1065
1192
  // Each function's parameter and result writes under its latest analysis:
@@ -1074,15 +1201,84 @@ export function analyzeInt32Slots(mod) {
1074
1201
  reads(`param:${fn.name}\0${id}`, fn.name);
1075
1202
  // Range facts are consulted only at writes into candidate slots; slots
1076
1203
  // are only ever dropped, so a body without such a write needs none.
1077
- const ranges = hasCandidateWrite(fn)
1204
+ const candidate = hasCandidateWrite(fn);
1205
+ const ranges = candidate
1078
1206
  ? analyzeIntegerRanges(numeric(fn), slots.facts(fn.name))
1079
1207
  : new Map();
1080
1208
  if (ranges.size > 0)
1081
- lastWrites.set(fn.name, slotWrites(fn, ranges, functions));
1209
+ lastWrites.set(fn.name, slotWrites(fn, ranges, functions, nodes));
1082
1210
  else
1083
1211
  lastWrites.delete(fn.name);
1084
1212
  const proven = [];
1213
+ // The walk below acts only at writes into candidate slots.
1214
+ if (!candidate) {
1215
+ provenByFunction.set(fn.name, proven);
1216
+ continue;
1217
+ }
1085
1218
  const int32 = (e) => withinInt32(ranges.get(e));
1219
+ // Every element stored into an int32 array candidate must be an int32
1220
+ // under the facts that assume the candidates' own elements are; a
1221
+ // failing store drops its array's element facts, and the function is
1222
+ // analyzed again without them. When every failing store is still an
1223
+ // exact integer under those facts (a counter, `a[i]! + 1`) and the array
1224
+ // is only ever allocated by a fill that may be long
1225
+ // (checkableInt32Allocations), it keeps int32 slots with checked stores
1226
+ // (checkedInt32Arrays), which widen it to doubles in place at the first
1227
+ // store that is not an int32.
1228
+ const locals = arrayCandidates.get(fn.name);
1229
+ let arrays = locals;
1230
+ if (globalArrayFunctions.has(fn.name)) {
1231
+ const both = new Set();
1232
+ if (locals)
1233
+ for (const id of locals)
1234
+ both.add(id);
1235
+ for (const id of globalArrays)
1236
+ both.add(id);
1237
+ arrays = both;
1238
+ }
1239
+ if (arrays && arrayGroups) {
1240
+ const requeue = (name) => {
1241
+ if (queued.has(name))
1242
+ return;
1243
+ queued.add(name);
1244
+ queue.push(name);
1245
+ };
1246
+ const params = new Set(fn.params.map((param) => param.localId));
1247
+ for (const [id, values] of int32ArrayStores(fn, arrays)) {
1248
+ const key = int32ArrayKey(fn.name, id);
1249
+ if (!slots.hasInt32ElementSlot(int32ArraySlot(key)) || values.every(int32))
1250
+ continue;
1251
+ // The array's group drops together: every function reading a
1252
+ // member is analyzed again without its facts.
1253
+ const group = arrayGroups.group.get(key) ?? [key];
1254
+ for (const member of group) {
1255
+ slots.dropInt32Elements(int32ArraySlot(member));
1256
+ if (member.startsWith("\0")) {
1257
+ const names = arrayGroups.globalReaders.get(member);
1258
+ if (names)
1259
+ for (const name of names)
1260
+ requeue(name);
1261
+ }
1262
+ else
1263
+ requeue(member.slice(0, member.indexOf("\0")));
1264
+ }
1265
+ // Checked stores serve a lone local: its allocations are the only
1266
+ // arrays it holds.
1267
+ const checkable = (value) => {
1268
+ const range = ranges.get(value);
1269
+ return int32(value) || range != null;
1270
+ };
1271
+ if (group.length === 1 &&
1272
+ !key.startsWith("\0") &&
1273
+ !params.has(id) &&
1274
+ values.every(checkable) &&
1275
+ checkableInt32Allocations(fn, id))
1276
+ slots.checkedInt32Arrays.add(key);
1277
+ else
1278
+ for (const member of group)
1279
+ reason(`array:${member}`, "an element store is not int32");
1280
+ }
1281
+ }
1086
1282
  // An int32 written into a slot still assumed non-negative: widen the
1087
1283
  // assumption when the value may be negative, and reanalyze its readers.
1088
1284
  const settle = (slot, e) => {
@@ -1128,7 +1324,7 @@ export function analyzeInt32Slots(mod) {
1128
1324
  else if (dropBox(group, `write in ${fn.name} is not int32`))
1129
1325
  invalidate(`box:${group}`);
1130
1326
  };
1131
- walkFunction(fn, {
1327
+ walkFunction(fn, nodes?.scan(CANDIDATE_WRITE_KINDS), {
1132
1328
  stmt: (s) => {
1133
1329
  if (s.kind === "assign")
1134
1330
  boxWrite(s.localId, s.value);
@@ -1169,8 +1365,11 @@ export function analyzeInt32Slots(mod) {
1169
1365
  for (const proven of provenByFunction.values())
1170
1366
  for (const value of proven)
1171
1367
  slots.provenWrites.add(value);
1172
- const ranged = rangedParameters(slots, functions, retry, numeric, (callee) => readers.get(`ret:${callee}`));
1173
- narrowSlotRanges(slots, functions, numeric, lastWrites, ranged, (slot) => readers.get(slot));
1368
+ for (const key of arrayKeys)
1369
+ if (slots.hasInt32ElementSlot(int32ArraySlot(key)))
1370
+ slots.int32Arrays.add(key);
1371
+ const ranged = rangedParameters(slots, functions, retry, numeric, (callee) => readers.get(`ret:${callee}`), nodes);
1372
+ narrowSlotRanges(slots, functions, numeric, lastWrites, ranged, (slot) => readers.get(slot), nodes);
1174
1373
  return slots;
1175
1374
  }
1176
1375
  /** Bounds a widened parameter range jumps to: the int32 limits, and the
@@ -1197,7 +1396,7 @@ const widenMax = (max) => WIDEN_MAX.find((bound) => bound >= max) ?? Infinity;
1197
1396
  * other waiting functions) fail their parameters and are analyzed too, so
1198
1397
  * every call site is checked under the final ranges. The facts the main
1199
1398
  * fixpoint proved are fixed here: these ranges only add precision. */
1200
- function rangedParameters(slots, functions, retry, numeric, callersOf) {
1399
+ function rangedParameters(slots, functions, retry, numeric, callersOf, nodes) {
1201
1400
  const changed = new Set();
1202
1401
  if (retry.size === 0)
1203
1402
  return changed;
@@ -1280,7 +1479,7 @@ function rangedParameters(slots, functions, retry, numeric, callersOf) {
1280
1479
  contribute(callee, param.localId, ranges.get(arg) ?? null);
1281
1480
  });
1282
1481
  };
1283
- walkFunction(fn, {
1482
+ walkFunction(fn, nodes?.scan(CALL_KINDS), {
1284
1483
  expr: (e) => {
1285
1484
  if (e.kind === "call")
1286
1485
  args(functions.get(e.callee), e.args, 0);
@@ -1323,7 +1522,7 @@ const sameRange = (a, b) => a.min === b.min && a.max === b.max;
1323
1522
  /** The values one analysis of a function writes into parameter slots of
1324
1523
  * its direct callees and into its own result slot (`param:` and `ret:`
1325
1524
  * keys), joined per slot; null when some write has no proven range. */
1326
- function slotWrites(fn, ranges, functions) {
1525
+ function slotWrites(fn, ranges, functions, nodes) {
1327
1526
  const writes = new Map();
1328
1527
  const write = (key, value) => {
1329
1528
  const range = value ? (ranges.get(value) ?? null) : null;
@@ -1339,7 +1538,7 @@ function slotWrites(fn, ranges, functions) {
1339
1538
  write(`param:${callee.name}\0${param.localId}`, arg);
1340
1539
  });
1341
1540
  };
1342
- walkFunction(fn, {
1541
+ walkFunction(fn, nodes?.scan(SLOT_WRITE_KINDS), {
1343
1542
  stmt: (s) => {
1344
1543
  if (s.kind === "return")
1345
1544
  write(`ret:${fn.name}`, s.value);
@@ -1376,7 +1575,7 @@ const NARROW_ROUNDS = 6;
1376
1575
  * function must still prove every write into a field or box slot (whose
1377
1576
  * facts do not change here), or the narrowing is abandoned. Pinned
1378
1577
  * (contract) slots keep their contract range. */
1379
- function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf) {
1578
+ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf, nodes) {
1380
1579
  // Every parameter and result slot with a fact, and that fact.
1381
1580
  const proven = new Map();
1382
1581
  const fixed = new Set();
@@ -1437,7 +1636,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
1437
1636
  if (!rangeWithin(range, level))
1438
1637
  sound = false;
1439
1638
  };
1440
- walkFunction(fn, {
1639
+ walkFunction(fn, nodes?.scan(NARROW_WRITE_KINDS), {
1441
1640
  stmt: (s) => {
1442
1641
  if (s.kind === "assign")
1443
1642
  box(s.localId, s.value);
@@ -1452,7 +1651,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
1452
1651
  box(e.localId, e.value);
1453
1652
  },
1454
1653
  });
1455
- return { writes: slotWrites(fn, ranges, functions), sound };
1654
+ return { writes: slotWrites(fn, ranges, functions, nodes), sound };
1456
1655
  };
1457
1656
  const writesByFunction = new Map(lastWrites);
1458
1657
  const join = () => {