@scriptc/compiler 0.4.2 → 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 (636) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +397 -37
  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 +473 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +258 -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/dense-array-access.d.ts +39 -8
  58. package/dist/backend/llvm/dense-array-access.js +222 -52
  59. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  61. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  63. package/dist/backend/llvm/dense-array-loops.js +194 -5
  64. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  66. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  67. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  68. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn.d.ts +26 -0
  70. package/dist/backend/llvm/dyn.js +352 -61
  71. package/dist/backend/llvm/dyn.js.map +1 -1
  72. package/dist/backend/llvm/emit-function.js +11 -20
  73. package/dist/backend/llvm/emit-function.js.map +1 -1
  74. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  75. package/dist/backend/llvm/emit-journal.js +170 -0
  76. package/dist/backend/llvm/emit-journal.js.map +1 -0
  77. package/dist/backend/llvm/emit-module.js +195 -27
  78. package/dist/backend/llvm/emit-module.js.map +1 -1
  79. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  80. package/dist/backend/llvm/emit-statements.js +268 -84
  81. package/dist/backend/llvm/emit-statements.js.map +1 -1
  82. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  83. package/dist/backend/llvm/emitter-state.js +14 -0
  84. package/dist/backend/llvm/emitter-state.js.map +1 -0
  85. package/dist/backend/llvm/emitter.d.ts +176 -37
  86. package/dist/backend/llvm/emitter.js +724 -85
  87. package/dist/backend/llvm/emitter.js.map +1 -1
  88. package/dist/backend/llvm/emitter.test.js +54 -5
  89. package/dist/backend/llvm/emitter.test.js.map +1 -1
  90. package/dist/backend/llvm/expr-bytes.js +34 -12
  91. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  92. package/dist/backend/llvm/expr-callbacks.js +47 -0
  93. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  94. package/dist/backend/llvm/expr-calls.js +28 -14
  95. package/dist/backend/llvm/expr-calls.js.map +1 -1
  96. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  97. package/dist/backend/llvm/expr-containers.js +129 -37
  98. package/dist/backend/llvm/expr-containers.js.map +1 -1
  99. package/dist/backend/llvm/expr-context.d.ts +14 -0
  100. package/dist/backend/llvm/expr-dynamic.js +18 -11
  101. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +100 -28
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  105. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  106. package/dist/backend/llvm/expr-records.d.ts +12 -0
  107. package/dist/backend/llvm/expr-records.js +106 -0
  108. package/dist/backend/llvm/expr-records.js.map +1 -1
  109. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  110. package/dist/backend/llvm/expr-stream-bridges.js +194 -65
  111. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  115. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  118. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  119. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  120. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  121. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  122. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  123. package/dist/backend/llvm/integer-values.d.ts +20 -1
  124. package/dist/backend/llvm/integer-values.js +71 -0
  125. package/dist/backend/llvm/integer-values.js.map +1 -1
  126. package/dist/backend/llvm/js-ic.d.ts +1 -1
  127. package/dist/backend/llvm/js-ic.js +1 -1
  128. package/dist/backend/llvm/js-ic.js.map +1 -1
  129. package/dist/backend/llvm/key-orders.d.ts +7 -0
  130. package/dist/backend/llvm/key-orders.js +33 -0
  131. package/dist/backend/llvm/key-orders.js.map +1 -0
  132. package/dist/backend/llvm/lib-connect.js +4 -0
  133. package/dist/backend/llvm/lib-connect.js.map +1 -1
  134. package/dist/backend/llvm/lib-datagram.js +11 -0
  135. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  136. package/dist/backend/llvm/lib-dispatch.js +80 -2
  137. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  138. package/dist/backend/llvm/lib-filesystem.js +4 -4
  139. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  140. package/dist/backend/llvm/lib-http2.js +4 -0
  141. package/dist/backend/llvm/lib-http2.js.map +1 -1
  142. package/dist/backend/llvm/lib-lookup.js +16 -6
  143. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  144. package/dist/backend/llvm/lib-shared.js +73 -2
  145. package/dist/backend/llvm/lib-shared.js.map +1 -1
  146. package/dist/backend/llvm/lib-stream.js +35 -5
  147. package/dist/backend/llvm/lib-stream.js.map +1 -1
  148. package/dist/backend/llvm/local-array-reads.js +115 -19
  149. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  150. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  151. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  152. package/dist/backend/llvm/loop-state.d.ts +33 -0
  153. package/dist/backend/llvm/loop-state.js +42 -0
  154. package/dist/backend/llvm/loop-state.js.map +1 -0
  155. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  156. package/dist/backend/llvm/map-number-lookup.js +91 -31
  157. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  158. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  159. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  160. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  161. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  162. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  163. package/dist/backend/llvm/nullable-unions.js +15 -3
  164. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  165. package/dist/backend/llvm/publish.d.ts +10 -0
  166. package/dist/backend/llvm/publish.js +12 -0
  167. package/dist/backend/llvm/publish.js.map +1 -1
  168. package/dist/backend/llvm/receivers.js +6 -1
  169. package/dist/backend/llvm/receivers.js.map +1 -1
  170. package/dist/backend/llvm/record-results.d.ts +1 -9
  171. package/dist/backend/llvm/record-results.js +2 -11
  172. package/dist/backend/llvm/record-results.js.map +1 -1
  173. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  174. package/dist/backend/llvm/reference-writes.js +89 -72
  175. package/dist/backend/llvm/reference-writes.js.map +1 -1
  176. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  177. package/dist/backend/llvm/running-extrema.js +115 -0
  178. package/dist/backend/llvm/running-extrema.js.map +1 -0
  179. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  180. package/dist/backend/llvm/running-extrema.test.js +89 -0
  181. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  182. package/dist/backend/llvm/shapes.d.ts +71 -15
  183. package/dist/backend/llvm/shapes.js +222 -33
  184. package/dist/backend/llvm/shapes.js.map +1 -1
  185. package/dist/backend/llvm/shapes.test.js +53 -7
  186. package/dist/backend/llvm/shapes.test.js.map +1 -1
  187. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  188. package/dist/backend/llvm/speculative-integers.js +2 -2
  189. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  190. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  191. package/dist/backend/llvm/stack-objects.js +5 -2
  192. package/dist/backend/llvm/stack-objects.js.map +1 -1
  193. package/dist/backend/llvm/string-reads.d.ts +12 -0
  194. package/dist/backend/llvm/string-reads.js +44 -0
  195. package/dist/backend/llvm/string-reads.js.map +1 -1
  196. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  197. package/dist/backend/llvm/walk-borrows.js +46 -41
  198. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  199. package/dist/backend/llvm/walkers.d.ts +3 -0
  200. package/dist/backend/llvm/walkers.js +88 -65
  201. package/dist/backend/llvm/walkers.js.map +1 -1
  202. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  203. package/dist/backend/llvm/wrapping-sums.js +126 -0
  204. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  205. package/dist/backend/may-throw.d.ts +8 -10
  206. package/dist/backend/may-throw.js +14 -10
  207. package/dist/backend/may-throw.js.map +1 -1
  208. package/dist/backend/native/contracts.d.ts +5 -0
  209. package/dist/backend/native/executable.js +7 -0
  210. package/dist/backend/native/executable.js.map +1 -1
  211. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  212. package/dist/backend/native/runtime-inputs.js +1 -0
  213. package/dist/backend/native/runtime-inputs.js.map +1 -1
  214. package/dist/backend/native-link-info-core.d.ts +4 -0
  215. package/dist/backend/native-link-info-core.js.map +1 -1
  216. package/dist/backend/publication.d.ts +12 -1
  217. package/dist/backend/publication.js +37 -14
  218. package/dist/backend/publication.js.map +1 -1
  219. package/dist/backend/publication.test.js +30 -0
  220. package/dist/backend/publication.test.js.map +1 -1
  221. package/dist/backend/result-slots.d.ts +16 -0
  222. package/dist/backend/result-slots.js +23 -0
  223. package/dist/backend/result-slots.js.map +1 -0
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +1 -0
  227. package/dist/backend/runtime-pack-core.js +1 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +2 -1
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.test.js +2 -1
  232. package/dist/backend/runtime-pack.test.js.map +1 -1
  233. package/dist/backend/stack-observations.d.ts +2 -1
  234. package/dist/backend/stack-observations.js +67 -42
  235. package/dist/backend/stack-observations.js.map +1 -1
  236. package/dist/backend/target-diagnostics.js +5 -3
  237. package/dist/backend/target-diagnostics.js.map +1 -1
  238. package/dist/backend/warm-cache.js +1 -0
  239. package/dist/backend/warm-cache.js.map +1 -1
  240. package/dist/cli/usage.d.ts +1 -1
  241. package/dist/cli/usage.js +3 -3
  242. package/dist/compat/fetch-profile.js +1 -1
  243. package/dist/compat/fetch-profile.js.map +1 -1
  244. package/dist/contracts/check.js +4 -3
  245. package/dist/contracts/check.js.map +1 -1
  246. package/dist/contracts/int32-elements.js +10 -2
  247. package/dist/contracts/int32-elements.js.map +1 -1
  248. package/dist/coverage/report.js +12 -3
  249. package/dist/coverage/report.js.map +1 -1
  250. package/dist/diagnostics/diagnostic.d.ts +4 -0
  251. package/dist/diagnostics/diagnostic.js.map +1 -1
  252. package/dist/diagnostics/envelope.d.ts +3 -0
  253. package/dist/diagnostics/envelope.js +1 -0
  254. package/dist/diagnostics/envelope.js.map +1 -1
  255. package/dist/executable/executable-cache.d.ts +2 -0
  256. package/dist/executable/executable-cache.js +1 -0
  257. package/dist/executable/executable-cache.js.map +1 -1
  258. package/dist/executable/executable-cache.test.js +1 -0
  259. package/dist/executable/executable-cache.test.js.map +1 -1
  260. package/dist/frontend/decl-projection.d.ts +41 -0
  261. package/dist/frontend/decl-projection.js +854 -0
  262. package/dist/frontend/decl-projection.js.map +1 -0
  263. package/dist/frontend/decl-projection.test.d.ts +1 -0
  264. package/dist/frontend/decl-projection.test.js +30 -0
  265. package/dist/frontend/decl-projection.test.js.map +1 -0
  266. package/dist/frontend/dts-paths.d.ts +15 -0
  267. package/dist/frontend/dts-paths.js +25 -0
  268. package/dist/frontend/dts-paths.js.map +1 -1
  269. package/dist/frontend/input-tracker.d.ts +6 -0
  270. package/dist/frontend/input-tracker.js +51 -28
  271. package/dist/frontend/input-tracker.js.map +1 -1
  272. package/dist/frontend/input-tracker.test.js +19 -0
  273. package/dist/frontend/input-tracker.test.js.map +1 -1
  274. package/dist/frontend/lowering/array-values.js +100 -2
  275. package/dist/frontend/lowering/array-values.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  277. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  279. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/crypto.js +84 -9
  281. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  283. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  284. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  285. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  286. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  288. package/dist/frontend/lowering/builtins/promises.js +88 -2
  289. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  290. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  291. package/dist/frontend/lowering/builtins/readline.js +35 -3
  292. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/url.js +24 -1
  294. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  295. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  296. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  297. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  298. package/dist/frontend/lowering/class-callbacks.js +82 -12
  299. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  300. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  301. package/dist/frontend/lowering/class-construction.js +17 -3
  302. package/dist/frontend/lowering/class-construction.js.map +1 -1
  303. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +39 -2
  304. package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -108
  305. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  306. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  307. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  308. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  309. package/dist/frontend/lowering/class-iterables.js +9 -1
  310. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  311. package/dist/frontend/lowering/class-method-mutations.js +32 -9
  312. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  313. package/dist/frontend/lowering/class-prototypes.js +31 -2
  314. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  315. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  316. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  317. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  318. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  319. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  320. package/dist/frontend/lowering/coercions/structural.js +91 -1
  321. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  322. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  323. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  324. package/dist/frontend/lowering/containers/array-callbacks.js +338 -18
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  327. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  328. package/dist/frontend/lowering/containers/array-methods.js +15 -0
  329. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  330. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  331. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  332. package/dist/frontend/lowering/containers/bytes.js +2 -1
  333. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  334. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  335. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  336. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  337. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  338. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  339. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  340. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  341. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  342. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  343. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  344. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  345. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  346. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  347. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  348. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  349. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  350. package/dist/frontend/lowering/divergences.js +9 -1
  351. package/dist/frontend/lowering/divergences.js.map +1 -1
  352. package/dist/frontend/lowering/error-methods.js +47 -2
  353. package/dist/frontend/lowering/error-methods.js.map +1 -1
  354. package/dist/frontend/lowering/expressions/array-literals.js +47 -0
  355. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  356. package/dist/frontend/lowering/expressions/binary.js +36 -2
  357. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  358. package/dist/frontend/lowering/expressions/element-access.js +90 -13
  359. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  360. package/dist/frontend/lowering/expressions/identifiers.js +33 -4
  361. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  362. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  363. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  364. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  365. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  366. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  367. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  368. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  369. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  370. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  371. package/dist/frontend/lowering/expressions/property-access.js +113 -11
  372. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  373. package/dist/frontend/lowering/expressions/relational.js +212 -33
  374. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  375. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  376. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  377. package/dist/frontend/lowering/expressions/updates.js +22 -3
  378. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  379. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  380. package/dist/frontend/lowering/frozen-records.js +322 -0
  381. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  382. package/dist/frontend/lowering/function-returns.js +49 -0
  383. package/dist/frontend/lowering/function-returns.js.map +1 -1
  384. package/dist/frontend/lowering/generic-functions.js +7 -2
  385. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  386. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  387. package/dist/frontend/lowering/iterable-values.js +297 -0
  388. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  389. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  390. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  391. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  392. package/dist/frontend/lowering/js-class-fields.js +45 -10
  393. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  394. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  395. package/dist/frontend/lowering/key-order-witness.js +770 -22
  396. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  397. package/dist/frontend/lowering/key-order-witness.test.js +428 -8
  398. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  399. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  400. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  401. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  402. package/dist/frontend/lowering/lower-calls.js +443 -41
  403. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  404. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  405. package/dist/frontend/lowering/lower-classes.js +302 -22
  406. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  407. package/dist/frontend/lowering/lower-dgram.js +3 -1
  408. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  409. package/dist/frontend/lowering/lower-exprs.js +10 -2
  410. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  411. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  412. package/dist/frontend/lowering/lower-functions.js +83 -0
  413. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  414. package/dist/frontend/lowering/lower-generators.js +41 -31
  415. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  416. package/dist/frontend/lowering/lower-global-value.js +6 -3
  417. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  418. package/dist/frontend/lowering/lower-inspect.js +18 -6
  419. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  420. package/dist/frontend/lowering/lower-modules.js +32 -0
  421. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  422. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  423. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  424. package/dist/frontend/lowering/lower-server.js +2 -2
  425. package/dist/frontend/lowering/lower-server.js.map +1 -1
  426. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  427. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  428. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  429. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  430. package/dist/frontend/lowering/lower-stmts.js +454 -48
  431. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  432. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  433. package/dist/frontend/lowering/lower-stream.js +1483 -156
  434. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  435. package/dist/frontend/lowering/lowerer.d.ts +77 -6
  436. package/dist/frontend/lowering/lowerer.js +313 -29
  437. package/dist/frontend/lowering/lowerer.js.map +1 -1
  438. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  439. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  440. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  441. package/dist/frontend/lowering/new-target.d.ts +12 -0
  442. package/dist/frontend/lowering/new-target.js +280 -0
  443. package/dist/frontend/lowering/new-target.js.map +1 -0
  444. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  445. package/dist/frontend/lowering/surfaces.js +18 -6
  446. package/dist/frontend/lowering/surfaces.js.map +1 -1
  447. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  448. package/dist/frontend/lowering/undefined-index.js +82 -0
  449. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  450. package/dist/frontend/lowering/var-hoisting.js +29 -13
  451. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  452. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  453. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  454. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  455. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  456. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  457. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  458. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  459. package/dist/frontend/npm-static.js +4 -20
  460. package/dist/frontend/npm-static.js.map +1 -1
  461. package/dist/frontend/package-shims.d.ts +3 -0
  462. package/dist/frontend/package-shims.js +71 -8
  463. package/dist/frontend/package-shims.js.map +1 -1
  464. package/dist/frontend/pipeline.js +18 -10
  465. package/dist/frontend/pipeline.js.map +1 -1
  466. package/dist/frontend/process-fork.d.ts +25 -0
  467. package/dist/frontend/process-fork.js +2 -0
  468. package/dist/frontend/process-fork.js.map +1 -0
  469. package/dist/frontend/program.d.ts +8 -1
  470. package/dist/frontend/program.js +484 -69
  471. package/dist/frontend/program.js.map +1 -1
  472. package/dist/frontend/program.test.js +43 -3
  473. package/dist/frontend/program.test.js.map +1 -1
  474. package/dist/frontend/token-equivalence.d.ts +3 -0
  475. package/dist/frontend/token-equivalence.js +409 -0
  476. package/dist/frontend/token-equivalence.js.map +1 -0
  477. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  478. package/dist/frontend/token-equivalence.test.js +67 -0
  479. package/dist/frontend/token-equivalence.test.js.map +1 -0
  480. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  481. package/dist/frontend/ts7/ast-node.js +1048 -103
  482. package/dist/frontend/ts7/ast-node.js.map +1 -1
  483. package/dist/frontend/ts7/ast-node.test.js +24 -0
  484. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  485. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  486. package/dist/frontend/ts7/ast-wire.js +34 -24
  487. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  488. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  489. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  490. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  491. package/dist/frontend/ts7/checker-backend.js +2 -2
  492. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  493. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  494. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  495. package/dist/frontend/ts7/checker.d.ts +4 -0
  496. package/dist/frontend/ts7/checker.js +7 -0
  497. package/dist/frontend/ts7/checker.js.map +1 -1
  498. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  499. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  500. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  501. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  502. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  503. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  504. package/dist/frontend/ts7/program-host.d.ts +7 -0
  505. package/dist/frontend/ts7/program-host.js +25 -2
  506. package/dist/frontend/ts7/program-host.js.map +1 -1
  507. package/dist/frontend/ts7/session.d.ts +14 -1
  508. package/dist/frontend/ts7/session.js +22 -0
  509. package/dist/frontend/ts7/session.js.map +1 -1
  510. package/dist/frontend/type-mapper.d.ts +13 -1
  511. package/dist/frontend/type-mapper.js +191 -11
  512. package/dist/frontend/type-mapper.js.map +1 -1
  513. package/dist/index.d.ts +0 -5
  514. package/dist/index.js +34 -4
  515. package/dist/index.js.map +1 -1
  516. package/dist/ir/analysis.js +5 -3
  517. package/dist/ir/analysis.js.map +1 -1
  518. package/dist/ir/array-length-stability.d.ts +4 -0
  519. package/dist/ir/array-length-stability.js +19 -6
  520. package/dist/ir/array-length-stability.js.map +1 -1
  521. package/dist/ir/array-length-stability.test.js +24 -0
  522. package/dist/ir/array-length-stability.test.js.map +1 -1
  523. package/dist/ir/builtin-effects.d.ts +7 -0
  524. package/dist/ir/builtin-effects.js +52 -0
  525. package/dist/ir/builtin-effects.js.map +1 -1
  526. package/dist/ir/builtin-signatures.d.ts +6 -4
  527. package/dist/ir/builtin-signatures.js +166 -13
  528. package/dist/ir/builtin-signatures.js.map +1 -1
  529. package/dist/ir/callback-specialization.d.ts +2 -1
  530. package/dist/ir/callback-specialization.js +23 -18
  531. package/dist/ir/callback-specialization.js.map +1 -1
  532. package/dist/ir/char-unit-locals.d.ts +19 -0
  533. package/dist/ir/char-unit-locals.js +185 -0
  534. package/dist/ir/char-unit-locals.js.map +1 -0
  535. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  536. package/dist/ir/char-unit-locals.test.js +94 -0
  537. package/dist/ir/char-unit-locals.test.js.map +1 -0
  538. package/dist/ir/final-fields.d.ts +2 -1
  539. package/dist/ir/final-fields.js +14 -16
  540. package/dist/ir/final-fields.js.map +1 -1
  541. package/dist/ir/function-references.d.ts +2 -0
  542. package/dist/ir/function-references.js +2 -0
  543. package/dist/ir/function-references.js.map +1 -1
  544. package/dist/ir/function-references.test.js +3 -0
  545. package/dist/ir/function-references.test.js.map +1 -1
  546. package/dist/ir/initializer-bindings.d.ts +2 -1
  547. package/dist/ir/initializer-bindings.js +27 -20
  548. package/dist/ir/initializer-bindings.js.map +1 -1
  549. package/dist/ir/int32-arrays.d.ts +108 -0
  550. package/dist/ir/int32-arrays.js +831 -0
  551. package/dist/ir/int32-arrays.js.map +1 -0
  552. package/dist/ir/int32-slots.d.ts +24 -2
  553. package/dist/ir/int32-slots.js +259 -57
  554. package/dist/ir/int32-slots.js.map +1 -1
  555. package/dist/ir/integer-loops.d.ts +3 -3
  556. package/dist/ir/integer-loops.js +14 -6
  557. package/dist/ir/integer-loops.js.map +1 -1
  558. package/dist/ir/integer-loops.test.js +10 -0
  559. package/dist/ir/integer-loops.test.js.map +1 -1
  560. package/dist/ir/integer-ranges.d.ts +5 -0
  561. package/dist/ir/integer-ranges.js +125 -12
  562. package/dist/ir/integer-ranges.js.map +1 -1
  563. package/dist/ir/integer-ranges.test.js +30 -0
  564. package/dist/ir/integer-ranges.test.js.map +1 -1
  565. package/dist/ir/ir.d.ts +70 -7
  566. package/dist/ir/ir.js +58 -1
  567. package/dist/ir/ir.js.map +1 -1
  568. package/dist/ir/ir.test.js +21 -1
  569. package/dist/ir/ir.test.js.map +1 -1
  570. package/dist/ir/js-ic.d.ts +19 -2
  571. package/dist/ir/js-ic.js +95 -11
  572. package/dist/ir/js-ic.js.map +1 -1
  573. package/dist/ir/js-ic.test.js +188 -0
  574. package/dist/ir/js-ic.test.js.map +1 -1
  575. package/dist/ir/node-index.d.ts +57 -0
  576. package/dist/ir/node-index.js +215 -0
  577. package/dist/ir/node-index.js.map +1 -0
  578. package/dist/ir/paired-while-loops.d.ts +25 -0
  579. package/dist/ir/paired-while-loops.js +335 -0
  580. package/dist/ir/paired-while-loops.js.map +1 -0
  581. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  582. package/dist/ir/paired-while-loops.test.js +163 -0
  583. package/dist/ir/paired-while-loops.test.js.map +1 -0
  584. package/dist/ir/parameter-versions.d.ts +25 -0
  585. package/dist/ir/parameter-versions.js +300 -0
  586. package/dist/ir/parameter-versions.js.map +1 -0
  587. package/dist/ir/runtime-features.d.ts +34 -13
  588. package/dist/ir/runtime-features.js +152 -38
  589. package/dist/ir/runtime-features.js.map +1 -1
  590. package/dist/ir/serialize.d.ts +12 -2
  591. package/dist/ir/serialize.js +16 -3
  592. package/dist/ir/serialize.js.map +1 -1
  593. package/dist/ir/serialize.test.js +17 -0
  594. package/dist/ir/serialize.test.js.map +1 -1
  595. package/dist/ir/traverse.js +18 -6
  596. package/dist/ir/traverse.js.map +1 -1
  597. package/dist/ir/validate.js +122 -36
  598. package/dist/ir/validate.js.map +1 -1
  599. package/dist/library/ir-policy.js +2 -0
  600. package/dist/library/ir-policy.js.map +1 -1
  601. package/dist/native/cache.d.ts +6 -1
  602. package/dist/native/cache.js +28 -5
  603. package/dist/native/cache.js.map +1 -1
  604. package/dist/native/cache.test.js +16 -2
  605. package/dist/native/cache.test.js.map +1 -1
  606. package/dist/native/cli.js +21 -1
  607. package/dist/native/cli.js.map +1 -1
  608. package/dist/native/compiler.js +8 -6
  609. package/dist/native/compiler.js.map +1 -1
  610. package/dist/native/executable-cache.d.ts +1 -1
  611. package/dist/native/executable-cache.js +2 -2
  612. package/dist/native/executable-cache.js.map +1 -1
  613. package/dist/native/prepare.d.ts +3 -1
  614. package/dist/native/prepare.js +119 -31
  615. package/dist/native/prepare.js.map +1 -1
  616. package/dist/native/prepare.test.js +78 -18
  617. package/dist/native/prepare.test.js.map +1 -1
  618. package/dist/native/sanitizer.test.js +2 -0
  619. package/dist/native/sanitizer.test.js.map +1 -1
  620. package/dist/native/text-file.d.ts +13 -3
  621. package/dist/native/text-file.js +63 -9
  622. package/dist/native/text-file.js.map +1 -1
  623. package/dist/native/text-file.test.d.ts +1 -0
  624. package/dist/native/text-file.test.js +49 -0
  625. package/dist/native/text-file.test.js.map +1 -0
  626. package/dist/native/toolchain.js +4 -4
  627. package/dist/native/toolchain.js.map +1 -1
  628. package/dist/native/toolchain.test.js +3 -3
  629. package/dist/native/toolchain.test.js.map +1 -1
  630. package/package.json +21 -21
  631. package/shims/chalk/v5.ts +688 -0
  632. package/shims/hono-node-server/v2.ts +645 -0
  633. package/shims/hot-shots/client.ts +1126 -0
  634. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  635. package/shims/hot-shots/v8.ts +8 -0
  636. package/surface-manifest.json +26 -4
