@scriptc/compiler 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (999) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +977 -113
  2. package/dist/backend/cycle-analysis.d.ts +5 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +9 -1
  8. package/dist/backend/cycle-mutability.js +21 -3
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +6 -1
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +7 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +5 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +23 -4
  18. package/dist/backend/llvm/alloc.js +61 -8
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +23 -10
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
  37. package/dist/backend/llvm/bytes-loop-versions.js +567 -30
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +74 -1
  44. package/dist/backend/llvm/classes.js +364 -54
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +384 -17
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +10 -6
  49. package/dist/backend/llvm/common.js +10 -6
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +91 -56
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  55. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  56. package/dist/backend/llvm/counted-loops.d.ts +11 -1
  57. package/dist/backend/llvm/counted-loops.js +80 -23
  58. package/dist/backend/llvm/counted-loops.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
  65. package/dist/backend/llvm/dense-array-loops.js +237 -12
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +140 -15
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +51 -1
  72. package/dist/backend/llvm/dyn.js +683 -69
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +33 -26
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +208 -34
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -27
  82. package/dist/backend/llvm/emit-statements.js +577 -93
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +314 -49
  88. package/dist/backend/llvm/emitter.js +1241 -129
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +54 -5
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +19 -0
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  95. package/dist/backend/llvm/expr-bytes.js +144 -52
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.js +47 -0
  98. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  99. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  100. package/dist/backend/llvm/expr-calls.js +62 -36
  101. package/dist/backend/llvm/expr-calls.js.map +1 -1
  102. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  103. package/dist/backend/llvm/expr-containers.js +148 -40
  104. package/dist/backend/llvm/expr-containers.js.map +1 -1
  105. package/dist/backend/llvm/expr-context.d.ts +14 -0
  106. package/dist/backend/llvm/expr-control.js +2 -3
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dynamic.js +71 -16
  109. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  110. package/dist/backend/llvm/expr-primitives.js +126 -36
  111. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  112. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  113. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-records.d.ts +12 -0
  115. package/dist/backend/llvm/expr-records.js +106 -0
  116. package/dist/backend/llvm/expr-records.js.map +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  118. package/dist/backend/llvm/expr-stream-bridges.js +225 -64
  119. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  121. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  126. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  127. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  128. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  129. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  130. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  131. package/dist/backend/llvm/integer-values.d.ts +20 -1
  132. package/dist/backend/llvm/integer-values.js +71 -0
  133. package/dist/backend/llvm/integer-values.js.map +1 -1
  134. package/dist/backend/llvm/js-ic.d.ts +1 -1
  135. package/dist/backend/llvm/js-ic.js +1 -1
  136. package/dist/backend/llvm/js-ic.js.map +1 -1
  137. package/dist/backend/llvm/key-orders.d.ts +7 -0
  138. package/dist/backend/llvm/key-orders.js +33 -0
  139. package/dist/backend/llvm/key-orders.js.map +1 -0
  140. package/dist/backend/llvm/lib-connect.js +4 -0
  141. package/dist/backend/llvm/lib-connect.js.map +1 -1
  142. package/dist/backend/llvm/lib-datagram.js +11 -0
  143. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  144. package/dist/backend/llvm/lib-dispatch.js +90 -2
  145. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  146. package/dist/backend/llvm/lib-filesystem.js +65 -4
  147. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  148. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  149. package/dist/backend/llvm/lib-http2.js +24 -17
  150. package/dist/backend/llvm/lib-http2.js.map +1 -1
  151. package/dist/backend/llvm/lib-lookup.js +16 -6
  152. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  153. package/dist/backend/llvm/lib-process.js +65 -14
  154. package/dist/backend/llvm/lib-process.js.map +1 -1
  155. package/dist/backend/llvm/lib-shared.js +126 -3
  156. package/dist/backend/llvm/lib-shared.js.map +1 -1
  157. package/dist/backend/llvm/lib-stream.js +97 -30
  158. package/dist/backend/llvm/lib-stream.js.map +1 -1
  159. package/dist/backend/llvm/lib-tls.js +23 -0
  160. package/dist/backend/llvm/lib-tls.js.map +1 -1
  161. package/dist/backend/llvm/local-array-reads.js +181 -64
  162. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  163. package/dist/backend/llvm/local-array-reads.test.js +28 -0
  164. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  165. package/dist/backend/llvm/loop-state.d.ts +33 -0
  166. package/dist/backend/llvm/loop-state.js +42 -0
  167. package/dist/backend/llvm/loop-state.js.map +1 -0
  168. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  169. package/dist/backend/llvm/map-number-lookup.js +91 -31
  170. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  171. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  172. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  173. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  176. package/dist/backend/llvm/nullable-unions.js +15 -3
  177. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  178. package/dist/backend/llvm/publish.d.ts +18 -1
  179. package/dist/backend/llvm/publish.js +76 -25
  180. package/dist/backend/llvm/publish.js.map +1 -1
  181. package/dist/backend/llvm/publish.test.js +3 -0
  182. package/dist/backend/llvm/publish.test.js.map +1 -1
  183. package/dist/backend/llvm/receivers.js +7 -2
  184. package/dist/backend/llvm/receivers.js.map +1 -1
  185. package/dist/backend/llvm/record-results.d.ts +1 -9
  186. package/dist/backend/llvm/record-results.js +2 -11
  187. package/dist/backend/llvm/record-results.js.map +1 -1
  188. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  189. package/dist/backend/llvm/reference-writes.js +91 -72
  190. package/dist/backend/llvm/reference-writes.js.map +1 -1
  191. package/dist/backend/llvm/regex-matchers.js +161 -14
  192. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  193. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  194. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  195. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  196. package/dist/backend/llvm/running-extrema.js +115 -0
  197. package/dist/backend/llvm/running-extrema.js.map +1 -0
  198. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  199. package/dist/backend/llvm/running-extrema.test.js +89 -0
  200. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  201. package/dist/backend/llvm/shapes.d.ts +79 -21
  202. package/dist/backend/llvm/shapes.js +233 -42
  203. package/dist/backend/llvm/shapes.js.map +1 -1
  204. package/dist/backend/llvm/shapes.test.js +53 -7
  205. package/dist/backend/llvm/shapes.test.js.map +1 -1
  206. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  207. package/dist/backend/llvm/speculative-integers.js +2 -2
  208. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  209. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  210. package/dist/backend/llvm/stack-objects.js +5 -2
  211. package/dist/backend/llvm/stack-objects.js.map +1 -1
  212. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  213. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  214. package/dist/backend/llvm/string-reads.d.ts +15 -0
  215. package/dist/backend/llvm/string-reads.js +128 -0
  216. package/dist/backend/llvm/string-reads.js.map +1 -1
  217. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  218. package/dist/backend/llvm/walk-borrows.js +46 -41
  219. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  220. package/dist/backend/llvm/walkers.d.ts +3 -0
  221. package/dist/backend/llvm/walkers.js +88 -65
  222. package/dist/backend/llvm/walkers.js.map +1 -1
  223. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  224. package/dist/backend/llvm/wasm-modules.js +32 -9
  225. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  226. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  227. package/dist/backend/llvm/wrapping-sums.js +126 -0
  228. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  229. package/dist/backend/mangle.d.ts +3 -0
  230. package/dist/backend/mangle.js +5 -0
  231. package/dist/backend/mangle.js.map +1 -1
  232. package/dist/backend/may-throw.d.ts +8 -10
  233. package/dist/backend/may-throw.js +14 -10
  234. package/dist/backend/may-throw.js.map +1 -1
  235. package/dist/backend/native/contracts.d.ts +27 -4
  236. package/dist/backend/native/executable.js +31 -8
  237. package/dist/backend/native/executable.js.map +1 -1
  238. package/dist/backend/native/library.js +1 -0
  239. package/dist/backend/native/library.js.map +1 -1
  240. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  241. package/dist/backend/native/runtime-inputs.js +1 -0
  242. package/dist/backend/native/runtime-inputs.js.map +1 -1
  243. package/dist/backend/native-codegen.d.ts +11 -6
  244. package/dist/backend/native-codegen.js +36 -9
  245. package/dist/backend/native-codegen.js.map +1 -1
  246. package/dist/backend/native-codegen.test.js +0 -23
  247. package/dist/backend/native-codegen.test.js.map +1 -1
  248. package/dist/backend/native-link-info-core.d.ts +18 -4
  249. package/dist/backend/native-link-info-core.js.map +1 -1
  250. package/dist/backend/optimization.d.ts +2 -2
  251. package/dist/backend/publication.d.ts +12 -1
  252. package/dist/backend/publication.js +37 -14
  253. package/dist/backend/publication.js.map +1 -1
  254. package/dist/backend/publication.test.js +30 -0
  255. package/dist/backend/publication.test.js.map +1 -1
  256. package/dist/backend/result-slots.d.ts +16 -0
  257. package/dist/backend/result-slots.js +23 -0
  258. package/dist/backend/result-slots.js.map +1 -0
  259. package/dist/backend/runtime-abi.d.ts +2 -2
  260. package/dist/backend/runtime-abi.js +2 -2
  261. package/dist/backend/runtime-pack-core.d.ts +2 -1
  262. package/dist/backend/runtime-pack-core.js +2 -1
  263. package/dist/backend/runtime-pack-core.js.map +1 -1
  264. package/dist/backend/runtime-pack-targets.test.js +5 -1
  265. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  266. package/dist/backend/runtime-pack.d.ts +0 -21
  267. package/dist/backend/runtime-pack.js +0 -29
  268. package/dist/backend/runtime-pack.js.map +1 -1
  269. package/dist/backend/runtime-pack.test.js +10 -69
  270. package/dist/backend/runtime-pack.test.js.map +1 -1
  271. package/dist/backend/stack-observations.d.ts +2 -1
  272. package/dist/backend/stack-observations.js +67 -42
  273. package/dist/backend/stack-observations.js.map +1 -1
  274. package/dist/backend/target-diagnostics.js +33 -1
  275. package/dist/backend/target-diagnostics.js.map +1 -1
  276. package/dist/backend/warm-cache.js +4 -0
  277. package/dist/backend/warm-cache.js.map +1 -1
  278. package/dist/cli/command.js +26 -6
  279. package/dist/cli/command.js.map +1 -1
  280. package/dist/cli/usage.d.ts +5 -1
  281. package/dist/cli/usage.js +10 -5
  282. package/dist/cli/usage.js.map +1 -1
  283. package/dist/compat/fetch-profile.js +1 -1
  284. package/dist/compat/fetch-profile.js.map +1 -1
  285. package/dist/contracts/check.js +5 -4
  286. package/dist/contracts/check.js.map +1 -1
  287. package/dist/contracts/int32-elements.js +10 -2
  288. package/dist/contracts/int32-elements.js.map +1 -1
  289. package/dist/coverage/report.d.ts +7 -2
  290. package/dist/coverage/report.js +30 -3
  291. package/dist/coverage/report.js.map +1 -1
  292. package/dist/coverage/verdict-cache.d.ts +1 -0
  293. package/dist/coverage/verdict-cache.js +4 -0
  294. package/dist/coverage/verdict-cache.js.map +1 -1
  295. package/dist/coverage/verdict-semantic.js +4 -0
  296. package/dist/coverage/verdict-semantic.js.map +1 -1
  297. package/dist/diagnostics/diagnostic.d.ts +4 -0
  298. package/dist/diagnostics/diagnostic.js.map +1 -1
  299. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  300. package/dist/diagnostics/dynamic-tier.js +57 -0
  301. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  302. package/dist/diagnostics/envelope.d.ts +5 -1
  303. package/dist/diagnostics/envelope.js +6 -2
  304. package/dist/diagnostics/envelope.js.map +1 -1
  305. package/dist/executable/executable-cache.d.ts +25 -1
  306. package/dist/executable/executable-cache.js +60 -7
  307. package/dist/executable/executable-cache.js.map +1 -1
  308. package/dist/executable/executable-cache.test.js +46 -3
  309. package/dist/executable/executable-cache.test.js.map +1 -1
  310. package/dist/executable/prepare.js +3 -1
  311. package/dist/executable/prepare.js.map +1 -1
  312. package/dist/frontend/analysis.js +1 -0
  313. package/dist/frontend/analysis.js.map +1 -1
  314. package/dist/frontend/decl-projection.d.ts +41 -0
  315. package/dist/frontend/decl-projection.js +854 -0
  316. package/dist/frontend/decl-projection.js.map +1 -0
  317. package/dist/frontend/decl-projection.test.d.ts +1 -0
  318. package/dist/frontend/decl-projection.test.js +30 -0
  319. package/dist/frontend/decl-projection.test.js.map +1 -0
  320. package/dist/frontend/dispose-hook.d.ts +2 -0
  321. package/dist/frontend/dispose-hook.js +14 -0
  322. package/dist/frontend/dispose-hook.js.map +1 -0
  323. package/dist/frontend/dts-paths.d.ts +15 -0
  324. package/dist/frontend/dts-paths.js +25 -0
  325. package/dist/frontend/dts-paths.js.map +1 -1
  326. package/dist/frontend/input-tracker.d.ts +6 -0
  327. package/dist/frontend/input-tracker.js +51 -28
  328. package/dist/frontend/input-tracker.js.map +1 -1
  329. package/dist/frontend/input-tracker.test.js +19 -0
  330. package/dist/frontend/input-tracker.test.js.map +1 -1
  331. package/dist/frontend/jsx-entities.d.ts +4 -0
  332. package/dist/frontend/jsx-entities.js +259 -0
  333. package/dist/frontend/jsx-entities.js.map +1 -0
  334. package/dist/frontend/jsx-source.d.ts +71 -0
  335. package/dist/frontend/jsx-source.js +781 -0
  336. package/dist/frontend/jsx-source.js.map +1 -0
  337. package/dist/frontend/jsx-source.test.d.ts +1 -0
  338. package/dist/frontend/jsx-source.test.js +200 -0
  339. package/dist/frontend/jsx-source.test.js.map +1 -0
  340. package/dist/frontend/literal-values.test.js +8 -9
  341. package/dist/frontend/literal-values.test.js.map +1 -1
  342. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  343. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  344. package/dist/frontend/lowering/array-values.js +103 -4
  345. package/dist/frontend/lowering/array-values.js.map +1 -1
  346. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  347. package/dist/frontend/lowering/binding-analysis.js +2 -2
  348. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  350. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  351. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  353. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  355. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  356. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  357. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  358. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  359. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  361. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  362. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  363. package/dist/frontend/lowering/builtins/crypto.js +136 -5
  364. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  366. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  367. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  368. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  369. package/dist/frontend/lowering/builtins/dates.js +55 -26
  370. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  372. package/dist/frontend/lowering/builtins/dh.js +151 -0
  373. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  374. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  375. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  376. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  377. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  378. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  380. package/dist/frontend/lowering/builtins/errors.js +110 -0
  381. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  382. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  383. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  384. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  385. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  386. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  387. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  388. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  389. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  390. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  391. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  392. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  393. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  394. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  395. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/json.js +2 -1
  397. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  398. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  399. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  400. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  401. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  402. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  403. package/dist/frontend/lowering/builtins/numbers.js +18 -6
  404. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  405. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  406. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  407. package/dist/frontend/lowering/builtins/performance.js +3 -2
  408. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  409. package/dist/frontend/lowering/builtins/process.js +3 -2
  410. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  411. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  412. package/dist/frontend/lowering/builtins/promises.js +91 -4
  413. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  414. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  415. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  416. package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
  417. package/dist/frontend/lowering/builtins/readline.js +58 -9
  418. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/strings.js +13 -5
  420. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  421. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  422. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  423. package/dist/frontend/lowering/builtins/timers.js +1 -1
  424. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  425. package/dist/frontend/lowering/builtins/url.js +28 -4
  426. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/v8.js +2 -1
  428. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  429. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  430. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  431. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  432. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  433. package/dist/frontend/lowering/call-arguments.js +2 -1
  434. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  435. package/dist/frontend/lowering/call-signatures.js +13 -6
  436. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  437. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  438. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  439. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  440. package/dist/frontend/lowering/class-assertions.js +3 -2
  441. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  442. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  443. package/dist/frontend/lowering/class-callbacks.js +82 -12
  444. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  445. package/dist/frontend/lowering/class-construction.d.ts +6 -2
  446. package/dist/frontend/lowering/class-construction.js +25 -16
  447. package/dist/frontend/lowering/class-construction.js.map +1 -1
  448. package/dist/frontend/lowering/class-descriptors.js +1 -1
  449. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  450. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
  451. package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
  452. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  453. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
  454. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  455. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  456. package/dist/frontend/lowering/class-iterables.js +9 -1
  457. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  458. package/dist/frontend/lowering/class-method-mutations.js +35 -9
  459. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  460. package/dist/frontend/lowering/class-method-values.js +1 -1
  461. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  462. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  463. package/dist/frontend/lowering/class-protocols.js +64 -4
  464. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  465. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  466. package/dist/frontend/lowering/class-prototypes.js +67 -5
  467. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  468. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  469. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  470. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  471. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  472. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  473. package/dist/frontend/lowering/class-unions.js +2 -1
  474. package/dist/frontend/lowering/class-unions.js.map +1 -1
  475. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  476. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  477. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  478. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  479. package/dist/frontend/lowering/coercions/structural.js +99 -8
  480. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  481. package/dist/frontend/lowering/coercions/unions.js +8 -7
  482. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  483. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  484. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  485. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  486. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  487. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  488. package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
  489. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  490. package/dist/frontend/lowering/containers/array-concat.js +12 -1
  491. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  492. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  493. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  494. package/dist/frontend/lowering/containers/array-methods.js +21 -5
  495. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  496. package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
  497. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  498. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  499. package/dist/frontend/lowering/containers/bytes.js +131 -29
  500. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  501. package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
  502. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  503. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  504. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  505. package/dist/frontend/lowering/containers/collection-methods.js +15 -9
  506. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  507. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  508. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  509. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  510. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  511. package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
  512. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  513. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  514. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  515. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  516. package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
  517. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  518. package/dist/frontend/lowering/containers/string-replacement.js +45 -20
  519. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  520. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  521. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  522. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  523. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  524. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  525. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  526. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  527. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  528. package/dist/frontend/lowering/dispatch-sites.js +218 -0
  529. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  530. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  531. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  532. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  533. package/dist/frontend/lowering/divergences.js +9 -1
  534. package/dist/frontend/lowering/divergences.js.map +1 -1
  535. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  536. package/dist/frontend/lowering/dyn-streams.js +1 -1
  537. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  538. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  539. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  540. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  541. package/dist/frontend/lowering/error-methods.js +51 -2
  542. package/dist/frontend/lowering/error-methods.js.map +1 -1
  543. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  544. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  545. package/dist/frontend/lowering/expressions/binary.js +81 -5
  546. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  547. package/dist/frontend/lowering/expressions/element-access.js +107 -14
  548. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  549. package/dist/frontend/lowering/expressions/identifiers.js +79 -11
  550. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  551. package/dist/frontend/lowering/expressions/narrowing.js +130 -6
  552. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  553. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  554. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  555. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
  556. package/dist/frontend/lowering/expressions/object-literals.js +164 -56
  557. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  558. package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
  559. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  560. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  561. package/dist/frontend/lowering/expressions/property-access.js +211 -17
  562. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  563. package/dist/frontend/lowering/expressions/relational.js +267 -30
  564. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  565. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  566. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  567. package/dist/frontend/lowering/expressions/updates.js +85 -12
  568. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  569. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  570. package/dist/frontend/lowering/frozen-records.js +322 -0
  571. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  572. package/dist/frontend/lowering/function-returns.js +49 -0
  573. package/dist/frontend/lowering/function-returns.js.map +1 -1
  574. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  575. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  576. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  577. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  578. package/dist/frontend/lowering/generic-functions.js +455 -20
  579. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  580. package/dist/frontend/lowering/intern-tables.js +2 -1
  581. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  582. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  583. package/dist/frontend/lowering/iterable-values.js +297 -0
  584. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  585. package/dist/frontend/lowering/iterator-adapters.js +195 -9
  586. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  587. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  588. package/dist/frontend/lowering/js-class-fields.js +45 -10
  589. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  590. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  591. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  592. package/dist/frontend/lowering/json-require.js +2 -1
  593. package/dist/frontend/lowering/json-require.js.map +1 -1
  594. package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
  595. package/dist/frontend/lowering/key-order-witness.js +790 -25
  596. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  597. package/dist/frontend/lowering/key-order-witness.test.js +466 -10
  598. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  599. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  600. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  601. package/dist/frontend/lowering/lower-assert.js +6 -5
  602. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  603. package/dist/frontend/lowering/lower-async-iteration.js +7 -2
  604. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  605. package/dist/frontend/lowering/lower-calls.d.ts +11 -0
  606. package/dist/frontend/lowering/lower-calls.js +776 -126
  607. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  608. package/dist/frontend/lowering/lower-classes.d.ts +29 -2
  609. package/dist/frontend/lowering/lower-classes.js +581 -46
  610. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  611. package/dist/frontend/lowering/lower-dgram.js +6 -3
  612. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  613. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  614. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  615. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  616. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  617. package/dist/frontend/lowering/lower-exprs.js +126 -13
  618. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  619. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  620. package/dist/frontend/lowering/lower-functions.js +387 -72
  621. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  622. package/dist/frontend/lowering/lower-generators.js +41 -31
  623. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  624. package/dist/frontend/lowering/lower-global-value.js +6 -3
  625. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  626. package/dist/frontend/lowering/lower-inspect.js +28 -12
  627. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  628. package/dist/frontend/lowering/lower-mixins.js +2 -1
  629. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  630. package/dist/frontend/lowering/lower-mock.js +2 -1
  631. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  632. package/dist/frontend/lowering/lower-modules.js +47 -5
  633. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  634. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  635. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  636. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  637. package/dist/frontend/lowering/lower-namespaces.js +9 -4
  638. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  639. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  640. package/dist/frontend/lowering/lower-server.js +239 -61
  641. package/dist/frontend/lowering/lower-server.js.map +1 -1
  642. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  643. package/dist/frontend/lowering/lower-stdlib.js +42 -10
  644. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  645. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  646. package/dist/frontend/lowering/lower-stmts.js +622 -68
  647. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  648. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  649. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  650. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  651. package/dist/frontend/lowering/lower-stream.js +2055 -318
  652. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  653. package/dist/frontend/lowering/lower-timers.js +4 -3
  654. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  655. package/dist/frontend/lowering/lowerer.d.ts +197 -29
  656. package/dist/frontend/lowering/lowerer.js +862 -84
  657. package/dist/frontend/lowering/lowerer.js.map +1 -1
  658. package/dist/frontend/lowering/lowerer.test.js +21 -9
  659. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  660. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  661. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  662. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  663. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  664. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  665. package/dist/frontend/lowering/native-ffi.js +1 -1
  666. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  667. package/dist/frontend/lowering/new-target.d.ts +12 -0
  668. package/dist/frontend/lowering/new-target.js +280 -0
  669. package/dist/frontend/lowering/new-target.js.map +1 -0
  670. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  671. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  672. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  673. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  674. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  675. package/dist/frontend/lowering/private-brands.js +66 -15
  676. package/dist/frontend/lowering/private-brands.js.map +1 -1
  677. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  678. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  679. package/dist/frontend/lowering/require-initialization.js +2 -1
  680. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  681. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  682. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  683. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  684. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  685. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  686. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  687. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  688. package/dist/frontend/lowering/site-dependencies.js +84 -0
  689. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  690. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  691. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  692. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  693. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  694. package/dist/frontend/lowering/stable-names.js +35 -0
  695. package/dist/frontend/lowering/stable-names.js.map +1 -0
  696. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  697. package/dist/frontend/lowering/static-typeof.js +42 -3
  698. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  699. package/dist/frontend/lowering/strict-equality.js +2 -1
  700. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  701. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  702. package/dist/frontend/lowering/structural-positions.js +108 -0
  703. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  704. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  705. package/dist/frontend/lowering/surfaces.js +60 -32
  706. package/dist/frontend/lowering/surfaces.js.map +1 -1
  707. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  708. package/dist/frontend/lowering/undefined-index.js +82 -0
  709. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  710. package/dist/frontend/lowering/var-hoisting.js +66 -16
  711. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  712. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  713. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  714. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  715. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  716. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  717. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  718. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  719. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  720. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  721. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  722. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  723. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  724. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  725. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  726. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  727. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  728. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  729. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  730. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  731. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  732. package/dist/frontend/npm-static-type-exports.js +261 -0
  733. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  734. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  735. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  736. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  737. package/dist/frontend/npm-static-umd.d.ts +6 -0
  738. package/dist/frontend/npm-static-umd.js +203 -0
  739. package/dist/frontend/npm-static-umd.js.map +1 -0
  740. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  741. package/dist/frontend/npm-static-umd.test.js +105 -0
  742. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  743. package/dist/frontend/npm-static.d.ts +8 -0
  744. package/dist/frontend/npm-static.js +51 -22
  745. package/dist/frontend/npm-static.js.map +1 -1
  746. package/dist/frontend/package-shims.d.ts +3 -0
  747. package/dist/frontend/package-shims.js +71 -8
  748. package/dist/frontend/package-shims.js.map +1 -1
  749. package/dist/frontend/pipeline.js +18 -10
  750. package/dist/frontend/pipeline.js.map +1 -1
  751. package/dist/frontend/process-fork.d.ts +25 -0
  752. package/dist/frontend/process-fork.js +2 -0
  753. package/dist/frontend/process-fork.js.map +1 -0
  754. package/dist/frontend/program.d.ts +21 -1
  755. package/dist/frontend/program.js +586 -74
  756. package/dist/frontend/program.js.map +1 -1
  757. package/dist/frontend/program.test.js +44 -4
  758. package/dist/frontend/program.test.js.map +1 -1
  759. package/dist/frontend/services.d.ts +6 -0
  760. package/dist/frontend/services.js +18 -0
  761. package/dist/frontend/services.js.map +1 -1
  762. package/dist/frontend/token-equivalence.d.ts +3 -0
  763. package/dist/frontend/token-equivalence.js +409 -0
  764. package/dist/frontend/token-equivalence.js.map +1 -0
  765. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  766. package/dist/frontend/token-equivalence.test.js +67 -0
  767. package/dist/frontend/token-equivalence.test.js.map +1 -0
  768. package/dist/frontend/ts7/ast-node.d.ts +43 -7
  769. package/dist/frontend/ts7/ast-node.js +1176 -129
  770. package/dist/frontend/ts7/ast-node.js.map +1 -1
  771. package/dist/frontend/ts7/ast-node.test.js +84 -0
  772. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  773. package/dist/frontend/ts7/ast-wire.d.ts +29 -3
  774. package/dist/frontend/ts7/ast-wire.js +144 -31
  775. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  776. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  777. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  778. package/dist/frontend/ts7/ast.d.ts +23 -2
  779. package/dist/frontend/ts7/ast.js +143 -2
  780. package/dist/frontend/ts7/ast.js.map +1 -1
  781. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  782. package/dist/frontend/ts7/checker-backend.js +2 -2
  783. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  784. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  785. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  786. package/dist/frontend/ts7/checker.d.ts +17 -1
  787. package/dist/frontend/ts7/checker.js +82 -1
  788. package/dist/frontend/ts7/checker.js.map +1 -1
  789. package/dist/frontend/ts7/checker.test.js +9 -6
  790. package/dist/frontend/ts7/checker.test.js.map +1 -1
  791. package/dist/frontend/ts7/enums.d.ts +3 -3
  792. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  793. package/dist/frontend/ts7/enums.generated.js +21 -0
  794. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  795. package/dist/frontend/ts7/enums.js +19 -0
  796. package/dist/frontend/ts7/enums.js.map +1 -1
  797. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  798. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  799. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  800. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  801. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  802. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  803. package/dist/frontend/ts7/program-host.d.ts +7 -0
  804. package/dist/frontend/ts7/program-host.js +30 -4
  805. package/dist/frontend/ts7/program-host.js.map +1 -1
  806. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  807. package/dist/frontend/ts7/semantic-checker.js +25 -20
  808. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  809. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  810. package/dist/frontend/ts7/semantic-json.js +146 -0
  811. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  812. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  813. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  814. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  815. package/dist/frontend/ts7/semantic-model.js +67 -19
  816. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  817. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  818. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  819. package/dist/frontend/ts7/session.d.ts +14 -1
  820. package/dist/frontend/ts7/session.js +23 -1
  821. package/dist/frontend/ts7/session.js.map +1 -1
  822. package/dist/frontend/tsc-codes.d.ts +1 -1
  823. package/dist/frontend/tsc-codes.js +7 -0
  824. package/dist/frontend/tsc-codes.js.map +1 -1
  825. package/dist/frontend/type-mapper.d.ts +51 -7
  826. package/dist/frontend/type-mapper.js +456 -43
  827. package/dist/frontend/type-mapper.js.map +1 -1
  828. package/dist/frontend/type-mapper.test.js +1 -1
  829. package/dist/frontend/type-mapper.test.js.map +1 -1
  830. package/dist/frontend-process-args.d.ts +4 -0
  831. package/dist/frontend-process-args.js +52 -0
  832. package/dist/frontend-process-args.js.map +1 -0
  833. package/dist/frontend-process-args.test.d.ts +1 -0
  834. package/dist/frontend-process-args.test.js +47 -0
  835. package/dist/frontend-process-args.test.js.map +1 -0
  836. package/dist/frontend-process.d.ts +1 -0
  837. package/dist/frontend-process.js +23 -0
  838. package/dist/frontend-process.js.map +1 -0
  839. package/dist/heap-collection.d.ts +16 -0
  840. package/dist/heap-collection.js +42 -0
  841. package/dist/heap-collection.js.map +1 -0
  842. package/dist/heap-collection.test.d.ts +1 -0
  843. package/dist/heap-collection.test.js +59 -0
  844. package/dist/heap-collection.test.js.map +1 -0
  845. package/dist/heap-pressure.d.ts +2 -0
  846. package/dist/heap-pressure.js +12 -0
  847. package/dist/heap-pressure.js.map +1 -0
  848. package/dist/index.d.ts +2 -0
  849. package/dist/index.js +435 -89
  850. package/dist/index.js.map +1 -1
  851. package/dist/ir/analysis.js +5 -3
  852. package/dist/ir/analysis.js.map +1 -1
  853. package/dist/ir/array-length-stability.d.ts +4 -0
  854. package/dist/ir/array-length-stability.js +26 -6
  855. package/dist/ir/array-length-stability.js.map +1 -1
  856. package/dist/ir/array-length-stability.test.js +49 -0
  857. package/dist/ir/array-length-stability.test.js.map +1 -1
  858. package/dist/ir/builtin-effects.d.ts +7 -0
  859. package/dist/ir/builtin-effects.js +80 -0
  860. package/dist/ir/builtin-effects.js.map +1 -1
  861. package/dist/ir/builtin-signatures.d.ts +7 -1
  862. package/dist/ir/builtin-signatures.js +303 -21
  863. package/dist/ir/builtin-signatures.js.map +1 -1
  864. package/dist/ir/callback-specialization.d.ts +2 -1
  865. package/dist/ir/callback-specialization.js +23 -18
  866. package/dist/ir/callback-specialization.js.map +1 -1
  867. package/dist/ir/char-unit-locals.d.ts +19 -0
  868. package/dist/ir/char-unit-locals.js +185 -0
  869. package/dist/ir/char-unit-locals.js.map +1 -0
  870. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  871. package/dist/ir/char-unit-locals.test.js +94 -0
  872. package/dist/ir/char-unit-locals.test.js.map +1 -0
  873. package/dist/ir/final-fields.d.ts +3 -1
  874. package/dist/ir/final-fields.js +15 -17
  875. package/dist/ir/final-fields.js.map +1 -1
  876. package/dist/ir/function-references.d.ts +2 -0
  877. package/dist/ir/function-references.js +2 -0
  878. package/dist/ir/function-references.js.map +1 -1
  879. package/dist/ir/function-references.test.js +5 -0
  880. package/dist/ir/function-references.test.js.map +1 -1
  881. package/dist/ir/initializer-bindings.d.ts +2 -1
  882. package/dist/ir/initializer-bindings.js +27 -20
  883. package/dist/ir/initializer-bindings.js.map +1 -1
  884. package/dist/ir/int32-arrays.d.ts +108 -0
  885. package/dist/ir/int32-arrays.js +831 -0
  886. package/dist/ir/int32-arrays.js.map +1 -0
  887. package/dist/ir/int32-slots.d.ts +36 -6
  888. package/dist/ir/int32-slots.js +370 -171
  889. package/dist/ir/int32-slots.js.map +1 -1
  890. package/dist/ir/int32-slots.test.js +3 -1
  891. package/dist/ir/int32-slots.test.js.map +1 -1
  892. package/dist/ir/integer-loop-facts.d.ts +9 -4
  893. package/dist/ir/integer-loop-facts.js +93 -18
  894. package/dist/ir/integer-loop-facts.js.map +1 -1
  895. package/dist/ir/integer-loops.d.ts +49 -0
  896. package/dist/ir/integer-loops.js +202 -40
  897. package/dist/ir/integer-loops.js.map +1 -1
  898. package/dist/ir/integer-loops.test.js +211 -1
  899. package/dist/ir/integer-loops.test.js.map +1 -1
  900. package/dist/ir/integer-ranges.d.ts +5 -0
  901. package/dist/ir/integer-ranges.js +125 -12
  902. package/dist/ir/integer-ranges.js.map +1 -1
  903. package/dist/ir/integer-ranges.test.js +94 -0
  904. package/dist/ir/integer-ranges.test.js.map +1 -1
  905. package/dist/ir/ir.d.ts +87 -9
  906. package/dist/ir/ir.js +61 -2
  907. package/dist/ir/ir.js.map +1 -1
  908. package/dist/ir/ir.test.js +21 -1
  909. package/dist/ir/ir.test.js.map +1 -1
  910. package/dist/ir/js-ic.d.ts +19 -2
  911. package/dist/ir/js-ic.js +95 -11
  912. package/dist/ir/js-ic.js.map +1 -1
  913. package/dist/ir/js-ic.test.js +188 -0
  914. package/dist/ir/js-ic.test.js.map +1 -1
  915. package/dist/ir/node-index.d.ts +57 -0
  916. package/dist/ir/node-index.js +215 -0
  917. package/dist/ir/node-index.js.map +1 -0
  918. package/dist/ir/paired-while-loops.d.ts +25 -0
  919. package/dist/ir/paired-while-loops.js +335 -0
  920. package/dist/ir/paired-while-loops.js.map +1 -0
  921. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  922. package/dist/ir/paired-while-loops.test.js +163 -0
  923. package/dist/ir/paired-while-loops.test.js.map +1 -0
  924. package/dist/ir/parameter-versions.d.ts +25 -0
  925. package/dist/ir/parameter-versions.js +300 -0
  926. package/dist/ir/parameter-versions.js.map +1 -0
  927. package/dist/ir/runtime-features.d.ts +60 -15
  928. package/dist/ir/runtime-features.js +276 -35
  929. package/dist/ir/runtime-features.js.map +1 -1
  930. package/dist/ir/serialize.d.ts +12 -2
  931. package/dist/ir/serialize.js +16 -3
  932. package/dist/ir/serialize.js.map +1 -1
  933. package/dist/ir/serialize.test.js +17 -0
  934. package/dist/ir/serialize.test.js.map +1 -1
  935. package/dist/ir/tiers.js +1 -0
  936. package/dist/ir/tiers.js.map +1 -1
  937. package/dist/ir/traverse.d.ts +2 -0
  938. package/dist/ir/traverse.js +29 -5
  939. package/dist/ir/traverse.js.map +1 -1
  940. package/dist/ir/validate.js +171 -45
  941. package/dist/ir/validate.js.map +1 -1
  942. package/dist/library/ir-policy.js +12 -0
  943. package/dist/library/ir-policy.js.map +1 -1
  944. package/dist/library/library-cache.d.ts +2 -0
  945. package/dist/library/library-cache.js.map +1 -1
  946. package/dist/library/prepare.js +2 -0
  947. package/dist/library/prepare.js.map +1 -1
  948. package/dist/native/cache.d.ts +6 -1
  949. package/dist/native/cache.js +28 -5
  950. package/dist/native/cache.js.map +1 -1
  951. package/dist/native/cache.test.js +16 -2
  952. package/dist/native/cache.test.js.map +1 -1
  953. package/dist/native/cli.js +26 -1
  954. package/dist/native/cli.js.map +1 -1
  955. package/dist/native/compiler.js +8 -6
  956. package/dist/native/compiler.js.map +1 -1
  957. package/dist/native/executable-cache.d.ts +1 -1
  958. package/dist/native/executable-cache.js +2 -2
  959. package/dist/native/executable-cache.js.map +1 -1
  960. package/dist/native/prepare.d.ts +3 -1
  961. package/dist/native/prepare.js +123 -31
  962. package/dist/native/prepare.js.map +1 -1
  963. package/dist/native/prepare.test.js +78 -18
  964. package/dist/native/prepare.test.js.map +1 -1
  965. package/dist/native/sanitizer.test.js +6 -1
  966. package/dist/native/sanitizer.test.js.map +1 -1
  967. package/dist/native/text-file.d.ts +13 -3
  968. package/dist/native/text-file.js +63 -9
  969. package/dist/native/text-file.js.map +1 -1
  970. package/dist/native/text-file.test.d.ts +1 -0
  971. package/dist/native/text-file.test.js +49 -0
  972. package/dist/native/text-file.test.js.map +1 -0
  973. package/dist/native/toolchain.js +4 -4
  974. package/dist/native/toolchain.js.map +1 -1
  975. package/dist/native/toolchain.test.js +3 -3
  976. package/dist/native/toolchain.test.js.map +1 -1
  977. package/dist/startup-cache.d.ts +1 -0
  978. package/dist/startup-cache.js +1 -0
  979. package/dist/startup-cache.js.map +1 -1
  980. package/dist/text-parts.d.ts +7 -0
  981. package/dist/text-parts.js +44 -0
  982. package/dist/text-parts.js.map +1 -1
  983. package/dist/text-parts.test.d.ts +1 -0
  984. package/dist/text-parts.test.js +46 -0
  985. package/dist/text-parts.test.js.map +1 -0
  986. package/dist/timing.d.ts +9 -2
  987. package/dist/timing.js +7 -4
  988. package/dist/timing.js.map +1 -1
  989. package/dist/wasm/translate.d.ts +4 -0
  990. package/dist/wasm/translate.js +2 -2
  991. package/dist/wasm/translate.js.map +1 -1
  992. package/package.json +21 -21
  993. package/shims/chalk/v5.ts +688 -0
  994. package/shims/hono-node-server/v2.ts +645 -0
  995. package/shims/hot-shots/client.ts +1126 -0
  996. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  997. package/shims/hot-shots/v8.ts +8 -0
  998. package/shims/undici/core/client.ts +4 -4
  999. package/surface-manifest.json +44 -52
