@scriptc/compiler 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (726) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +470 -66
  2. package/dist/backend/cycle-analysis.d.ts +4 -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 +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -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 +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  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 +21 -9
  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 +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +479 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +263 -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 +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  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 +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/debug-info.js +2 -5
  58. package/dist/backend/llvm/debug-info.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 +17 -1
  65. package/dist/backend/llvm/dense-array-loops.js +194 -5
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  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 +30 -0
  72. package/dist/backend/llvm/dyn.js +373 -70
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +13 -28
  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 +211 -33
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  82. package/dist/backend/llvm/emit-statements.js +268 -84
  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 +186 -37
  88. package/dist/backend/llvm/emitter.js +733 -90
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +65 -7
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +11 -13
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.js +48 -20
  95. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  96. package/dist/backend/llvm/expr-callbacks.js +47 -0
  97. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  98. package/dist/backend/llvm/expr-calls.js +28 -14
  99. package/dist/backend/llvm/expr-calls.js.map +1 -1
  100. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  101. package/dist/backend/llvm/expr-containers.js +143 -37
  102. package/dist/backend/llvm/expr-containers.js.map +1 -1
  103. package/dist/backend/llvm/expr-context.d.ts +14 -0
  104. package/dist/backend/llvm/expr-dynamic.js +18 -11
  105. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +119 -38
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.d.ts +12 -0
  111. package/dist/backend/llvm/expr-records.js +106 -0
  112. package/dist/backend/llvm/expr-records.js.map +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  114. package/dist/backend/llvm/expr-stream-bridges.js +210 -69
  115. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  118. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  119. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  120. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  121. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  122. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  123. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  124. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  125. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  126. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  127. package/dist/backend/llvm/integer-values.d.ts +25 -1
  128. package/dist/backend/llvm/integer-values.js +95 -0
  129. package/dist/backend/llvm/integer-values.js.map +1 -1
  130. package/dist/backend/llvm/js-ic.d.ts +1 -1
  131. package/dist/backend/llvm/js-ic.js +1 -1
  132. package/dist/backend/llvm/js-ic.js.map +1 -1
  133. package/dist/backend/llvm/key-orders.d.ts +7 -0
  134. package/dist/backend/llvm/key-orders.js +33 -0
  135. package/dist/backend/llvm/key-orders.js.map +1 -0
  136. package/dist/backend/llvm/lib-connect.js +4 -0
  137. package/dist/backend/llvm/lib-connect.js.map +1 -1
  138. package/dist/backend/llvm/lib-datagram.js +11 -0
  139. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  140. package/dist/backend/llvm/lib-dispatch.js +213 -5
  141. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  142. package/dist/backend/llvm/lib-filesystem.js +4 -4
  143. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  144. package/dist/backend/llvm/lib-http2.js +4 -0
  145. package/dist/backend/llvm/lib-http2.js.map +1 -1
  146. package/dist/backend/llvm/lib-lookup.js +16 -6
  147. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  148. package/dist/backend/llvm/lib-process.js +37 -1
  149. package/dist/backend/llvm/lib-process.js.map +1 -1
  150. package/dist/backend/llvm/lib-shared.js +94 -2
  151. package/dist/backend/llvm/lib-shared.js.map +1 -1
  152. package/dist/backend/llvm/lib-stream.js +35 -5
  153. package/dist/backend/llvm/lib-stream.js.map +1 -1
  154. package/dist/backend/llvm/local-array-reads.js +115 -19
  155. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  156. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  157. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  158. package/dist/backend/llvm/loop-state.d.ts +33 -0
  159. package/dist/backend/llvm/loop-state.js +42 -0
  160. package/dist/backend/llvm/loop-state.js.map +1 -0
  161. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  162. package/dist/backend/llvm/map-number-lookup.js +91 -31
  163. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  164. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  165. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  166. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  167. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  168. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  169. package/dist/backend/llvm/nullable-unions.js +15 -3
  170. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  171. package/dist/backend/llvm/publish.d.ts +10 -0
  172. package/dist/backend/llvm/publish.js +15 -3
  173. package/dist/backend/llvm/publish.js.map +1 -1
  174. package/dist/backend/llvm/receivers.js +6 -1
  175. package/dist/backend/llvm/receivers.js.map +1 -1
  176. package/dist/backend/llvm/record-results.d.ts +1 -9
  177. package/dist/backend/llvm/record-results.js +2 -11
  178. package/dist/backend/llvm/record-results.js.map +1 -1
  179. package/dist/backend/llvm/reference-effects.js +3 -0
  180. package/dist/backend/llvm/reference-effects.js.map +1 -1
  181. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  182. package/dist/backend/llvm/reference-writes.js +89 -72
  183. package/dist/backend/llvm/reference-writes.js.map +1 -1
  184. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  185. package/dist/backend/llvm/running-extrema.js +115 -0
  186. package/dist/backend/llvm/running-extrema.js.map +1 -0
  187. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  188. package/dist/backend/llvm/running-extrema.test.js +89 -0
  189. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  190. package/dist/backend/llvm/shapes.d.ts +71 -15
  191. package/dist/backend/llvm/shapes.js +224 -40
  192. package/dist/backend/llvm/shapes.js.map +1 -1
  193. package/dist/backend/llvm/shapes.test.js +53 -7
  194. package/dist/backend/llvm/shapes.test.js.map +1 -1
  195. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  196. package/dist/backend/llvm/speculative-integers.js +2 -2
  197. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  198. package/dist/backend/llvm/stack-captures.js +1 -5
  199. package/dist/backend/llvm/stack-captures.js.map +1 -1
  200. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  201. package/dist/backend/llvm/stack-objects.js +5 -2
  202. package/dist/backend/llvm/stack-objects.js.map +1 -1
  203. package/dist/backend/llvm/string-reads.d.ts +12 -0
  204. package/dist/backend/llvm/string-reads.js +44 -0
  205. package/dist/backend/llvm/string-reads.js.map +1 -1
  206. package/dist/backend/llvm/union-repr.d.ts +4 -3
  207. package/dist/backend/llvm/union-repr.js +6 -5
  208. package/dist/backend/llvm/union-repr.js.map +1 -1
  209. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  210. package/dist/backend/llvm/walk-borrows.js +46 -41
  211. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  212. package/dist/backend/llvm/walkers.d.ts +3 -0
  213. package/dist/backend/llvm/walkers.js +101 -65
  214. package/dist/backend/llvm/walkers.js.map +1 -1
  215. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  216. package/dist/backend/llvm/wrapping-sums.js +126 -0
  217. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  218. package/dist/backend/may-throw.d.ts +8 -10
  219. package/dist/backend/may-throw.js +14 -10
  220. package/dist/backend/may-throw.js.map +1 -1
  221. package/dist/backend/native/contracts.d.ts +5 -0
  222. package/dist/backend/native/executable.js +7 -0
  223. package/dist/backend/native/executable.js.map +1 -1
  224. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  225. package/dist/backend/native/runtime-inputs.js +1 -0
  226. package/dist/backend/native/runtime-inputs.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.test.js +6 -4
  231. package/dist/backend/native-codegen.test.js.map +1 -1
  232. package/dist/backend/native-link-info-core.d.ts +4 -0
  233. package/dist/backend/native-link-info-core.js.map +1 -1
  234. package/dist/backend/publication.d.ts +12 -1
  235. package/dist/backend/publication.js +37 -14
  236. package/dist/backend/publication.js.map +1 -1
  237. package/dist/backend/publication.test.js +30 -0
  238. package/dist/backend/publication.test.js.map +1 -1
  239. package/dist/backend/result-slots.d.ts +16 -0
  240. package/dist/backend/result-slots.js +23 -0
  241. package/dist/backend/result-slots.js.map +1 -0
  242. package/dist/backend/runtime-abi.d.ts +2 -2
  243. package/dist/backend/runtime-abi.js +2 -2
  244. package/dist/backend/runtime-pack-core.d.ts +1 -0
  245. package/dist/backend/runtime-pack-core.js +1 -0
  246. package/dist/backend/runtime-pack-core.js.map +1 -1
  247. package/dist/backend/runtime-pack-targets.test.js +2 -1
  248. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  249. package/dist/backend/runtime-pack.test.js +2 -1
  250. package/dist/backend/runtime-pack.test.js.map +1 -1
  251. package/dist/backend/stack-observations.d.ts +2 -1
  252. package/dist/backend/stack-observations.js +67 -42
  253. package/dist/backend/stack-observations.js.map +1 -1
  254. package/dist/backend/target-cpu.d.ts +26 -0
  255. package/dist/backend/target-cpu.js +98 -0
  256. package/dist/backend/target-cpu.js.map +1 -0
  257. package/dist/backend/target-cpu.test.d.ts +1 -0
  258. package/dist/backend/target-cpu.test.js +38 -0
  259. package/dist/backend/target-cpu.test.js.map +1 -0
  260. package/dist/backend/target-diagnostics.js +5 -3
  261. package/dist/backend/target-diagnostics.js.map +1 -1
  262. package/dist/backend/warm-cache.js +1 -0
  263. package/dist/backend/warm-cache.js.map +1 -1
  264. package/dist/cli/command.js +20 -1
  265. package/dist/cli/command.js.map +1 -1
  266. package/dist/cli/usage.d.ts +4 -1
  267. package/dist/cli/usage.js +10 -3
  268. package/dist/cli/usage.js.map +1 -1
  269. package/dist/compat/fetch-profile.js +1 -1
  270. package/dist/compat/fetch-profile.js.map +1 -1
  271. package/dist/compile-types.d.ts +7 -0
  272. package/dist/contracts/check.js +4 -3
  273. package/dist/contracts/check.js.map +1 -1
  274. package/dist/contracts/int32-elements.js +10 -2
  275. package/dist/contracts/int32-elements.js.map +1 -1
  276. package/dist/coverage/report.js +12 -3
  277. package/dist/coverage/report.js.map +1 -1
  278. package/dist/diagnostics/diagnostic.d.ts +4 -0
  279. package/dist/diagnostics/diagnostic.js +1 -1
  280. package/dist/diagnostics/diagnostic.js.map +1 -1
  281. package/dist/diagnostics/envelope.d.ts +3 -0
  282. package/dist/diagnostics/envelope.js +1 -0
  283. package/dist/diagnostics/envelope.js.map +1 -1
  284. package/dist/executable/executable-cache.d.ts +5 -0
  285. package/dist/executable/executable-cache.js +5 -0
  286. package/dist/executable/executable-cache.js.map +1 -1
  287. package/dist/executable/executable-cache.test.js +3 -0
  288. package/dist/executable/executable-cache.test.js.map +1 -1
  289. package/dist/frontend/decl-projection.d.ts +41 -0
  290. package/dist/frontend/decl-projection.js +949 -0
  291. package/dist/frontend/decl-projection.js.map +1 -0
  292. package/dist/frontend/decl-projection.test.d.ts +1 -0
  293. package/dist/frontend/decl-projection.test.js +30 -0
  294. package/dist/frontend/decl-projection.test.js.map +1 -0
  295. package/dist/frontend/dts-paths.d.ts +15 -0
  296. package/dist/frontend/dts-paths.js +25 -0
  297. package/dist/frontend/dts-paths.js.map +1 -1
  298. package/dist/frontend/input-tracker.d.ts +6 -0
  299. package/dist/frontend/input-tracker.js +51 -28
  300. package/dist/frontend/input-tracker.js.map +1 -1
  301. package/dist/frontend/input-tracker.test.js +19 -0
  302. package/dist/frontend/input-tracker.test.js.map +1 -1
  303. package/dist/frontend/lowering/array-values.js +100 -2
  304. package/dist/frontend/lowering/array-values.js.map +1 -1
  305. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  306. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  307. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  308. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  309. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  310. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  311. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  312. package/dist/frontend/lowering/builtins/crypto.js +87 -10
  313. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/dates.js +4 -1
  315. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  317. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  318. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  319. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  321. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  322. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  323. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  324. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  325. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  326. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  327. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  329. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
  331. package/dist/frontend/lowering/builtins/promises.js +236 -139
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  334. package/dist/frontend/lowering/builtins/readline.js +35 -3
  335. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/url.js +24 -1
  337. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/call-signatures.js +0 -1
  341. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  342. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  343. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  344. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  345. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  346. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  347. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  348. package/dist/frontend/lowering/class-callbacks.js +82 -12
  349. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  350. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  351. package/dist/frontend/lowering/class-construction.js +17 -3
  352. package/dist/frontend/lowering/class-construction.js.map +1 -1
  353. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
  355. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  358. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  359. package/dist/frontend/lowering/class-iterables.js +9 -1
  360. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  361. package/dist/frontend/lowering/class-method-mutations.js +83 -24
  362. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  363. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  364. package/dist/frontend/lowering/class-protocols.js +183 -1
  365. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  366. package/dist/frontend/lowering/class-prototypes.js +31 -2
  367. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  368. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  369. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  370. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  371. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  372. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  373. package/dist/frontend/lowering/coercions/structural.js +91 -1
  374. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  375. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  376. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  377. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  378. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  379. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  380. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  381. package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
  382. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  383. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  384. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  385. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  386. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  387. package/dist/frontend/lowering/containers/array-methods.js +26 -3
  388. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  390. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  391. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  392. package/dist/frontend/lowering/containers/bytes.js +455 -46
  393. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  394. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  395. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  396. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  397. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  399. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  400. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  401. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  402. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  407. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  408. package/dist/frontend/lowering/date-values.d.ts +11 -0
  409. package/dist/frontend/lowering/date-values.js +207 -0
  410. package/dist/frontend/lowering/date-values.js.map +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  412. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  413. package/dist/frontend/lowering/divergences.js +9 -1
  414. package/dist/frontend/lowering/divergences.js.map +1 -1
  415. package/dist/frontend/lowering/error-methods.js +47 -2
  416. package/dist/frontend/lowering/error-methods.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/array-literals.js +53 -0
  418. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/binary.js +100 -28
  420. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/element-access.js +169 -13
  422. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  423. package/dist/frontend/lowering/expressions/identifiers.js +64 -5
  424. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  425. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  426. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  427. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  428. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  429. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  430. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  431. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  433. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  434. package/dist/frontend/lowering/expressions/property-access.js +168 -10
  435. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  436. package/dist/frontend/lowering/expressions/relational.js +212 -33
  437. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  438. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  439. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  440. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  441. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  442. package/dist/frontend/lowering/expressions/updates.js +39 -3
  443. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  444. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  445. package/dist/frontend/lowering/frozen-records.js +322 -0
  446. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  447. package/dist/frontend/lowering/function-returns.js +64 -0
  448. package/dist/frontend/lowering/function-returns.js.map +1 -1
  449. package/dist/frontend/lowering/generic-functions.js +7 -2
  450. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  451. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  452. package/dist/frontend/lowering/indexed-unions.js +401 -0
  453. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  454. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  455. package/dist/frontend/lowering/iterable-values.js +297 -0
  456. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  457. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  458. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  459. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  460. package/dist/frontend/lowering/js-class-fields.js +45 -10
  461. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  462. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  463. package/dist/frontend/lowering/key-order-witness.js +974 -48
  464. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  465. package/dist/frontend/lowering/key-order-witness.test.js +530 -10
  466. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  467. package/dist/frontend/lowering/lower-assert.js +15 -3
  468. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  469. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  470. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  471. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  472. package/dist/frontend/lowering/lower-calls.js +462 -44
  473. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  474. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  475. package/dist/frontend/lowering/lower-classes.js +324 -69
  476. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  477. package/dist/frontend/lowering/lower-dgram.js +3 -1
  478. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  479. package/dist/frontend/lowering/lower-exprs.js +215 -3
  480. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  481. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  482. package/dist/frontend/lowering/lower-functions.js +83 -0
  483. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  484. package/dist/frontend/lowering/lower-generators.js +42 -32
  485. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  486. package/dist/frontend/lowering/lower-global-value.js +6 -3
  487. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  488. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  489. package/dist/frontend/lowering/lower-inspect.js +53 -17
  490. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  491. package/dist/frontend/lowering/lower-modules.js +53 -5
  492. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  493. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  494. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.js +2 -2
  496. package/dist/frontend/lowering/lower-server.js.map +1 -1
  497. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  498. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  499. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  500. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  501. package/dist/frontend/lowering/lower-stmts.js +553 -81
  502. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  503. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  504. package/dist/frontend/lowering/lower-stream.js +1483 -156
  505. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  506. package/dist/frontend/lowering/lowerer.d.ts +107 -8
  507. package/dist/frontend/lowering/lowerer.js +381 -36
  508. package/dist/frontend/lowering/lowerer.js.map +1 -1
  509. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  510. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  511. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  512. package/dist/frontend/lowering/new-target.d.ts +12 -0
  513. package/dist/frontend/lowering/new-target.js +280 -0
  514. package/dist/frontend/lowering/new-target.js.map +1 -0
  515. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  516. package/dist/frontend/lowering/object-factory-new.js +20 -6
  517. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  518. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  519. package/dist/frontend/lowering/overload-choice.js +190 -0
  520. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  521. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  522. package/dist/frontend/lowering/surfaces.js +73 -8
  523. package/dist/frontend/lowering/surfaces.js.map +1 -1
  524. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  525. package/dist/frontend/lowering/undefined-index.js +82 -0
  526. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  527. package/dist/frontend/lowering/var-hoisting.js +29 -13
  528. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  529. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  530. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  531. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  532. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  533. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  534. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  535. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  536. package/dist/frontend/npm-static.js +4 -20
  537. package/dist/frontend/npm-static.js.map +1 -1
  538. package/dist/frontend/package-shims.d.ts +3 -0
  539. package/dist/frontend/package-shims.js +71 -8
  540. package/dist/frontend/package-shims.js.map +1 -1
  541. package/dist/frontend/pipeline.js +19 -11
  542. package/dist/frontend/pipeline.js.map +1 -1
  543. package/dist/frontend/process-fork.d.ts +25 -0
  544. package/dist/frontend/process-fork.js +2 -0
  545. package/dist/frontend/process-fork.js.map +1 -0
  546. package/dist/frontend/program-analysis.d.ts +5 -1
  547. package/dist/frontend/program-analysis.js +5 -0
  548. package/dist/frontend/program-analysis.js.map +1 -1
  549. package/dist/frontend/program.d.ts +21 -6
  550. package/dist/frontend/program.js +681 -83
  551. package/dist/frontend/program.js.map +1 -1
  552. package/dist/frontend/program.test.js +43 -3
  553. package/dist/frontend/program.test.js.map +1 -1
  554. package/dist/frontend/token-equivalence.d.ts +3 -0
  555. package/dist/frontend/token-equivalence.js +409 -0
  556. package/dist/frontend/token-equivalence.js.map +1 -0
  557. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  558. package/dist/frontend/token-equivalence.test.js +67 -0
  559. package/dist/frontend/token-equivalence.test.js.map +1 -0
  560. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  561. package/dist/frontend/ts7/ast-node.js +1048 -103
  562. package/dist/frontend/ts7/ast-node.js.map +1 -1
  563. package/dist/frontend/ts7/ast-node.test.js +24 -0
  564. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  565. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  566. package/dist/frontend/ts7/ast-wire.js +34 -24
  567. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  568. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  569. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  570. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  571. package/dist/frontend/ts7/checker-backend.js +2 -2
  572. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  573. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  574. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  575. package/dist/frontend/ts7/checker.d.ts +4 -0
  576. package/dist/frontend/ts7/checker.js +7 -0
  577. package/dist/frontend/ts7/checker.js.map +1 -1
  578. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  579. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  580. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  581. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  582. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  583. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  584. package/dist/frontend/ts7/program-host.d.ts +7 -0
  585. package/dist/frontend/ts7/program-host.js +25 -2
  586. package/dist/frontend/ts7/program-host.js.map +1 -1
  587. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  588. package/dist/frontend/ts7/semantic-model.js +5 -0
  589. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  590. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  591. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  592. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  593. package/dist/frontend/ts7/semantic-types.js +1 -1
  594. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  595. package/dist/frontend/ts7/session.d.ts +14 -1
  596. package/dist/frontend/ts7/session.js +22 -0
  597. package/dist/frontend/ts7/session.js.map +1 -1
  598. package/dist/frontend/type-mapper.d.ts +13 -1
  599. package/dist/frontend/type-mapper.js +229 -20
  600. package/dist/frontend/type-mapper.js.map +1 -1
  601. package/dist/index.d.ts +0 -5
  602. package/dist/index.js +46 -4
  603. package/dist/index.js.map +1 -1
  604. package/dist/ir/analysis.js +5 -3
  605. package/dist/ir/analysis.js.map +1 -1
  606. package/dist/ir/array-length-stability.d.ts +4 -0
  607. package/dist/ir/array-length-stability.js +19 -6
  608. package/dist/ir/array-length-stability.js.map +1 -1
  609. package/dist/ir/array-length-stability.test.js +24 -0
  610. package/dist/ir/array-length-stability.test.js.map +1 -1
  611. package/dist/ir/builtin-effects.d.ts +7 -0
  612. package/dist/ir/builtin-effects.js +60 -0
  613. package/dist/ir/builtin-effects.js.map +1 -1
  614. package/dist/ir/builtin-signatures.d.ts +6 -4
  615. package/dist/ir/builtin-signatures.js +222 -13
  616. package/dist/ir/builtin-signatures.js.map +1 -1
  617. package/dist/ir/callback-specialization.d.ts +2 -1
  618. package/dist/ir/callback-specialization.js +23 -18
  619. package/dist/ir/callback-specialization.js.map +1 -1
  620. package/dist/ir/char-unit-locals.d.ts +19 -0
  621. package/dist/ir/char-unit-locals.js +185 -0
  622. package/dist/ir/char-unit-locals.js.map +1 -0
  623. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  624. package/dist/ir/char-unit-locals.test.js +94 -0
  625. package/dist/ir/char-unit-locals.test.js.map +1 -0
  626. package/dist/ir/final-fields.d.ts +2 -1
  627. package/dist/ir/final-fields.js +14 -16
  628. package/dist/ir/final-fields.js.map +1 -1
  629. package/dist/ir/function-references.d.ts +2 -0
  630. package/dist/ir/function-references.js +2 -0
  631. package/dist/ir/function-references.js.map +1 -1
  632. package/dist/ir/function-references.test.js +3 -0
  633. package/dist/ir/function-references.test.js.map +1 -1
  634. package/dist/ir/initializer-bindings.d.ts +2 -1
  635. package/dist/ir/initializer-bindings.js +27 -20
  636. package/dist/ir/initializer-bindings.js.map +1 -1
  637. package/dist/ir/int32-arrays.d.ts +108 -0
  638. package/dist/ir/int32-arrays.js +831 -0
  639. package/dist/ir/int32-arrays.js.map +1 -0
  640. package/dist/ir/int32-slots.d.ts +24 -2
  641. package/dist/ir/int32-slots.js +266 -57
  642. package/dist/ir/int32-slots.js.map +1 -1
  643. package/dist/ir/int32-slots.test.js +33 -0
  644. package/dist/ir/int32-slots.test.js.map +1 -1
  645. package/dist/ir/integer-loops.d.ts +3 -3
  646. package/dist/ir/integer-loops.js +28 -10
  647. package/dist/ir/integer-loops.js.map +1 -1
  648. package/dist/ir/integer-loops.test.js +10 -0
  649. package/dist/ir/integer-loops.test.js.map +1 -1
  650. package/dist/ir/integer-ranges.d.ts +5 -0
  651. package/dist/ir/integer-ranges.js +125 -12
  652. package/dist/ir/integer-ranges.js.map +1 -1
  653. package/dist/ir/integer-ranges.test.js +30 -0
  654. package/dist/ir/integer-ranges.test.js.map +1 -1
  655. package/dist/ir/ir.d.ts +83 -10
  656. package/dist/ir/ir.js +77 -6
  657. package/dist/ir/ir.js.map +1 -1
  658. package/dist/ir/ir.test.js +23 -2
  659. package/dist/ir/ir.test.js.map +1 -1
  660. package/dist/ir/js-ic.d.ts +4 -0
  661. package/dist/ir/js-ic.js +17 -1
  662. package/dist/ir/js-ic.js.map +1 -1
  663. package/dist/ir/js-ic.test.js +46 -0
  664. package/dist/ir/js-ic.test.js.map +1 -1
  665. package/dist/ir/node-index.d.ts +57 -0
  666. package/dist/ir/node-index.js +215 -0
  667. package/dist/ir/node-index.js.map +1 -0
  668. package/dist/ir/paired-while-loops.d.ts +25 -0
  669. package/dist/ir/paired-while-loops.js +335 -0
  670. package/dist/ir/paired-while-loops.js.map +1 -0
  671. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  672. package/dist/ir/paired-while-loops.test.js +163 -0
  673. package/dist/ir/paired-while-loops.test.js.map +1 -0
  674. package/dist/ir/parameter-versions.d.ts +25 -0
  675. package/dist/ir/parameter-versions.js +300 -0
  676. package/dist/ir/parameter-versions.js.map +1 -0
  677. package/dist/ir/runtime-features.d.ts +34 -13
  678. package/dist/ir/runtime-features.js +177 -39
  679. package/dist/ir/runtime-features.js.map +1 -1
  680. package/dist/ir/serialize.d.ts +12 -2
  681. package/dist/ir/serialize.js +16 -3
  682. package/dist/ir/serialize.js.map +1 -1
  683. package/dist/ir/serialize.test.js +17 -0
  684. package/dist/ir/serialize.test.js.map +1 -1
  685. package/dist/ir/traverse.js +18 -6
  686. package/dist/ir/traverse.js.map +1 -1
  687. package/dist/ir/validate.js +167 -40
  688. package/dist/ir/validate.js.map +1 -1
  689. package/dist/library/ir-policy.js +3 -0
  690. package/dist/library/ir-policy.js.map +1 -1
  691. package/dist/native/cache.d.ts +6 -1
  692. package/dist/native/cache.js +28 -5
  693. package/dist/native/cache.js.map +1 -1
  694. package/dist/native/cache.test.js +16 -2
  695. package/dist/native/cache.test.js.map +1 -1
  696. package/dist/native/cli.js +21 -1
  697. package/dist/native/cli.js.map +1 -1
  698. package/dist/native/compiler.js +8 -6
  699. package/dist/native/compiler.js.map +1 -1
  700. package/dist/native/executable-cache.d.ts +1 -1
  701. package/dist/native/executable-cache.js +2 -2
  702. package/dist/native/executable-cache.js.map +1 -1
  703. package/dist/native/prepare.d.ts +4 -2
  704. package/dist/native/prepare.js +130 -32
  705. package/dist/native/prepare.js.map +1 -1
  706. package/dist/native/prepare.test.js +96 -20
  707. package/dist/native/prepare.test.js.map +1 -1
  708. package/dist/native/sanitizer.test.js +2 -0
  709. package/dist/native/sanitizer.test.js.map +1 -1
  710. package/dist/native/text-file.d.ts +13 -3
  711. package/dist/native/text-file.js +63 -9
  712. package/dist/native/text-file.js.map +1 -1
  713. package/dist/native/text-file.test.d.ts +1 -0
  714. package/dist/native/text-file.test.js +49 -0
  715. package/dist/native/text-file.test.js.map +1 -0
  716. package/dist/native/toolchain.js +4 -4
  717. package/dist/native/toolchain.js.map +1 -1
  718. package/dist/native/toolchain.test.js +3 -3
  719. package/dist/native/toolchain.test.js.map +1 -1
  720. package/package.json +21 -21
  721. package/shims/chalk/v5.ts +688 -0
  722. package/shims/hono-node-server/v2.ts +645 -0
  723. package/shims/hot-shots/client.ts +1126 -0
  724. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  725. package/shims/hot-shots/v8.ts +8 -0
  726. package/surface-manifest.json +27 -7