@@ -11,17 +11,20 @@ import { allocateLocalUnion, storeLocalUnion } from "./local-union-storage.js";
11
11
  import { boxAccess, boxNewCall, elemAccess } from "./shapes.js";
12
12
  import { dynHoleRead } from "./loop-array-borrows.js";
13
13
  import { endsWithJump, matchStringSelfConcat } from "../../ir/analysis.js";
14
- import { emitDiscardedSplice } from "./expr-containers.js";
14
+ import { charAtUnitRead, emitDiscardedSplice } from "./expr-containers.js";
15
15
  import { InternalCompilerError } from "../../errors.js";
16
- import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet } from "./dense-array-access.js";
16
+ import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet, SCR_ELEM_I32, } from "./dense-array-access.js";
17
17
  import { emitBorrowedInput } from "./borrowed-inputs.js";
18
- import { f64Lit, llvmCommentText, loadArrCount, sizeToDouble } from "./common.js";
19
- import { RESULT_DST_ID, RESULT_ENTRY_PREFIX } from "./record-results.js";
18
+ import { f64Lit, llvmCommentText, loadArrCount, SCR_ARR_FIELD, sizeToDouble } from "./common.js";
19
+ import { planInt32KindLoop } from "./int32-kind-loops.js";
20
+ import { withinInt32 } from "../../ir/integer-ranges.js";
21
+ import { resultSlotStore } from "../result-slots.js";
20
22
  import { matchIntegerArrayForLoop, matchIntegerBytesForLoop, matchIntegerCountedForLoop, matchIntegerPairedForLoop, } from "../../ir/integer-loops.js";