@@ -11,24 +11,32 @@ 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";
20
- import { matchIntegerArrayForLoop, matchIntegerBytesForLoop, matchIntegerCountedForLoop, } from "../../ir/integer-loops.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";
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";
23
- import { emitCountedLoopLimit, emitCountedLoopSafety } from "./counted-loops.js";
24
+ import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop, pairedDenseShape, } from "./dense-array-loops.js";
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";
30
+ import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
31
+ import { widenInteger } from "./integer-values.js";
27
32
  import { SCALAR_UNION_RESULT } from "./int32-abi.js";
28
33
  import { emitLiteralSwitch } from "./switch-dispatch.js";
29
34
  import { SPECULATIVE_RANGE, emitSafeIntegerCheck, emitSpeculativeInteger, planProvenIntegerLoop, planSpeculativeLoop, speculativeReads, speculativeWriteTarget, } from "./speculative-integers.js";
30
35
  import { emitConcatInputs, emitMixedConcat, numberPart, stringParts, } from "./string-construction.js";
31
36
  import { emitStringInputs } from "./string-lifetimes.js";
37
+ import { LOOPS } from "./loop-state.js";
38
+ /** A callback loop version copies the loop; keep the copies small. */
39
+ const MAX_CALLBACK_VERSION_COST = 400;
32
40
  export function emitStmtBody(emitter, s) {
33
41
  const B = emitter.B;
34
42
  emitter.frames.push([]);
@@ -216,6 +224,7 @@ export function emitStmtBody(emitter, s) {
216
224
  emitter.toFrame(v);
217
225
  B.line(`store ${emitter.llType(b.type)} ${v.name}, ptr ${b.slot}`);
218
226
  emitter.storeIntegerView(s.localId, v, s.init);
227
+ storeIntegerTemp(emitter, s.localId, b, v);
219
228
  if (isRefCounted(b.type)) {
220
229
  emitter.scopes[emitter.scopes.length - 1].push({ slot: b.slot, type: b.type });
221
230
  emitter.noteLastUseMove(s, b);
@@ -357,11 +366,26 @@ export function emitStmtBody(emitter, s) {
357
366
  const v = emitter.emitExpr(s.value);
358
367
  if (s.arr.type.kind !== "array")
359
368
  throw new InternalCompilerError("llvm emitter bug: arraySet on non-array");
360
- 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);
361
385
  emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
362
386
  if (acc === "ref")
363
387
  emitter.toHeap(v);
364
- 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);
365
389
  break;
366
390
  }
367
391
  case "arraySetLength": {
@@ -376,6 +400,11 @@ export function emitStmtBody(emitter, s) {
376
400
  const length = emitter.emitExpr(s.length);
377
401
  if (s.arr.type.kind !== "array")
378
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
+ }
379
408
  emitter.emitPublishedArrayGuard(arr.name, s.arr.type, s.pop === true ? 2 : 3);
380
409
  emitter.declare(`declare void @scr_arr_set_len(ptr, double)`);
381
410
  // Assigning the current length (a reused work array reset to where
@@ -401,12 +430,20 @@ export function emitStmtBody(emitter, s) {
401
430
  B.condBr(dropsLast, pop, call);
402
431
  B.startBlock(pop);
403
432
  const elem = s.arr.type.elem;
404
- const acc = elemAccess(elem);
405
- const raw = emitDenseArrayPop(emitter, arr.name, acc, call, call);
406
- if (acc === "ref" && isRefCounted(elem)) {
407
- const old = B.tmp();
408
- B.line(`${old} = inttoptr i64 ${raw} to ptr`);
409
- 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
+ }
410
447
  }
411
448
  B.br(done);
412
449
  B.startBlock(call);
@@ -443,7 +480,7 @@ export function emitStmtBody(emitter, s) {
443
480
  const v = emitter.emitExpr(s.value);
444
481
  if (s.arr.type.kind !== "bytes")
445
482
  throw new InternalCompilerError("llvm emitter bug: bytesSet on non-bytes");
446
- emitter.emitBytesSet(s.arr.type.elem, arr.name, idx, v, s.index, s.value, emitter.bytesBounds.has(s));
483
+ emitter.emitBytesSet(s.arr.type.elem, arr.name, idx, v, s.index, s.value, emitter.bytesBounds.has(s), emitter.bytesOwned.has(s));
447
484
  break;
448
485
  }
449
486
  case "fieldSet":
@@ -481,13 +518,10 @@ export function emitStmtBody(emitter, s) {
481
518
  else if (emitter.publishedTypes?.recordGuarded(s.shapeId) === true)
482
519
  emitter.emitPublishedFieldGuard(obj.name, null, s.field);
483
520
  const { ptr, type, inline } = s.kind === "fieldSet"
484
- ? emitter.classFieldPtr(obj.name, s.className, s.field)
521
+ ? emitter.classFieldPtr(obj.name, s.className, s.field, "compressed")
485
522
  : emitter.recordFieldPtr(obj.name, s.shapeId, s.field);
486
523
  // A result-slot entry fills zeroed caller storage, each field once.
487
- if (s.kind === "recordSet" &&
488
- s.obj.kind === "varRef" &&
489
- s.obj.localId === RESULT_DST_ID &&
490
- emitter.currentFunctionName.startsWith(RESULT_ENTRY_PREFIX))
524
+ if (resultSlotStore(emitter.currentFunctionName, s))
491
525
  emitter.initField(ptr, type, inline, v);
492
526
  else
493
527
  emitter.replaceField(ptr, type, inline, v);
@@ -691,7 +725,12 @@ export function emitStmtBody(emitter, s) {
691
725
  const trueLabel = B.newLabel("if.t");
692
726
  const joinLabel = B.newLabel("if.j");
693
727
  const falseLabel = s.else_ ? B.newLabel("if.f") : joinLabel;
694
- 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);
695
734
  B.startBlock(trueLabel);
696
735
  emitter.emitBlock(s.then);
697
736
  B.br(joinLabel);
@@ -704,6 +743,20 @@ export function emitStmtBody(emitter, s) {
704
743
  break;
705
744
  }
706
745
  case "while": {
746
+ const callbacks = callbackVersionBindings(emitter, s);
747
+ if (callbacks) {
748
+ emitCallbackVersionedLoop(emitter, s, callbacks);
749
+ break;
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
+ }
707
760
  const workerBudget = emitter.workerLoopBudget(s);
708
761
  const le = B.newLabel("loop.e");
709
762
  emitter.emitLoopCopies(s, true, le, (exit) => {
@@ -712,6 +765,7 @@ export function emitStmtBody(emitter, s) {
712
765
  const lp = workerBudget !== null ? B.newLabel("loop.p") : lc;
713
766
  B.br(lc);
714
767
  B.startBlock(lc);
768
+ enterLoopHeader(emitter, lc);
715
769
  B.condBr(emitter.emitCondition(s.cond), lb, exit);
716
770
  B.startBlock(lb);
717
771
  emitter.jumpTargets.push({
@@ -736,6 +790,11 @@ export function emitStmtBody(emitter, s) {
736
790
  break;
737
791
  }
738
792
  case "doWhile": {
793
+ const callbacks = callbackVersionBindings(emitter, s);
794
+ if (callbacks) {
795
+ emitCallbackVersionedLoop(emitter, s, callbacks);
796
+ break;
797
+ }
739
798
  const workerBudget = emitter.workerLoopBudget(s);
740
799
  // Body first (runs at least once); continue jumps to the CONDITION.
741
800
  const le = B.newLabel("loop.e");
@@ -744,6 +803,7 @@ export function emitStmtBody(emitter, s) {
744
803
  const lc = B.newLabel("loop.c");
745
804
  B.br(lb);
746
805
  B.startBlock(lb);
806
+ enterLoopHeader(emitter, lb);
747
807
  emitter.jumpTargets.push({
748
808
  kind: "loop",
749
809
  brkLabel: exit,
@@ -764,6 +824,11 @@ export function emitStmtBody(emitter, s) {
764
824
  break;
765
825
  }
766
826
  case "for": {
827
+ const callbacks = callbackVersionBindings(emitter, s);
828
+ if (callbacks) {
829
+ emitCallbackVersionedLoop(emitter, s, callbacks);
830
+ break;
831
+ }
767
832
  // The init's scope wraps the whole loop (break/continue must NOT
768
833
  // release it — scopeDepth captured after the push, C parity).
769
834
  const integerArrayLoop = emitter.debug === null
@@ -771,13 +836,19 @@ export function emitStmtBody(emitter, s) {
771
836
  : null;
772
837
  const integerLoop = integerArrayLoop ??
773
838
  (emitter.debug === null ? matchIntegerBytesForLoop(s, emitter.numericLocals) : null);
774
- const countedLoop = !integerLoop && emitter.countedLoopsEnabled
775
- ? 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)
776
841
  : null;
777
- const window = countedLoop && emitter.byteWindowsEnabled
778
- ? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, emitter.byteWindowEntries.get(s) ?? new Set())
842
+ // Two counters closing in on each other (`lo++, hi--`) take the same
843
+ // integer storage as a counted loop's one.
844
+ const pairedLoop = !integerLoop && !countedLoop && LOOPS.of(emitter).countedLoopsEnabled
845
+ ? matchIntegerPairedForLoop(s, emitter.numericLocals, emitter.integerRanges)
779
846
  : null;
780
- const denseShape = !emitter.denseLoopsEnabled
847
+ // Byte windows and dense loops reason about one counter.
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())
850
+ : null;
851
+ const denseShape = !LOOPS.of(emitter).denseLoopsEnabled
781
852
  ? null
782
853
  : integerArrayLoop
783
854
  ? {
@@ -785,29 +856,31 @@ export function emitStmtBody(emitter, s) {
785
856
  length: integerArrayLoop.limitReceiver,
786
857
  range: { min: 0, max: 4294967294 },
787
858
  }
788
- : countedLoop && !countedLoop.guarded
859
+ : countedLoop && !countedLoop.guarded && countedLoop.followers.length === 0
789
860
  ? countedDenseShape(s, countedLoop)
790
- : null;
861
+ : pairedLoop
862
+ ? pairedDenseShape(pairedLoop)
863
+ : null;
791
864
  const dense = denseShape && !window
792
- ? 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())
793
866
  : null;
794
867
  if (dense) {
795
868
  const valid = emitDenseLoopGuard(emitter, dense);
796
869
  const fast = B.newLabel("dense.loop.fast"), slow = B.newLabel("dense.loop.slow"), done = B.newLabel("dense.loop.done");
797
870
  B.condBr(valid, fast, slow);
798
- emitter.denseLoopsEnabled = false;
871
+ LOOPS.of(emitter).denseLoopsEnabled = false;
799
872
  try {
800
873
  B.startBlock(slow);
801
874
  emitter.emitStmt(s);
802
875
  B.br(done);
803
876
  B.startBlock(fast);
804
- emitter.denseLoop = dense;
877
+ LOOPS.of(emitter).denseLoop = dense;
805
878
  emitter.emitStmt(s);
806
879
  B.br(done);
807
880
  }
808
881
  finally {
809
- emitter.denseLoop = null;
810
- emitter.denseLoopsEnabled = true;
882
+ LOOPS.of(emitter).denseLoop = null;
883
+ LOOPS.of(emitter).denseLoopsEnabled = true;
811
884
  }
812
885
  B.startBlock(done);
813
886
  break;
@@ -817,7 +890,7 @@ export function emitStmtBody(emitter, s) {
817
890
  const fast = B.newLabel("bytes.window.fast"), slow = B.newLabel("bytes.window.slow"), done = B.newLabel("bytes.window.done");
818
891
  B.condBr(valid, fast, slow);
819
892
  const originalRanges = emitter.integerRanges, originalBounds = emitter.bytesBounds;
820
- emitter.byteWindowsEnabled = false;
893
+ LOOPS.of(emitter).byteWindowsEnabled = false;
821
894
  try {
822
895
  B.startBlock(slow);
823
896
  emitter.emitStmt(s);
@@ -831,60 +904,51 @@ export function emitStmtBody(emitter, s) {
831
904
  finally {
832
905
  emitter.integerRanges = originalRanges;
833
906
  emitter.bytesBounds = originalBounds;
834
- emitter.byteWindowsEnabled = true;
907
+ LOOPS.of(emitter).byteWindowsEnabled = true;
835
908
  }
836
909
  B.startBlock(done);
837
910
  break;
838
911
  }
839
- const version = emitter.bytesLoopVersionsEnabled &&
840
- emitter.bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
841
- !emitter.bytesLoopVersioning.has(s)
842
- ? emitter.matchBytesLoopVersion(s, countedLoop)
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);
915
+ // A loop to a typed array's or an array's length keeps its integer
916
+ // induction. Its counted form only gives the version guard the
917
+ // counter's iteration space, so the guard also covers accesses of
918
+ // other typed arrays at the counter, such as `x[i]` and `y[i]` in
919
+ // `for (let i = 0; i < out.length; i++) out[i] = x[i] * y[i]`.
920
+ const versionCounted = versionable && !countedLoop && integerLoop && LOOPS.of(emitter).countedLoopsEnabled
921
+ ? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
922
+ : countedLoop;
923
+ const version = versionable
924
+ ? emitter.matchBytesLoopVersion(s, versionCounted, versionCounted ? null : pairedLoop)
843
925
  : null;
844
926
  if (version) {
845
- const fast = B.newLabel("bytes.version.fast"), slow = B.newLabel("bytes.version.slow"), done = B.newLabel("bytes.version.done");
846
- emitBytesLoopVersionGuard(emitter, version, fast, slow);
847
- const originalBounds = emitter.bytesBounds, originalRanges = emitter.integerRanges;
848
- emitter.bytesLoopVersioning.add(s);
849
- try {
850
- B.startBlock(slow);
851
- emitter.emitStmt(s);
852
- B.br(done);
853
- B.startBlock(fast);
854
- emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
855
- if (version.ranges.size > 0)
856
- emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
857
- if (version.counted?.guarded)
858
- emitter.provenCountedGuards.add(s);
859
- emitter.emitStmt(s);
860
- B.br(done);
861
- }
862
- finally {
863
- emitter.bytesBounds = originalBounds;
864
- emitter.integerRanges = originalRanges;
865
- emitter.provenCountedGuards.delete(s);
866
- emitter.bytesLoopVersioning.delete(s);
867
- }
868
- B.startBlock(done);
927
+ emitVersionedLoop(emitter, s, version);
869
928
  break;
870
929
  }
871
930
  let countedJoin = null;
872
- if (countedLoop?.guarded && !emitter.provenCountedGuards.has(s)) {
873
- const safe = emitCountedLoopSafety(emitter, countedLoop);
931
+ if ((countedLoop?.guarded || pairedLoop?.guarded) &&
932
+ !LOOPS.of(emitter).provenCountedGuards.has(s)) {
933
+ const safe = countedLoop
934
+ ? emitCountedLoopSafety(emitter, countedLoop)
935
+ : emitPairedLoopSafety(emitter, pairedLoop);
874
936
  const fast = B.newLabel("counted.fast");
875
937
  const slow = B.newLabel("counted.slow");
876
938
  countedJoin = B.newLabel("counted.done");
877
939
  B.condBr(safe, fast, slow);
878
940
  B.startBlock(slow);
879
- emitter.countedLoopsEnabled = false;
941
+ LOOPS.of(emitter).countedLoopsEnabled = false;
880
942
  emitter.emitStmt(s);
881
- emitter.countedLoopsEnabled = true;
943
+ LOOPS.of(emitter).countedLoopsEnabled = true;
882
944
  B.br(countedJoin);
883
945
  B.startBlock(fast);
884
946
  }
885
947
  emitter.scopes.push([]);
886
948
  let integerSlot = null;
887
949
  let countedLimit = null;
950
+ const pairedSlots = [];
951
+ const followerSlots = [];
888
952
  if (integerLoop) {
889
953
  integerSlot = B.slot();
890
954
  B.entryAllocas.push(`${integerSlot} = alloca ${emitter.sizeType} ; integer induction ${emitter.currentLocals.get(integerLoop.localId).name}`);
@@ -903,8 +967,8 @@ export function emitStmtBody(emitter, s) {
903
967
  emitter.integerLoopBindings.set(integerLoop.localId, {
904
968
  slot: integerSlot,
905
969
  type: emitter.sizeType,
906
- range: emitter.denseLoop?.counter === integerLoop.localId
907
- ? emitter.denseLoop.range
970
+ range: LOOPS.of(emitter).denseLoop?.counter === integerLoop.localId
971
+ ? LOOPS.of(emitter).denseLoop.range
908
972
  : { min: 0, max: integerArrayLoop ? 4294967294 : Number.MAX_SAFE_INTEGER - 1 },
909
973
  });
910
974
  }
@@ -919,12 +983,47 @@ export function emitStmtBody(emitter, s) {
919
983
  slot: integerSlot,
920
984
  type: "i64",
921
985
  signed: true,
922
- range: emitter.denseLoop?.counter === countedLoop.localId
923
- ? emitter.denseLoop.range
986
+ range: LOOPS.of(emitter).denseLoop?.counter === countedLoop.localId
987
+ ? LOOPS.of(emitter).denseLoop.range
924
988
  : countedLoop.range,
925
989
  });
990
+ for (const follower of countedLoop.followers) {
991
+ const slot = B.slot();
992
+ B.entryAllocas.push(`${slot} = alloca i64 ; integer induction ${emitter.currentLocals.get(follower.localId).name}`);
993
+ const value = emitter.emitExpr(follower.start);
994
+ const followerStart = B.tmp();
995
+ B.line(`${followerStart} = fptosi double ${value.name} to i64`);
996
+ B.line(`store i64 ${followerStart}, ptr ${slot}`);
997
+ followerSlots.push(slot);
998
+ emitter.integerLoopBindings.set(follower.localId, {
999
+ slot,
1000
+ type: "i64",
1001
+ signed: true,
1002
+ range: follower.range,
1003
+ });
1004
+ }
926
1005
  countedLimit = emitCountedLoopLimit(emitter, countedLoop);
927
1006
  }
1007
+ else if (pairedLoop) {
1008
+ for (const counter of [pairedLoop.low, pairedLoop.high]) {
1009
+ const slot = B.slot();
1010
+ B.entryAllocas.push(`${slot} = alloca i64 ; integer induction ${emitter.currentLocals.get(counter.localId).name}`);
1011
+ const value = emitter.emitExpr(counter.start);
1012
+ const start = B.tmp();
1013
+ B.line(`${start} = fptosi double ${value.name} to i64`);
1014
+ B.line(`store i64 ${start}, ptr ${slot}`);
1015
+ pairedSlots.push(slot);
1016
+ const dense = LOOPS.of(emitter).denseLoop;
1017
+ emitter.integerLoopBindings.set(counter.localId, {
1018
+ slot,
1019
+ type: "i64",
1020
+ signed: true,
1021
+ range: dense?.pair && dense.counter === pairedLoop.low.localId
1022
+ ? dense.range
1023
+ : pairedLoop.range,
1024
+ });
1025
+ }
1026
+ }
928
1027
  else if (s.init) {
929
1028
  // A multi-declarator head shares the loop's scope. Emitting its
930
1029
  // IR block as an ordinary block would release captured/ref locals
@@ -966,6 +1065,7 @@ export function emitStmtBody(emitter, s) {
966
1065
  const lu = s.update || capturedLets.length > 0 || workerBudget !== null ? B.newLabel("loop.u") : lc;
967
1066
  B.br(lc);
968
1067
  B.startBlock(lc);
1068
+ enterLoopHeader(emitter, lc);
969
1069
  if (integerLoop && integerSlot) {
970
1070
  const receiver = emitter.emitStableReceiver(integerLoop.limitReceiver, []);
971
1071
  const lenPtr = B.tmp();
@@ -988,8 +1088,7 @@ export function emitStmtBody(emitter, s) {
988
1088
  B.line(`${inBounds} = icmp ult i32 ${narrow}, ${len}`);
989
1089
  }
990
1090
  else {
991
- emitter.markMemoryPointer(lenPtr, "bytes:header");
992
- B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${emitter.fieldAliasAttachment(lenPtr)}`);
1091
+ B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${bytesHeaderAlias(emitter)}`);
993
1092
  B.line(`${inBounds} = icmp ult ${emitter.sizeType} ${index}, ${len}`);
994
1093
  }
995
1094
  B.condBr(inBounds, lb, exit);
@@ -1001,6 +1100,13 @@ export function emitStmtBody(emitter, s) {
1001
1100
  B.line(`${inBounds} = icmp ${countedLoop.step > 0 ? "slt" : "sgt"} i64 ${index}, ${countedLimit}`);
1002
1101
  B.condBr(inBounds, lb, exit);
1003
1102
  }
1103
+ else if (pairedLoop) {
1104
+ const low = B.tmp(), high = B.tmp(), open = B.tmp();
1105
+ B.line(`${low} = load i64, ptr ${pairedSlots[0]}`);
1106
+ B.line(`${high} = load i64, ptr ${pairedSlots[1]}`);
1107
+ B.line(`${open} = icmp ${pairedLoop.inclusive ? "sle" : "slt"} i64 ${low}, ${high}`);
1108
+ B.condBr(open, lb, exit);
1109
+ }
1004
1110
  else if (s.cond)
1005
1111
  B.condBr(emitter.emitCondition(s.cond), lb, exit);
1006
1112
  else
@@ -1035,6 +1141,22 @@ export function emitStmtBody(emitter, s) {
1035
1141
  B.line(`${old} = load i64, ptr ${integerSlot}`);
1036
1142
  B.line(`${next} = add nsw i64 ${old}, ${countedLoop.step}`);
1037
1143
  B.line(`store i64 ${next}, ptr ${integerSlot}`);
1144
+ countedLoop.followers.forEach((follower, i) => {
1145
+ const was = B.tmp();
1146
+ const now = B.tmp();
1147
+ B.line(`${was} = load i64, ptr ${followerSlots[i]}`);
1148
+ B.line(`${now} = add nsw i64 ${was}, ${follower.step}`);
1149
+ B.line(`store i64 ${now}, ptr ${followerSlots[i]}`);
1150
+ });
1151
+ }
1152
+ else if (pairedLoop) {
1153
+ [pairedLoop.low, pairedLoop.high].forEach((counter, i) => {
1154
+ const old = B.tmp();
1155
+ const next = B.tmp();
1156
+ B.line(`${old} = load i64, ptr ${pairedSlots[i]}`);
1157
+ B.line(`${next} = add nsw i64 ${old}, ${counter.step}`);
1158
+ B.line(`store i64 ${next}, ptr ${pairedSlots[i]}`);
1159
+ });
1038
1160
  }
1039
1161
  else if (s.update)
1040
1162
  emitter.emitStmt(s.update);
@@ -1045,8 +1167,15 @@ export function emitStmtBody(emitter, s) {
1045
1167
  emitter.releaseScope(emitter.scopes.pop());
1046
1168
  if (integerLoop)
1047
1169
  emitter.integerLoopBindings.delete(integerLoop.localId);
1048
- if (countedLoop)
1170
+ if (countedLoop) {
1049
1171
  emitter.integerLoopBindings.delete(countedLoop.localId);
1172
+ for (const follower of countedLoop.followers)
1173
+ emitter.integerLoopBindings.delete(follower.localId);
1174
+ }
1175
+ if (pairedLoop) {
1176
+ emitter.integerLoopBindings.delete(pairedLoop.low.localId);
1177
+ emitter.integerLoopBindings.delete(pairedLoop.high.localId);
1178
+ }
1050
1179
  if (integerArrayLoop)
1051
1180
  emitter.integerArrayBindings.delete(integerArrayLoop.localId);
1052
1181
  if (countedJoin) {
@@ -1416,6 +1545,40 @@ export function emitStmtBody(emitter, s) {
1416
1545
  * Abrupt completions inside tryBody/catchBody ride the finallyStack:
1417
1546
  * returns inline copies at the return site, while break/continue use the
1418
1547
  * shared region walk before branching to their resolved target. */
1548
+ /** A constant number local whose initializer has an exact integer form
1549
+ * (such as `const j = i * 4` in a typed-array loop version) keeps that
1550
+ * integer in an i64 slot beside the double, so reads such as `px[j + 1]`
1551
+ * index with integer arithmetic instead of converting the double back.
1552
+ * Every other declaration of the local drops the integer: the same
1553
+ * declaration is emitted once per loop copy, and a copy must not read the
1554
+ * integer another copy stored. */
1555
+ function storeIntegerTemp(emitter, localId, b, v) {
1556
+ const local = b.local;
1557
+ if (!emitter.integerTempsEnabled ||
1558
+ b.kind !== "local" ||
1559
+ !local ||
1560
+ local.type.kind !== "f64" ||
1561
+ local.mutable ||
1562
+ local.tdz === true ||
1563
+ emitter.captureIds.has(localId) ||
1564
+ !v.integer) {
1565
+ emitter.integerTemps.delete(localId);
1566
+ return;
1567
+ }
1568
+ const B = emitter.B;
1569
+ let slot = emitter.integerTemps.get(localId)?.slot;
1570
+ if (slot === undefined) {
1571
+ slot = B.slot();
1572
+ B.entryAllocas.push(`${slot} = alloca i64 ; integer ${local.name}`);
1573
+ }
1574
+ B.line(`store i64 ${widenInteger(emitter, v.integer)}, ptr ${slot}`);
1575
+ emitter.integerTemps.set(localId, {
1576
+ slot,
1577
+ type: "i64",
1578
+ signed: true,
1579
+ range: v.integer.range,
1580
+ });
1581
+ }
1419
1582
  export function emitTryCatch(emitter, s) {
1420
1583
  const B = emitter.B;
1421
1584
  const hasCatch = s.catchBody !== null;
@@ -1562,7 +1725,7 @@ export function emitTryCatch(emitter, s) {
1562
1725
  * case, refcounted/boxed case-body locals are NULL-reset up front and
1563
1726
  * the scope-exit releases rely on NULL tolerance. */
1564
1727
  export function emitSwitch(emitter, s) {
1565
- const unitSwitch = charAtUnitSwitch(s);
1728
+ const unitSwitch = charAtUnitSwitch(emitter, s);
1566
1729
  if (unitSwitch !== null)
1567
1730
  return emitSwitch(emitter, unitSwitch);
1568
1731
  const B = emitter.B;
@@ -1668,10 +1831,136 @@ export function emitSwitch(emitter, s) {
1668
1831
  B.br(end);
1669
1832
  B.startBlock(end);
1670
1833
  }
1834
+ /** The loop copies a callback loop version needs: the bindings the loop
1835
+ * calls that the constant-callback census resolves to one function, each
1836
+ * with that function's direct entry. Only small loops of optimized
1837
+ * synchronous functions, and only bindings declared before the loop,
1838
+ * qualify: the guard reads each binding before the loop runs. Versions do
1839
+ * not nest: a loop inside either copy of a version (including the
1840
+ * versioned loop itself, emitted again for each copy) keeps its calls as
1841
+ * they are, so a loop nest is emitted at most twice. */
1842
+ function callbackVersionBindings(emitter, s) {
1843
+ if (!emitter.callbackVersionsEnabled ||
1844
+ emitter.currentConstantCallbacks.size === 0 ||
1845
+ emitter.callbackVersioning.size > 0)
1846
+ return null;
1847
+ const found = new Map();
1848
+ // Bindings the loop declares or writes (a callback declared in its body).
1849
+ const bound = new Set();
1850
+ let cost = 0;
1851
+ const expr = (e) => {
1852
+ if (++cost > MAX_CALLBACK_VERSION_COST)
1853
+ return false;
1854
+ if (e.kind === "assignExpr")
1855
+ bound.add(e.localId);
1856
+ if (e.kind === "callValue" && e.callee.kind === "varRef" && !found.has(e.callee.localId)) {
1857
+ const local = emitter.currentLocals.get(e.callee.localId);
1858
+ const target = local && local.tdz !== true ? emitter.knownCallbackTarget(e.callee) : undefined;
1859
+ if (target)
1860
+ found.set(e.callee.localId, { ref: e.callee, direct: target.direct });
1861
+ }
1862
+ return everyExprChild(e, expr, stmt);
1863
+ };
1864
+ const stmt = (x) => {
1865
+ if (++cost > MAX_CALLBACK_VERSION_COST)
1866
+ return false;
1867
+ if (x.kind === "varDecl" || x.kind === "assign" || x.kind === "forOf")
1868
+ bound.add(x.localId);
1869
+ else if (x.kind === "tryCatch" && x.catchLocalId !== null)
1870
+ bound.add(x.catchLocalId);
1871
+ return everyStmtChild(x, expr, stmt);
1872
+ };
1873
+ if (!stmt(s))
1874
+ return null;
1875
+ const bindings = [...found.values()].filter(({ ref }) => !bound.has(ref.localId));
1876
+ return bindings.length > 0 ? bindings : null;
1877
+ }
1878
+ /** A callback loop version. The guard tests, once before the loop, that
1879
+ * each binding's closure holds its known function: a closure's code
1880
+ * pointer is written only when the closure is built, and the census
1881
+ * resolves only bindings the function never rebinds. The copy where the
1882
+ * guard holds calls those functions directly, with no indirect fallback
1883
+ * that could rewrite the closure or what it captures, so LLVM can keep a
1884
+ * captured scalar the callback updates in a register. The other copy is the
1885
+ * ordinary loop. */
1886
+ function emitCallbackVersionedLoop(emitter, s, bindings) {
1887
+ const B = emitter.B;
1888
+ let ok = "true";
1889
+ for (const { ref, direct } of bindings) {
1890
+ // A borrowed read: the guard only compares the code pointer.
1891
+ const closure = emitter.emitReadReceiver(ref).name;
1892
+ const fnp = B.tmp(), fn = B.tmp(), same = B.tmp();
1893
+ B.line(`${fnp} = getelementptr inbounds %ScrClosure, ptr ${closure}, i64 0, i32 1`);
1894
+ B.line(`${fn} = load ptr, ptr ${fnp}`);
1895
+ B.line(`${same} = icmp eq ptr ${fn}, ${direct}`);
1896
+ if (ok === "true")
1897
+ ok = same;
1898
+ else {
1899
+ const both = B.tmp();
1900
+ B.line(`${both} = and i1 ${ok}, ${same}`);
1901
+ ok = both;
1902
+ }
1903
+ }
1904
+ const fast = B.newLabel("callback.version.fast"), slow = B.newLabel("callback.version.slow"), done = B.newLabel("callback.version.done");
1905
+ B.condBr(ok, fast, slow);
1906
+ emitter.callbackVersioning.add(s);
1907
+ try {
1908
+ B.startBlock(slow);
1909
+ emitter.emitStmt(s);
1910
+ B.br(done);
1911
+ B.startBlock(fast);
1912
+ for (const { ref } of bindings)
1913
+ emitter.knownCallbacks.add(ref.localId);
1914
+ emitter.emitStmt(s);
1915
+ B.br(done);
1916
+ }
1917
+ finally {
1918
+ for (const { ref } of bindings)
1919
+ emitter.knownCallbacks.delete(ref.localId);
1920
+ emitter.callbackVersioning.delete(s);
1921
+ }
1922
+ B.startBlock(done);
1923
+ }
1924
+ /** Entries in a row whose fast copy bailed before a speculative loop site
1925
+ * stops trying it. */
1926
+ const SPECULATION_BAILS = 8;
1671
1927
  /** Emit a loop's condition, body and update through `emitCopy`, twice
1672
1928
  * when speculative-integers.ts plans a fast integer copy. Both copies
1673
1929
  * share the loop's setup and exit; the ordinary copy comes first so the
1674
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
+ }
1675
1964
  export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1676
1965
  const plan = allowed &&
1677
1966
  emitter.speculativeLoopsEnabled &&
@@ -1686,11 +1975,25 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1686
1975
  }, (id) => emitter.speculativeLocal(id) || emitter.speculativeInvariantGlobal(id))
1687
1976
  : null;
1688
1977
  if (!plan) {
1689
- const proven = allowed ? planProvenLoop(emitter, loop) : null;
1690
- if (proven)
1691
- 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);
1692
1995
  else
1693
- emitCopy(exit);
1996
+ ordinary(exit);
1694
1997
  return;
1695
1998
  }
1696
1999
  const B = emitter.B;
@@ -1711,24 +2014,67 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1711
2014
  ok = both;
1712
2015
  }
1713
2016
  }
2017
+ // Each entry whose fast copy bails counts at the loop site, and a fast
2018
+ // copy that completes a speculated write and leaves the loop clears the
2019
+ // count. After SPECULATION_BAILS bailing entries in a row, the site runs
2020
+ // the ordinary copy only. The count is a hint: both copies give the same
2021
+ // results, and a race between workers loses at most an update.
2022
+ const bails = emitter.speculativeLoopSite();
2023
+ const count = B.tmp(), trying = B.tmp();
2024
+ B.line(`${count} = load atomic i8, ptr ${bails} unordered, align 1`);
2025
+ B.line(`${trying} = icmp ult i8 ${count}, ${SPECULATION_BAILS}`);
2026
+ if (ok === "true")
2027
+ ok = trying;
2028
+ else {
2029
+ const both = B.tmp();
2030
+ B.line(`${both} = and i1 ${ok}, ${trying}`);
2031
+ ok = both;
2032
+ }
1714
2033
  const fast = B.newLabel("spec.fast"), slow = B.newLabel("spec.slow");
1715
2034
  B.condBr(ok, fast, slow);
1716
2035
  const resume = new Map();
1717
2036
  for (const s of plan.writes)
1718
2037
  resume.set(s, { label: B.newLabel("spec.resume"), placed: false });
2038
+ // A failed check finishes its iteration in a third copy, entered only
2039
+ // there: it re-executes the statement and the rest of the body and the
2040
+ // update, then enters the ordinary copy through its header. Jumping
2041
+ // into the middle of the ordinary copy instead would give that loop a
2042
+ // second entry, and LLVM does not optimize an irreducible loop.
2043
+ const points = [...resume.values()];
2044
+ let header = null;
1719
2045
  B.startBlock(slow);
2046
+ emitter.speculationHeader = (label) => {
2047
+ header = label;
2048
+ };
2049
+ try {
2050
+ emitCopy(exit);
2051
+ }
2052
+ finally {
2053
+ emitter.speculationHeader = null;
2054
+ }
2055
+ if (header === null)
2056
+ throw new InternalCompilerError("llvm emitter bug: speculative loop copy without a header");
2057
+ B.startBlock(B.newLabel("spec.tail"));
1720
2058
  emitter.speculationResume = resume;
2059
+ emitter.speculationHeader = () => {
2060
+ B.br(header);
2061
+ B.startBlock(B.newLabel("spec.unused"));
2062
+ };
1721
2063
  try {
1722
2064
  emitCopy(exit);
1723
2065
  }
1724
2066
  finally {
1725
2067
  emitter.speculationResume = null;
2068
+ emitter.speculationHeader = null;
1726
2069
  }
1727
2070
  B.startBlock(fast);
1728
- if (![...resume.values()].every((r) => r.placed)) {
2071
+ if (!points.every((r) => r.placed)) {
1729
2072
  B.br(slow);
1730
2073
  return;
1731
2074
  }
2075
+ const ran = B.slot();
2076
+ B.entryAllocas.push(`${ran} = alloca i1 ; speculated write completed`);
2077
+ B.line(`store i1 false, ptr ${ran}`);
1732
2078
  for (const id of plan.locals.keys()) {
1733
2079
  const shadow = B.slot();
1734
2080
  B.entryAllocas.push(`${shadow} = alloca i64 ; speculative integer ${emitter.currentLocals.get(id)?.name ?? id}`);
@@ -1766,17 +2112,25 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1766
2112
  writes: plan.writes,
1767
2113
  resume: new Map([...resume].map(([s, r]) => [s, r.label])),
1768
2114
  deferred,
2115
+ bails,
2116
+ ran,
1769
2117
  };
1770
2118
  try {
1771
- if (deferred.size === 0)
1772
- emitCopy(exit);
1773
- else {
1774
- const leave = B.newLabel("spec.leave");
1775
- emitCopy(leave);
1776
- B.startBlock(leave);
1777
- emitter.writeBackDeferred(deferred);
1778
- B.br(exit);
1779
- }
2119
+ const leave = B.newLabel("spec.leave");
2120
+ emitCopy(leave);
2121
+ B.startBlock(leave);
2122
+ emitter.writeBackDeferred(deferred);
2123
+ // An entry that never ran a speculated write (a loop of no iterations)
2124
+ // says nothing about the site.
2125
+ const wrote = B.tmp(), left = B.tmp(), counted = B.tmp(), both = B.tmp(), clear = B.newLabel("spec.clear");
2126
+ B.line(`${wrote} = load i1, ptr ${ran}`);
2127
+ B.line(`${left} = load atomic i8, ptr ${bails} unordered, align 1`);
2128
+ B.line(`${counted} = icmp ne i8 ${left}, 0`);
2129
+ B.line(`${both} = and i1 ${wrote}, ${counted}`);
2130
+ B.condBr(both, clear, exit);
2131
+ B.startBlock(clear);
2132
+ B.line(`store atomic i8 0, ptr ${bails} unordered, align 1`);
2133
+ B.br(exit);
1780
2134
  }
1781
2135
  finally {
1782
2136
  emitter.speculation = null;
@@ -1784,6 +2138,127 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1784
2138
  emitter.integerLoopBindings.delete(id);
1785
2139
  }
1786
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
+ }
2255
+ /** At the top of a loop copy's header: lets a speculative loop find its
2256
+ * ordinary copy's header, and keeps its third copy out of the loop. */
2257
+ function enterLoopHeader(emitter, header) {
2258
+ const dispatch = emitter.speculationHeader;
2259
+ emitter.speculationHeader = null;
2260
+ dispatch?.(header);
2261
+ }
1787
2262
  /** A proven integer loop (speculative-integers.ts) for this loop, or null.
1788
2263
  * A shadowed local's double is stale until the loop is left, which only
1789
2264
  * the loop's exit, a return and an exception do: the loop is planned only
@@ -1890,7 +2365,9 @@ export function emitSpeculativeWrite(emitter, s, resume) {
1890
2365
  if (emitter.frames.pop().length > 0)
1891
2366
  throw new InternalCompilerError("llvm emitter bug: speculative write owns a temporary");
1892
2367
  B.line(`store i64 ${result}, ptr ${binding.slot}`);
1893
- const deferred = emitter.speculation.deferred;
2368
+ const { deferred, bails: site, ran } = emitter.speculation;
2369
+ if (ran !== undefined)
2370
+ B.line(`store i1 true, ptr ${ran}`);
1894
2371
  if (!deferred.has(target.localId)) {
1895
2372
  const number = B.tmp();
1896
2373
  B.line(`${number} = sitofp i64 ${result} to double`);
@@ -1902,6 +2379,13 @@ export function emitSpeculativeWrite(emitter, s, resume) {
1902
2379
  B.br(done);
1903
2380
  B.startBlock(failed);
1904
2381
  emitter.writeBackDeferred(deferred);
2382
+ if (site !== undefined) {
2383
+ const count = B.tmp(), next = B.tmp();
2384
+ emitter.declare("declare i8 @llvm.uadd.sat.i8(i8, i8)");
2385
+ B.line(`${count} = load atomic i8, ptr ${site} unordered, align 1`);
2386
+ B.line(`${next} = call i8 @llvm.uadd.sat.i8(i8 ${count}, i8 1)`);
2387
+ B.line(`store atomic i8 ${next}, ptr ${site} unordered, align 1`);
2388
+ }
1905
2389
  B.br(resume);
1906
2390
  B.startBlock(done);
1907
2391
  }
@@ -2019,7 +2503,7 @@ function nullableStringSwitch(emitter, s) {
2019
2503
  * one-unit string literals, as a switch on `s.charCodeAt(i)` with the units
2020
2504
  * as cases: no character string is built. An index out of range answers
2021
2505
  * NaN, which matches no case, as "" matches no one-unit literal. */
2022
- function charAtUnitSwitch(s) {
2506
+ function charAtUnitSwitch(emitter, s) {
2023
2507
  const disc = s.disc;
2024
2508
  if (disc.kind !== "strIntrinsic" || disc.method !== "charAt" || disc.args.length !== 1)
2025
2509
  return null;
@@ -2029,7 +2513,7 @@ function charAtUnitSwitch(s) {
2029
2513
  return null;
2030
2514
  return {
2031
2515
  ...s,
2032
- disc: { ...disc, method: "charCodeAt", type: F64 },
2516
+ disc: charAtUnitRead(emitter, disc),
2033
2517
  cases: s.cases.map((c) => c.test?.kind === "strLit"
2034
2518
  ? {
2035
2519
  ...c,