@@ -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) {
@@ -351,6 +379,7 @@ const DYN_READ_ONLY = new Set([
351
379
  "dyn.forInStable",
352
380
  "dyn.getOwnPropertyNames",
353
381
  "dyn.getPrototype",
382
+ "dyn.getPrototypeForIdentity",
354
383
  "dyn.hasKey",
355
384
  "dyn.hasOwn",
356
385
  "dyn.in",
@@ -391,6 +420,13 @@ const DYN_READ_ONLY = new Set([
391
420
  "error.new",
392
421
  "error.newOptions",
393
422
  "fs.utimesSync",
423
+ // Buffer.prototype members read as values: a lookup by key.
424
+ "buffer.prototypeMember",
425
+ // Buffer.from(value, offset[, length]) over checked values: an
426
+ // ArrayBuffer's view after Node's offset and length conversions, or a copy
427
+ // of a string, array-like or typed array's values.
428
+ "buffer.poolFromDynOffset",
429
+ "buffer.poolFromDynRange",
394
430
  "insp.dyn",
395
431
  "insp.dynS",
396
432
  // The dynamic-tier operators run their dyn twins (scr_js_value.c); the
@@ -426,7 +462,58 @@ const DYN_READ_ONLY = new Set([
426
462
  "text.decodeStream",
427
463
  "worker.new",
428
464
  ]);
429
- function walkFunction(fn, visit) {
465
+ /** The node kinds each walk below reads. */
466
+ const LIB_CALL_KINDS = ["libCall"];
467
+ const CALL_FACT_KINDS = [
468
+ ...FUNCTION_REFERENCE_KINDS,
469
+ "virtualCall",
470
+ "instanceOfValue",
471
+ "varRef",
472
+ "assignExpr",
473
+ "incDec",
474
+ "classRef",
475
+ "varDecl",
476
+ "assign",
477
+ "forOf",
478
+ ];
479
+ const CENSUS_KINDS = [
480
+ "call",
481
+ "new",
482
+ "varRef",
483
+ "fieldGet",
484
+ "fieldIncDec",
485
+ "closure",
486
+ "classRef",
487
+ "incDec",
488
+ "forOf",
489
+ "tryCatch",
490
+ ];
491
+ const DECLARATION_KINDS = ["varDecl"];
492
+ const CANDIDATE_WRITE_KINDS = [
493
+ "assign",
494
+ "varDecl",
495
+ "fieldSet",
496
+ "return",
497
+ "call",
498
+ "new",
499
+ "assignExpr",
500
+ ];
501
+ const CALL_KINDS = ["call", "new"];
502
+ const SLOT_WRITE_KINDS = ["return", "call", "new"];
503
+ const NARROW_WRITE_KINDS = ["assign", "varDecl", "fieldSet", "assignExpr"];
504
+ /** Visits the nodes of `fn` in walk order; with `scan`, only those of its
505
+ * kinds, read from the module's node index (the visitors must ignore the
506
+ * other kinds). */
507
+ function walkFunction(fn, scan, visit) {
508
+ if (scan !== undefined) {
509
+ eachNodeOfKinds(fn, scan, (node, statement) => {
510
+ if (statement)
511
+ visit.stmt?.(node);
512
+ else
513
+ visit.expr?.(node);
514
+ });
515
+ return;
516
+ }
430
517
  const expr = (e) => {
431
518
  visit.expr?.(e);
432
519
  return everyExprChild(e, expr, stmt);
@@ -440,7 +527,7 @@ function walkFunction(fn, visit) {
440
527
  }
441
528
  /** Computes DynamicFieldStores with one walk of every function. Analyses of
442
529
  * the same module accept the result so the emitter walks the module once. */
443
- export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).map((r) => [r.id, r])), unions = new Map((mod.unions ?? []).map((u) => [u.id, u]))) {
530
+ 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) {
444
531
  const dynTypes = new Map();
445
532
  const dynNamed = new Map();
446
533
  const dynish = (type) => {
@@ -480,8 +567,13 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
480
567
  };
481
568
  const dynWritten = new Set();
482
569
  let dynWritesAll = false;
483
- for (const fn of mod.functions)
484
- walkFunction(fn, {
570
+ // A store whose key is not a literal names every field: later stores add
571
+ // nothing, so the walk stops there.
572
+ const scan = nodes?.scan(LIB_CALL_KINDS);
573
+ for (const fn of mod.functions) {
574
+ if (dynWritesAll)
575
+ break;
576
+ walkFunction(fn, scan, {
485
577
  expr: (e) => {
486
578
  if (dynWritesAll)
487
579
  return;
@@ -496,6 +588,7 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
496
588
  }
497
589
  },
498
590
  });
591
+ }
499
592
  return { all: dynWritesAll, names: dynWritten };
500
593
  }
501
594
  /** The f64 class field families a runtime store through a live dynamic view
@@ -503,6 +596,21 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
503
596
  * another exposed type), and some dynamic store in the program can name the
504
597
  * field. */
505
598
  export function dynamicallyStoredFamilies(mod, slots, stores) {
599
+ const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
600
+ const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
601
+ // A live dyn view (typed-ref capsule) of an instance writes back into
602
+ // its fields only after a runtime store into the capsule; the commit then
603
+ // writes every field from the view, which holds the exact snapshot value
604
+ // of any property no store named. So reaching dynamic code disqualifies
605
+ // exactly the field names some dynamic store in the program can name.
606
+ const { all: dynWritesAll, names: dynWritten } = stores ?? dynamicFieldStores(mod, records, unions);
607
+ const storable = (field) => field.type.kind === "f64" &&
608
+ !field.name.startsWith("%") &&
609
+ (dynWritesAll || dynWritten.has(field.name));
610
+ const families = new Set();
611
+ // Without a field some store can name, no class is worth exposing.
612
+ if (!(mod.classes ?? []).some((cls) => cls.fields.some(storable)))
613
+ return families;
506
614
  const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
507
615
  const children = new Map();
508
616
  for (const cls of classes.values())
@@ -524,8 +632,6 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
524
632
  }
525
633
  return out;
526
634
  };
527
- const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
528
- const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
529
635
  const exposedClasses = new Set();
530
636
  const seenNamed = new Set();
531
637
  let exposeAll = false;
@@ -574,14 +680,8 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
574
680
  });
575
681
  }
576
682
  };
577
- // A live dyn view (typed-ref capsule) of an instance writes back into
578
- // its fields only after a runtime store into the capsule; the commit then
579
- // writes every field from the view, which holds the exact snapshot value
580
- // of any property no store named. So reaching dynamic code disqualifies
581
- // exactly the field names some dynamic store in the program can name.
582
- const { all: dynWritesAll, names: dynWritten } = stores ?? dynamicFieldStores(mod, records, unions);
583
683
  for (const fn of mod.functions)
584
- walkFunction(fn, {
684
+ walkFunction(fn, undefined, {
585
685
  expr: (e) => {
586
686
  const dynResult = DYN_KINDS.has(e.type.kind);
587
687
  const boundary = BOUNDARY_KINDS.has(e.kind);
@@ -604,14 +704,11 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
604
704
  expose(s.value.type);
605
705
  },
606
706
  });
607
- const families = new Set();
608
707
  for (const cls of classes.values()) {
609
708
  if (!exposeAll && !exposedClasses.has(cls.name))
610
709
  continue;
611
710
  for (const field of cls.fields)
612
- if (field.type.kind === "f64" &&
613
- !field.name.startsWith("%") &&
614
- (dynWritesAll || dynWritten.has(field.name)))
711
+ if (storable(field))
615
712
  families.add(slots.family(cls.name, field.name));
616
713
  }
617
714
  return families;
@@ -620,7 +717,7 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
620
717
  * the entry, constructors behind class values: `valueEscaped`), through
621
718
  * virtual dispatch (`virtualTargets`), or as vtable entries the runtime
622
719
  * calls (`runtimeVirtual`: methods of runtime-rooted hierarchies). */
623
- export function functionCallFacts(mod, classes, subtree) {
720
+ export function functionCallFacts(mod, classes, subtree, nodes) {
624
721
  const escaped = new Set(moduleFunctionReferences(mod));
625
722
  const virtualTargets = new Set();
626
723
  // Virtual dispatch: a `virtualCall` can reach the method's implementation
@@ -652,7 +749,7 @@ export function functionCallFacts(mod, classes, subtree) {
652
749
  const count = (map, id) => {
653
750
  map.set(id, (map.get(id) ?? 0) + 1);
654
751
  };
655
- walkFunction(fn, {
752
+ walkFunction(fn, nodes?.scan(CALL_FACT_KINDS), {
656
753
  expr: (e) => {
657
754
  const referenced = exprFunctionReference(e);
658
755
  if (referenced !== undefined)
@@ -695,6 +792,7 @@ export function functionCallFacts(mod, classes, subtree) {
695
792
  return { valueEscaped: escaped, virtualTargets, runtimeVirtual };
696
793
  }
697
794
  export function analyzeInt32Slots(mod, inputs = {}) {
795
+ const nodes = inputs.nodes;
698
796
  const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
699
797
  const slots = new Int32Slots(classes);
700
798
  if (mod.lib)
@@ -723,6 +821,32 @@ export function analyzeInt32Slots(mod, inputs = {}) {
723
821
  slots.addInt32Local(key);
724
822
  for (const key of contracts?.int32Elements ?? [])
725
823
  slots.addInt32Elements(key);
824
+ // Int32 array candidates (ir/int32-arrays.ts): assumed to hold int32
825
+ // elements until a store the fixpoint cannot prove drops one, with every
826
+ // candidate the same array can reach (its group).
827
+ const arrayCandidates = new Map();
828
+ const globalArrays = new Set();
829
+ const arrayKeys = new Set(mod.int32ArrayCandidates ?? []);
830
+ slots.narrowedReads = arrayKeys.size > 0;
831
+ for (const key of arrayKeys) {
832
+ const cut = key.indexOf("\0");
833
+ if (cut === 0)
834
+ globalArrays.add(key.slice(1));
835
+ else {
836
+ const fnName = key.slice(0, cut);
837
+ const set = arrayCandidates.get(fnName) ?? new Set();
838
+ set.add(key.slice(cut + 1));
839
+ arrayCandidates.set(fnName, set);
840
+ }
841
+ slots.addInt32Elements(int32ArraySlot(key));
842
+ }
843
+ const arrayGroups = arrayKeys.size > 0 ? int32ArrayGroups(mod, arrayKeys) : null;
844
+ // Functions that read or write a candidate global.
845
+ const globalArrayFunctions = new Set();
846
+ if (arrayGroups)
847
+ for (const names of arrayGroups.globalReaders.values())
848
+ for (const name of names)
849
+ globalArrayFunctions.add(name);
726
850
  /* ── candidate fields ── */
727
851
  const children = new Map();
728
852
  for (const cls of classes.values())
@@ -783,7 +907,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
783
907
  }
784
908
  /* ── functions: escapes, parameter and return candidates ── */
785
909
  const functions = new Map(mod.functions.map((fn) => [fn.name, fn]));
786
- const calls = functionCallFacts(mod, classes, subtree);
910
+ const calls = functionCallFacts(mod, classes, subtree, nodes);
787
911
  const escaped = new Set([...calls.valueEscaped, ...calls.virtualTargets]);
788
912
  const virtual = calls.runtimeVirtual;
789
913
  const paramKey = (fnName, localId) => `param:${fnName}\0${localId}`;
@@ -846,7 +970,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
846
970
  for (const capture of fn.classCaptures ?? [])
847
971
  unstableBoxes.add(boxKey(fn.name, capture.localId));
848
972
  const read = new Set();
849
- walkFunction(fn, {
973
+ walkFunction(fn, nodes?.scan(CENSUS_KINDS), {
850
974
  expr: (e) => {
851
975
  if (e.kind === "call") {
852
976
  called.add(e.callee);
@@ -958,7 +1082,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
958
1082
  let ids = initializedDeclarations.get(fn.name);
959
1083
  if (ids === undefined) {
960
1084
  const found = new Set();
961
- walkFunction(fn, {
1085
+ walkFunction(fn, nodes?.scan(DECLARATION_KINDS), {
962
1086
  stmt: (s) => {
963
1087
  if (s.kind === "varDecl" && s.init)
964
1088
  found.add(s.localId);
@@ -1032,31 +1156,44 @@ export function analyzeInt32Slots(mod, inputs = {}) {
1032
1156
  }
1033
1157
  return false;
1034
1158
  };
1159
+ const candidateWrites = nodes?.scan(CANDIDATE_WRITE_KINDS);
1035
1160
  const hasCandidateWrite = (fn) => {
1161
+ if (arrayCandidates.has(fn.name))
1162
+ return true;
1163
+ if (globalArrayFunctions.has(fn.name))
1164
+ return true;
1036
1165
  const box = (localId) => slots.hasBox(slots.boxGroup(fn.name, localId));
1037
1166
  const returns = slots.hasReturn(fn.name);
1038
- return !everyStmtList(fn.body, {
1039
- stmt: (s) => {
1040
- if (s.kind === "assign")
1041
- return !box(s.localId);
1042
- if (s.kind === "varDecl")
1043
- return s.init === null || !box(s.localId);
1044
- if (s.kind === "fieldSet") {
1045
- const family = slots.family(s.className, s.field);
1046
- return !family || !slots.hasFamily(family);
1167
+ let found = false;
1168
+ eachNodeOfKinds(fn, candidateWrites, (node) => {
1169
+ switch (node.kind) {
1170
+ case "assign":
1171
+ found = box(node.localId);
1172
+ break;
1173
+ case "varDecl":
1174
+ found = node.init !== null && box(node.localId);
1175
+ break;
1176
+ case "fieldSet": {
1177
+ const family = slots.family(node.className, node.field);
1178
+ found = !!family && slots.hasFamily(family);
1179
+ break;
1047
1180
  }
1048
- return !(s.kind === "return" && returns);
1049
- },
1050
- expr: (e) => {
1051
- if (e.kind === "call")
1052
- return !candidateArgs(functions.get(e.callee), e.args.length, 0);
1053
- if (e.kind === "new")
1054
- return !candidateArgs(functions.get(`%${e.className}.constructor`), e.args.length, 1);
1055
- if (e.kind === "assignExpr")
1056
- return !box(e.localId);
1057
- return true;
1058
- },
1181
+ case "return":
1182
+ found = returns;
1183
+ break;
1184
+ case "call":
1185
+ found = candidateArgs(functions.get(node.callee), node.args.length, 0);
1186
+ break;
1187
+ case "new":
1188
+ found = candidateArgs(functions.get(`%${node.className}.constructor`), node.args.length, 1);
1189
+ break;
1190
+ case "assignExpr":
1191
+ found = box(node.localId);
1192
+ break;
1193
+ }
1194
+ return !found;
1059
1195
  });
1196
+ return found;
1060
1197
  };
1061
1198
  const provenByFunction = new Map();
1062
1199
  // Each function's parameter and result writes under its latest analysis:
@@ -1071,15 +1208,84 @@ export function analyzeInt32Slots(mod, inputs = {}) {
1071
1208
  reads(`param:${fn.name}\0${id}`, fn.name);
1072
1209
  // Range facts are consulted only at writes into candidate slots; slots
1073
1210
  // are only ever dropped, so a body without such a write needs none.
1074
- const ranges = hasCandidateWrite(fn)
1211
+ const candidate = hasCandidateWrite(fn);
1212
+ const ranges = candidate
1075
1213
  ? analyzeIntegerRanges(numeric(fn), slots.facts(fn.name))
1076
1214
  : new Map();
1077
1215
  if (ranges.size > 0)
1078
- lastWrites.set(fn.name, slotWrites(fn, ranges, functions));
1216
+ lastWrites.set(fn.name, slotWrites(fn, ranges, functions, nodes));
1079
1217
  else
1080
1218
  lastWrites.delete(fn.name);
1081
1219
  const proven = [];
1220
+ // The walk below acts only at writes into candidate slots.
1221
+ if (!candidate) {
1222
+ provenByFunction.set(fn.name, proven);
1223
+ continue;
1224
+ }
1082
1225
  const int32 = (e) => withinInt32(ranges.get(e));
1226
+ // Every element stored into an int32 array candidate must be an int32
1227
+ // under the facts that assume the candidates' own elements are; a
1228
+ // failing store drops its array's element facts, and the function is
1229
+ // analyzed again without them. When every failing store is still an
1230
+ // exact integer under those facts (a counter, `a[i]! + 1`) and the array
1231
+ // is only ever allocated by a fill that may be long
1232
+ // (checkableInt32Allocations), it keeps int32 slots with checked stores
1233
+ // (checkedInt32Arrays), which widen it to doubles in place at the first
1234
+ // store that is not an int32.
1235
+ const locals = arrayCandidates.get(fn.name);
1236
+ let arrays = locals;
1237
+ if (globalArrayFunctions.has(fn.name)) {
1238
+ const both = new Set();
1239
+ if (locals)
1240
+ for (const id of locals)
1241
+ both.add(id);
1242
+ for (const id of globalArrays)
1243
+ both.add(id);
1244
+ arrays = both;
1245
+ }
1246
+ if (arrays && arrayGroups) {
1247
+ const requeue = (name) => {
1248
+ if (queued.has(name))
1249
+ return;
1250
+ queued.add(name);
1251
+ queue.push(name);
1252
+ };
1253
+ const params = new Set(fn.params.map((param) => param.localId));
1254
+ for (const [id, values] of int32ArrayStores(fn, arrays)) {
1255
+ const key = int32ArrayKey(fn.name, id);
1256
+ if (!slots.hasInt32ElementSlot(int32ArraySlot(key)) || values.every(int32))
1257
+ continue;
1258
+ // The array's group drops together: every function reading a
1259
+ // member is analyzed again without its facts.
1260
+ const group = arrayGroups.group.get(key) ?? [key];
1261
+ for (const member of group) {
1262
+ slots.dropInt32Elements(int32ArraySlot(member));
1263
+ if (member.startsWith("\0")) {
1264
+ const names = arrayGroups.globalReaders.get(member);
1265
+ if (names)
1266
+ for (const name of names)
1267
+ requeue(name);
1268
+ }
1269
+ else
1270
+ requeue(member.slice(0, member.indexOf("\0")));
1271
+ }
1272
+ // Checked stores serve a lone local: its allocations are the only
1273
+ // arrays it holds.
1274
+ const checkable = (value) => {
1275
+ const range = ranges.get(value);
1276
+ return int32(value) || range != null;
1277
+ };
1278
+ if (group.length === 1 &&
1279
+ !key.startsWith("\0") &&
1280
+ !params.has(id) &&
1281
+ values.every(checkable) &&
1282
+ checkableInt32Allocations(fn, id))
1283
+ slots.checkedInt32Arrays.add(key);
1284
+ else
1285
+ for (const member of group)
1286
+ reason(`array:${member}`, "an element store is not int32");
1287
+ }
1288
+ }
1083
1289
  // An int32 written into a slot still assumed non-negative: widen the
1084
1290
  // assumption when the value may be negative, and reanalyze its readers.
1085
1291
  const settle = (slot, e) => {
@@ -1125,7 +1331,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
1125
1331
  else if (dropBox(group, `write in ${fn.name} is not int32`))
1126
1332
  invalidate(`box:${group}`);
1127
1333
  };
1128
- walkFunction(fn, {
1334
+ walkFunction(fn, nodes?.scan(CANDIDATE_WRITE_KINDS), {
1129
1335
  stmt: (s) => {
1130
1336
  if (s.kind === "assign")
1131
1337
  boxWrite(s.localId, s.value);
@@ -1166,8 +1372,11 @@ export function analyzeInt32Slots(mod, inputs = {}) {
1166
1372
  for (const proven of provenByFunction.values())
1167
1373
  for (const value of proven)
1168
1374
  slots.provenWrites.add(value);
1169
- const ranged = rangedParameters(slots, functions, retry, numeric, (callee) => readers.get(`ret:${callee}`));
1170
- narrowSlotRanges(slots, functions, numeric, lastWrites, ranged, (slot) => readers.get(slot));
1375
+ for (const key of arrayKeys)
1376
+ if (slots.hasInt32ElementSlot(int32ArraySlot(key)))
1377
+ slots.int32Arrays.add(key);
1378
+ const ranged = rangedParameters(slots, functions, retry, numeric, (callee) => readers.get(`ret:${callee}`), nodes);
1379
+ narrowSlotRanges(slots, functions, numeric, lastWrites, ranged, (slot) => readers.get(slot), nodes);
1171
1380
  return slots;
1172
1381
  }
1173
1382
  /** Bounds a widened parameter range jumps to: the int32 limits, and the
@@ -1194,7 +1403,7 @@ const widenMax = (max) => WIDEN_MAX.find((bound) => bound >= max) ?? Infinity;
1194
1403
  * other waiting functions) fail their parameters and are analyzed too, so
1195
1404
  * every call site is checked under the final ranges. The facts the main
1196
1405
  * fixpoint proved are fixed here: these ranges only add precision. */
1197
- function rangedParameters(slots, functions, retry, numeric, callersOf) {
1406
+ function rangedParameters(slots, functions, retry, numeric, callersOf, nodes) {
1198
1407
  const changed = new Set();
1199
1408
  if (retry.size === 0)
1200
1409
  return changed;
@@ -1277,7 +1486,7 @@ function rangedParameters(slots, functions, retry, numeric, callersOf) {
1277
1486
  contribute(callee, param.localId, ranges.get(arg) ?? null);
1278
1487
  });
1279
1488
  };
1280
- walkFunction(fn, {
1489
+ walkFunction(fn, nodes?.scan(CALL_KINDS), {
1281
1490
  expr: (e) => {
1282
1491
  if (e.kind === "call")
1283
1492
  args(functions.get(e.callee), e.args, 0);
@@ -1320,7 +1529,7 @@ const sameRange = (a, b) => a.min === b.min && a.max === b.max;
1320
1529
  /** The values one analysis of a function writes into parameter slots of
1321
1530
  * its direct callees and into its own result slot (`param:` and `ret:`
1322
1531
  * keys), joined per slot; null when some write has no proven range. */
1323
- function slotWrites(fn, ranges, functions) {
1532
+ function slotWrites(fn, ranges, functions, nodes) {
1324
1533
  const writes = new Map();
1325
1534
  const write = (key, value) => {
1326
1535
  const range = value ? (ranges.get(value) ?? null) : null;
@@ -1336,7 +1545,7 @@ function slotWrites(fn, ranges, functions) {
1336
1545
  write(`param:${callee.name}\0${param.localId}`, arg);
1337
1546
  });
1338
1547
  };
1339
- walkFunction(fn, {
1548
+ walkFunction(fn, nodes?.scan(SLOT_WRITE_KINDS), {
1340
1549
  stmt: (s) => {
1341
1550
  if (s.kind === "return")
1342
1551
  write(`ret:${fn.name}`, s.value);
@@ -1373,7 +1582,7 @@ const NARROW_ROUNDS = 6;
1373
1582
  * function must still prove every write into a field or box slot (whose
1374
1583
  * facts do not change here), or the narrowing is abandoned. Pinned
1375
1584
  * (contract) slots keep their contract range. */
1376
- function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf) {
1585
+ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf, nodes) {
1377
1586
  // Every parameter and result slot with a fact, and that fact.
1378
1587
  const proven = new Map();
1379
1588
  const fixed = new Set();
@@ -1434,7 +1643,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
1434
1643
  if (!rangeWithin(range, level))
1435
1644
  sound = false;
1436
1645
  };
1437
- walkFunction(fn, {
1646
+ walkFunction(fn, nodes?.scan(NARROW_WRITE_KINDS), {
1438
1647
  stmt: (s) => {
1439
1648
  if (s.kind === "assign")
1440
1649
  box(s.localId, s.value);
@@ -1449,7 +1658,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
1449
1658
  box(e.localId, e.value);
1450
1659
  },
1451
1660
  });
1452
- return { writes: slotWrites(fn, ranges, functions), sound };
1661
+ return { writes: slotWrites(fn, ranges, functions, nodes), sound };
1453
1662
  };
1454
1663
  const writesByFunction = new Map(lastWrites);
1455
1664
  const join = () => {