21
23
  import { emitByteWindowGuard, matchByteWindow } from "./byte-windows.js";
22
- import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop } from "./dense-array-loops.js";
24
+ import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop, pairedDenseShape, } from "./dense-array-loops.js";
23
25
  import { emitCountedLoopLimit, emitCountedLoopSafety, emitPairedLoopSafety, } from "./counted-loops.js";
24
26
  import { emitBytesLoopVersionGuard } from "./bytes-loop-versions.js";
27
+ import { bytesHeaderAlias } from "./bytes-alias.js";
25
28
  import { mangleLocal } from "../mangle.js";
26
29
  import { LlvmUnsupportedError } from "./unsupported.js";
27
30
  import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
@@ -31,6 +34,7 @@ import { emitLiteralSwitch } from "./switch-dispatch.js";
31
34
  import { SPECULATIVE_RANGE, emitSafeIntegerCheck, emitSpeculativeInteger, planProvenIntegerLoop, planSpeculativeLoop, speculativeReads, speculativeWriteTarget, } from "./speculative-integers.js";
32
35
  import { emitConcatInputs, emitMixedConcat, numberPart, stringParts, } from "./string-construction.js";
33
36
  import { emitStringInputs } from "./string-lifetimes.js";
37
+ import { LOOPS } from "./loop-state.js";
34
38
  /** A callback loop version copies the loop; keep the copies small. */
35
39
  const MAX_CALLBACK_VERSION_COST = 400;
36
40
  export function emitStmtBody(emitter, s) {
@@ -362,11 +366,26 @@ export function emitStmtBody(emitter, s) {
362
366
  const v = emitter.emitExpr(s.value);
363
367
  if (s.arr.type.kind !== "array")
364
368
  throw new InternalCompilerError("llvm emitter bug: arraySet on non-array");
365
- const acc = elemAccess(s.arr.type.elem);
369
+ if (emitter.checkedInt32Array(s.arr)) {
370
+ // An int32 array with checked stores: the int32 arm stores an int32
371
+ // value, and widens the array for any other first.
372
+ emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
373
+ const elem = s.arr.type.elem;
374
+ const proven = emitter.provenDenseIndex(s.arr, s.index);
375
+ emitter.emitByElementKind(arr.name, null, (acc, widened) => {
376
+ if (acc === "i32")
377
+ emitter.emitCheckedInt32Store(arr.name, v.name, s.value, widened);
378
+ emitDenseArraySet(emitter, arr.name, idx, s.index, acc, elem, v.name, proven);
379
+ return null;
380
+ });
381
+ break;
382
+ }
383
+ const acc = emitter.arrayAccess(s.arr, s.arr.type.elem);
384
+ const int32 = emitter.emitInt32KindStoreCheck(s.arr, v, s.value);
366
385
  emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
367
386
  if (acc === "ref")
368
387
  emitter.toHeap(v);
369
- emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index));
388
+ emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index), int32);
370
389
  break;
371
390
  }
372
391
  case "arraySetLength": {
@@ -381,6 +400,11 @@ export function emitStmtBody(emitter, s) {
381
400
  const length = emitter.emitExpr(s.length);
382
401
  if (s.arr.type.kind !== "array")
383
402
  throw new InternalCompilerError("llvm emitter bug: arraySetLength on non-array");
403
+ if (s.reserve === true) {
404
+ emitter.declare(`declare void @scr_arr_reserve_len(ptr, double)`);
405
+ B.line(`call void @scr_arr_reserve_len(ptr ${arr.name}, double ${length.name})`);
406
+ break;
407
+ }
384
408
  emitter.emitPublishedArrayGuard(arr.name, s.arr.type, s.pop === true ? 2 : 3);
385
409
  emitter.declare(`declare void @scr_arr_set_len(ptr, double)`);
386
410
  // Assigning the current length (a reused work array reset to where
@@ -406,12 +430,20 @@ export function emitStmtBody(emitter, s) {
406
430
  B.condBr(dropsLast, pop, call);
407
431
  B.startBlock(pop);
408
432
  const elem = s.arr.type.elem;
409
- const acc = elemAccess(elem);
410
- const raw = emitDenseArrayPop(emitter, arr.name, acc, call, call);
411
- if (acc === "ref" && isRefCounted(elem)) {
412
- const old = B.tmp();
413
- B.line(`${old} = inttoptr i64 ${raw} to ptr`);
414
- emitter.releaseHeap(old, elem);
433
+ if (emitter.checkedInt32Array(s.arr)) {
434
+ emitter.emitByElementKind(arr.name, null, (acc) => {
435
+ emitDenseArrayPop(emitter, arr.name, acc, elem, call, call);
436
+ return null;
437
+ });
438
+ }
439
+ else {
440
+ const acc = emitter.arrayAccess(s.arr, elem);
441
+ const raw = emitDenseArrayPop(emitter, arr.name, acc, elem, call, call);
442
+ if (acc === "ref" && isRefCounted(elem)) {
443
+ const old = B.tmp();
444
+ B.line(`${old} = inttoptr i64 ${raw} to ptr`);
445
+ emitter.releaseHeap(old, elem);
446
+ }
415
447
  }
416
448
  B.br(done);
417
449
  B.startBlock(call);
@@ -489,10 +521,7 @@ export function emitStmtBody(emitter, s) {
489
521
  ? emitter.classFieldPtr(obj.name, s.className, s.field, "compressed")
490
522
  : emitter.recordFieldPtr(obj.name, s.shapeId, s.field);
491
523
  // A result-slot entry fills zeroed caller storage, each field once.
492
- if (s.kind === "recordSet" &&
493
- s.obj.kind === "varRef" &&
494
- s.obj.localId === RESULT_DST_ID &&
495
- emitter.currentFunctionName.startsWith(RESULT_ENTRY_PREFIX))
524
+ if (resultSlotStore(emitter.currentFunctionName, s))
496
525
  emitter.initField(ptr, type, inline, v);
497
526
  else
498
527
  emitter.replaceField(ptr, type, inline, v);
@@ -696,7 +725,12 @@ export function emitStmtBody(emitter, s) {
696
725
  const trueLabel = B.newLabel("if.t");
697
726
  const joinLabel = B.newLabel("if.j");
698
727
  const falseLabel = s.else_ ? B.newLabel("if.f") : joinLabel;
699
- B.condBr(cond, trueLabel, falseLabel);
728
+ // A running maximum or minimum is rarely updated; the weights keep
729
+ // the branch, where a select would make each element wait on the last.
730
+ const weights = emitter.runningExtrema.has(s)
731
+ ? `, !prof !{!"branch_weights", i32 1, i32 1000}`
732
+ : "";
733
+ B.condBr(cond, trueLabel, falseLabel, weights);
700
734
  B.startBlock(trueLabel);
701
735
  emitter.emitBlock(s.then);
702
736
  B.br(joinLabel);
@@ -714,6 +748,15 @@ export function emitStmtBody(emitter, s) {
714
748
  emitCallbackVersionedLoop(emitter, s, callbacks);
715
749
  break;
716
750
  }
751
+ const version = LOOPS.of(emitter).bytesLoopVersionsEnabled &&
752
+ LOOPS.of(emitter).bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
753
+ !LOOPS.of(emitter).bytesLoopVersioning.has(s)
754
+ ? emitter.matchBytesLoopVersion(s, null)
755
+ : null;
756
+ if (version) {
757
+ emitVersionedLoop(emitter, s, version);
758
+ break;
759
+ }
717
760
  const workerBudget = emitter.workerLoopBudget(s);
718
761
  const le = B.newLabel("loop.e");
719
762
  emitter.emitLoopCopies(s, true, le, (exit) => {
@@ -793,19 +836,19 @@ export function emitStmtBody(emitter, s) {
793
836
  : null;
794
837
  const integerLoop = integerArrayLoop ??
795
838
  (emitter.debug === null ? matchIntegerBytesForLoop(s, emitter.numericLocals) : null);
796
- const countedLoop = !integerLoop && emitter.countedLoopsEnabled
797
- ? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, emitter.unaliasedArrays)
839
+ const countedLoop = !integerLoop && LOOPS.of(emitter).countedLoopsEnabled
840
+ ? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
798
841
  : null;
799
842
  // Two counters closing in on each other (`lo++, hi--`) take the same
800
843
  // integer storage as a counted loop's one.
801
- const pairedLoop = !integerLoop && !countedLoop && emitter.countedLoopsEnabled
844
+ const pairedLoop = !integerLoop && !countedLoop && LOOPS.of(emitter).countedLoopsEnabled
802
845
  ? matchIntegerPairedForLoop(s, emitter.numericLocals, emitter.integerRanges)
803
846
  : null;
804
847
  // Byte windows and dense loops reason about one counter.
805
- const window = countedLoop && countedLoop.followers.length === 0 && emitter.byteWindowsEnabled
806
- ? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, emitter.byteWindowEntries.get(s) ?? new Set())
848
+ const window = countedLoop && countedLoop.followers.length === 0 && LOOPS.of(emitter).byteWindowsEnabled
849
+ ? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, LOOPS.of(emitter).byteWindowEntries.get(s) ?? new Set())
807
850
  : null;
808
- const denseShape = !emitter.denseLoopsEnabled
851
+ const denseShape = !LOOPS.of(emitter).denseLoopsEnabled
809
852
  ? null
810
853
  : integerArrayLoop
811
854
  ? {
@@ -815,27 +858,29 @@ export function emitStmtBody(emitter, s) {
815
858
  }
816
859
  : countedLoop && !countedLoop.guarded && countedLoop.followers.length === 0
817
860
  ? countedDenseShape(s, countedLoop)
818
- : null;
861
+ : pairedLoop
862
+ ? pairedDenseShape(pairedLoop)
863
+ : null;
819
864
  const dense = denseShape && !window
820
- ? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, emitter.unaliasedArrays, emitter.denseLoopEntries.get(s) ?? new Set())
865
+ ? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, LOOPS.of(emitter).unaliasedArrays, LOOPS.of(emitter).denseLoopEntries.get(s) ?? new Set())
821
866
  : null;
822
867
  if (dense) {
823
868
  const valid = emitDenseLoopGuard(emitter, dense);
824
869
  const fast = B.newLabel("dense.loop.fast"), slow = B.newLabel("dense.loop.slow"), done = B.newLabel("dense.loop.done");
825
870
  B.condBr(valid, fast, slow);
826
- emitter.denseLoopsEnabled = false;
871
+ LOOPS.of(emitter).denseLoopsEnabled = false;
827
872
  try {
828
873
  B.startBlock(slow);
829
874
  emitter.emitStmt(s);
830
875
  B.br(done);
831
876
  B.startBlock(fast);
832
- emitter.denseLoop = dense;
877
+ LOOPS.of(emitter).denseLoop = dense;
833
878
  emitter.emitStmt(s);
834
879
  B.br(done);
835
880
  }
836
881
  finally {
837
- emitter.denseLoop = null;
838
- emitter.denseLoopsEnabled = true;
882
+ LOOPS.of(emitter).denseLoop = null;
883
+ LOOPS.of(emitter).denseLoopsEnabled = true;
839
884
  }
840
885
  B.startBlock(done);
841
886
  break;
@@ -845,7 +890,7 @@ export function emitStmtBody(emitter, s) {
845
890
  const fast = B.newLabel("bytes.window.fast"), slow = B.newLabel("bytes.window.slow"), done = B.newLabel("bytes.window.done");
846
891
  B.condBr(valid, fast, slow);
847
892
  const originalRanges = emitter.integerRanges, originalBounds = emitter.bytesBounds;
848
- emitter.byteWindowsEnabled = false;
893
+ LOOPS.of(emitter).byteWindowsEnabled = false;
849
894
  try {
850
895
  B.startBlock(slow);
851
896
  emitter.emitStmt(s);
@@ -859,55 +904,32 @@ export function emitStmtBody(emitter, s) {
859
904
  finally {
860
905
  emitter.integerRanges = originalRanges;
861
906
  emitter.bytesBounds = originalBounds;
862
- emitter.byteWindowsEnabled = true;
907
+ LOOPS.of(emitter).byteWindowsEnabled = true;
863
908
  }
864
909
  B.startBlock(done);
865
910
  break;
866
911
  }
867
- const versionable = emitter.bytesLoopVersionsEnabled &&
868
- emitter.bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
869
- !emitter.bytesLoopVersioning.has(s);
912
+ const versionable = LOOPS.of(emitter).bytesLoopVersionsEnabled &&
913
+ LOOPS.of(emitter).bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
914
+ !LOOPS.of(emitter).bytesLoopVersioning.has(s);
870
915
  // A loop to a typed array's or an array's length keeps its integer
871
916
  // induction. Its counted form only gives the version guard the
872
917
  // counter's iteration space, so the guard also covers accesses of
873
918
  // other typed arrays at the counter, such as `x[i]` and `y[i]` in
874
919
  // `for (let i = 0; i < out.length; i++) out[i] = x[i] * y[i]`.
875
- const versionCounted = versionable && !countedLoop && integerLoop && emitter.countedLoopsEnabled
876
- ? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, emitter.unaliasedArrays)
920
+ const versionCounted = versionable && !countedLoop && integerLoop && LOOPS.of(emitter).countedLoopsEnabled
921
+ ? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
877
922
  : countedLoop;
878
- const version = versionable ? emitter.matchBytesLoopVersion(s, versionCounted) : null;
923
+ const version = versionable
924
+ ? emitter.matchBytesLoopVersion(s, versionCounted, versionCounted ? null : pairedLoop)
925
+ : null;
879
926
  if (version) {
880
- const fast = B.newLabel("bytes.version.fast"), slow = B.newLabel("bytes.version.slow"), done = B.newLabel("bytes.version.done");
881
- emitBytesLoopVersionGuard(emitter, version, fast, slow);
882
- const originalBounds = emitter.bytesBounds, originalOwned = emitter.bytesOwned, originalRanges = emitter.integerRanges;
883
- emitter.bytesLoopVersioning.add(s);
884
- try {
885
- B.startBlock(slow);
886
- emitter.emitStmt(s);
887
- B.br(done);
888
- B.startBlock(fast);
889
- emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
890
- if (version.owned.size > 0)
891
- emitter.bytesOwned = new Set([...originalOwned, ...version.owned]);
892
- if (version.ranges.size > 0)
893
- emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
894
- if (version.counted?.guarded)
895
- emitter.provenCountedGuards.add(s);
896
- emitter.emitStmt(s);
897
- B.br(done);
898
- }
899
- finally {
900
- emitter.bytesBounds = originalBounds;
901
- emitter.bytesOwned = originalOwned;
902
- emitter.integerRanges = originalRanges;
903
- emitter.provenCountedGuards.delete(s);
904
- emitter.bytesLoopVersioning.delete(s);
905
- }
906
- B.startBlock(done);
927
+ emitVersionedLoop(emitter, s, version);
907
928
  break;
908
929
  }
909
930
  let countedJoin = null;
910
- if ((countedLoop?.guarded && !emitter.provenCountedGuards.has(s)) || pairedLoop?.guarded) {
931
+ if ((countedLoop?.guarded || pairedLoop?.guarded) &&
932
+ !LOOPS.of(emitter).provenCountedGuards.has(s)) {
911
933
  const safe = countedLoop
912
934
  ? emitCountedLoopSafety(emitter, countedLoop)
913
935
  : emitPairedLoopSafety(emitter, pairedLoop);
@@ -916,9 +938,9 @@ export function emitStmtBody(emitter, s) {
916
938
  countedJoin = B.newLabel("counted.done");
917
939
  B.condBr(safe, fast, slow);
918
940
  B.startBlock(slow);
919
- emitter.countedLoopsEnabled = false;
941
+ LOOPS.of(emitter).countedLoopsEnabled = false;
920
942
  emitter.emitStmt(s);
921
- emitter.countedLoopsEnabled = true;
943
+ LOOPS.of(emitter).countedLoopsEnabled = true;
922
944
  B.br(countedJoin);
923
945
  B.startBlock(fast);
924
946
  }
@@ -945,8 +967,8 @@ export function emitStmtBody(emitter, s) {
945
967
  emitter.integerLoopBindings.set(integerLoop.localId, {
946
968
  slot: integerSlot,
947
969
  type: emitter.sizeType,
948
- range: emitter.denseLoop?.counter === integerLoop.localId
949
- ? emitter.denseLoop.range
970
+ range: LOOPS.of(emitter).denseLoop?.counter === integerLoop.localId
971
+ ? LOOPS.of(emitter).denseLoop.range
950
972
  : { min: 0, max: integerArrayLoop ? 4294967294 : Number.MAX_SAFE_INTEGER - 1 },
951
973
  });
952
974
  }
@@ -961,8 +983,8 @@ export function emitStmtBody(emitter, s) {
961
983
  slot: integerSlot,
962
984
  type: "i64",
963
985
  signed: true,
964
- range: emitter.denseLoop?.counter === countedLoop.localId
965
- ? emitter.denseLoop.range
986
+ range: LOOPS.of(emitter).denseLoop?.counter === countedLoop.localId
987
+ ? LOOPS.of(emitter).denseLoop.range
966
988
  : countedLoop.range,
967
989
  });
968
990
  for (const follower of countedLoop.followers) {
@@ -991,11 +1013,14 @@ export function emitStmtBody(emitter, s) {
991
1013
  B.line(`${start} = fptosi double ${value.name} to i64`);
992
1014
  B.line(`store i64 ${start}, ptr ${slot}`);
993
1015
  pairedSlots.push(slot);
1016
+ const dense = LOOPS.of(emitter).denseLoop;
994
1017
  emitter.integerLoopBindings.set(counter.localId, {
995
1018
  slot,
996
1019
  type: "i64",
997
1020
  signed: true,
998
- range: pairedLoop.range,
1021
+ range: dense?.pair && dense.counter === pairedLoop.low.localId
1022
+ ? dense.range
1023
+ : pairedLoop.range,
999
1024
  });
1000
1025
  }
1001
1026
  }
@@ -1063,8 +1088,7 @@ export function emitStmtBody(emitter, s) {
1063
1088
  B.line(`${inBounds} = icmp ult i32 ${narrow}, ${len}`);
1064
1089
  }
1065
1090
  else {
1066
- emitter.markMemoryPointer(lenPtr, "bytes:header");
1067
- B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${emitter.fieldAliasAttachment(lenPtr)}`);
1091
+ B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${bytesHeaderAlias(emitter)}`);
1068
1092
  B.line(`${inBounds} = icmp ult ${emitter.sizeType} ${index}, ${len}`);
1069
1093
  }
1070
1094
  B.condBr(inBounds, lb, exit);
@@ -1701,7 +1725,7 @@ export function emitTryCatch(emitter, s) {
1701
1725
  * case, refcounted/boxed case-body locals are NULL-reset up front and
1702
1726
  * the scope-exit releases rely on NULL tolerance. */
1703
1727
  export function emitSwitch(emitter, s) {
1704
- const unitSwitch = charAtUnitSwitch(s);
1728
+ const unitSwitch = charAtUnitSwitch(emitter, s);
1705
1729
  if (unitSwitch !== null)
1706
1730
  return emitSwitch(emitter, unitSwitch);
1707
1731
  const B = emitter.B;
@@ -1904,6 +1928,39 @@ const SPECULATION_BAILS = 8;
1904
1928
  * when speculative-integers.ts plans a fast integer copy. Both copies
1905
1929
  * share the loop's setup and exit; the ordinary copy comes first so the
1906
1930
  * fast copy is only emitted when every resume point exists. */
1931
+ /** A typed-array loop version: the guard, then the checked copy, which
1932
+ * runs whenever the guard fails, and the copy whose accesses the guard
1933
+ * proves in bounds (or thread-owned). */
1934
+ function emitVersionedLoop(emitter, s, version) {
1935
+ const B = emitter.B;
1936
+ const fast = B.newLabel("bytes.version.fast"), slow = B.newLabel("bytes.version.slow"), done = B.newLabel("bytes.version.done");
1937
+ emitBytesLoopVersionGuard(emitter, version, fast, slow);
1938
+ const originalBounds = emitter.bytesBounds, originalOwned = emitter.bytesOwned, originalRanges = emitter.integerRanges;
1939
+ LOOPS.of(emitter).bytesLoopVersioning.add(s);
1940
+ try {
1941
+ B.startBlock(slow);
1942
+ emitter.emitStmt(s);
1943
+ B.br(done);
1944
+ B.startBlock(fast);
1945
+ emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
1946
+ if (version.owned.size > 0)
1947
+ emitter.bytesOwned = new Set([...originalOwned, ...version.owned]);
1948
+ if (version.ranges.size > 0)
1949
+ emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
1950
+ if (version.counted?.guarded || version.paired?.loop.guarded)
1951
+ LOOPS.of(emitter).provenCountedGuards.add(s);
1952
+ emitter.emitStmt(s);
1953
+ B.br(done);
1954
+ }
1955
+ finally {
1956
+ emitter.bytesBounds = originalBounds;
1957
+ emitter.bytesOwned = originalOwned;
1958
+ emitter.integerRanges = originalRanges;
1959
+ LOOPS.of(emitter).provenCountedGuards.delete(s);
1960
+ LOOPS.of(emitter).bytesLoopVersioning.delete(s);
1961
+ }
1962
+ B.startBlock(done);
1963
+ }
1907
1964
  export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1908
1965
  const plan = allowed &&
1909
1966
  emitter.speculativeLoopsEnabled &&
@@ -1918,11 +1975,25 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1918
1975
  }, (id) => emitter.speculativeLocal(id) || emitter.speculativeInvariantGlobal(id))
1919
1976
  : null;
1920
1977
  if (!plan) {
1921
- const proven = allowed ? planProvenLoop(emitter, loop) : null;
1922
- if (proven)
1923
- emitProvenLoop(emitter, proven, exit, emitCopy);
1978
+ const ordinary = (exit) => {
1979
+ const proven = allowed ? planProvenLoop(emitter, loop) : null;
1980
+ if (proven)
1981
+ emitProvenLoop(emitter, proven, exit, emitCopy);
1982
+ else
1983
+ emitCopy(exit);
1984
+ };
1985
+ const kinds = allowed &&
1986
+ emitter.speculativeLoopsEnabled &&
1987
+ emitter.int32Slots.checkedInt32Arrays.size > 0 &&
1988
+ emitter.int32Kinds === null &&
1989
+ emitter.speculation === null &&
1990
+ emitter.speculationResume === null
1991
+ ? planInt32KindLoop(loop, (id) => emitter.checkedInt32Local(id), (e) => withinInt32(emitter.integerRanges.get(e)))
1992
+ : null;
1993
+ if (kinds)
1994
+ emitInt32KindLoop(emitter, kinds, exit, kinds.writes.size > 0 ? emitCopy : ordinary);
1924
1995
  else
1925
- emitCopy(exit);
1996
+ ordinary(exit);
1926
1997
  return;
1927
1998
  }
1928
1999
  const B = emitter.B;
@@ -1948,8 +2019,7 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1948
2019
  // count. After SPECULATION_BAILS bailing entries in a row, the site runs
1949
2020
  // the ordinary copy only. The count is a hint: both copies give the same
1950
2021
  // results, and a race between workers loses at most an update.
1951
- const bails = `@scr.spec.bails.${emitter.speculativeLoopSites++}`;
1952
- emitter.declare(`${bails} = internal global i8 0`);
2022
+ const bails = emitter.speculativeLoopSite();
1953
2023
  const count = B.tmp(), trying = B.tmp();
1954
2024
  B.line(`${count} = load atomic i8, ptr ${bails} unordered, align 1`);
1955
2025
  B.line(`${trying} = icmp ult i8 ${count}, ${SPECULATION_BAILS}`);
@@ -2068,6 +2138,120 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
2068
2138
  emitter.integerLoopBindings.delete(id);
2069
2139
  }
2070
2140
  }
2141
+ /** An int32 kind loop (int32-kind-loops.ts). The entry test reads the kind
2142
+ * of each of the plan's arrays: when every one holds int32 slots the fast
2143
+ * copy runs, when every one holds doubles the wide copy, which reads and
2144
+ * writes them as double arrays, and otherwise (a plan with several arrays)
2145
+ * the mixed copy, which tests their kinds at each access. A failed store of
2146
+ * the fast copy re-executes in the third copy, which finishes its
2147
+ * iteration with kind tests and then enters the mixed copy, or the wide
2148
+ * copy when the plan has one array (it just widened). Each copy is emitted
2149
+ * by `ordinary`: the loop's plain copy when a store may fail, since a
2150
+ * proven integer loop keeps locals in shadows of its own copy that another
2151
+ * copy cannot resume from. */
2152
+ function emitInt32KindLoop(emitter, plan, exit, ordinary) {
2153
+ const B = emitter.B;
2154
+ const fn = emitter.currentFunctionName;
2155
+ const keys = new Set([...plan.arrays.keys()].map((id) => `${fn}\0${id}`));
2156
+ const several = keys.size > 1;
2157
+ let allInt32 = "true", allWide = "true";
2158
+ const and = (all, next) => {
2159
+ if (all === "true")
2160
+ return next;
2161
+ const both = B.tmp();
2162
+ B.line(`${both} = and i1 ${all}, ${next}`);
2163
+ return both;
2164
+ };
2165
+ for (const ref of plan.arrays.values()) {
2166
+ const arr = emitter.emitStableReceiver(ref, []);
2167
+ const kindPtr = B.tmp(), kind = B.tmp(), isInt32 = B.tmp();
2168
+ B.line(`${kindPtr} = getelementptr inbounds %ScrArr, ptr ${arr.name}, i32 0, i32 ${SCR_ARR_FIELD.elem}`);
2169
+ emitter.markMemoryPointer(kindPtr, "array:header");
2170
+ B.line(`${kind} = load i8, ptr ${kindPtr}${emitter.fieldAliasAttachment(kindPtr)}`);
2171
+ B.line(`${isInt32} = icmp eq i8 ${kind}, ${SCR_ELEM_I32}`);
2172
+ allInt32 = and(allInt32, isInt32);
2173
+ if (several) {
2174
+ const isWide = B.tmp();
2175
+ B.line(`${isWide} = xor i1 ${isInt32}, true`);
2176
+ allWide = and(allWide, isWide);
2177
+ }
2178
+ }
2179
+ const fast = B.newLabel("kind.fast"), wide = B.newLabel("kind.wide"), mixed = several ? B.newLabel("kind.mixed") : null;
2180
+ if (mixed === null)
2181
+ B.condBr(allInt32, fast, wide);
2182
+ else {
2183
+ const other = B.newLabel("kind.other");
2184
+ B.condBr(allInt32, fast, other);
2185
+ B.startBlock(other);
2186
+ B.condBr(allWide, wide, mixed);
2187
+ }
2188
+ const resume = new Map();
2189
+ for (const s of plan.writes)
2190
+ resume.set(s, { label: B.newLabel("kind.resume"), placed: false });
2191
+ // The header the third copy enters: the mixed copy's, or the wide copy's.
2192
+ let header = null;
2193
+ const capture = (label) => {
2194
+ header = label;
2195
+ };
2196
+ B.startBlock(wide);
2197
+ if (resume.size > 0 && mixed === null)
2198
+ emitter.speculationHeader = capture;
2199
+ emitter.int32Kinds = { int32: new Set(), wide: keys, resume: new Map() };
2200
+ try {
2201
+ ordinary(exit);
2202
+ }
2203
+ finally {
2204
+ emitter.speculationHeader = null;
2205
+ emitter.int32Kinds = null;
2206
+ }
2207
+ if (mixed !== null) {
2208
+ B.startBlock(mixed);
2209
+ if (resume.size > 0)
2210
+ emitter.speculationHeader = capture;
2211
+ try {
2212
+ ordinary(exit);
2213
+ }
2214
+ finally {
2215
+ emitter.speculationHeader = null;
2216
+ }
2217
+ }
2218
+ if (resume.size > 0) {
2219
+ if (header === null)
2220
+ throw new InternalCompilerError("llvm emitter bug: int32 kind loop copy without a header");
2221
+ // A failed store finishes its iteration here, as in a speculative
2222
+ // integer loop's third copy.
2223
+ B.startBlock(B.newLabel("kind.tail"));
2224
+ emitter.speculationResume = resume;
2225
+ emitter.speculationHeader = () => {
2226
+ B.br(header);
2227
+ B.startBlock(B.newLabel("kind.unused"));
2228
+ };
2229
+ try {
2230
+ ordinary(exit);
2231
+ }
2232
+ finally {
2233
+ emitter.speculationResume = null;
2234
+ emitter.speculationHeader = null;
2235
+ }
2236
+ }
2237
+ B.startBlock(fast);
2238
+ if (![...resume.values()].every((r) => r.placed)) {
2239
+ // A write the third copy never reached: this copy tests the kinds.
2240
+ ordinary(exit);
2241
+ return;
2242
+ }
2243
+ emitter.int32Kinds = {
2244
+ int32: keys,
2245
+ wide: new Set(),
2246
+ resume: new Map([...resume].map(([s, r]) => [s, r.label])),
2247
+ };
2248
+ try {
2249
+ ordinary(exit);
2250
+ }
2251
+ finally {
2252
+ emitter.int32Kinds = null;
2253
+ }
2254
+ }
2071
2255
  /** At the top of a loop copy's header: lets a speculative loop find its
2072
2256
  * ordinary copy's header, and keeps its third copy out of the loop. */
2073
2257
  function enterLoopHeader(emitter, header) {
@@ -2319,7 +2503,7 @@ function nullableStringSwitch(emitter, s) {
2319
2503
  * one-unit string literals, as a switch on `s.charCodeAt(i)` with the units
2320
2504
  * as cases: no character string is built. An index out of range answers
2321
2505
  * NaN, which matches no case, as "" matches no one-unit literal. */
2322
- function charAtUnitSwitch(s) {
2506
+ function charAtUnitSwitch(emitter, s) {
2323
2507
  const disc = s.disc;
2324
2508
  if (disc.kind !== "strIntrinsic" || disc.method !== "charAt" || disc.args.length !== 1)
2325
2509
  return null;
@@ -2329,7 +2513,7 @@ function charAtUnitSwitch(s) {
2329
2513
  return null;
2330
2514
  return {
2331
2515
  ...s,
2332
- disc: { ...disc, method: "charCodeAt", type: F64 },
2516
+ disc: charAtUnitRead(emitter, disc),
2333
2517
  cases: s.cases.map((c) => c.test?.kind === "strLit"
2334
2518
  ? {
2335
2519
  ...c,