@scriptc/compiler 0.3.6 → 0.4.1

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 (1358) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +717 -55
  2. package/ambient/scriptc.d.ts +134 -0
  3. package/dist/backend/cycle-analysis.d.ts +1 -1
  4. package/dist/backend/cycle-analysis.js +1 -0
  5. package/dist/backend/cycle-analysis.js.map +1 -1
  6. package/dist/backend/cycle-analysis.test.js +13 -1
  7. package/dist/backend/cycle-analysis.test.js.map +1 -1
  8. package/dist/backend/cycle-mutability.js +16 -5
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +20 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.test.js +1 -1
  13. package/dist/backend/library-pack.js +9 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/link-plan-core.d.ts +2 -0
  16. package/dist/backend/link-plan-core.js +2 -0
  17. package/dist/backend/link-plan-core.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +1 -0
  19. package/dist/backend/link-plan.js +1 -0
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/alloc.d.ts +41 -4
  22. package/dist/backend/llvm/alloc.js +138 -7
  23. package/dist/backend/llvm/alloc.js.map +1 -1
  24. package/dist/backend/llvm/alloc.test.js +30 -1
  25. package/dist/backend/llvm/alloc.test.js.map +1 -1
  26. package/dist/backend/llvm/appended-array-literals.test.js +1 -1
  27. package/dist/backend/llvm/array-search.js +3 -1
  28. package/dist/backend/llvm/array-search.js.map +1 -1
  29. package/dist/backend/llvm/array-search.test.js +1 -1
  30. package/dist/backend/llvm/blocks.d.ts +8 -0
  31. package/dist/backend/llvm/blocks.js +43 -1
  32. package/dist/backend/llvm/blocks.js.map +1 -1
  33. package/dist/backend/llvm/blocks.test.js +22 -1
  34. package/dist/backend/llvm/blocks.test.js.map +1 -1
  35. package/dist/backend/llvm/byte-numbers.js +15 -5
  36. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  37. package/dist/backend/llvm/bytes-alias.d.ts +14 -0
  38. package/dist/backend/llvm/bytes-alias.js +20 -0
  39. package/dist/backend/llvm/bytes-alias.js.map +1 -0
  40. package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
  41. package/dist/backend/llvm/bytes-loop-versions.js +506 -0
  42. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
  43. package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
  44. package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
  45. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
  46. package/dist/backend/llvm/call-lifetimes.js +50 -1
  47. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  48. package/dist/backend/llvm/call-lifetimes.test.js +34 -0
  49. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  50. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  51. package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
  52. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  53. package/dist/backend/llvm/classes.d.ts +38 -1
  54. package/dist/backend/llvm/classes.js +185 -35
  55. package/dist/backend/llvm/classes.js.map +1 -1
  56. package/dist/backend/llvm/classes.test.js +79 -17
  57. package/dist/backend/llvm/classes.test.js.map +1 -1
  58. package/dist/backend/llvm/common.d.ts +21 -3
  59. package/dist/backend/llvm/common.js +51 -3
  60. package/dist/backend/llvm/common.js.map +1 -1
  61. package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
  62. package/dist/backend/llvm/constant-callbacks.js +55 -12
  63. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  64. package/dist/backend/llvm/constant-callbacks.test.js +88 -1
  65. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  66. package/dist/backend/llvm/counted-loops.d.ts +4 -0
  67. package/dist/backend/llvm/counted-loops.js +37 -0
  68. package/dist/backend/llvm/counted-loops.js.map +1 -1
  69. package/dist/backend/llvm/dense-array-access.d.ts +15 -4
  70. package/dist/backend/llvm/dense-array-access.js +125 -44
  71. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  72. package/dist/backend/llvm/dense-array-access.test.js +63 -3
  73. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  74. package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
  75. package/dist/backend/llvm/dense-array-loops.js +162 -0
  76. package/dist/backend/llvm/dense-array-loops.js.map +1 -0
  77. package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
  78. package/dist/backend/llvm/dense-array-loops.test.js +128 -0
  79. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
  80. package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
  81. package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
  82. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
  83. package/dist/backend/llvm/dyn.d.ts +37 -4
  84. package/dist/backend/llvm/dyn.js +354 -183
  85. package/dist/backend/llvm/dyn.js.map +1 -1
  86. package/dist/backend/llvm/emit-function.d.ts +64 -0
  87. package/dist/backend/llvm/emit-function.js +1193 -0
  88. package/dist/backend/llvm/emit-function.js.map +1 -0
  89. package/dist/backend/llvm/emit-module.d.ts +24 -0
  90. package/dist/backend/llvm/emit-module.js +1557 -0
  91. package/dist/backend/llvm/emit-module.js.map +1 -0
  92. package/dist/backend/llvm/emit-statements.d.ts +59 -0
  93. package/dist/backend/llvm/emit-statements.js +2041 -0
  94. package/dist/backend/llvm/emit-statements.js.map +1 -0
  95. package/dist/backend/llvm/emitter.d.ts +566 -291
  96. package/dist/backend/llvm/emitter.js +728 -4671
  97. package/dist/backend/llvm/emitter.js.map +1 -1
  98. package/dist/backend/llvm/emitter.test.js +57 -3
  99. package/dist/backend/llvm/emitter.test.js.map +1 -1
  100. package/dist/backend/llvm/expr-async.js +73 -46
  101. package/dist/backend/llvm/expr-async.js.map +1 -1
  102. package/dist/backend/llvm/expr-async.test.js +1 -1
  103. package/dist/backend/llvm/expr-bytes.d.ts +2 -0
  104. package/dist/backend/llvm/expr-bytes.js +76 -29
  105. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  106. package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
  107. package/dist/backend/llvm/expr-callbacks.js +48 -11
  108. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  109. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  110. package/dist/backend/llvm/expr-calls.js +87 -56
  111. package/dist/backend/llvm/expr-calls.js.map +1 -1
  112. package/dist/backend/llvm/expr-calls.test.js +1 -1
  113. package/dist/backend/llvm/expr-containers.js +45 -24
  114. package/dist/backend/llvm/expr-containers.js.map +1 -1
  115. package/dist/backend/llvm/expr-control.js +16 -16
  116. package/dist/backend/llvm/expr-control.js.map +1 -1
  117. package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
  118. package/dist/backend/llvm/expr-dynamic.js +113 -66
  119. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  120. package/dist/backend/llvm/expr-primitives.js +124 -28
  121. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  122. package/dist/backend/llvm/expr-primitives.test.js +57 -2
  123. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  124. package/dist/backend/llvm/expr-records.d.ts +1 -1
  125. package/dist/backend/llvm/expr-records.js +32 -11
  126. package/dist/backend/llvm/expr-records.js.map +1 -1
  127. package/dist/backend/llvm/expr-stream-bridges.js +65 -27
  128. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  129. package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
  130. package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
  131. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  132. package/dist/backend/llvm/int32-abi.test.js +2 -2
  133. package/dist/backend/llvm/integer-clones.js +3 -3
  134. package/dist/backend/llvm/integer-clones.js.map +1 -1
  135. package/dist/backend/llvm/integer-clones.test.js +3 -3
  136. package/dist/backend/llvm/integer-remainder.d.ts +34 -13
  137. package/dist/backend/llvm/integer-remainder.js +156 -22
  138. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  139. package/dist/backend/llvm/intern-tables.test.js +1 -1
  140. package/dist/backend/llvm/js-ic.d.ts +18 -0
  141. package/dist/backend/llvm/js-ic.js +712 -0
  142. package/dist/backend/llvm/js-ic.js.map +1 -0
  143. package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
  144. package/dist/backend/llvm/jsval-encoding.js +20 -0
  145. package/dist/backend/llvm/jsval-encoding.js.map +1 -0
  146. package/dist/backend/llvm/jsval.d.ts +12 -0
  147. package/dist/backend/llvm/jsval.js +616 -0
  148. package/dist/backend/llvm/jsval.js.map +1 -0
  149. package/dist/backend/llvm/lazy-captures.d.ts +12 -2
  150. package/dist/backend/llvm/lazy-captures.js +39 -17
  151. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  152. package/dist/backend/llvm/lib-abi.js +1 -1
  153. package/dist/backend/llvm/lib-abi.js.map +1 -1
  154. package/dist/backend/llvm/lib-connect.js +1 -1
  155. package/dist/backend/llvm/lib-connect.js.map +1 -1
  156. package/dist/backend/llvm/lib-datagram.js +14 -8
  157. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  158. package/dist/backend/llvm/lib-dispatch.js +189 -23
  159. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  160. package/dist/backend/llvm/lib-filesystem.js +42 -13
  161. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  162. package/dist/backend/llvm/lib-http2.js +3 -3
  163. package/dist/backend/llvm/lib-http2.js.map +1 -1
  164. package/dist/backend/llvm/lib-lookup.js +2 -2
  165. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  166. package/dist/backend/llvm/lib-network.js +56 -22
  167. package/dist/backend/llvm/lib-network.js.map +1 -1
  168. package/dist/backend/llvm/lib-process.js +94 -53
  169. package/dist/backend/llvm/lib-process.js.map +1 -1
  170. package/dist/backend/llvm/lib-shared.d.ts +12 -0
  171. package/dist/backend/llvm/lib-shared.js +209 -6
  172. package/dist/backend/llvm/lib-shared.js.map +1 -1
  173. package/dist/backend/llvm/lib-stream.js +46 -16
  174. package/dist/backend/llvm/lib-stream.js.map +1 -1
  175. package/dist/backend/llvm/lib-test.js +43 -7
  176. package/dist/backend/llvm/lib-test.js.map +1 -1
  177. package/dist/backend/llvm/lib-tls.js +4 -9
  178. package/dist/backend/llvm/lib-tls.js.map +1 -1
  179. package/dist/backend/llvm/local-array-reads.js +42 -33
  180. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  181. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  182. package/dist/backend/llvm/local-extents.d.ts +19 -0
  183. package/dist/backend/llvm/local-extents.js +169 -0
  184. package/dist/backend/llvm/local-extents.js.map +1 -0
  185. package/dist/backend/llvm/local-extents.test.d.ts +1 -0
  186. package/dist/backend/llvm/local-extents.test.js +92 -0
  187. package/dist/backend/llvm/local-extents.test.js.map +1 -0
  188. package/dist/backend/llvm/local-union-storage.js +7 -7
  189. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  190. package/dist/backend/llvm/local-union-storage.test.js +2 -2
  191. package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
  192. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  193. package/dist/backend/llvm/map-number-lookup.js +45 -9
  194. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  195. package/dist/backend/llvm/map-number-lookup.test.js +2 -2
  196. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  197. package/dist/backend/llvm/narrow-guards.d.ts +38 -0
  198. package/dist/backend/llvm/narrow-guards.js +215 -0
  199. package/dist/backend/llvm/narrow-guards.js.map +1 -0
  200. package/dist/backend/llvm/nullable-unions.d.ts +64 -6
  201. package/dist/backend/llvm/nullable-unions.js +103 -6
  202. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  203. package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
  204. package/dist/backend/llvm/nullable-unions.test.js +65 -0
  205. package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
  206. package/dist/backend/llvm/publish.d.ts +7 -0
  207. package/dist/backend/llvm/publish.js +50 -19
  208. package/dist/backend/llvm/publish.js.map +1 -1
  209. package/dist/backend/llvm/publish.test.js +1 -1
  210. package/dist/backend/llvm/receivers.d.ts +31 -0
  211. package/dist/backend/llvm/receivers.js +395 -0
  212. package/dist/backend/llvm/receivers.js.map +1 -0
  213. package/dist/backend/llvm/record-results.d.ts +12 -1
  214. package/dist/backend/llvm/record-results.js +64 -4
  215. package/dist/backend/llvm/record-results.js.map +1 -1
  216. package/dist/backend/llvm/reference-effects.js +9 -0
  217. package/dist/backend/llvm/reference-effects.js.map +1 -1
  218. package/dist/backend/llvm/reference-writes.d.ts +4 -0
  219. package/dist/backend/llvm/reference-writes.js +142 -6
  220. package/dist/backend/llvm/reference-writes.js.map +1 -1
  221. package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
  222. package/dist/backend/llvm/reference-writes.test.js +88 -0
  223. package/dist/backend/llvm/reference-writes.test.js.map +1 -0
  224. package/dist/backend/llvm/regex-matchers.d.ts +8 -0
  225. package/dist/backend/llvm/regex-matchers.js +33 -0
  226. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  227. package/dist/backend/llvm/regex-matchers.test.js +23 -1
  228. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  229. package/dist/backend/llvm/regions.d.ts +1 -1
  230. package/dist/backend/llvm/regions.js +10 -7
  231. package/dist/backend/llvm/regions.js.map +1 -1
  232. package/dist/backend/llvm/regions.test.js +8 -2
  233. package/dist/backend/llvm/regions.test.js.map +1 -1
  234. package/dist/backend/llvm/shapes.d.ts +74 -45
  235. package/dist/backend/llvm/shapes.js +289 -28
  236. package/dist/backend/llvm/shapes.js.map +1 -1
  237. package/dist/backend/llvm/shapes.test.js +37 -3
  238. package/dist/backend/llvm/shapes.test.js.map +1 -1
  239. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  240. package/dist/backend/llvm/speculative-integers.js +94 -6
  241. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  242. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  243. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  244. package/dist/backend/llvm/split-loops.js +2 -2
  245. package/dist/backend/llvm/split-loops.js.map +1 -1
  246. package/dist/backend/llvm/stack-objects.d.ts +26 -6
  247. package/dist/backend/llvm/stack-objects.js +133 -10
  248. package/dist/backend/llvm/stack-objects.js.map +1 -1
  249. package/dist/backend/llvm/stack-objects.test.js +55 -1
  250. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  251. package/dist/backend/llvm/stack-unions.test.js +1 -1
  252. package/dist/backend/llvm/string-construction.test.js +1 -1
  253. package/dist/backend/llvm/string-lifetimes.test.js +15 -14
  254. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  255. package/dist/backend/llvm/string-reads.d.ts +1 -1
  256. package/dist/backend/llvm/string-reads.js +4 -4
  257. package/dist/backend/llvm/string-reads.js.map +1 -1
  258. package/dist/backend/llvm/string-slices.d.ts +25 -0
  259. package/dist/backend/llvm/string-slices.js +207 -1
  260. package/dist/backend/llvm/string-slices.js.map +1 -1
  261. package/dist/backend/llvm/string-slices.test.js +139 -2
  262. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  263. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  264. package/dist/backend/llvm/thread-slots.d.ts +5 -0
  265. package/dist/backend/llvm/thread-slots.js +142 -0
  266. package/dist/backend/llvm/thread-slots.js.map +1 -0
  267. package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
  268. package/dist/backend/llvm/thread-slots.test.js +111 -0
  269. package/dist/backend/llvm/thread-slots.test.js.map +1 -0
  270. package/dist/backend/llvm/union-repr.d.ts +7 -7
  271. package/dist/backend/llvm/union-repr.js +18 -2
  272. package/dist/backend/llvm/union-repr.js.map +1 -1
  273. package/dist/backend/llvm/union-retype.test.js +17 -3
  274. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  275. package/dist/backend/llvm/walkers.d.ts +2 -2
  276. package/dist/backend/llvm/walkers.js +51 -26
  277. package/dist/backend/llvm/walkers.js.map +1 -1
  278. package/dist/backend/llvm/wasm-modules.d.ts +16 -0
  279. package/dist/backend/llvm/wasm-modules.js +66 -0
  280. package/dist/backend/llvm/wasm-modules.js.map +1 -0
  281. package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
  282. package/dist/backend/llvm/wrapping-sums.js +11 -3
  283. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  284. package/dist/backend/mangle.d.ts +12 -0
  285. package/dist/backend/mangle.js +18 -0
  286. package/dist/backend/mangle.js.map +1 -1
  287. package/dist/backend/may-throw.d.ts +3 -0
  288. package/dist/backend/may-throw.js +4 -2
  289. package/dist/backend/may-throw.js.map +1 -1
  290. package/dist/backend/may-throw.test.js +1 -1
  291. package/dist/backend/native/contracts.d.ts +57 -0
  292. package/dist/backend/native/executable.js +211 -139
  293. package/dist/backend/native/executable.js.map +1 -1
  294. package/dist/backend/native/library.js +2 -0
  295. package/dist/backend/native/library.js.map +1 -1
  296. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  297. package/dist/backend/native/runtime-inputs.js +1 -0
  298. package/dist/backend/native/runtime-inputs.js.map +1 -1
  299. package/dist/backend/native-codegen.d.ts +6 -0
  300. package/dist/backend/native-codegen.js +19 -0
  301. package/dist/backend/native-codegen.js.map +1 -1
  302. package/dist/backend/native-codegen.test.js +27 -0
  303. package/dist/backend/native-codegen.test.js.map +1 -1
  304. package/dist/backend/native-link-info-core.d.ts +48 -0
  305. package/dist/backend/native-link-info-core.js.map +1 -1
  306. package/dist/backend/native-profile.d.ts +32 -0
  307. package/dist/backend/native-profile.js +39 -0
  308. package/dist/backend/native-profile.js.map +1 -0
  309. package/dist/backend/native-profile.test.d.ts +1 -0
  310. package/dist/backend/native-profile.test.js +58 -0
  311. package/dist/backend/native-profile.test.js.map +1 -0
  312. package/dist/backend/native-tools.d.ts +14 -0
  313. package/dist/backend/native-tools.js +13 -0
  314. package/dist/backend/native-tools.js.map +1 -1
  315. package/dist/backend/publication.test.js +1 -1
  316. package/dist/backend/runtime-abi.d.ts +2 -2
  317. package/dist/backend/runtime-abi.js +2 -2
  318. package/dist/backend/runtime-pack-core.d.ts +13 -1
  319. package/dist/backend/runtime-pack-core.js +14 -1
  320. package/dist/backend/runtime-pack-core.js.map +1 -1
  321. package/dist/backend/runtime-pack-native.js +1 -1
  322. package/dist/backend/runtime-pack-native.js.map +1 -1
  323. package/dist/backend/runtime-pack-native.test.d.ts +1 -0
  324. package/dist/backend/runtime-pack-native.test.js +31 -0
  325. package/dist/backend/runtime-pack-native.test.js.map +1 -0
  326. package/dist/backend/runtime-pack-targets.test.js +9 -1
  327. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  328. package/dist/backend/runtime-pack.test.js +9 -1
  329. package/dist/backend/runtime-pack.test.js.map +1 -1
  330. package/dist/backend/stack-observations.d.ts +22 -0
  331. package/dist/backend/stack-observations.js +382 -0
  332. package/dist/backend/stack-observations.js.map +1 -0
  333. package/dist/backend/stack-observations.test.d.ts +1 -0
  334. package/dist/backend/stack-observations.test.js +233 -0
  335. package/dist/backend/stack-observations.test.js.map +1 -0
  336. package/dist/backend/target-diagnostics.js +15 -0
  337. package/dist/backend/target-diagnostics.js.map +1 -1
  338. package/dist/backend/target-diagnostics.test.js +1 -1
  339. package/dist/backend/warm-cache.js +8 -0
  340. package/dist/backend/warm-cache.js.map +1 -1
  341. package/dist/backend/young-nursery.d.ts +7 -0
  342. package/dist/backend/young-nursery.js +10 -0
  343. package/dist/backend/young-nursery.js.map +1 -0
  344. package/dist/cli/command.js +106 -4
  345. package/dist/cli/command.js.map +1 -1
  346. package/dist/cli/host.d.ts +3 -0
  347. package/dist/cli/output-options.d.ts +2 -0
  348. package/dist/cli/output-options.js +9 -0
  349. package/dist/cli/output-options.js.map +1 -1
  350. package/dist/cli/usage.d.ts +21 -1
  351. package/dist/cli/usage.js +43 -1
  352. package/dist/cli/usage.js.map +1 -1
  353. package/dist/compat/fetch-profile.js +10 -1
  354. package/dist/compat/fetch-profile.js.map +1 -1
  355. package/dist/compile-types.d.ts +22 -0
  356. package/dist/contracts/check.js +25 -8
  357. package/dist/contracts/check.js.map +1 -1
  358. package/dist/contracts/int32-elements.d.ts +115 -0
  359. package/dist/contracts/int32-elements.js +1179 -0
  360. package/dist/contracts/int32-elements.js.map +1 -0
  361. package/dist/coverage/report.d.ts +16 -0
  362. package/dist/coverage/report.js +182 -1
  363. package/dist/coverage/report.js.map +1 -1
  364. package/dist/coverage/surface-manifest.js +16 -3
  365. package/dist/coverage/surface-manifest.js.map +1 -1
  366. package/dist/coverage/verdict-cache.d.ts +2 -0
  367. package/dist/coverage/verdict-cache.js +12 -0
  368. package/dist/coverage/verdict-cache.js.map +1 -1
  369. package/dist/coverage/verdict-cache.test.js +2 -1
  370. package/dist/coverage/verdict-cache.test.js.map +1 -1
  371. package/dist/diagnostics/diagnostic.d.ts +10 -6
  372. package/dist/diagnostics/diagnostic.js +29 -21
  373. package/dist/diagnostics/diagnostic.js.map +1 -1
  374. package/dist/diagnostics/envelope.d.ts +39 -2
  375. package/dist/diagnostics/envelope.js.map +1 -1
  376. package/dist/diagnostics/render.d.ts +7 -0
  377. package/dist/diagnostics/render.js +50 -13
  378. package/dist/diagnostics/render.js.map +1 -1
  379. package/dist/diagnostics/render.test.d.ts +1 -0
  380. package/dist/diagnostics/render.test.js +49 -0
  381. package/dist/diagnostics/render.test.js.map +1 -0
  382. package/dist/executable/executable-cache.d.ts +27 -0
  383. package/dist/executable/executable-cache.js +19 -1
  384. package/dist/executable/executable-cache.js.map +1 -1
  385. package/dist/executable/executable-cache.test.js +12 -1
  386. package/dist/executable/executable-cache.test.js.map +1 -1
  387. package/dist/executable/prepare.js +2 -1
  388. package/dist/executable/prepare.js.map +1 -1
  389. package/dist/frontend/analysis.js +6 -1
  390. package/dist/frontend/analysis.js.map +1 -1
  391. package/dist/frontend/arguments-usage.d.ts +8 -0
  392. package/dist/frontend/arguments-usage.js +98 -0
  393. package/dist/frontend/arguments-usage.js.map +1 -1
  394. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  395. package/dist/frontend/arguments-usage.test.js +32 -0
  396. package/dist/frontend/arguments-usage.test.js.map +1 -0
  397. package/dist/frontend/builtin-modules.d.ts +16 -2
  398. package/dist/frontend/builtin-modules.js +40 -7
  399. package/dist/frontend/builtin-modules.js.map +1 -1
  400. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  401. package/dist/frontend/builtin-package-aliases.js +133 -0
  402. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  403. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  404. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  405. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  406. package/dist/frontend/cjs-syntax.js +52 -51
  407. package/dist/frontend/cjs-syntax.js.map +1 -1
  408. package/dist/frontend/contract-types.d.ts +3 -0
  409. package/dist/frontend/contract-types.js +36 -7
  410. package/dist/frontend/contract-types.js.map +1 -1
  411. package/dist/frontend/dts-paths.d.ts +4 -0
  412. package/dist/frontend/dts-paths.js +9 -1
  413. package/dist/frontend/dts-paths.js.map +1 -1
  414. package/dist/frontend/experimental-import.d.ts +5 -1
  415. package/dist/frontend/experimental-import.js +26 -7
  416. package/dist/frontend/experimental-import.js.map +1 -1
  417. package/dist/frontend/fork-target.js +20 -22
  418. package/dist/frontend/fork-target.js.map +1 -1
  419. package/dist/frontend/fork-target.test.js +2 -1
  420. package/dist/frontend/fork-target.test.js.map +1 -1
  421. package/dist/frontend/function-completion.js +6 -6
  422. package/dist/frontend/function-completion.js.map +1 -1
  423. package/dist/frontend/helper-tokens.js +15 -3
  424. package/dist/frontend/helper-tokens.js.map +1 -1
  425. package/dist/frontend/helper-tokens.test.js +7 -1
  426. package/dist/frontend/helper-tokens.test.js.map +1 -1
  427. package/dist/frontend/inferred-js-diagnostics.js +14 -17
  428. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  429. package/dist/frontend/input-tracker.d.ts +3 -0
  430. package/dist/frontend/input-tracker.js +32 -3
  431. package/dist/frontend/input-tracker.js.map +1 -1
  432. package/dist/frontend/lib-contract.js +36 -32
  433. package/dist/frontend/lib-contract.js.map +1 -1
  434. package/dist/frontend/lib-exports.js +3 -3
  435. package/dist/frontend/lib-exports.js.map +1 -1
  436. package/dist/frontend/lowering/array-values.d.ts +8 -3
  437. package/dist/frontend/lowering/array-values.js +60 -11
  438. package/dist/frontend/lowering/array-values.js.map +1 -1
  439. package/dist/frontend/lowering/assert-instances.js +4 -4
  440. package/dist/frontend/lowering/assert-instances.js.map +1 -1
  441. package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
  442. package/dist/frontend/lowering/assertion-identity.js +70 -0
  443. package/dist/frontend/lowering/assertion-identity.js.map +1 -0
  444. package/dist/frontend/lowering/assertion-members.d.ts +28 -0
  445. package/dist/frontend/lowering/assertion-members.js +185 -0
  446. package/dist/frontend/lowering/assertion-members.js.map +1 -0
  447. package/dist/frontend/lowering/binding-analysis.js +27 -20
  448. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  449. package/dist/frontend/lowering/builtin-calls.js +63 -5
  450. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  451. package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
  452. package/dist/frontend/lowering/builtin-function-fences.js +42 -0
  453. package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
  454. package/dist/frontend/lowering/builtins/arguments.js +1 -1
  455. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  456. package/dist/frontend/lowering/builtins/async-context.js +53 -52
  457. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  458. package/dist/frontend/lowering/builtins/atomics.js +6 -6
  459. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  460. package/dist/frontend/lowering/builtins/blob.js +8 -6
  461. package/dist/frontend/lowering/builtins/blob.js.map +1 -1
  462. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +31 -0
  463. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +205 -0
  464. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
  465. package/dist/frontend/lowering/builtins/callable-aliases.js +17 -5
  466. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  467. package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
  468. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  469. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
  470. package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
  471. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  472. package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
  473. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  474. package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
  475. package/dist/frontend/lowering/builtins/child-process.js +85 -61
  476. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  477. package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
  478. package/dist/frontend/lowering/builtins/class-values.js +226 -0
  479. package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
  480. package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
  481. package/dist/frontend/lowering/builtins/compression.js +107 -44
  482. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  483. package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
  484. package/dist/frontend/lowering/builtins/constants.js +28 -7
  485. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  486. package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
  487. package/dist/frontend/lowering/builtins/crypto.js +215 -38
  488. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  489. package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
  490. package/dist/frontend/lowering/builtins/dates.js +92 -16
  491. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  492. package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
  493. package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
  494. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
  495. package/dist/frontend/lowering/builtins/ecdh.d.ts +10 -0
  496. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  497. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  498. package/dist/frontend/lowering/builtins/environment.js +3 -3
  499. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  500. package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
  501. package/dist/frontend/lowering/builtins/errors.js +169 -3
  502. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  503. package/dist/frontend/lowering/builtins/filesystem-calls.js +128 -116
  504. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  505. package/dist/frontend/lowering/builtins/filesystem.js +77 -77
  506. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  507. package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
  508. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  509. package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
  510. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  511. package/dist/frontend/lowering/builtins/ipc.js +45 -8
  512. package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
  513. package/dist/frontend/lowering/builtins/json.js +284 -24
  514. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  515. package/dist/frontend/lowering/builtins/key-object.js +4 -4
  516. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  517. package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
  518. package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
  519. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  520. package/dist/frontend/lowering/builtins/module-calls.js +55 -44
  521. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  522. package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
  523. package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
  524. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  525. package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
  526. package/dist/frontend/lowering/builtins/navigator.js +40 -0
  527. package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
  528. package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
  529. package/dist/frontend/lowering/builtins/net-address.js +156 -0
  530. package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
  531. package/dist/frontend/lowering/builtins/numbers.js +25 -9
  532. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  533. package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
  534. package/dist/frontend/lowering/builtins/operating-system.js +25 -12
  535. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  536. package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
  537. package/dist/frontend/lowering/builtins/performance.js +259 -8
  538. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  539. package/dist/frontend/lowering/builtins/process.d.ts +41 -1
  540. package/dist/frontend/lowering/builtins/process.js +505 -99
  541. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  542. package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
  543. package/dist/frontend/lowering/builtins/promises.js +326 -43
  544. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  545. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +40 -0
  546. package/dist/frontend/lowering/builtins/promisify-callback.js +338 -0
  547. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
  548. package/dist/frontend/lowering/builtins/properties.js +37 -1
  549. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  550. package/dist/frontend/lowering/builtins/querystring.js +14 -14
  551. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  552. package/dist/frontend/lowering/builtins/readline.d.ts +12 -2
  553. package/dist/frontend/lowering/builtins/readline.js +136 -39
  554. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  555. package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
  556. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
  557. package/dist/frontend/lowering/builtins/reflection.js +42 -14
  558. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  559. package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
  560. package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
  561. package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
  562. package/dist/frontend/lowering/builtins/strings.js +101 -12
  563. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  564. package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
  565. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  566. package/dist/frontend/lowering/builtins/timers.js +79 -30
  567. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  568. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  569. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  570. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  571. package/dist/frontend/lowering/builtins/url.d.ts +3 -0
  572. package/dist/frontend/lowering/builtins/url.js +120 -17
  573. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  574. package/dist/frontend/lowering/builtins/util-types.js +20 -4
  575. package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
  576. package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
  577. package/dist/frontend/lowering/builtins/v8.js +105 -0
  578. package/dist/frontend/lowering/builtins/v8.js.map +1 -0
  579. package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
  580. package/dist/frontend/lowering/builtins/webassembly.js +388 -0
  581. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
  582. package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
  583. package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
  584. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
  585. package/dist/frontend/lowering/builtins/workers.d.ts +12 -0
  586. package/dist/frontend/lowering/builtins/workers.js +193 -8
  587. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  588. package/dist/frontend/lowering/call-arguments.js +69 -14
  589. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  590. package/dist/frontend/lowering/call-signatures.d.ts +23 -1
  591. package/dist/frontend/lowering/call-signatures.js +379 -55
  592. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  593. package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
  594. package/dist/frontend/lowering/checked-promise-all.js +1 -1
  595. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  596. package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
  597. package/dist/frontend/lowering/cjs-exports-object.js +561 -0
  598. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
  599. package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
  600. package/dist/frontend/lowering/cjs-inline-require.js +314 -0
  601. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
  602. package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
  603. package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
  604. package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
  605. package/dist/frontend/lowering/class-attributes.d.ts +19 -0
  606. package/dist/frontend/lowering/class-attributes.js +378 -0
  607. package/dist/frontend/lowering/class-attributes.js.map +1 -0
  608. package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
  609. package/dist/frontend/lowering/class-callbacks.js +21 -10
  610. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  611. package/dist/frontend/lowering/class-construction.js +49 -4
  612. package/dist/frontend/lowering/class-construction.js.map +1 -1
  613. package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
  614. package/dist/frontend/lowering/class-descriptors.js +8 -8
  615. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  616. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
  617. package/dist/frontend/lowering/class-dynamic-dispatch.js +1124 -90
  618. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  619. package/dist/frontend/lowering/class-instance-constructor.js +1 -1
  620. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  621. package/dist/frontend/lowering/class-iterables.d.ts +11 -0
  622. package/dist/frontend/lowering/class-iterables.js +31 -0
  623. package/dist/frontend/lowering/class-iterables.js.map +1 -0
  624. package/dist/frontend/lowering/class-method-mutations.js +73 -35
  625. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  626. package/dist/frontend/lowering/class-method-values.js +56 -10
  627. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  628. package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
  629. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  630. package/dist/frontend/lowering/class-protocols.d.ts +10 -0
  631. package/dist/frontend/lowering/class-protocols.js +76 -45
  632. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  633. package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
  634. package/dist/frontend/lowering/class-prototypes.js +86 -19
  635. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  636. package/dist/frontend/lowering/class-runtime-statics.js +1 -1
  637. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  638. package/dist/frontend/lowering/class-static-data.js +2 -2
  639. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  640. package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
  641. package/dist/frontend/lowering/class-to-primitive.js +264 -0
  642. package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
  643. package/dist/frontend/lowering/class-unions.d.ts +25 -0
  644. package/dist/frontend/lowering/class-unions.js +102 -1
  645. package/dist/frontend/lowering/class-unions.js.map +1 -1
  646. package/dist/frontend/lowering/code-generation.d.ts +14 -0
  647. package/dist/frontend/lowering/code-generation.js +127 -0
  648. package/dist/frontend/lowering/code-generation.js.map +1 -0
  649. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  650. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  651. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  652. package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
  653. package/dist/frontend/lowering/coercions/function-adapters.js +239 -68
  654. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  655. package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
  656. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  657. package/dist/frontend/lowering/coercions/structural.js +35 -3
  658. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  659. package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
  660. package/dist/frontend/lowering/coercions/unions.js +57 -1
  661. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  662. package/dist/frontend/lowering/collection-ingestion.js +2 -2
  663. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  664. package/dist/frontend/lowering/collection-narrowing.js +2 -4
  665. package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
  666. package/dist/frontend/lowering/construction-escapes.js +8 -8
  667. package/dist/frontend/lowering/construction-escapes.js.map +1 -1
  668. package/dist/frontend/lowering/construction-escapes.test.js +4 -4
  669. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
  670. package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
  671. package/dist/frontend/lowering/constructor-returns.js +477 -0
  672. package/dist/frontend/lowering/constructor-returns.js.map +1 -0
  673. package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
  674. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  675. package/dist/frontend/lowering/containers/array-callbacks.d.ts +17 -0
  676. package/dist/frontend/lowering/containers/array-callbacks.js +287 -118
  677. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  678. package/dist/frontend/lowering/containers/array-concat.js +1 -1
  679. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  680. package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
  681. package/dist/frontend/lowering/containers/array-construction.js +58 -13
  682. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  683. package/dist/frontend/lowering/containers/array-from-async.d.ts +6 -5
  684. package/dist/frontend/lowering/containers/array-from-async.js +159 -14
  685. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  686. package/dist/frontend/lowering/containers/array-methods.js +94 -77
  687. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  688. package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
  689. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  690. package/dist/frontend/lowering/containers/bytes.d.ts +9 -0
  691. package/dist/frontend/lowering/containers/bytes.js +649 -113
  692. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  693. package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
  694. package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
  695. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  696. package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
  697. package/dist/frontend/lowering/containers/collection-grouping.js +217 -26
  698. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  699. package/dist/frontend/lowering/containers/collection-methods.js +126 -28
  700. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  701. package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
  702. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
  703. package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
  704. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
  705. package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
  706. package/dist/frontend/lowering/containers/for-of.js +19 -19
  707. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  708. package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
  709. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  710. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
  711. package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
  712. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  713. package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
  714. package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
  715. package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
  716. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
  717. package/dist/frontend/lowering/containers/string-and-regexp.js +455 -30
  718. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  719. package/dist/frontend/lowering/containers/string-replacement.js +1 -1
  720. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  721. package/dist/frontend/lowering/cycle-initialization.d.ts +30 -10
  722. package/dist/frontend/lowering/cycle-initialization.js +191 -35
  723. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  724. package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
  725. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  726. package/dist/frontend/lowering/devirtualize.d.ts +1 -1
  727. package/dist/frontend/lowering/devirtualize.js +27 -7
  728. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  729. package/dist/frontend/lowering/divergences.d.ts +0 -5
  730. package/dist/frontend/lowering/divergences.js +62 -125
  731. package/dist/frontend/lowering/divergences.js.map +1 -1
  732. package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
  733. package/dist/frontend/lowering/dyn-streams.js +257 -0
  734. package/dist/frontend/lowering/dyn-streams.js.map +1 -0
  735. package/dist/frontend/lowering/error-methods.js +4 -1
  736. package/dist/frontend/lowering/error-methods.js.map +1 -1
  737. package/dist/frontend/lowering/error-name-order.d.ts +19 -0
  738. package/dist/frontend/lowering/error-name-order.js +93 -0
  739. package/dist/frontend/lowering/error-name-order.js.map +1 -0
  740. package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
  741. package/dist/frontend/lowering/expressions/array-literals.js +723 -0
  742. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
  743. package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
  744. package/dist/frontend/lowering/expressions/binary.js +2557 -0
  745. package/dist/frontend/lowering/expressions/binary.js.map +1 -0
  746. package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
  747. package/dist/frontend/lowering/expressions/element-access.js +1804 -0
  748. package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
  749. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
  750. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  751. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
  752. package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
  753. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
  754. package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
  755. package/dist/frontend/lowering/expressions/identifiers.js +830 -0
  756. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
  757. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +52 -0
  758. package/dist/frontend/lowering/expressions/keyed-field-targets.js +307 -0
  759. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
  760. package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
  761. package/dist/frontend/lowering/expressions/narrowing.js +1337 -0
  762. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
  763. package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
  764. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  765. package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
  766. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  767. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  768. package/dist/frontend/lowering/expressions/object-literals.js +301 -86
  769. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  770. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -2
  771. package/dist/frontend/lowering/expressions/optional-chains.js +103 -17
  772. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  773. package/dist/frontend/lowering/expressions/property-access.d.ts +115 -0
  774. package/dist/frontend/lowering/expressions/property-access.js +3787 -0
  775. package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
  776. package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
  777. package/dist/frontend/lowering/expressions/relational.js +1724 -0
  778. package/dist/frontend/lowering/expressions/relational.js.map +1 -0
  779. package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
  780. package/dist/frontend/lowering/expressions/typeof.js +551 -0
  781. package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
  782. package/dist/frontend/lowering/expressions/union-fields.js +1 -1
  783. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  784. package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
  785. package/dist/frontend/lowering/expressions/updates.js +780 -0
  786. package/dist/frontend/lowering/expressions/updates.js.map +1 -0
  787. package/dist/frontend/lowering/function-context.d.ts +10 -0
  788. package/dist/frontend/lowering/function-context.js +11 -1
  789. package/dist/frontend/lowering/function-context.js.map +1 -1
  790. package/dist/frontend/lowering/function-returns.js +52 -28
  791. package/dist/frontend/lowering/function-returns.js.map +1 -1
  792. package/dist/frontend/lowering/general-streams.d.ts +25 -0
  793. package/dist/frontend/lowering/general-streams.js +108 -0
  794. package/dist/frontend/lowering/general-streams.js.map +1 -0
  795. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  796. package/dist/frontend/lowering/generator-delegation.js +191 -1
  797. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  798. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
  799. package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
  800. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  801. package/dist/frontend/lowering/generic-functions.d.ts +43 -0
  802. package/dist/frontend/lowering/generic-functions.js +593 -118
  803. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  804. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  805. package/dist/frontend/lowering/handle-properties.js +281 -0
  806. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  807. package/dist/frontend/lowering/import-meta.js +2 -2
  808. package/dist/frontend/lowering/import-meta.js.map +1 -1
  809. package/dist/frontend/lowering/intern-tables.js +10 -9
  810. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  811. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  812. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  813. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  814. package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
  815. package/dist/frontend/lowering/iterator-adapters.js +331 -3
  816. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  817. package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
  818. package/dist/frontend/lowering/js-class-fields.js +170 -0
  819. package/dist/frontend/lowering/js-class-fields.js.map +1 -0
  820. package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
  821. package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
  822. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
  823. package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
  824. package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
  825. package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
  826. package/dist/frontend/lowering/json-require.d.ts +22 -0
  827. package/dist/frontend/lowering/json-require.js +131 -0
  828. package/dist/frontend/lowering/json-require.js.map +1 -0
  829. package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
  830. package/dist/frontend/lowering/key-order-witness.js +641 -0
  831. package/dist/frontend/lowering/key-order-witness.js.map +1 -0
  832. package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
  833. package/dist/frontend/lowering/key-order-witness.test.js +239 -0
  834. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
  835. package/dist/frontend/lowering/lifetime-regions.js +7 -7
  836. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  837. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  838. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  839. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  840. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  841. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  842. package/dist/frontend/lowering/lower-assert.js +61 -60
  843. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  844. package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
  845. package/dist/frontend/lowering/lower-async-iteration.js +34 -6
  846. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  847. package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
  848. package/dist/frontend/lowering/lower-builtin-values.js +33 -3
  849. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  850. package/dist/frontend/lowering/lower-calls.js +1404 -448
  851. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  852. package/dist/frontend/lowering/lower-classes.d.ts +54 -3
  853. package/dist/frontend/lowering/lower-classes.js +1529 -472
  854. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  855. package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
  856. package/dist/frontend/lowering/lower-comptime.js +111 -13
  857. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  858. package/dist/frontend/lowering/lower-console.js +13 -11
  859. package/dist/frontend/lowering/lower-console.js.map +1 -1
  860. package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
  861. package/dist/frontend/lowering/lower-dgram.js +241 -21
  862. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  863. package/dist/frontend/lowering/lower-enums.js +113 -14
  864. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  865. package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
  866. package/dist/frontend/lowering/lower-event-emitter.js +258 -70
  867. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  868. package/dist/frontend/lowering/lower-event-target.js +2 -2
  869. package/dist/frontend/lowering/lower-event-target.js.map +1 -1
  870. package/dist/frontend/lowering/lower-expando.js +17 -13
  871. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  872. package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
  873. package/dist/frontend/lowering/lower-exprs.js +1509 -12486
  874. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  875. package/dist/frontend/lowering/lower-functions.js +72 -22
  876. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  877. package/dist/frontend/lowering/lower-generators.d.ts +6 -0
  878. package/dist/frontend/lowering/lower-generators.js +39 -20
  879. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  880. package/dist/frontend/lowering/lower-global-value.js +5 -1
  881. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  882. package/dist/frontend/lowering/lower-inspect.js +900 -107
  883. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  884. package/dist/frontend/lowering/lower-mixins.js +23 -20
  885. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  886. package/dist/frontend/lowering/lower-mock.d.ts +8 -1
  887. package/dist/frontend/lowering/lower-mock.js +185 -18
  888. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  889. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  890. package/dist/frontend/lowering/lower-modules.js +445 -94
  891. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  892. package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
  893. package/dist/frontend/lowering/lower-namespaces.js +65 -33
  894. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  895. package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
  896. package/dist/frontend/lowering/lower-node-module.js +147 -14
  897. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  898. package/dist/frontend/lowering/lower-server.d.ts +6 -6
  899. package/dist/frontend/lowering/lower-server.js +514 -101
  900. package/dist/frontend/lowering/lower-server.js.map +1 -1
  901. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  902. package/dist/frontend/lowering/lower-stdlib.js +179 -118
  903. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  904. package/dist/frontend/lowering/lower-stmts.d.ts +30 -7
  905. package/dist/frontend/lowering/lower-stmts.js +1950 -433
  906. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  907. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  908. package/dist/frontend/lowering/lower-stream.js +398 -56
  909. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  910. package/dist/frontend/lowering/lower-test.d.ts +3 -0
  911. package/dist/frontend/lowering/lower-test.js +437 -62
  912. package/dist/frontend/lowering/lower-test.js.map +1 -1
  913. package/dist/frontend/lowering/lower-timers.js +96 -32
  914. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  915. package/dist/frontend/lowering/lower-url.js +1 -1
  916. package/dist/frontend/lowering/lower-url.js.map +1 -1
  917. package/dist/frontend/lowering/lowerer.d.ts +424 -27
  918. package/dist/frontend/lowering/lowerer.js +2062 -310
  919. package/dist/frontend/lowering/lowerer.js.map +1 -1
  920. package/dist/frontend/lowering/lowerer.test.js +10 -4
  921. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  922. package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
  923. package/dist/frontend/lowering/maybe-promise.js +249 -0
  924. package/dist/frontend/lowering/maybe-promise.js.map +1 -0
  925. package/dist/frontend/lowering/module-member-this.d.ts +3 -0
  926. package/dist/frontend/lowering/module-member-this.js +262 -0
  927. package/dist/frontend/lowering/module-member-this.js.map +1 -0
  928. package/dist/frontend/lowering/module-namespace-elements.js +1 -1
  929. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  930. package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
  931. package/dist/frontend/lowering/nan-coded-reads.js +45 -32
  932. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  933. package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
  934. package/dist/frontend/lowering/narrowing-stability.js +104 -32
  935. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  936. package/dist/frontend/lowering/native-ffi.js +11 -11
  937. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  938. package/dist/frontend/lowering/object-factory-new.js +6 -8
  939. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  940. package/dist/frontend/lowering/private-brands.d.ts +46 -0
  941. package/dist/frontend/lowering/private-brands.js +265 -0
  942. package/dist/frontend/lowering/private-brands.js.map +1 -0
  943. package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
  944. package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
  945. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
  946. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  947. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  948. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  949. package/dist/frontend/lowering/require-initialization.d.ts +32 -0
  950. package/dist/frontend/lowering/require-initialization.js +246 -0
  951. package/dist/frontend/lowering/require-initialization.js.map +1 -0
  952. package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
  953. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  954. package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
  955. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  956. package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
  957. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  958. package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
  959. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  960. package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
  961. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
  962. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
  963. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  964. package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
  965. package/dist/frontend/lowering/runtime-optional-records.js +205 -32
  966. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  967. package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
  968. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
  969. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  970. package/dist/frontend/lowering/split-consumers.js +4 -4
  971. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  972. package/dist/frontend/lowering/static-function-names.d.ts +28 -0
  973. package/dist/frontend/lowering/static-function-names.js +212 -0
  974. package/dist/frontend/lowering/static-function-names.js.map +1 -0
  975. package/dist/frontend/lowering/static-this.js +6 -6
  976. package/dist/frontend/lowering/static-this.js.map +1 -1
  977. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  978. package/dist/frontend/lowering/static-typeof.js +133 -0
  979. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  980. package/dist/frontend/lowering/strict-mode.d.ts +5 -0
  981. package/dist/frontend/lowering/strict-mode.js +31 -0
  982. package/dist/frontend/lowering/strict-mode.js.map +1 -0
  983. package/dist/frontend/lowering/string-index-bounds.js +13 -12
  984. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  985. package/dist/frontend/lowering/string-index.d.ts +12 -0
  986. package/dist/frontend/lowering/string-index.js +72 -1
  987. package/dist/frontend/lowering/string-index.js.map +1 -1
  988. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  989. package/dist/frontend/lowering/surfaces.js +282 -45
  990. package/dist/frontend/lowering/surfaces.js.map +1 -1
  991. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  992. package/dist/frontend/lowering/symbol-fields.js +204 -36
  993. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  994. package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
  995. package/dist/frontend/lowering/symbol-methods.js +24 -6
  996. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  997. package/dist/frontend/lowering/thenables.d.ts +16 -0
  998. package/dist/frontend/lowering/thenables.js +124 -0
  999. package/dist/frontend/lowering/thenables.js.map +1 -0
  1000. package/dist/frontend/lowering/thread-slots.d.ts +13 -0
  1001. package/dist/frontend/lowering/thread-slots.js +208 -0
  1002. package/dist/frontend/lowering/thread-slots.js.map +1 -0
  1003. package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
  1004. package/dist/frontend/lowering/typed-arguments.js +472 -0
  1005. package/dist/frontend/lowering/typed-arguments.js.map +1 -0
  1006. package/dist/frontend/lowering/union-retag.d.ts +8 -0
  1007. package/dist/frontend/lowering/union-retag.js +27 -0
  1008. package/dist/frontend/lowering/union-retag.js.map +1 -1
  1009. package/dist/frontend/lowering/union-retag.test.js +24 -1
  1010. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  1011. package/dist/frontend/lowering/var-hoisting.js +6 -6
  1012. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  1013. package/dist/frontend/lowering/width-lift.d.ts +4 -0
  1014. package/dist/frontend/mock-shapes.js +13 -6
  1015. package/dist/frontend/mock-shapes.js.map +1 -1
  1016. package/dist/frontend/module-source-candidates.js +1 -1
  1017. package/dist/frontend/module-source-candidates.js.map +1 -1
  1018. package/dist/frontend/module-source-candidates.test.js +2 -1
  1019. package/dist/frontend/module-source-candidates.test.js.map +1 -1
  1020. package/dist/frontend/module-syntax.js +8 -8
  1021. package/dist/frontend/module-syntax.js.map +1 -1
  1022. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  1023. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  1024. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  1025. package/dist/frontend/npm-static-bundled-chunks.d.ts +58 -0
  1026. package/dist/frontend/npm-static-bundled-chunks.js +981 -0
  1027. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
  1028. package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
  1029. package/dist/frontend/npm-static-bundled-chunks.test.js +399 -0
  1030. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
  1031. package/dist/frontend/npm-static-bundled-cjs.js +24 -23
  1032. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  1033. package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
  1034. package/dist/frontend/npm-static-bundled-esm.js +988 -0
  1035. package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
  1036. package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
  1037. package/dist/frontend/npm-static-bundled-esm.test.js +336 -0
  1038. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
  1039. package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
  1040. package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
  1041. package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
  1042. package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
  1043. package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
  1044. package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
  1045. package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
  1046. package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
  1047. package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
  1048. package/dist/frontend/npm-static-declaration-syntax.js +102 -101
  1049. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  1050. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  1051. package/dist/frontend/npm-static-enum-iife.js +280 -0
  1052. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  1053. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  1054. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  1055. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  1056. package/dist/frontend/npm-static-prune.js +36 -24
  1057. package/dist/frontend/npm-static-prune.js.map +1 -1
  1058. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
  1059. package/dist/frontend/npm-static-rewrite-host.js +14 -3
  1060. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  1061. package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
  1062. package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
  1063. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  1064. package/dist/frontend/npm-static-subtyping.js +7 -9
  1065. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  1066. package/dist/frontend/npm-static.d.ts +25 -1
  1067. package/dist/frontend/npm-static.js +212 -16
  1068. package/dist/frontend/npm-static.js.map +1 -1
  1069. package/dist/frontend/npm-static.test.js +22 -1
  1070. package/dist/frontend/npm-static.test.js.map +1 -1
  1071. package/dist/frontend/npm.js +13 -0
  1072. package/dist/frontend/npm.js.map +1 -1
  1073. package/dist/frontend/package-shims.d.ts +47 -0
  1074. package/dist/frontend/package-shims.js +300 -0
  1075. package/dist/frontend/package-shims.js.map +1 -0
  1076. package/dist/frontend/pipeline.js +230 -26
  1077. package/dist/frontend/pipeline.js.map +1 -1
  1078. package/dist/frontend/pipeline.test.js +22 -1
  1079. package/dist/frontend/pipeline.test.js.map +1 -1
  1080. package/dist/frontend/program-analysis.d.ts +6 -1
  1081. package/dist/frontend/program-analysis.js +7 -0
  1082. package/dist/frontend/program-analysis.js.map +1 -1
  1083. package/dist/frontend/program.d.ts +100 -2
  1084. package/dist/frontend/program.js +1627 -262
  1085. package/dist/frontend/program.js.map +1 -1
  1086. package/dist/frontend/program.test.js +76 -6
  1087. package/dist/frontend/program.test.js.map +1 -1
  1088. package/dist/frontend/resolve.js +49 -2
  1089. package/dist/frontend/resolve.js.map +1 -1
  1090. package/dist/frontend/resolve.test.js +49 -0
  1091. package/dist/frontend/resolve.test.js.map +1 -1
  1092. package/dist/frontend/services.d.ts +26 -1
  1093. package/dist/frontend/services.js +59 -3
  1094. package/dist/frontend/services.js.map +1 -1
  1095. package/dist/frontend/services.test.js +2 -1
  1096. package/dist/frontend/services.test.js.map +1 -1
  1097. package/dist/frontend/threads-import.js +1 -1
  1098. package/dist/frontend/threads-import.js.map +1 -1
  1099. package/dist/frontend/tier-analysis.d.ts +71 -0
  1100. package/dist/frontend/tier-analysis.js +522 -0
  1101. package/dist/frontend/tier-analysis.js.map +1 -0
  1102. package/dist/frontend/ts7/api-conformance.d.ts +234 -0
  1103. package/dist/frontend/ts7/api-conformance.js +7 -0
  1104. package/dist/frontend/ts7/api-conformance.js.map +1 -0
  1105. package/dist/frontend/ts7/ast-guards.generated.js +2 -1
  1106. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
  1107. package/dist/frontend/ts7/ast-node.d.ts +47 -25
  1108. package/dist/frontend/ts7/ast-node.js +64 -18
  1109. package/dist/frontend/ts7/ast-node.js.map +1 -1
  1110. package/dist/frontend/ts7/ast-node.test.js +36 -12
  1111. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  1112. package/dist/frontend/ts7/ast-types.d.ts +10 -3
  1113. package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
  1114. package/dist/frontend/ts7/ast.d.ts +1 -0
  1115. package/dist/frontend/ts7/ast.js +3 -2
  1116. package/dist/frontend/ts7/ast.js.map +1 -1
  1117. package/dist/frontend/ts7/checker-backend.d.ts +23 -0
  1118. package/dist/frontend/ts7/checker-backend.js +88 -0
  1119. package/dist/frontend/ts7/checker-backend.js.map +1 -0
  1120. package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
  1121. package/dist/frontend/ts7/checker-backend.test.js +63 -0
  1122. package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
  1123. package/dist/frontend/ts7/checker-cache.d.ts +0 -3
  1124. package/dist/frontend/ts7/checker-cache.js +0 -6
  1125. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  1126. package/dist/frontend/ts7/checker.d.ts +18 -11
  1127. package/dist/frontend/ts7/checker.js +42 -55
  1128. package/dist/frontend/ts7/checker.js.map +1 -1
  1129. package/dist/frontend/ts7/checker.test.js +10 -7
  1130. package/dist/frontend/ts7/checker.test.js.map +1 -1
  1131. package/dist/frontend/ts7/diagnostic.d.ts +19 -0
  1132. package/dist/frontend/ts7/diagnostic.js +22 -0
  1133. package/dist/frontend/ts7/diagnostic.js.map +1 -0
  1134. package/dist/frontend/ts7/node-functions.d.ts +8 -0
  1135. package/dist/frontend/ts7/node-functions.js +18 -0
  1136. package/dist/frontend/ts7/node-functions.js.map +1 -0
  1137. package/dist/frontend/ts7/program-host.d.ts +10 -5
  1138. package/dist/frontend/ts7/program-host.js +19 -0
  1139. package/dist/frontend/ts7/program-host.js.map +1 -1
  1140. package/dist/frontend/ts7/rpc-api.d.ts +5 -1
  1141. package/dist/frontend/ts7/rpc-api.js +8 -1
  1142. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  1143. package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
  1144. package/dist/frontend/ts7/semantic-checker.js +26 -8
  1145. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  1146. package/dist/frontend/ts7/semantic-checker.test.js +12 -9
  1147. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  1148. package/dist/frontend/ts7/semantic-model.d.ts +57 -24
  1149. package/dist/frontend/ts7/semantic-model.js +114 -16
  1150. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  1151. package/dist/frontend/ts7/semantic-model.test.js +4 -4
  1152. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  1153. package/dist/frontend/ts7/semantic-types.d.ts +7 -3
  1154. package/dist/frontend/ts7/semantic-types.js +1 -1
  1155. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  1156. package/dist/frontend/ts7/session.d.ts +30 -15
  1157. package/dist/frontend/ts7/session.js +8 -5
  1158. package/dist/frontend/ts7/session.js.map +1 -1
  1159. package/dist/frontend/ts7/session.test.js +9 -5
  1160. package/dist/frontend/ts7/session.test.js.map +1 -1
  1161. package/dist/frontend/ts7/source-parser.d.ts +6 -2
  1162. package/dist/frontend/ts7/source-parser.js +24 -3
  1163. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1164. package/dist/frontend/ts7/source-parser.test.js +38 -17
  1165. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1166. package/dist/frontend/type-mapper.d.ts +122 -2
  1167. package/dist/frontend/type-mapper.js +2735 -723
  1168. package/dist/frontend/type-mapper.js.map +1 -1
  1169. package/dist/frontend/type-only-imports.d.ts +28 -0
  1170. package/dist/frontend/type-only-imports.js +122 -0
  1171. package/dist/frontend/type-only-imports.js.map +1 -0
  1172. package/dist/frontend/worker-target.js +8 -8
  1173. package/dist/frontend/worker-target.js.map +1 -1
  1174. package/dist/index.d.ts +4 -1
  1175. package/dist/index.js +87 -8
  1176. package/dist/index.js.map +1 -1
  1177. package/dist/ir/analysis.js +4 -2
  1178. package/dist/ir/analysis.js.map +1 -1
  1179. package/dist/ir/api.d.ts +1 -1
  1180. package/dist/ir/api.js +1 -1
  1181. package/dist/ir/api.js.map +1 -1
  1182. package/dist/ir/array-length-stability.d.ts +31 -0
  1183. package/dist/ir/array-length-stability.js +249 -0
  1184. package/dist/ir/array-length-stability.js.map +1 -0
  1185. package/dist/ir/array-length-stability.test.d.ts +1 -0
  1186. package/dist/ir/array-length-stability.test.js +134 -0
  1187. package/dist/ir/array-length-stability.test.js.map +1 -0
  1188. package/dist/ir/build.d.ts +2 -2
  1189. package/dist/ir/build.js +1 -1
  1190. package/dist/ir/build.js.map +1 -1
  1191. package/dist/ir/builtin-effects.js +116 -0
  1192. package/dist/ir/builtin-effects.js.map +1 -1
  1193. package/dist/ir/builtin-signatures.d.ts +1 -1
  1194. package/dist/ir/builtin-signatures.js +540 -29
  1195. package/dist/ir/builtin-signatures.js.map +1 -1
  1196. package/dist/ir/byte-numbers.js +3 -0
  1197. package/dist/ir/byte-numbers.js.map +1 -1
  1198. package/dist/ir/callback-specialization.d.ts +37 -0
  1199. package/dist/ir/callback-specialization.js +459 -0
  1200. package/dist/ir/callback-specialization.js.map +1 -0
  1201. package/dist/ir/callback-specialization.test.d.ts +1 -0
  1202. package/dist/ir/callback-specialization.test.js +208 -0
  1203. package/dist/ir/callback-specialization.test.js.map +1 -0
  1204. package/dist/ir/capture-values.d.ts +0 -1
  1205. package/dist/ir/capture-values.js +51 -40
  1206. package/dist/ir/capture-values.js.map +1 -1
  1207. package/dist/ir/constant-globals.test.js +1 -1
  1208. package/dist/ir/constant-tables.test.js +1 -1
  1209. package/dist/ir/field-values.test.js +1 -1
  1210. package/dist/ir/final-fields.test.js +1 -1
  1211. package/dist/ir/function-references.test.js +9 -1
  1212. package/dist/ir/function-references.test.js.map +1 -1
  1213. package/dist/ir/init-only-globals.test.js +1 -1
  1214. package/dist/ir/initializer-bindings.test.js +1 -1
  1215. package/dist/ir/int32-slots.d.ts +14 -0
  1216. package/dist/ir/int32-slots.js +97 -14
  1217. package/dist/ir/int32-slots.js.map +1 -1
  1218. package/dist/ir/int32-slots.test.js +1 -1
  1219. package/dist/ir/integer-loop-facts.d.ts +7 -0
  1220. package/dist/ir/integer-loop-facts.js +103 -17
  1221. package/dist/ir/integer-loop-facts.js.map +1 -1
  1222. package/dist/ir/integer-loops.d.ts +1 -1
  1223. package/dist/ir/integer-loops.js +39 -9
  1224. package/dist/ir/integer-loops.js.map +1 -1
  1225. package/dist/ir/integer-loops.test.js +104 -0
  1226. package/dist/ir/integer-loops.test.js.map +1 -1
  1227. package/dist/ir/integer-ranges.d.ts +13 -1
  1228. package/dist/ir/integer-ranges.js +125 -26
  1229. package/dist/ir/integer-ranges.js.map +1 -1
  1230. package/dist/ir/integer-ranges.test.js +273 -2
  1231. package/dist/ir/integer-ranges.test.js.map +1 -1
  1232. package/dist/ir/intrinsic-signatures.js +6 -0
  1233. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1234. package/dist/ir/ir.d.ts +221 -58
  1235. package/dist/ir/ir.js +127 -12
  1236. package/dist/ir/ir.js.map +1 -1
  1237. package/dist/ir/ir.test.js +10 -0
  1238. package/dist/ir/ir.test.js.map +1 -1
  1239. package/dist/ir/js-ic.d.ts +52 -0
  1240. package/dist/ir/js-ic.js +199 -0
  1241. package/dist/ir/js-ic.js.map +1 -0
  1242. package/dist/ir/js-ic.test.d.ts +1 -0
  1243. package/dist/ir/js-ic.test.js +148 -0
  1244. package/dist/ir/js-ic.test.js.map +1 -0
  1245. package/dist/ir/jsval.d.ts +8 -0
  1246. package/dist/ir/jsval.js +399 -0
  1247. package/dist/ir/jsval.js.map +1 -0
  1248. package/dist/ir/jsval.test.d.ts +1 -0
  1249. package/dist/ir/jsval.test.js +239 -0
  1250. package/dist/ir/jsval.test.js.map +1 -0
  1251. package/dist/ir/runtime-features.d.ts +183 -33
  1252. package/dist/ir/runtime-features.js +795 -422
  1253. package/dist/ir/runtime-features.js.map +1 -1
  1254. package/dist/ir/scalar-records.test.js +1 -1
  1255. package/dist/ir/self-captures.d.ts +33 -0
  1256. package/dist/ir/self-captures.js +245 -0
  1257. package/dist/ir/self-captures.js.map +1 -0
  1258. package/dist/ir/self-captures.test.d.ts +1 -0
  1259. package/dist/ir/self-captures.test.js +135 -0
  1260. package/dist/ir/self-captures.test.js.map +1 -0
  1261. package/dist/ir/serialize.d.ts +1 -1
  1262. package/dist/ir/serialize.js +7 -4
  1263. package/dist/ir/serialize.js.map +1 -1
  1264. package/dist/ir/tiers.d.ts +26 -0
  1265. package/dist/ir/tiers.js +101 -0
  1266. package/dist/ir/tiers.js.map +1 -0
  1267. package/dist/ir/tiers.test.d.ts +1 -0
  1268. package/dist/ir/tiers.test.js +140 -0
  1269. package/dist/ir/tiers.test.js.map +1 -0
  1270. package/dist/ir/traverse.js +201 -150
  1271. package/dist/ir/traverse.js.map +1 -1
  1272. package/dist/ir/traverse.test.js +33 -30
  1273. package/dist/ir/traverse.test.js.map +1 -1
  1274. package/dist/ir/unshare.js +65 -3
  1275. package/dist/ir/unshare.js.map +1 -1
  1276. package/dist/ir/unshare.test.js +1 -1
  1277. package/dist/ir/validate.js +196 -76
  1278. package/dist/ir/validate.js.map +1 -1
  1279. package/dist/ir/validate.test.js +41 -11
  1280. package/dist/ir/validate.test.js.map +1 -1
  1281. package/dist/library/fence-eval.test.js +1 -1
  1282. package/dist/library/int-infer.test.js +4 -4
  1283. package/dist/library/ir-policy.js +14 -0
  1284. package/dist/library/ir-policy.js.map +1 -1
  1285. package/dist/library/library-cache.d.ts +1 -0
  1286. package/dist/library/library-cache.js.map +1 -1
  1287. package/dist/library/library-cache.test.js +5 -5
  1288. package/dist/library/library-profile.d.ts +4 -4
  1289. package/dist/library/library-profile.js +35 -7
  1290. package/dist/library/library-profile.js.map +1 -1
  1291. package/dist/library/prepare.js +13 -1
  1292. package/dist/library/prepare.js.map +1 -1
  1293. package/dist/native/cli.js +22 -0
  1294. package/dist/native/cli.js.map +1 -1
  1295. package/dist/native/compiler.js +35 -6
  1296. package/dist/native/compiler.js.map +1 -1
  1297. package/dist/native/compiler.test.js +2 -2
  1298. package/dist/native/executable-cache.js +3 -0
  1299. package/dist/native/executable-cache.js.map +1 -1
  1300. package/dist/native/prepare.js +10 -0
  1301. package/dist/native/prepare.js.map +1 -1
  1302. package/dist/native/sanitizer.test.js +19 -0
  1303. package/dist/native/sanitizer.test.js.map +1 -1
  1304. package/dist/native/toolchain.d.ts +2 -0
  1305. package/dist/native/toolchain.js +10 -1
  1306. package/dist/native/toolchain.js.map +1 -1
  1307. package/dist/native/toolchain.test.js +39 -1
  1308. package/dist/native/toolchain.test.js.map +1 -1
  1309. package/dist/startup-cache.d.ts +1 -0
  1310. package/dist/startup-cache.js +1 -0
  1311. package/dist/startup-cache.js.map +1 -1
  1312. package/dist/wasm/base64.d.ts +5 -0
  1313. package/dist/wasm/base64.js +62 -0
  1314. package/dist/wasm/base64.js.map +1 -0
  1315. package/dist/wasm/binary.d.ts +36 -0
  1316. package/dist/wasm/binary.js +1976 -0
  1317. package/dist/wasm/binary.js.map +1 -0
  1318. package/dist/wasm/binary.test.d.ts +1 -0
  1319. package/dist/wasm/binary.test.js +190 -0
  1320. package/dist/wasm/binary.test.js.map +1 -0
  1321. package/dist/wasm/discover.d.ts +38 -0
  1322. package/dist/wasm/discover.js +377 -0
  1323. package/dist/wasm/discover.js.map +1 -0
  1324. package/dist/wasm/discover.test.d.ts +1 -0
  1325. package/dist/wasm/discover.test.js +24 -0
  1326. package/dist/wasm/discover.test.js.map +1 -0
  1327. package/dist/wasm/module.d.ts +151 -0
  1328. package/dist/wasm/module.js +575 -0
  1329. package/dist/wasm/module.js.map +1 -0
  1330. package/dist/wasm/translate.d.ts +48 -0
  1331. package/dist/wasm/translate.js +2129 -0
  1332. package/dist/wasm/translate.js.map +1 -0
  1333. package/dist/wasm/translate.test.d.ts +1 -0
  1334. package/dist/wasm/translate.test.js +207 -0
  1335. package/dist/wasm/translate.test.js.map +1 -0
  1336. package/package.json +22 -20
  1337. package/shims/fs-extra/core/api.ts +1192 -0
  1338. package/shims/fs-extra/index.ts +9 -0
  1339. package/shims/undici/core/agent.ts +163 -0
  1340. package/shims/undici/core/api.ts +93 -0
  1341. package/shims/undici/core/client.ts +1304 -0
  1342. package/shims/undici/core/connector.ts +157 -0
  1343. package/shims/undici/core/diagnostics-types.ts +68 -0
  1344. package/shims/undici/core/diagnostics.ts +16 -0
  1345. package/shims/undici/core/dispatcher.ts +574 -0
  1346. package/shims/undici/core/errors-v5.ts +22 -0
  1347. package/shims/undici/core/errors-v7.ts +25 -0
  1348. package/shims/undici/core/errors.ts +255 -0
  1349. package/shims/undici/core/fetch.ts +635 -0
  1350. package/shims/undici/core/pool.ts +280 -0
  1351. package/shims/undici/core/readable.ts +268 -0
  1352. package/shims/undici/core/request.ts +313 -0
  1353. package/shims/undici/core/timers.ts +80 -0
  1354. package/shims/undici/core/types.ts +167 -0
  1355. package/shims/undici/core/util.ts +67 -0
  1356. package/shims/undici/v5.ts +119 -0
  1357. package/shims/undici/v7.ts +119 -0
  1358. package/surface-manifest.json +304 -22
@@ -0,0 +1,2041 @@
1
+ /* LlEmitter's statement emission: the statement switch, try/catch, switch, loop copies, speculative writes and string self-concatenation. */
2
+ import { adoptingAwaitOf, MAX_BYTES_LOOP_VERSION_DEPTH, } from "./emitter.js";
3
+ import { CAUGHT, F64, STRING, isRefCounted } from "../../ir/ir.js";
4
+ import { emitStringSliceSnapshot } from "./string-slices.js";
5
+ import { canDeferSplitPiece, emitSplitCursor, emitSplitNext, emitSplitScratch, emitSplitSnapshot, emitSplitSpanNext, loadSplitSnapshot, storeSplitSnapshot, stringSplit, } from "./split-loops.js";
6
+ import { emitStackObject, stackObjectFields, stackObjectStruct, } from "./stack-objects.js";
7
+ import { emitStackUnion } from "./stack-unions.js";
8
+ import { emitBorrowedArrayRead, emitLocalArrayRead } from "./local-array-reads.js";
9
+ import { emitStackMapRead } from "./map-read-lifetimes.js";
10
+ import { allocateLocalUnion, storeLocalUnion } from "./local-union-storage.js";
11
+ import { boxAccess, boxNewCall, elemAccess } from "./shapes.js";
12
+ import { dynHoleRead } from "./loop-array-borrows.js";
13
+ import { endsWithJump, matchStringSelfConcat } from "../../ir/analysis.js";
14
+ import { emitDiscardedSplice } from "./expr-containers.js";
15
+ import { InternalCompilerError } from "../../errors.js";
16
+ import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet } from "./dense-array-access.js";
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";
21
+ 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 { emitBytesLoopVersionGuard } from "./bytes-loop-versions.js";
25
+ import { mangleLocal } from "../mangle.js";
26
+ import { LlvmUnsupportedError } from "./unsupported.js";
27
+ import { SCALAR_UNION_RESULT } from "./int32-abi.js";
28
+ import { emitLiteralSwitch } from "./switch-dispatch.js";
29
+ import { SPECULATIVE_RANGE, emitSafeIntegerCheck, emitSpeculativeInteger, planProvenIntegerLoop, planSpeculativeLoop, speculativeReads, speculativeWriteTarget, } from "./speculative-integers.js";
30
+ import { emitConcatInputs, emitMixedConcat, numberPart, stringParts, } from "./string-construction.js";
31
+ import { emitStringInputs } from "./string-lifetimes.js";
32
+ export function emitStmtBody(emitter, s) {
33
+ const B = emitter.B;
34
+ emitter.frames.push([]);
35
+ switch (s.kind) {
36
+ case "varDecl": {
37
+ if (s.init && emitter.int32Locals.has(s.localId)) {
38
+ emitter.storeInt32Local(s.localId, emitter.emitExpr(s.init), s.init);
39
+ break;
40
+ }
41
+ const b = emitter.binding(s.localId);
42
+ if (emitter.walkBorrows.has(s.localId) && b.kind === "local") {
43
+ // A borrowed walk pointer: no retain now, no release at scope exit.
44
+ const v = s.init === null ? "null" : emitter.emitReadReceiver(s.init).name;
45
+ B.line(`store ptr ${v}, ptr ${b.slot}`);
46
+ break;
47
+ }
48
+ const slice = emitter.scalarStringSlices.get(s.localId);
49
+ if (slice) {
50
+ const snapshot = emitStringSliceSnapshot(emitter, slice);
51
+ emitter.stringSlices.set(s.localId, snapshot);
52
+ emitter.scopes[emitter.scopes.length - 1].push({ slot: snapshot.source, type: STRING });
53
+ break;
54
+ }
55
+ const split = emitter.privateSplitLocals.get(s.localId);
56
+ if (split) {
57
+ const snapshot = storeSplitSnapshot(emitter, emitSplitSnapshot(emitter, split));
58
+ emitter.storedSplits.set(s.localId, snapshot);
59
+ emitter.scopes[emitter.scopes.length - 1].push({ slot: snapshot.sourceSlot, type: STRING }, { slot: snapshot.separatorSlot, type: STRING });
60
+ break;
61
+ }
62
+ const stackObject = emitter.localStackObjects.get(s.localId);
63
+ if (stackObject) {
64
+ const value = emitStackObject(emitter, stackObject, (fields) => emitter.ownScopeFields(fields));
65
+ B.line(`store ptr ${value.name}, ptr ${b.slot}`);
66
+ break;
67
+ }
68
+ if (s.init && emitter.reassignedStackObjects.has(s.localId)) {
69
+ const slot = emitter.stackObjectSlot(s.localId, s.init.type);
70
+ emitStackObject(emitter, s.init, (fields) => emitter.ownScopeFields(fields), slot);
71
+ B.line(`store ptr ${slot}, ptr ${b.slot}`);
72
+ break;
73
+ }
74
+ const localUnion = emitter.localStackUnions.get(s.localId);
75
+ if (localUnion) {
76
+ const union = emitStackUnion(emitter, localUnion);
77
+ B.line(`store ptr ${union.value.name}, ptr ${b.slot}`);
78
+ if (union.payload) {
79
+ emitter.toFrame(union.payload);
80
+ emitter.scopes[emitter.scopes.length - 1].push({
81
+ slot: union.payloadSlot,
82
+ type: union.payload.type,
83
+ });
84
+ }
85
+ break;
86
+ }
87
+ const localRead = emitter.localArrayReads.get(s.localId);
88
+ if (localRead) {
89
+ const owner = emitLocalArrayRead(emitter, !localRead.borrow && emitter.unwrittenLocalArrayRead(s, localRead)
90
+ ? { ...localRead, borrow: true }
91
+ : localRead, b.slot);
92
+ if (owner)
93
+ emitter.scopes[emitter.scopes.length - 1].push(owner);
94
+ break;
95
+ }
96
+ const mapRead = emitter.mapReadLifetimes.locals.get(s.localId);
97
+ if (mapRead) {
98
+ const result = emitStackMapRead(emitter, mapRead);
99
+ B.line(`store ptr ${result.value.name}, ptr ${b.slot}`);
100
+ if (result.owner)
101
+ emitter.scopes[emitter.scopes.length - 1].push(result.owner);
102
+ break;
103
+ }
104
+ const localStorage = emitter.localUnionStorageProofs.get(s.localId);
105
+ if (localStorage && s.init) {
106
+ const storage = allocateLocalUnion(emitter, localStorage);
107
+ emitter.localUnionStorage.set(s.localId, storage);
108
+ storeLocalUnion(emitter, storage, s.init);
109
+ B.line(`store ptr ${storage.box}, ptr ${b.slot}`);
110
+ if (storage.owner && storage.ownerType)
111
+ emitter.scopes[emitter.scopes.length - 1].push({
112
+ slot: storage.owner,
113
+ type: storage.ownerType,
114
+ });
115
+ break;
116
+ }
117
+ if (b.kind === "boxed") {
118
+ const stack = emitter.stackCaptures.emit(emitter, s.localId, b.type);
119
+ if (stack) {
120
+ B.line(`store ptr ${stack.box}, ptr ${b.slot}`);
121
+ if (stack.owner)
122
+ emitter.scopes[emitter.scopes.length - 1].push(stack.owner);
123
+ if (s.init) {
124
+ const value = emitter.emitExpr(s.init);
125
+ if (isRefCounted(value.type))
126
+ emitter.toFrame(value);
127
+ emitter.boxSet(stack.box, b.type, value.name);
128
+ }
129
+ break;
130
+ }
131
+ // Box FIRST, then evaluate the initializer: a named function
132
+ // expression's closure captures this box during init evaluation.
133
+ // A SCALAR TDZ box rides an ARR-kind box: the value lives in a
134
+ // one-element array cell, so the empty (NULL) slot stays the
135
+ // not-yet-initialized sentinel — a raw scalar slot has no spare
136
+ // bit pattern to spend on it (stmts.ts's varDecl).
137
+ const boxNew = b.local.tdz === true && boxAccess(b.type) !== "ref"
138
+ ? (emitter.declare(`declare ptr @scr_box_new(i32)`), `call ptr @scr_box_new(i32 3)`)
139
+ : boxNewCall(emitter.shapeHost, b.type);
140
+ const box = B.tmp();
141
+ B.line(`${box} = ${boxNew} ; let ${b.local.name} (boxed)`);
142
+ B.line(`store ptr ${box}, ptr ${b.slot}`);
143
+ emitter.scopes[emitter.scopes.length - 1].push({
144
+ slot: b.slot,
145
+ type: b.type,
146
+ boxed: true,
147
+ });
148
+ if (s.init === null) {
149
+ // An empty TDZ box whose payload can legitimately be NULL
150
+ // starts at its distinct sentinel (tdzEmptySentinel).
151
+ const sentinel = b.local.tdz === true ? emitter.tdzEmptySentinel(b.type) : null;
152
+ if (sentinel !== null)
153
+ B.line(`store ptr ${sentinel}, ptr ${emitter.boxSlot(box)}`);
154
+ break;
155
+ }
156
+ const v = emitter.emitExpr(s.init);
157
+ if (isRefCounted(v.type))
158
+ emitter.toHeap(v); // the box takes ownership
159
+ if (b.local.tdz === true && boxAccess(b.type) !== "ref") {
160
+ emitter.tdzScalarInit(box, b.type, v.name);
161
+ }
162
+ else {
163
+ emitter.boxSet(box, b.type, v.name);
164
+ }
165
+ break;
166
+ }
167
+ if (s.init === null) {
168
+ // Declared, uninitialized (`let x: number;`): reset the slot —
169
+ // inside a loop the previous iteration's scope exit released the
170
+ // old value and left a stale pointer (NULL-tolerant releases).
171
+ if (isRefCounted(b.type)) {
172
+ B.line(`store ptr null, ptr ${b.slot}`);
173
+ emitter.scopes[emitter.scopes.length - 1].push({ slot: b.slot, type: b.type });
174
+ }
175
+ break;
176
+ }
177
+ if (emitter.loopArrayBorrows.has(s) && s.init.kind === "arrayGet") {
178
+ emitBorrowedArrayRead(emitter, s.init, b.slot);
179
+ break;
180
+ }
181
+ const holeRead = emitter.loopArrayBorrows.has(s) ? dynHoleRead(s.init) : null;
182
+ if (holeRead && s.init.kind === "ternary") {
183
+ // A hole reads as the immortal undefined value, which needs no owner.
184
+ const present = emitter.emitExpr(s.init.cond);
185
+ const filled = B.newLabel("borrow.hole.filled"), missing = B.newLabel("borrow.hole.missing"), done = B.newLabel("borrow.hole.done");
186
+ B.condBr(present.name, filled, missing);
187
+ B.startBlock(filled);
188
+ emitBorrowedArrayRead(emitter, holeRead, b.slot);
189
+ B.br(done);
190
+ B.startBlock(missing);
191
+ emitter.declare("declare ptr @scr_dyn_undefined()");
192
+ const undef = B.tmp();
193
+ B.line(`${undef} = call ptr @scr_dyn_undefined()`);
194
+ B.line(`store ptr ${undef}, ptr ${b.slot}`);
195
+ B.br(done);
196
+ B.startBlock(done);
197
+ break;
198
+ }
199
+ // A stable lexical alias cannot outlive its unchanged local owner.
200
+ // Whole-value uses still retain their own copies, so returning or
201
+ // storing the alias preserves the ordinary heap representation.
202
+ // Boxed captures, reassigned sources and projections need ownership.
203
+ if (b.kind === "local" &&
204
+ b.local &&
205
+ isRefCounted(b.type) &&
206
+ emitter.stableCallBindings.has(s.localId) &&
207
+ (emitter.canBorrowCallArgument(s.init) || emitter.unwrittenAlias(s))) {
208
+ const v = emitter.emitReadReceiver(s.init);
209
+ B.line(`store ptr ${v.name}, ptr ${b.slot}`);
210
+ break;
211
+ }
212
+ const v = emitter.emitExpr(s.init);
213
+ if (b.kind === "global")
214
+ emitter.toHeap(v);
215
+ else
216
+ emitter.toFrame(v);
217
+ B.line(`store ${emitter.llType(b.type)} ${v.name}, ptr ${b.slot}`);
218
+ emitter.storeIntegerView(s.localId, v, s.init);
219
+ if (isRefCounted(b.type)) {
220
+ emitter.scopes[emitter.scopes.length - 1].push({ slot: b.slot, type: b.type });
221
+ emitter.noteLastUseMove(s, b);
222
+ }
223
+ break;
224
+ }
225
+ case "assign": {
226
+ if (emitter.int32Locals.has(s.localId)) {
227
+ emitter.storeInt32Local(s.localId, emitter.emitExpr(s.value), s.value);
228
+ break;
229
+ }
230
+ const owner = emitter.reboundOwnerSlots.get(s.localId);
231
+ if (owner !== undefined && !emitter.walkBorrows.has(s.localId)) {
232
+ // A rebound borrowed parameter: the new value moves into the owner
233
+ // slot, replacing (and releasing) the previous owned value. This
234
+ // precedes the in-place string append, which would release the
235
+ // caller's borrow.
236
+ const param = emitter.binding(s.localId);
237
+ const slot = param.slot;
238
+ const v = emitter.emitExpr(s.value);
239
+ emitter.toFrame(v);
240
+ const old = B.tmp();
241
+ B.line(`${old} = load ptr, ptr ${owner}`);
242
+ emitter.releaseFrame(old, param.type);
243
+ B.line(`store ptr ${v.name}, ptr ${slot}`);
244
+ B.line(`store ptr ${v.name}, ptr ${owner}`);
245
+ break;
246
+ }
247
+ if (emitter.reassignedStackObjects.has(s.localId)) {
248
+ // The new value may read the old one: build it apart (its
249
+ // reference fields owned by this statement until it completes),
250
+ // then copy it over the binding's slot. The binding takes over the
251
+ // new fields; the old ones are released after the slot no longer
252
+ // holds them.
253
+ const struct = stackObjectStruct(s.value.type);
254
+ let owned = [];
255
+ const value = emitStackObject(emitter, s.value, (fields) => {
256
+ owned = fields;
257
+ for (const field of fields)
258
+ emitter.ownSlot(field.ptr, field.type);
259
+ });
260
+ const target = emitter.stackObjectSlot(s.localId, s.value.type);
261
+ const old = stackObjectFields(emitter, s.value.type, target).map((field) => {
262
+ const t = B.tmp();
263
+ B.line(`${t} = load ptr, ptr ${field.ptr}`);
264
+ return { name: t, type: field.type };
265
+ });
266
+ const bits = B.tmp();
267
+ B.line(`${bits} = load ${struct}, ptr ${value.name}`);
268
+ B.line(`store ${struct} ${bits}, ptr ${target}`);
269
+ emitter.disownSlots(owned);
270
+ for (const field of old)
271
+ emitter.releaseFrame(field.name, field.type);
272
+ break;
273
+ }
274
+ const localStorage = emitter.localUnionStorage.get(s.localId);
275
+ if (localStorage) {
276
+ storeLocalUnion(emitter, localStorage, s.value);
277
+ break;
278
+ }
279
+ const self = matchStringSelfConcat(s.localId, s.value);
280
+ if (self) {
281
+ emitter.emitStringSelfConcatAssign(s.localId, self.left, self.suffix, false);
282
+ break;
283
+ }
284
+ const b = emitter.binding(s.localId);
285
+ if (emitter.walkBorrows.has(s.localId) && b.kind === "local") {
286
+ // Rebinding a borrowed walk pointer releases nothing.
287
+ B.line(`store ptr ${emitter.emitReadReceiver(s.value).name}, ptr ${b.slot}`);
288
+ break;
289
+ }
290
+ const v = emitter.emitExpr(s.value);
291
+ if (b.kind === "global" && !s.initializes)
292
+ emitter.checkGlobalTdz(s.localId);
293
+ if (b.kind === "boxed") {
294
+ emitter.writeBindingBox(emitter.loadBox(b.slot), b.local, v.name, s.initializes);
295
+ // The RHS remains frame-owned until a possible TDZ throw passes.
296
+ if (isRefCounted(v.type))
297
+ emitter.toHeap(v);
298
+ break;
299
+ }
300
+ if (b.kind === "global")
301
+ emitter.toHeap(v);
302
+ else
303
+ emitter.toFrame(v);
304
+ if (isRefCounted(b.type)) {
305
+ const old = B.tmp();
306
+ B.line(`${old} = load ptr, ptr ${b.slot}`);
307
+ if (b.kind === "global")
308
+ emitter.releaseHeap(old, b.type);
309
+ else
310
+ emitter.releaseFrame(old, b.type);
311
+ }
312
+ B.line(`store ${emitter.llType(b.type)} ${v.name}, ptr ${b.slot}`);
313
+ emitter.storeIntegerView(s.localId, v, s.value);
314
+ if (b.kind === "global" && emitter.immortalGlobals.has(s.localId)) {
315
+ // An Immutable module constant (contracts/check.ts proved it is
316
+ // fresh, publishable and never written): its graph becomes
317
+ // immortal, so reads skip reference counting and the collector
318
+ // never visits it.
319
+ const lines = emitter.publishWalkers.emitPublish(v.name, v.type, s.loc);
320
+ for (const line of lines)
321
+ B.line(line.trimStart());
322
+ // Reads of this global skip retains from here on, which is only
323
+ // sound once the graph really is immortal. Node.js never fails
324
+ // here, so a refusal means the contract proof was wrong: stop
325
+ // rather than keep running with a mortal graph read as immortal.
326
+ if (lines.length > 0) {
327
+ emitter.declare(`declare zeroext i1 @scr_exc_pending()`);
328
+ emitter.declare(`declare void @scr_trap(ptr)`);
329
+ const refused = B.tmp();
330
+ B.line(`${refused} = call zeroext i1 @scr_exc_pending()`);
331
+ const stop = B.newLabel("immutable.refused");
332
+ const done = B.newLabel("immutable.published");
333
+ B.condBr(refused, stop, done);
334
+ B.startBlock(stop);
335
+ B.line(`call void @scr_trap(ptr ${emitter.cstr("scriptc: internal error: an Immutable value could not be published\n")})`);
336
+ B.terminate("unreachable");
337
+ B.startBlock(done);
338
+ }
339
+ }
340
+ break;
341
+ }
342
+ case "exprStmt":
343
+ // A statement-position splice never observes its removed elements.
344
+ if (!emitDiscardedSplice(emitter, s.expr))
345
+ emitter.emitDiscarded(s.expr);
346
+ break;
347
+ case "arraySet": {
348
+ // Evaluation order matches JS: array, index, then value. Ownership
349
+ // of a refcounted value moves into the array (the runtime releases
350
+ // the replaced element itself). A local receiver that the index and
351
+ // value cannot rebind is read in place, as for field stores; the
352
+ // released element cannot reach that binding.
353
+ if (emitter.emitArraySelfConcat(s))
354
+ break;
355
+ const arr = emitter.emitStableReceiver(s.arr, [s.index, s.value]);
356
+ const idx = emitter.emitExpr(s.index);
357
+ const v = emitter.emitExpr(s.value);
358
+ if (s.arr.type.kind !== "array")
359
+ throw new InternalCompilerError("llvm emitter bug: arraySet on non-array");
360
+ const acc = elemAccess(s.arr.type.elem);
361
+ emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
362
+ if (acc === "ref")
363
+ emitter.toHeap(v);
364
+ emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index));
365
+ break;
366
+ }
367
+ case "arraySetLength": {
368
+ // Pop's `length = 0` store on an empty array only matters when the
369
+ // array can be frozen (published); its operand is a local.
370
+ if (s.pop === true &&
371
+ s.length.kind === "numLit" &&
372
+ s.length.value === 0 &&
373
+ emitter.publishedTypes?.containerGuarded(s.arr.type) !== true)
374
+ break;
375
+ const arr = emitBorrowedInput(emitter, s.arr);
376
+ const length = emitter.emitExpr(s.length);
377
+ if (s.arr.type.kind !== "array")
378
+ throw new InternalCompilerError("llvm emitter bug: arraySetLength on non-array");
379
+ emitter.emitPublishedArrayGuard(arr.name, s.arr.type, s.pop === true ? 2 : 3);
380
+ emitter.declare(`declare void @scr_arr_set_len(ptr, double)`);
381
+ // Assigning the current length (a reused work array reset to where
382
+ // it already is) changes nothing: the runtime's validation accepts
383
+ // exactly the value equal to the length (-0 included, NaN never),
384
+ // and no element is released. Everything else keeps the call.
385
+ const lenPtr = B.tmp(), len = B.tmp(), lenNumber = B.tmp(), same = B.tmp();
386
+ const resize = B.newLabel("arr.len.set"), done = B.newLabel("arr.len.done");
387
+ B.line(`${lenPtr} = getelementptr inbounds %ScrArr, ptr ${arr.name}, i32 0, i32 1`);
388
+ emitter.markMemoryPointer(lenPtr, "array:header");
389
+ loadArrCount(emitter, len, lenPtr, emitter.fieldAliasAttachment(lenPtr));
390
+ B.line(`${lenNumber} = ${sizeToDouble(emitter.sizeType)} ${emitter.sizeType} ${len} to double`);
391
+ B.line(`${same} = fcmp oeq double ${length.name}, ${lenNumber}`);
392
+ B.condBr(same, done, resize);
393
+ B.startBlock(resize);
394
+ if (s.pop === true) {
395
+ // A discarded pop's `length - 1` on a packed array removes the
396
+ // last element inline, then releases it.
397
+ const call = B.newLabel("arr.len.call"), pop = B.newLabel("arr.len.pop");
398
+ const lastNumber = B.tmp(), dropsLast = B.tmp();
399
+ B.line(`${lastNumber} = fsub double ${lenNumber}, 1.0`);
400
+ B.line(`${dropsLast} = fcmp oeq double ${length.name}, ${lastNumber}`);
401
+ B.condBr(dropsLast, pop, call);
402
+ B.startBlock(pop);
403
+ 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);
410
+ }
411
+ B.br(done);
412
+ B.startBlock(call);
413
+ }
414
+ B.line(`call void @scr_arr_set_len(ptr ${arr.name}, double ${length.name})`);
415
+ emitter.emitPendingCheck();
416
+ B.br(done);
417
+ B.startBlock(done);
418
+ break;
419
+ }
420
+ case "arraySetUndefined":
421
+ case "arrayDelete": {
422
+ const arr = emitBorrowedInput(emitter, s.arr);
423
+ const idx = emitter.emitExpr(s.index);
424
+ if (s.arr.type.kind !== "array")
425
+ throw new InternalCompilerError(`llvm emitter bug: ${s.kind} on non-array`);
426
+ emitter.emitPublishedArrayGuard(arr.name, s.arr.type, s.kind === "arrayDelete" ? 5 : 0, idx.name);
427
+ const fn = s.kind === "arraySetUndefined" ? "scr_arr_set_undefined" : "scr_arr_delete";
428
+ emitter.declare(`declare ${s.kind === "arrayDelete" ? "zeroext i1" : "void"} @${fn}(ptr, double)`);
429
+ if (s.kind === "arrayDelete")
430
+ B.line(`call zeroext i1 @${fn}(ptr ${arr.name}, double ${idx.name})`);
431
+ else
432
+ B.line(`call void @${fn}(ptr ${arr.name}, double ${idx.name})`);
433
+ break;
434
+ }
435
+ case "bytesSet": {
436
+ // Typed-array element write: same evaluation order as arraySet;
437
+ // the value is a scalar (the kind-specific inline path coerces
438
+ // JS-exactly), so no ownership moves. Invalid writes are ignored.
439
+ // IrBytesElem is static, so never rediscover it through the
440
+ // generic runtime switch in a hot loop.
441
+ const arr = emitter.emitStableReceiver(s.arr, [s.index, s.value]);
442
+ const idx = emitter.emitExpr(s.index);
443
+ const v = emitter.emitExpr(s.value);
444
+ if (s.arr.type.kind !== "bytes")
445
+ 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));
447
+ break;
448
+ }
449
+ case "fieldSet":
450
+ case "recordSet": {
451
+ // Evaluation order: obj, then value. New value moved in; the old
452
+ // value is released AFTER the field is overwritten (unlink-then-
453
+ // release — a release can trigger a cycle collection, which must
454
+ // never see a heap edge whose count was already given up).
455
+ // Classes and records share the struct layout, so one emission.
456
+ const nullable = s.kind === "fieldSet" ? emitter.nullableFields.get(s.className, s.field) : null;
457
+ if (nullable && s.kind === "fieldSet") {
458
+ const obj = emitter.emitStableReceiver(s.obj, [s.value]);
459
+ // (The guard precedes the value here: the nullable store
460
+ // evaluates it itself.)
461
+ emitter.emitStoreGuard(obj.name, s);
462
+ emitter.emitNullableFieldStore(obj.name, s.className, s.field, nullable, s.value);
463
+ break;
464
+ }
465
+ if (s.kind === "fieldSet" && emitter.int32Slots.isField(s.className, s.field)) {
466
+ const obj = emitter.emitStableReceiver(s.obj, [s.value]);
467
+ const v = emitter.emitExpr(s.value);
468
+ emitter.emitStoreGuard(obj.name, s);
469
+ const { ptr } = emitter.classFieldPtr(obj.name, s.className, s.field);
470
+ emitter.storeInt32Field(ptr, v, s.value);
471
+ break;
472
+ }
473
+ if (emitter.emitFieldSelfConcat(s))
474
+ break;
475
+ const obj = emitter.emitStableReceiver(s.obj, [s.value]);
476
+ const v = emitter.emitFieldValue(s.value, s.kind === "recordSet"
477
+ ? emitter.recordFieldInline(s.shapeId, s.field)
478
+ : emitter.inlineUnions.classField(s.className, s.field));
479
+ if (s.kind === "fieldSet")
480
+ emitter.emitStoreGuard(obj.name, s);
481
+ else if (emitter.publishedTypes?.recordGuarded(s.shapeId) === true)
482
+ emitter.emitPublishedFieldGuard(obj.name, null, s.field);
483
+ const { ptr, type, inline } = s.kind === "fieldSet"
484
+ ? emitter.classFieldPtr(obj.name, s.className, s.field)
485
+ : emitter.recordFieldPtr(obj.name, s.shapeId, s.field);
486
+ // 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))
491
+ emitter.initField(ptr, type, inline, v);
492
+ else
493
+ emitter.replaceField(ptr, type, inline, v);
494
+ if (s.kind === "fieldSet" &&
495
+ s.field === "name" &&
496
+ emitter.classMeta.get(s.className)?.root.def.name === "%Error") {
497
+ const present = emitter.classFieldPtr(obj.name, s.className, "%namePresent").ptr;
498
+ const enumerable = emitter.classFieldPtr(obj.name, s.className, "%nameEnumerable").ptr;
499
+ const wasPresent = B.tmp(), wasEnumerable = B.tmp(), isPresent = B.tmp(), nextEnumerable = B.tmp();
500
+ B.line(`${wasPresent} = load i8, ptr ${present}`);
501
+ B.line(`${wasEnumerable} = load i8, ptr ${enumerable}`);
502
+ B.line(`${isPresent} = icmp ne i8 ${wasPresent}, 0`);
503
+ B.line(`${nextEnumerable} = select i1 ${isPresent}, i8 ${wasEnumerable}, i8 1`);
504
+ B.line(`store i8 1, ptr ${present}`);
505
+ B.line(`store i8 ${nextEnumerable}, ptr ${enumerable}`);
506
+ }
507
+ break;
508
+ }
509
+ case "recordKeyDelete": {
510
+ // `delete obj[k]` on a pure index-signature shape: a Map delete on
511
+ // the overflow (key and value released; absent keys no-op).
512
+ const obj = emitter.emitExpr(s.obj);
513
+ const key = emitter.emitExpr(s.key);
514
+ if (emitter.publishedTypes?.recordGuarded(s.shapeId) === true) {
515
+ // Node: "Cannot delete property 'k' of #<Object>" (key known at
516
+ // run time only; the guard reports the frozen record generically).
517
+ emitter.emitPublishedFieldGuard(obj.name, null, "[key]");
518
+ }
519
+ const ovf = emitter.recordOvfPtr(obj.name, s.shapeId);
520
+ emitter.declare(`declare zeroext i1 @scr_map_delete_str(ptr, ptr)`);
521
+ const t = B.tmp();
522
+ B.line(`${t} = call zeroext i1 @scr_map_delete_str(ptr ${ovf}, ptr ${key.name})`);
523
+ break;
524
+ }
525
+ case "recordKeySet": {
526
+ // Dynamic-keyed record write (the C per-shape helper, inline):
527
+ // declared keys write through (same-typed — dyn-valued shapes,
528
+ // whose writes validate and can throw, stay refused), undeclared
529
+ // keys insert/replace in the overflow map. Evaluation order: obj,
530
+ // key, value; the write OWNS the value (+1 moves in).
531
+ const obj = emitter.emitExpr(s.obj);
532
+ const key = emitter.emitExpr(s.key);
533
+ const v = emitter.emitExpr(s.value);
534
+ if (emitter.publishedTypes?.recordGuarded(s.shapeId) === true)
535
+ emitter.emitPublishedFieldGuard(obj.name, null, "[key]");
536
+ if (isRefCounted(v.type))
537
+ emitter.toHeap(v);
538
+ const shape = emitter.recordShape(s.shapeId);
539
+ // Signature-free shapes dispatch over their (one-typed) declared
540
+ // fields and TRAP on a miss (scr_record_key_miss — JS would add
541
+ // the property, which a monomorphic struct cannot); overflow
542
+ // shapes keep the map insert tail.
543
+ const iv = shape.indexValue ?? shape.fields[0]?.type;
544
+ if (!iv)
545
+ throw new InternalCompilerError(`llvm emitter bug: keyed write on field-free non-overflow shape ${s.shapeId}`);
546
+ const vAcc = iv.kind === "f64" ? "f64" : iv.kind === "bool" ? "bool" : "ref";
547
+ if (s.overflowOnly === true) {
548
+ // A LITERAL key naming no declared field: a plain overflow
549
+ // insert — no field chain.
550
+ const ovf = emitter.recordOvfPtr(obj.name, s.shapeId);
551
+ emitter.mapSet(ovf, "str", vAcc, key.name, v.name);
552
+ break;
553
+ }
554
+ const join = B.newLabel("rks.j");
555
+ if (iv.kind === "dyn" && shape.indexValue) {
556
+ // A dyn-valued shape (the C recordKeySetHelper's dyn arm,
557
+ // inline): declared keys VALIDATE the dyn value against the
558
+ // field's type first (dynCheck — a mismatched write throws the
559
+ // catchable TypeError and leaves the field untouched; JS would
560
+ // store anything, the documented divergence); undeclared keys
561
+ // insert the dyn value into the overflow map as-is.
562
+ emitter.declare(`declare void @scr_dyn_release(ptr)`);
563
+ for (const f of shape.fields) {
564
+ const hit = B.tmp();
565
+ B.line(`${hit} = call zeroext i1 ${emitter.literalEquals(f.name)}(ptr ${key.name}) ; ${llvmCommentText(f.name)}`);
566
+ const lh = B.newLabel("rks.h");
567
+ const ln = B.newLabel("rks.n");
568
+ B.condBr(hit, lh, ln);
569
+ B.startBlock(lh);
570
+ const pathSlot = B.slot();
571
+ B.entryAllocas.push(`${pathSlot} = alloca %ScrDynPath`);
572
+ const pp = B.tmp();
573
+ const kp = B.tmp();
574
+ const ip = B.tmp();
575
+ B.line(`${pp} = getelementptr inbounds %ScrDynPath, ptr ${pathSlot}, i64 0, i32 0`);
576
+ B.line(`store ptr null, ptr ${pp}`);
577
+ B.line(`${kp} = getelementptr inbounds %ScrDynPath, ptr ${pathSlot}, i64 0, i32 1`);
578
+ B.line(`store ptr ${emitter.cstr(f.name)}, ptr ${kp}`);
579
+ B.line(`${ip} = getelementptr inbounds %ScrDynPath, ptr ${pathSlot}, i64 0, i32 2`);
580
+ B.line(`store ${emitter.sizeType} 0, ptr ${ip}`);
581
+ const helper = emitter.dyn.dynCheckHelper(f.type);
582
+ const fty = emitter.llType(f.type);
583
+ const nv = B.tmp();
584
+ B.line(`${nv} = call ${fty === "i1" ? "zeroext i1" : fty} @${helper}(ptr ${v.name}, ptr ${pathSlot})`);
585
+ B.line(`call void @scr_dyn_release(ptr ${v.name})`);
586
+ // Mismatched write: TypeError pending, field untouched — the
587
+ // statement-level check below unwinds.
588
+ const pend = B.tmp();
589
+ for (const line of emitter.pendingTestLines(pend))
590
+ B.line(line.trimStart());
591
+ const lw = B.newLabel("rks.w");
592
+ B.condBr(pend, join, lw);
593
+ B.startBlock(lw);
594
+ const { ptr, type, inline } = emitter.recordFieldPtr(obj.name, s.shapeId, f.name);
595
+ if (inline) {
596
+ // The slot copies the checked value's bits; nv is released below.
597
+ emitter.storeField(ptr, type, nv, true);
598
+ emitter.releaseFrame(nv, type);
599
+ }
600
+ else if (isRefCounted(type)) {
601
+ const old = B.tmp();
602
+ B.line(`${old} = load ptr, ptr ${ptr}`);
603
+ emitter.storeField(ptr, type, nv, false);
604
+ emitter.releaseHeap(old, type);
605
+ }
606
+ else {
607
+ emitter.storeField(ptr, type, nv, false);
608
+ }
609
+ B.br(join);
610
+ B.startBlock(ln);
611
+ }
612
+ const ovf = emitter.recordOvfPtr(obj.name, s.shapeId);
613
+ emitter.mapSet(ovf, "str", vAcc, key.name, v.name);
614
+ B.br(join);
615
+ B.startBlock(join);
616
+ // MAY THROW exactly when a dyn value can validate against a
617
+ // declared field (stmts.ts's condition).
618
+ if (shape.fields.length > 0)
619
+ emitter.emitPendingCheck();
620
+ break;
621
+ }
622
+ for (const f of shape.fields) {
623
+ // typeEquals(f.type, iv) — the frontend fences everything else.
624
+ const hit = B.tmp();
625
+ B.line(`${hit} = call zeroext i1 ${emitter.literalEquals(f.name)}(ptr ${key.name}) ; ${llvmCommentText(f.name)}`);
626
+ const lh = B.newLabel("rks.h");
627
+ const ln = B.newLabel("rks.n");
628
+ B.condBr(hit, lh, ln);
629
+ B.startBlock(lh);
630
+ const { ptr, type, inline } = emitter.recordFieldPtr(obj.name, s.shapeId, f.name);
631
+ if (inline) {
632
+ // The write owns the moved-in value; the slot copies its bits.
633
+ emitter.storeField(ptr, type, v.name, true);
634
+ emitter.releaseHeap(v.name, type);
635
+ }
636
+ else if (isRefCounted(type)) {
637
+ const old = B.tmp();
638
+ B.line(`${old} = load ptr, ptr ${ptr}`);
639
+ emitter.storeField(ptr, type, v.name, false);
640
+ emitter.releaseHeap(old, type);
641
+ }
642
+ else {
643
+ emitter.storeField(ptr, type, v.name, false);
644
+ }
645
+ B.br(join);
646
+ B.startBlock(ln);
647
+ }
648
+ if (!shape.indexValue) {
649
+ // The MISS on a fixed shape: release the moved-in value, throw
650
+ // the catchable TypeError naming the key (scr_record_key_miss —
651
+ // JS would add the property, the documented divergence).
652
+ if (isRefCounted(iv))
653
+ emitter.releaseHeap(v.name, iv);
654
+ emitter.declare(`declare void @scr_record_key_miss(ptr)`);
655
+ B.line(`call void @scr_record_key_miss(ptr ${key.name})`);
656
+ B.br(join);
657
+ B.startBlock(join);
658
+ emitter.emitPendingCheck();
659
+ break;
660
+ }
661
+ const ovf = emitter.recordOvfPtr(obj.name, s.shapeId);
662
+ emitter.mapSet(ovf, "str", vAcc, key.name, v.name);
663
+ B.br(join);
664
+ B.startBlock(join);
665
+ break;
666
+ }
667
+ case "block": {
668
+ if (s.labels === undefined) {
669
+ emitter.emitBlock(s.body);
670
+ break;
671
+ }
672
+ // A labeled block: `break lbl` inside branches to the end label.
673
+ const le = B.newLabel("blk.e");
674
+ emitter.jumpTargets.push({
675
+ kind: "block",
676
+ brkLabel: le,
677
+ contLabel: null,
678
+ labels: s.labels,
679
+ frameDepth: emitter.frames.length,
680
+ scopeDepth: emitter.scopes.length,
681
+ finallyDepth: emitter.finallyStack.length,
682
+ });
683
+ emitter.emitBlock(s.body);
684
+ emitter.jumpTargets.pop();
685
+ B.br(le);
686
+ B.startBlock(le);
687
+ break;
688
+ }
689
+ case "if": {
690
+ const cond = emitter.emitCondition(s.cond);
691
+ const trueLabel = B.newLabel("if.t");
692
+ const joinLabel = B.newLabel("if.j");
693
+ const falseLabel = s.else_ ? B.newLabel("if.f") : joinLabel;
694
+ B.condBr(cond, trueLabel, falseLabel);
695
+ B.startBlock(trueLabel);
696
+ emitter.emitBlock(s.then);
697
+ B.br(joinLabel);
698
+ if (s.else_) {
699
+ B.startBlock(falseLabel);
700
+ emitter.emitBlock(s.else_);
701
+ B.br(joinLabel);
702
+ }
703
+ B.startBlock(joinLabel);
704
+ break;
705
+ }
706
+ case "while": {
707
+ const workerBudget = emitter.workerLoopBudget(s);
708
+ const le = B.newLabel("loop.e");
709
+ emitter.emitLoopCopies(s, true, le, (exit) => {
710
+ const lc = B.newLabel("loop.c");
711
+ const lb = B.newLabel("loop.b");
712
+ const lp = workerBudget !== null ? B.newLabel("loop.p") : lc;
713
+ B.br(lc);
714
+ B.startBlock(lc);
715
+ B.condBr(emitter.emitCondition(s.cond), lb, exit);
716
+ B.startBlock(lb);
717
+ emitter.jumpTargets.push({
718
+ kind: "loop",
719
+ brkLabel: exit,
720
+ contLabel: lp,
721
+ labels: s.labels,
722
+ frameDepth: emitter.frames.length,
723
+ scopeDepth: emitter.scopes.length,
724
+ finallyDepth: emitter.finallyStack.length,
725
+ });
726
+ emitter.emitBlock(s.body);
727
+ emitter.jumpTargets.pop();
728
+ B.br(lp);
729
+ if (lp !== lc) {
730
+ B.startBlock(lp);
731
+ emitter.emitWorkerLoopCheck(workerBudget);
732
+ B.br(lc);
733
+ }
734
+ });
735
+ B.startBlock(le);
736
+ break;
737
+ }
738
+ case "doWhile": {
739
+ const workerBudget = emitter.workerLoopBudget(s);
740
+ // Body first (runs at least once); continue jumps to the CONDITION.
741
+ const le = B.newLabel("loop.e");
742
+ emitter.emitLoopCopies(s, true, le, (exit) => {
743
+ const lb = B.newLabel("loop.b");
744
+ const lc = B.newLabel("loop.c");
745
+ B.br(lb);
746
+ B.startBlock(lb);
747
+ emitter.jumpTargets.push({
748
+ kind: "loop",
749
+ brkLabel: exit,
750
+ contLabel: lc,
751
+ labels: s.labels,
752
+ frameDepth: emitter.frames.length,
753
+ scopeDepth: emitter.scopes.length,
754
+ finallyDepth: emitter.finallyStack.length,
755
+ });
756
+ emitter.emitBlock(s.body);
757
+ emitter.jumpTargets.pop();
758
+ B.br(lc);
759
+ B.startBlock(lc);
760
+ emitter.emitWorkerLoopCheck(workerBudget);
761
+ B.condBr(emitter.emitCondition(s.cond), lb, exit);
762
+ });
763
+ B.startBlock(le);
764
+ break;
765
+ }
766
+ case "for": {
767
+ // The init's scope wraps the whole loop (break/continue must NOT
768
+ // release it — scopeDepth captured after the push, C parity).
769
+ const integerArrayLoop = emitter.debug === null
770
+ ? matchIntegerArrayForLoop(s, emitter.currentLocals, emitter.integerArrayBindings)
771
+ : null;
772
+ const integerLoop = integerArrayLoop ??
773
+ (emitter.debug === null ? matchIntegerBytesForLoop(s, emitter.numericLocals) : null);
774
+ const countedLoop = !integerLoop && emitter.countedLoopsEnabled
775
+ ? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, emitter.unaliasedArrays)
776
+ : null;
777
+ const window = countedLoop && emitter.byteWindowsEnabled
778
+ ? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, emitter.byteWindowEntries.get(s) ?? new Set())
779
+ : null;
780
+ const denseShape = !emitter.denseLoopsEnabled
781
+ ? null
782
+ : integerArrayLoop
783
+ ? {
784
+ counter: integerArrayLoop.localId,
785
+ length: integerArrayLoop.limitReceiver,
786
+ range: { min: 0, max: 4294967294 },
787
+ }
788
+ : countedLoop && !countedLoop.guarded
789
+ ? countedDenseShape(s, countedLoop)
790
+ : null;
791
+ const dense = denseShape && !window
792
+ ? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, emitter.unaliasedArrays, emitter.denseLoopEntries.get(s) ?? new Set())
793
+ : null;
794
+ if (dense) {
795
+ const valid = emitDenseLoopGuard(emitter, dense);
796
+ const fast = B.newLabel("dense.loop.fast"), slow = B.newLabel("dense.loop.slow"), done = B.newLabel("dense.loop.done");
797
+ B.condBr(valid, fast, slow);
798
+ emitter.denseLoopsEnabled = false;
799
+ try {
800
+ B.startBlock(slow);
801
+ emitter.emitStmt(s);
802
+ B.br(done);
803
+ B.startBlock(fast);
804
+ emitter.denseLoop = dense;
805
+ emitter.emitStmt(s);
806
+ B.br(done);
807
+ }
808
+ finally {
809
+ emitter.denseLoop = null;
810
+ emitter.denseLoopsEnabled = true;
811
+ }
812
+ B.startBlock(done);
813
+ break;
814
+ }
815
+ if (window) {
816
+ const valid = emitByteWindowGuard(emitter, window);
817
+ const fast = B.newLabel("bytes.window.fast"), slow = B.newLabel("bytes.window.slow"), done = B.newLabel("bytes.window.done");
818
+ B.condBr(valid, fast, slow);
819
+ const originalRanges = emitter.integerRanges, originalBounds = emitter.bytesBounds;
820
+ emitter.byteWindowsEnabled = false;
821
+ try {
822
+ B.startBlock(slow);
823
+ emitter.emitStmt(s);
824
+ B.br(done);
825
+ B.startBlock(fast);
826
+ emitter.integerRanges = window.ranges;
827
+ emitter.bytesBounds = new Set([...originalBounds, ...window.bounds]);
828
+ emitter.emitStmt(s);
829
+ B.br(done);
830
+ }
831
+ finally {
832
+ emitter.integerRanges = originalRanges;
833
+ emitter.bytesBounds = originalBounds;
834
+ emitter.byteWindowsEnabled = true;
835
+ }
836
+ B.startBlock(done);
837
+ break;
838
+ }
839
+ const version = emitter.bytesLoopVersionsEnabled &&
840
+ emitter.bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
841
+ !emitter.bytesLoopVersioning.has(s)
842
+ ? emitter.matchBytesLoopVersion(s, countedLoop)
843
+ : null;
844
+ 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);
869
+ break;
870
+ }
871
+ let countedJoin = null;
872
+ if (countedLoop?.guarded && !emitter.provenCountedGuards.has(s)) {
873
+ const safe = emitCountedLoopSafety(emitter, countedLoop);
874
+ const fast = B.newLabel("counted.fast");
875
+ const slow = B.newLabel("counted.slow");
876
+ countedJoin = B.newLabel("counted.done");
877
+ B.condBr(safe, fast, slow);
878
+ B.startBlock(slow);
879
+ emitter.countedLoopsEnabled = false;
880
+ emitter.emitStmt(s);
881
+ emitter.countedLoopsEnabled = true;
882
+ B.br(countedJoin);
883
+ B.startBlock(fast);
884
+ }
885
+ emitter.scopes.push([]);
886
+ let integerSlot = null;
887
+ let countedLimit = null;
888
+ if (integerLoop) {
889
+ integerSlot = B.slot();
890
+ B.entryAllocas.push(`${integerSlot} = alloca ${emitter.sizeType} ; integer induction ${emitter.currentLocals.get(integerLoop.localId).name}`);
891
+ let start = "0";
892
+ if (integerArrayLoop && s.init?.kind === "varDecl" && s.init.init) {
893
+ const value = emitter.emitExpr(s.init.init);
894
+ start = B.tmp();
895
+ // The start is 0 or an enclosing array index plus one (at most
896
+ // 2^32 - 1): on 64-bit targets the signed conversion is exact
897
+ // and avoids x86-64's unsigned 64-bit conversion sequence.
898
+ const conversion = emitter.sizeType === "i64" ? "fptosi" : "fptoui";
899
+ B.line(`${start} = ${conversion} double ${value.name} to ${emitter.sizeType}`);
900
+ emitter.integerArrayBindings.add(integerLoop.localId);
901
+ }
902
+ B.line(`store ${emitter.sizeType} ${start}, ptr ${integerSlot}`);
903
+ emitter.integerLoopBindings.set(integerLoop.localId, {
904
+ slot: integerSlot,
905
+ type: emitter.sizeType,
906
+ range: emitter.denseLoop?.counter === integerLoop.localId
907
+ ? emitter.denseLoop.range
908
+ : { min: 0, max: integerArrayLoop ? 4294967294 : Number.MAX_SAFE_INTEGER - 1 },
909
+ });
910
+ }
911
+ else if (countedLoop) {
912
+ integerSlot = B.slot();
913
+ B.entryAllocas.push(`${integerSlot} = alloca i64 ; integer induction ${emitter.currentLocals.get(countedLoop.localId).name}`);
914
+ const startNumber = emitter.emitExpr(countedLoop.start);
915
+ const start = B.tmp();
916
+ B.line(`${start} = fptosi double ${startNumber.name} to i64`);
917
+ B.line(`store i64 ${start}, ptr ${integerSlot}`);
918
+ emitter.integerLoopBindings.set(countedLoop.localId, {
919
+ slot: integerSlot,
920
+ type: "i64",
921
+ signed: true,
922
+ range: emitter.denseLoop?.counter === countedLoop.localId
923
+ ? emitter.denseLoop.range
924
+ : countedLoop.range,
925
+ });
926
+ countedLimit = emitCountedLoopLimit(emitter, countedLoop);
927
+ }
928
+ else if (s.init) {
929
+ // A multi-declarator head shares the loop's scope. Emitting its
930
+ // IR block as an ordinary block would release captured/ref locals
931
+ // before the first condition.
932
+ const initializers = s.init.kind === "block" ? s.init.body : [s.init];
933
+ for (const initializer of initializers)
934
+ emitter.emitStmt(initializer);
935
+ }
936
+ const le = B.newLabel("loop.e");
937
+ // JS `for (let i ...)`: each iteration gets a FRESH binding holding
938
+ // a copy of the previous one (closures made in iteration k keep
939
+ // seeing iteration k's value) — only observable, and only emitted,
940
+ // when a let variable is captured (boxed). Freshen before the first
941
+ // condition and again in the continue-target block before updating.
942
+ const initializers = s.init?.kind === "block" ? s.init.body : s.init ? [s.init] : [];
943
+ const capturedLets = initializers.flatMap((init) => {
944
+ const local = init.kind === "varDecl" ? emitter.currentLocals.get(init.localId) : undefined;
945
+ return local?.boxed && local.mutable ? [local] : [];
946
+ });
947
+ const freshenBindings = () => {
948
+ for (const local of capturedLets) {
949
+ const slot = `%${mangleLocal(local.id)}`;
950
+ const fresh = B.tmp();
951
+ const old = B.tmp();
952
+ B.line(`${fresh} = ${boxNewCall(emitter.shapeHost, local.type)} ; per-iteration ${local.name}`);
953
+ B.line(`${old} = load ptr, ptr ${slot}`);
954
+ const val = emitter.boxGet(old, local.type);
955
+ emitter.boxSet(fresh, local.type, val);
956
+ emitter.declare(`declare void @scr_box_release(ptr)`);
957
+ B.line(`call void @scr_box_release(ptr ${old})`);
958
+ B.line(`store ptr ${fresh}, ptr ${slot}`);
959
+ }
960
+ };
961
+ const workerBudget = emitter.workerLoopBudget(s);
962
+ freshenBindings();
963
+ emitter.emitLoopCopies(s, capturedLets.length === 0, le, (exit) => {
964
+ const lc = B.newLabel("loop.c");
965
+ const lb = B.newLabel("loop.b");
966
+ const lu = s.update || capturedLets.length > 0 || workerBudget !== null ? B.newLabel("loop.u") : lc;
967
+ B.br(lc);
968
+ B.startBlock(lc);
969
+ if (integerLoop && integerSlot) {
970
+ const receiver = emitter.emitStableReceiver(integerLoop.limitReceiver, []);
971
+ const lenPtr = B.tmp();
972
+ const len = B.tmp();
973
+ const index = B.tmp();
974
+ const inBounds = B.tmp();
975
+ B.line(`${lenPtr} = getelementptr inbounds %${integerArrayLoop ? "ScrArr" : "ScrBytes"}, ptr ${receiver.name}, i64 0, i32 1`);
976
+ B.line(`${index} = load ${emitter.sizeType}, ptr ${integerSlot}`);
977
+ if (integerArrayLoop) {
978
+ // The counter starts at most 2^32 - 1 and steps only while it is
979
+ // below the length, so it fits the i32 length field: compare in
980
+ // 32 bits, which lets the compare read the field directly.
981
+ emitter.markMemoryPointer(lenPtr, "array:header");
982
+ B.line(`${len} = load i32, ptr ${lenPtr}${emitter.fieldAliasAttachment(lenPtr)}`);
983
+ let narrow = index;
984
+ if (emitter.sizeType === "i64") {
985
+ narrow = B.tmp();
986
+ B.line(`${narrow} = trunc i64 ${index} to i32`);
987
+ }
988
+ B.line(`${inBounds} = icmp ult i32 ${narrow}, ${len}`);
989
+ }
990
+ else {
991
+ emitter.markMemoryPointer(lenPtr, "bytes:header");
992
+ B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${emitter.fieldAliasAttachment(lenPtr)}`);
993
+ B.line(`${inBounds} = icmp ult ${emitter.sizeType} ${index}, ${len}`);
994
+ }
995
+ B.condBr(inBounds, lb, exit);
996
+ }
997
+ else if (countedLoop && integerSlot && countedLimit) {
998
+ const index = B.tmp();
999
+ const inBounds = B.tmp();
1000
+ B.line(`${index} = load i64, ptr ${integerSlot}`);
1001
+ B.line(`${inBounds} = icmp ${countedLoop.step > 0 ? "slt" : "sgt"} i64 ${index}, ${countedLimit}`);
1002
+ B.condBr(inBounds, lb, exit);
1003
+ }
1004
+ else if (s.cond)
1005
+ B.condBr(emitter.emitCondition(s.cond), lb, exit);
1006
+ else
1007
+ B.br(lb);
1008
+ B.startBlock(lb);
1009
+ emitter.jumpTargets.push({
1010
+ kind: "loop",
1011
+ brkLabel: exit,
1012
+ contLabel: lu,
1013
+ labels: s.labels,
1014
+ frameDepth: emitter.frames.length,
1015
+ scopeDepth: emitter.scopes.length,
1016
+ finallyDepth: emitter.finallyStack.length,
1017
+ });
1018
+ emitter.emitBlock(s.body);
1019
+ emitter.jumpTargets.pop();
1020
+ B.br(lu);
1021
+ if (lu !== lc) {
1022
+ B.startBlock(lu);
1023
+ emitter.emitWorkerLoopCheck(workerBudget);
1024
+ freshenBindings();
1025
+ if (integerLoop && integerSlot) {
1026
+ const old = B.tmp();
1027
+ const next = B.tmp();
1028
+ B.line(`${old} = load ${emitter.sizeType}, ptr ${integerSlot}`);
1029
+ B.line(`${next} = add nuw ${emitter.sizeType} ${old}, 1`);
1030
+ B.line(`store ${emitter.sizeType} ${next}, ptr ${integerSlot}`);
1031
+ }
1032
+ else if (countedLoop && integerSlot) {
1033
+ const old = B.tmp();
1034
+ const next = B.tmp();
1035
+ B.line(`${old} = load i64, ptr ${integerSlot}`);
1036
+ B.line(`${next} = add nsw i64 ${old}, ${countedLoop.step}`);
1037
+ B.line(`store i64 ${next}, ptr ${integerSlot}`);
1038
+ }
1039
+ else if (s.update)
1040
+ emitter.emitStmt(s.update);
1041
+ B.br(lc);
1042
+ }
1043
+ });
1044
+ B.startBlock(le);
1045
+ emitter.releaseScope(emitter.scopes.pop());
1046
+ if (integerLoop)
1047
+ emitter.integerLoopBindings.delete(integerLoop.localId);
1048
+ if (countedLoop)
1049
+ emitter.integerLoopBindings.delete(countedLoop.localId);
1050
+ if (integerArrayLoop)
1051
+ emitter.integerArrayBindings.delete(integerArrayLoop.localId);
1052
+ if (countedJoin) {
1053
+ B.br(countedJoin);
1054
+ B.startBlock(countedJoin);
1055
+ }
1056
+ break;
1057
+ }
1058
+ case "forOf": {
1059
+ // Ascending index loop; the length is re-read every iteration
1060
+ // (JS-exact — pushes inside the body extend the iteration). The
1061
+ // iterable temp lives in this statement's frame, so it is released
1062
+ // when the whole loop ends (and by `return`'s frame sweep).
1063
+ if (s.iterable.type.kind !== "array")
1064
+ throw new LlvmUnsupportedError(`forOf:${s.iterable.type.kind}`, s.loc);
1065
+ const elem = s.iterable.type.elem;
1066
+ const stored = s.iterable.kind === "varRef" ? emitter.storedSplits.get(s.iterable.localId) : undefined;
1067
+ const direct = emitter.streamingSplitsEnabled ? stringSplit(s.iterable) : null;
1068
+ const snapshot = stored
1069
+ ? loadSplitSnapshot(emitter, stored)
1070
+ : direct
1071
+ ? emitSplitSnapshot(emitter, direct)
1072
+ : null;
1073
+ const arr = snapshot ? null : emitter.emitExpr(s.iterable);
1074
+ const cursor = snapshot ? emitSplitCursor(emitter, snapshot) : null;
1075
+ const scratch = snapshot ? emitSplitScratch(emitter) : null;
1076
+ const deferred = snapshot && canDeferSplitPiece(s, emitter.currentLocals.get(s.localId));
1077
+ const spanLength = deferred ? B.slot() : null;
1078
+ if (spanLength)
1079
+ B.entryAllocas.push(`${spanLength} = alloca ${emitter.sizeType}`);
1080
+ const idxSlot = snapshot ? null : B.slot();
1081
+ if (idxSlot) {
1082
+ B.entryAllocas.push(`${idxSlot} = alloca double`);
1083
+ B.line(`store double ${f64Lit(0)}, ptr ${idxSlot}`);
1084
+ }
1085
+ const lc = B.newLabel("fof.c");
1086
+ const lb = B.newLabel("fof.b");
1087
+ const lu = B.newLabel("fof.u");
1088
+ const le = B.newLabel("fof.e");
1089
+ const workerBudget = emitter.workerLoopBudget(s);
1090
+ B.br(lc);
1091
+ B.startBlock(lc);
1092
+ const inBounds = B.tmp();
1093
+ let cur;
1094
+ if (snapshot && cursor && scratch) {
1095
+ cur = spanLength
1096
+ ? emitSplitSpanNext(emitter, snapshot, cursor, spanLength)
1097
+ : emitSplitNext(emitter, snapshot, cursor, scratch);
1098
+ B.line(`${inBounds} = icmp ne ptr ${cur}, null`);
1099
+ }
1100
+ else {
1101
+ const i = B.tmp(), lenPtr = B.tmp(), rawLen = B.tmp(), len = B.tmp();
1102
+ B.line(`${i} = load double, ptr ${idxSlot}`);
1103
+ // The inline form of scr_arr_len, like the `length` intrinsic.
1104
+ B.line(`${lenPtr} = getelementptr inbounds %ScrArr, ptr ${arr.name}, i32 0, i32 1`);
1105
+ emitter.markMemoryPointer(lenPtr, "array:header");
1106
+ loadArrCount(emitter, rawLen, lenPtr, emitter.fieldAliasAttachment(lenPtr));
1107
+ B.line(`${len} = ${sizeToDouble(emitter.sizeType)} ${emitter.sizeType} ${rawLen} to double`);
1108
+ B.line(`${inBounds} = fcmp olt double ${i}, ${len}`);
1109
+ cur = i;
1110
+ }
1111
+ B.condBr(inBounds, lb, le);
1112
+ B.startBlock(lb);
1113
+ emitter.jumpTargets.push({
1114
+ kind: "loop",
1115
+ brkLabel: le,
1116
+ contLabel: lu,
1117
+ labels: s.labels,
1118
+ frameDepth: emitter.frames.length,
1119
+ scopeDepth: emitter.scopes.length,
1120
+ finallyDepth: emitter.finallyStack.length,
1121
+ });
1122
+ // The loop variable is a fresh const per iteration: its scope opens
1123
+ // here, holds the (for ref elements: owned +1) current element, and
1124
+ // releases it at the end of each iteration.
1125
+ emitter.scopes.push([]);
1126
+ const localInfo = emitter.currentLocals.get(s.localId);
1127
+ const slot = `%${mangleLocal(s.localId)}`;
1128
+ const borrowedElement = !snapshot && emitter.loopArrayBorrows.has(s);
1129
+ if (!snapshot) {
1130
+ const acc = elemAccess(elem);
1131
+ const getter = borrowedElement ? "scr_arr_borrow_ref" : `scr_arr_get_${acc}`;
1132
+ cur = emitDenseArrayGet(emitter, arr.name, { name: cur, type: { kind: "f64" } }, undefined, acc, elem, getter, !borrowedElement);
1133
+ }
1134
+ if (spanLength) {
1135
+ const length = B.tmp();
1136
+ B.line(`${length} = load ${emitter.sizeType}, ptr ${spanLength}`);
1137
+ emitter.splitSpans.set(s.localId, { bytes: cur, length, scratch: scratch });
1138
+ cur = "null";
1139
+ }
1140
+ if (localInfo?.boxed) {
1141
+ // Captured loop variable: a fresh box per iteration, matching the
1142
+ // fresh const binding. The box takes ownership of a ref element's
1143
+ // +1 and is released with the iteration's scope.
1144
+ const box = B.tmp();
1145
+ B.line(`${box} = ${boxNewCall(emitter.shapeHost, elem)} ; per-iteration ${localInfo.name}`);
1146
+ emitter.boxSet(box, elem, cur);
1147
+ B.line(`store ptr ${box}, ptr ${slot}`);
1148
+ emitter.scopes[emitter.scopes.length - 1].push({ slot, type: elem, boxed: true });
1149
+ }
1150
+ else {
1151
+ B.line(`store ${emitter.llType(elem)} ${cur}, ptr ${slot}`);
1152
+ if (isRefCounted(elem) && !borrowedElement)
1153
+ emitter.scopes[emitter.scopes.length - 1].push({ slot, type: elem });
1154
+ }
1155
+ emitter.emitStmts(s.body);
1156
+ if (spanLength)
1157
+ emitter.splitSpans.delete(s.localId);
1158
+ const endedWithJump = endsWithJump(s.body);
1159
+ const scope = emitter.scopes.pop();
1160
+ if (!endedWithJump)
1161
+ emitter.releaseScope(scope);
1162
+ emitter.jumpTargets.pop();
1163
+ B.br(lu);
1164
+ B.startBlock(lu);
1165
+ emitter.emitWorkerLoopCheck(workerBudget);
1166
+ if (idxSlot) {
1167
+ const i2 = B.tmp(), i3 = B.tmp();
1168
+ B.line(`${i2} = load double, ptr ${idxSlot}`);
1169
+ B.line(`${i3} = fadd double ${i2}, ${f64Lit(1)}`);
1170
+ B.line(`store double ${i3}, ptr ${idxSlot}`);
1171
+ }
1172
+ B.br(lc);
1173
+ B.startBlock(le);
1174
+ break;
1175
+ }
1176
+ case "switch":
1177
+ emitter.emitSwitch(s);
1178
+ break;
1179
+ case "break": {
1180
+ // Unlabeled: the innermost loop OR switch (labeled blocks are
1181
+ // skipped); labeled: the entry carrying the label.
1182
+ let target;
1183
+ for (let i = emitter.jumpTargets.length - 1; i >= 0; i--) {
1184
+ const t = emitter.jumpTargets[i];
1185
+ if (s.label !== undefined ? t.labels?.includes(s.label) : t.kind !== "block") {
1186
+ target = t;
1187
+ break;
1188
+ }
1189
+ }
1190
+ if (!target)
1191
+ throw new InternalCompilerError("llvm emitter bug: break target not found");
1192
+ emitter.emitFinallysForJump(target.finallyDepth, target.frameDepth, target.scopeDepth);
1193
+ if (!B.isTerminated())
1194
+ B.terminate(`br label %${target.brkLabel}`);
1195
+ break;
1196
+ }
1197
+ case "continue": {
1198
+ // Unlabeled: the innermost loop; labeled: the loop carrying the
1199
+ // label (tsc + the validator guarantee it IS a loop).
1200
+ let target;
1201
+ for (let i = emitter.jumpTargets.length - 1; i >= 0; i--) {
1202
+ const t = emitter.jumpTargets[i];
1203
+ if (t.kind === "loop" && (s.label === undefined || t.labels?.includes(s.label))) {
1204
+ target = t;
1205
+ break;
1206
+ }
1207
+ }
1208
+ if (!target || target.contLabel === null)
1209
+ throw new InternalCompilerError("llvm emitter bug: continue target not found");
1210
+ emitter.emitFinallysForJump(target.finallyDepth, target.frameDepth, target.scopeDepth);
1211
+ if (!B.isTerminated())
1212
+ B.terminate(`br label %${target.contLabel}`);
1213
+ break;
1214
+ }
1215
+ case "return": {
1216
+ // The value computes FIRST (an SSA temp — finally mutations of
1217
+ // returned locals cannot change it, Node-exact), then every
1218
+ // crossed finally runs innermost-first with the frames/scopes/
1219
+ // tryStack it sees truncated to its region (its releases already
1220
+ // ran; a throw inside a copy propagates OUT of the completing
1221
+ // try, past its own catch), then the function-level releases and
1222
+ // the actual ret. The parked value owns a synthetic slot-backed
1223
+ // scope entry during each copy so a throwing finally releases it.
1224
+ const adopted = emitter.finallyStack.length > 0 || emitter.tryStack.length > 0
1225
+ ? adoptingAwaitOf(s.value)
1226
+ : null;
1227
+ if (adopted !== null) {
1228
+ emitter.emitAdoptingReturn(s, adopted);
1229
+ break;
1230
+ }
1231
+ let v = null;
1232
+ const moved = emitter.finallyStack.length === 0 && !emitter.currentUnionResult
1233
+ ? emitter.movableReturn(s.value)
1234
+ : null;
1235
+ if (s.value !== null && emitter.currentUnionResult) {
1236
+ // The tag and payload bits leave in registers; a heap box the
1237
+ // value needed is released with its frame below.
1238
+ const box = emitter.emitUnionProjection(s.value);
1239
+ v = { name: emitter.scalarUnionPair(box.name, s.value.type), type: s.value.type };
1240
+ }
1241
+ else if (moved !== null) {
1242
+ // Returning an owned local hands its reference to the caller: no
1243
+ // retain now and no release of the local below.
1244
+ const t = B.tmp();
1245
+ B.line(`${t} = load ptr, ptr ${moved.entry.slot}`);
1246
+ v = { name: t, type: s.value.type };
1247
+ moved.scope.splice(moved.scope.indexOf(moved.entry), 1);
1248
+ emitter.releaseForJump(0, 0);
1249
+ moved.scope.splice(moved.index, 0, moved.entry);
1250
+ }
1251
+ else if (s.value !== null && emitter.currentBorrowedReturn) {
1252
+ // A borrowed-return body hands back its walk without a reference
1253
+ // (it has no try statements, so no finally can intervene). An
1254
+ // optional element read lends the element its array keeps alive.
1255
+ const read = emitter.optionalArrayReads.get(s.value);
1256
+ if (read) {
1257
+ const slot = B.slot();
1258
+ B.entryAllocas.push(`${slot} = alloca ptr`);
1259
+ emitLocalArrayRead(emitter, { ...read, borrow: true }, slot);
1260
+ const t = B.tmp();
1261
+ B.line(`${t} = load ptr, ptr ${slot}`);
1262
+ v = { name: t, type: s.value.type };
1263
+ }
1264
+ else
1265
+ v = emitter.emitReadReceiver(s.value);
1266
+ }
1267
+ else if (s.value !== null) {
1268
+ v = emitter.emitExpr(s.value);
1269
+ if (emitter.currentCoro !== null)
1270
+ emitter.toHeap(v);
1271
+ else
1272
+ emitter.toFrame(v);
1273
+ }
1274
+ // An async generator's `return v` awaits v before any crossed
1275
+ // finally runs. Past finally regions that turn is taken here and
1276
+ // the request settles at completion; otherwise the completion's
1277
+ // own turn is the await (nothing runs in between).
1278
+ const genSettles = emitter.currentAsyncGenerator && (s.awaited === true || emitter.finallyStack.length > 0);
1279
+ // A completion turn that awaits x replaces a return() request's
1280
+ // already-taken await.
1281
+ if (emitter.currentAsyncGenerator && !genSettles) {
1282
+ emitter.declare(`declare void @scr_async_gen_return_awaits()`);
1283
+ B.line(`call void @scr_async_gen_return_awaits()`);
1284
+ }
1285
+ if (emitter.currentAsyncGenerator && s.awaited !== true && emitter.finallyStack.length > 0) {
1286
+ if (emitter.wasi)
1287
+ emitter.emitWasiSuspend(null);
1288
+ else {
1289
+ emitter.declare(`declare void @scr_await_hop()`);
1290
+ B.line(`call void @scr_await_hop()`);
1291
+ }
1292
+ }
1293
+ if (emitter.finallyStack.length > 0) {
1294
+ let pretSlot = null;
1295
+ if (v !== null && isRefCounted(v.type) && !emitter.currentUnionResult) {
1296
+ pretSlot = B.slot();
1297
+ B.entryAllocas.push(`${pretSlot} = alloca ptr ; pending return (through finally)`);
1298
+ B.line(`store ptr ${v.name}, ptr ${pretSlot}`);
1299
+ }
1300
+ const savedFrames = emitter.frames;
1301
+ const savedScopes = emitter.scopes;
1302
+ const savedFinally = emitter.finallyStack;
1303
+ const savedTry = emitter.tryStack;
1304
+ for (let i = savedFinally.length - 1; i >= 0 && !B.isTerminated(); i--) {
1305
+ const fin = savedFinally[i];
1306
+ emitter.releaseForJump(fin.frameDepth, fin.scopeDepth);
1307
+ emitter.frames = emitter.frames.slice(0, fin.frameDepth);
1308
+ emitter.scopes = emitter.scopes.slice(0, fin.scopeDepth);
1309
+ emitter.finallyStack = savedFinally.slice(0, i);
1310
+ emitter.tryStack = savedTry.slice(0, fin.tryDepth);
1311
+ if (pretSlot !== null)
1312
+ emitter.scopes.push([{ slot: pretSlot, type: v.type }]);
1313
+ emitter.emitBlock(fin.body);
1314
+ if (pretSlot !== null)
1315
+ emitter.scopes.pop();
1316
+ }
1317
+ if (!B.isTerminated())
1318
+ emitter.releaseForJump(0, 0);
1319
+ emitter.frames = savedFrames;
1320
+ emitter.scopes = savedScopes;
1321
+ emitter.finallyStack = savedFinally;
1322
+ emitter.tryStack = savedTry;
1323
+ }
1324
+ else if (moved === null) {
1325
+ emitter.releaseForJump(0, 0);
1326
+ }
1327
+ if (!B.isTerminated()) {
1328
+ if (genSettles)
1329
+ emitter.emitAsyncGenSettled();
1330
+ if (emitter.currentCoro !== null) {
1331
+ emitter.emitWasiFulfill(v);
1332
+ B.terminate(`br label %${emitter.currentCoro.finalLabel}`);
1333
+ }
1334
+ else if (v === null)
1335
+ B.terminate("ret void");
1336
+ else if (emitter.currentInt32Result)
1337
+ B.terminate(`ret i32 ${emitter.int32Argument(v, s.value)}`);
1338
+ else if (emitter.currentUnionResult)
1339
+ B.terminate(`ret ${SCALAR_UNION_RESULT} ${v.name}`);
1340
+ else
1341
+ B.terminate(`ret ${emitter.llType(s.value.type)} ${v.name}`);
1342
+ }
1343
+ break;
1344
+ }
1345
+ case "throw": {
1346
+ // Evaluate, move ownership into the runtime's exception cell, then
1347
+ // unwind unconditionally (the innermost try handler, or out of the
1348
+ // function) — the same release path as return/break/continue.
1349
+ const v = emitter.emitExpr(s.value);
1350
+ if (isRefCounted(s.value.type))
1351
+ emitter.toHeap(v); // the cell takes ownership
1352
+ emitter.emitThrowValue({ name: v.name, type: s.value.type });
1353
+ emitter.emitUnwind();
1354
+ break;
1355
+ }
1356
+ case "rethrow": {
1357
+ // Re-raise the saved snapshot (payload retained — the binding
1358
+ // local releases with its scope) and unwind like `throw`.
1359
+ const c = emitter.emitExpr({ kind: "varRef", localId: s.localId, type: CAUGHT, loc: s.loc });
1360
+ emitter.declare(`declare void @scr_rethrow(ptr)`);
1361
+ B.line(`call void @scr_rethrow(ptr ${c.name})`);
1362
+ emitter.emitUnwind();
1363
+ break;
1364
+ }
1365
+ case "runtimeFence": {
1366
+ // The deferred JS compile fence: throw a catchable Error naming
1367
+ // the construct (message) with the SC code stamped on `code`,
1368
+ // then unwind exactly like `throw`. SCR_ERR_ERROR = 0.
1369
+ const bytes = Buffer.byteLength(s.message, "utf8");
1370
+ emitter.declare(`declare void @scr_throw_error_msg_code(i32, ptr, ${emitter.sizeType}, ptr)`);
1371
+ B.line(`call void @scr_throw_error_msg_code(i32 0, ptr ${emitter.cstr(s.message)}, ${emitter.sizeType} ${bytes}, ptr ${emitter.cstr(s.code)})`);
1372
+ emitter.emitUnwind();
1373
+ break;
1374
+ }
1375
+ case "tryCatch":
1376
+ emitter.emitTryCatch(s);
1377
+ break;
1378
+ default: {
1379
+ // Statement coverage is now total (bytesSet closed the set) —
1380
+ // keep throwing LlvmUnsupportedError for any future IR statement kind.
1381
+ const rest = s;
1382
+ const k = rest.kind;
1383
+ throw new LlvmUnsupportedError(`stmt:${k}`, rest.loc);
1384
+ }
1385
+ }
1386
+ const frame = emitter.frames.pop();
1387
+ // return/throw already released their frames on the jump path; the
1388
+ // fall-through releases after them would be dead double-release code.
1389
+ if (s.kind !== "return" &&
1390
+ s.kind !== "throw" &&
1391
+ s.kind !== "rethrow" &&
1392
+ s.kind !== "runtimeFence") {
1393
+ emitter.releaseTemps(frame);
1394
+ }
1395
+ }
1396
+ /** try/catch/finally via pending-flag unwinding — stmts.ts's
1397
+ * emitTryCatch, block-flavored. Entering a try emits NO code: the try
1398
+ * context is compile-time state (tryStack) redirecting unwinds inside
1399
+ * the region to a label here. Shape:
1400
+ *
1401
+ * { try body } unwinds inside release frames/scopes down to
1402
+ * this statement's depths, then br the handler
1403
+ * br after (normal completion skips the handler)
1404
+ * try.c: (emitted only when some unwind targets it)
1405
+ * binding = scr_exc_take() (or scr_exc_clear() when bindingless)
1406
+ * { catch body }
1407
+ * after: { finally body } normal path
1408
+ * br try.e
1409
+ * try.fx: exception path: the pending exception is
1410
+ * stash = scr_exc_take() STASHED across the finally body so the
1411
+ * { finally body } body's own pending checks answer for
1412
+ * scr_rethrow(stash) themselves; a throw inside REPLACES the
1413
+ * <unwind> stash (it unwinds through the synthetic
1414
+ * try.e: scope entry) — JS's semantics exactly
1415
+ *
1416
+ * Abrupt completions inside tryBody/catchBody ride the finallyStack:
1417
+ * returns inline copies at the return site, while break/continue use the
1418
+ * shared region walk before branching to their resolved target. */
1419
+ export function emitTryCatch(emitter, s) {
1420
+ const B = emitter.B;
1421
+ const hasCatch = s.catchBody !== null;
1422
+ const hasFinally = s.finallyBody !== null;
1423
+ const catchLabel = B.newLabel("try.c");
1424
+ const finExcLabel = B.newLabel("try.fx");
1425
+ const endLabel = B.newLabel("try.e");
1426
+ const afterTryLabel = hasFinally ? B.newLabel("try.f") : endLabel;
1427
+ const handler = {
1428
+ label: hasCatch ? catchLabel : finExcLabel,
1429
+ used: false,
1430
+ frameDepth: emitter.frames.length,
1431
+ scopeDepth: emitter.scopes.length,
1432
+ };
1433
+ if (hasFinally) {
1434
+ emitter.finallyStack.push({
1435
+ frameDepth: emitter.frames.length,
1436
+ scopeDepth: emitter.scopes.length,
1437
+ tryDepth: emitter.tryStack.length,
1438
+ body: s.finallyBody,
1439
+ });
1440
+ }
1441
+ emitter.tryStack.push(handler);
1442
+ emitter.emitBlock(s.tryBody);
1443
+ emitter.tryStack.pop();
1444
+ B.br(afterTryLabel); // no-op when the try body already terminated
1445
+ // Exceptions raised in the CATCH body unwind to the exception-path
1446
+ // finally (pending stays set through it) when one exists.
1447
+ const excHandler = {
1448
+ label: finExcLabel,
1449
+ used: !hasCatch && handler.used,
1450
+ frameDepth: emitter.frames.length,
1451
+ scopeDepth: emitter.scopes.length,
1452
+ };
1453
+ if (hasCatch && handler.used) {
1454
+ B.startBlock(catchLabel);
1455
+ if (hasFinally)
1456
+ emitter.tryStack.push(excHandler);
1457
+ if (emitter.currentGenerator !== null) {
1458
+ // Generator bodies: a pending GENRET sentinel (.return(v)
1459
+ // injected at a yield) is a RETURN completion, not a throw —
1460
+ // catch must not take it. Re-unwind past this handler (finally
1461
+ // still runs — the unwind targets the exception-path finally or
1462
+ // the enclosing context; the depths here equal the handler's).
1463
+ emitter.declare(`declare zeroext i1 @scr_exc_genret_pending()`);
1464
+ const gr = B.tmp();
1465
+ B.line(`${gr} = call zeroext i1 @scr_exc_genret_pending()`);
1466
+ const lg = B.newLabel("try.gr");
1467
+ const lk = B.newLabel("try.gk");
1468
+ B.condBr(gr, lg, lk);
1469
+ B.startBlock(lg);
1470
+ emitter.emitUnwind();
1471
+ B.startBlock(lk);
1472
+ }
1473
+ if (s.catchLocalId !== null) {
1474
+ // catch (e): the exception MOVES into the binding's snapshot box,
1475
+ // owned by the catch body's scope (released on every exit —
1476
+ // normal fall-through, jumps out, and unwinds from the body).
1477
+ const slot = `%${mangleLocal(s.catchLocalId)}`;
1478
+ emitter.declare(`declare ptr @scr_exc_take()`);
1479
+ emitter.emitBlock(s.catchBody, (scope) => {
1480
+ const c = B.tmp();
1481
+ B.line(`${c} = call ptr @scr_exc_take() ; catch binding`);
1482
+ if (emitter.currentLocals.get(s.catchLocalId)?.boxed) {
1483
+ const box = B.tmp();
1484
+ B.line(`${box} = ${boxNewCall(emitter.shapeHost, CAUGHT)} ; captured exception`);
1485
+ emitter.boxSet(box, CAUGHT, c);
1486
+ B.line(`store ptr ${box}, ptr ${slot}`);
1487
+ scope.push({ slot, type: CAUGHT, boxed: true });
1488
+ }
1489
+ else {
1490
+ B.line(`store ptr ${c}, ptr ${slot}`);
1491
+ scope.push({ slot, type: CAUGHT });
1492
+ }
1493
+ });
1494
+ }
1495
+ else {
1496
+ emitter.declare(`declare void @scr_exc_clear()`);
1497
+ B.line(`call void @scr_exc_clear() ; catch takes the exception`);
1498
+ emitter.emitBlock(s.catchBody);
1499
+ }
1500
+ if (hasFinally)
1501
+ emitter.tryStack.pop();
1502
+ B.br(afterTryLabel); // the catch's normal completion
1503
+ }
1504
+ if (hasFinally)
1505
+ emitter.finallyStack.pop();
1506
+ if (hasFinally) {
1507
+ B.startBlock(afterTryLabel);
1508
+ emitter.emitBlock(s.finallyBody); // normal path
1509
+ B.br(endLabel);
1510
+ if (excHandler.used) {
1511
+ // The pending exception is STASHED across the finally body (a
1512
+ // ScrCaught snapshot, re-raised after) so the body runs with a
1513
+ // CLEAN cell — see stmts.ts's exception-path copy. The
1514
+ // stash rides an alloca slot so a throw inside the body unwinds
1515
+ // through the synthetic scope entry (replace semantics).
1516
+ B.startBlock(finExcLabel);
1517
+ emitter.declare(`declare ptr @scr_exc_take()`);
1518
+ emitter.declare(`declare void @scr_rethrow(ptr)`);
1519
+ emitter.declare(`declare void @scr_caught_release(ptr)`);
1520
+ const stash = B.tmp();
1521
+ const stashSlot = B.slot();
1522
+ B.entryAllocas.push(`${stashSlot} = alloca ptr ; finally exception stash`);
1523
+ B.line(`${stash} = call ptr @scr_exc_take() ; stash across finally`);
1524
+ B.line(`store ptr ${stash}, ptr ${stashSlot}`);
1525
+ emitter.scopes.push([{ slot: stashSlot, type: CAUGHT }]);
1526
+ const suppressHandler = s.suppressFinallyErrors || s.dropFinallyErrors
1527
+ ? {
1528
+ label: B.newLabel("try.fs"),
1529
+ used: false,
1530
+ frameDepth: emitter.frames.length,
1531
+ scopeDepth: emitter.scopes.length,
1532
+ }
1533
+ : null;
1534
+ if (suppressHandler)
1535
+ emitter.tryStack.push(suppressHandler);
1536
+ emitter.emitBlock(s.finallyBody);
1537
+ if (suppressHandler)
1538
+ emitter.tryStack.pop();
1539
+ emitter.scopes.pop(); // normal completion keeps the stash for the re-raise
1540
+ B.line(`call void @scr_rethrow(ptr ${stash})`);
1541
+ B.line(`call void @scr_caught_release(ptr ${stash})`);
1542
+ emitter.emitUnwind();
1543
+ if (suppressHandler?.used) {
1544
+ B.startBlock(suppressHandler.label);
1545
+ const cleanup = s.dropFinallyErrors ? "scr_exc_keep_first" : "scr_exc_suppress";
1546
+ emitter.declare(`declare void @${cleanup}(ptr)`);
1547
+ B.line(`call void @${cleanup}(ptr ${stash}) ; consumes stash`);
1548
+ emitter.emitUnwind();
1549
+ }
1550
+ }
1551
+ B.startBlock(endLabel);
1552
+ }
1553
+ else {
1554
+ B.startBlock(endLabel);
1555
+ }
1556
+ }
1557
+ /** JS-exact switch: lazily evaluated, arbitrary-expression case tests in
1558
+ * source order, bodies falling through in source order until a break —
1559
+ * Literal-only tests can use native dispatch; other tests keep a chain
1560
+ * of conditional branches. All case bodies
1561
+ * share ONE scope; because dispatch can jump PAST a varDecl into a later
1562
+ * case, refcounted/boxed case-body locals are NULL-reset up front and
1563
+ * the scope-exit releases rely on NULL tolerance. */
1564
+ export function emitSwitch(emitter, s) {
1565
+ const unitSwitch = charAtUnitSwitch(s);
1566
+ if (unitSwitch !== null)
1567
+ return emitSwitch(emitter, unitSwitch);
1568
+ const B = emitter.B;
1569
+ const discKind = s.disc.type.kind;
1570
+ if (discKind !== "f64" && discKind !== "string" && discKind !== "bool") {
1571
+ throw new LlvmUnsupportedError(`switch:${discKind}`, s.loc);
1572
+ }
1573
+ // The disc temp lives in the whole statement's frame: for a string
1574
+ // discriminant it stays alive across every test and body, released
1575
+ // when the switch statement ends (break lands past this statement's
1576
+ // frame release — releaseForJump keeps the target's own frame).
1577
+ const disc = emitter.emitExpr(s.disc);
1578
+ for (const c of s.cases) {
1579
+ for (const stmt of c.body) {
1580
+ if (stmt.kind !== "varDecl")
1581
+ continue;
1582
+ const local = emitter.currentLocals.get(stmt.localId);
1583
+ if (local.boxed || isRefCounted(local.type)) {
1584
+ B.line(`store ptr null, ptr %${mangleLocal(local.id)} ; case-scoped ${local.name}`);
1585
+ }
1586
+ }
1587
+ }
1588
+ const end = B.newLabel("sw.e");
1589
+ const caseLabels = s.cases.map(() => B.newLabel("sw.c"));
1590
+ const defaultIdx = s.cases.findIndex((c) => c.test === null);
1591
+ const fallback = defaultIdx >= 0 ? caseLabels[defaultIdx] : end;
1592
+ const nullableString = nullableStringSwitch(emitter, s);
1593
+ if (nullableString !== null) {
1594
+ // `undefined` matches no string literal; any other value is the
1595
+ // string itself and dispatches as a string switch.
1596
+ const value = emitter.emitExpr(nullableString.value);
1597
+ const present = B.tmp();
1598
+ const dispatch = B.newLabel("sw.string");
1599
+ B.line(`${present} = icmp ne ptr ${value.name}, null`);
1600
+ B.condBr(present, dispatch, fallback);
1601
+ B.startBlock(dispatch);
1602
+ const text = { name: value.name, type: STRING };
1603
+ if (!emitLiteralSwitch(emitter, text, undefined, nullableString.cases, caseLabels, fallback)) {
1604
+ nullableString.cases.forEach((c, i) => {
1605
+ if (c.test?.kind !== "strLit")
1606
+ return;
1607
+ const hit = B.tmp();
1608
+ B.line(`${hit} = call zeroext i1 ${emitter.literalEquals(c.test.value)}(ptr ${value.name})`);
1609
+ const next = B.newLabel("sw.t");
1610
+ B.condBr(hit, caseLabels[i], next);
1611
+ B.startBlock(next);
1612
+ });
1613
+ B.br(fallback);
1614
+ }
1615
+ }
1616
+ else if (!emitLiteralSwitch(emitter, disc, s.disc, s.cases, caseLabels, fallback)) {
1617
+ s.cases.forEach((c, i) => {
1618
+ if (c.test === null)
1619
+ return;
1620
+ // Lazy source-order test evaluation (a test after the match never
1621
+ // runs). Each test's temps release right after its comparison.
1622
+ emitter.frames.push([]);
1623
+ const t = emitter.emitExpr(c.test);
1624
+ const hit = B.tmp();
1625
+ if (c.test.kind === "strLit") {
1626
+ B.line(`${hit} = call zeroext i1 ${emitter.literalEquals(c.test.value)}(ptr ${disc.name})`);
1627
+ }
1628
+ else if (c.test.type.kind === "string") {
1629
+ emitter.declare(`declare zeroext i1 @scr_str_eq(ptr, ptr)`);
1630
+ B.line(`${hit} = call zeroext i1 @sc_str_eq(ptr ${disc.name}, ptr ${t.name})`);
1631
+ }
1632
+ else if (c.test.type.kind === "bool") {
1633
+ B.line(`${hit} = icmp eq i1 ${disc.name}, ${t.name}`);
1634
+ }
1635
+ else {
1636
+ B.line(`${hit} = fcmp oeq double ${disc.name}, ${t.name}`);
1637
+ }
1638
+ emitter.releaseTemps(emitter.frames.pop());
1639
+ const next = B.newLabel("sw.t");
1640
+ B.condBr(hit, caseLabels[i], next);
1641
+ B.startBlock(next);
1642
+ });
1643
+ B.br(fallback);
1644
+ }
1645
+ emitter.jumpTargets.push({
1646
+ kind: "switch",
1647
+ brkLabel: end,
1648
+ contLabel: null,
1649
+ labels: s.labels,
1650
+ frameDepth: emitter.frames.length,
1651
+ scopeDepth: emitter.scopes.length,
1652
+ finallyDepth: emitter.finallyStack.length,
1653
+ });
1654
+ const scope = [];
1655
+ emitter.scopes.push(scope);
1656
+ s.cases.forEach((c, i) => {
1657
+ B.br(caseLabels[i]); // the previous body's natural fall-through
1658
+ B.startBlock(caseLabels[i]);
1659
+ emitter.emitStmts(c.body);
1660
+ });
1661
+ emitter.jumpTargets.pop();
1662
+ emitter.scopes.pop();
1663
+ // Natural fall-off of the last body releases the shared scope; a jump
1664
+ // already released it before jumping.
1665
+ const lastBody = s.cases[s.cases.length - 1]?.body;
1666
+ if (!lastBody || !endsWithJump(lastBody))
1667
+ emitter.releaseScope(scope);
1668
+ B.br(end);
1669
+ B.startBlock(end);
1670
+ }
1671
+ /** Emit a loop's condition, body and update through `emitCopy`, twice
1672
+ * when speculative-integers.ts plans a fast integer copy. Both copies
1673
+ * share the loop's setup and exit; the ordinary copy comes first so the
1674
+ * fast copy is only emitted when every resume point exists. */
1675
+ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
1676
+ const plan = allowed &&
1677
+ emitter.speculativeLoopsEnabled &&
1678
+ emitter.speculation === null &&
1679
+ emitter.speculationResume === null
1680
+ ? planSpeculativeLoop(loop, (id) => emitter.speculativeLocal(id), (id) => emitter.integerLoopBindings.has(id) || emitter.int32Locals.has(id), (e) => {
1681
+ const range = emitter.integerRanges.get(e);
1682
+ return (range !== undefined &&
1683
+ range !== null &&
1684
+ range.min >= -Number.MAX_SAFE_INTEGER &&
1685
+ range.max <= Number.MAX_SAFE_INTEGER);
1686
+ }, (id) => emitter.speculativeLocal(id) || emitter.speculativeInvariantGlobal(id))
1687
+ : null;
1688
+ if (!plan) {
1689
+ const proven = allowed ? planProvenLoop(emitter, loop) : null;
1690
+ if (proven)
1691
+ emitProvenLoop(emitter, proven, exit, emitCopy);
1692
+ else
1693
+ emitCopy(exit);
1694
+ return;
1695
+ }
1696
+ const B = emitter.B;
1697
+ const entries = new Map();
1698
+ let ok = "true";
1699
+ for (const [id, live] of plan.locals) {
1700
+ if (!live)
1701
+ continue;
1702
+ const value = B.tmp();
1703
+ B.line(`${value} = load double, ptr ${emitter.binding(id).slot}`);
1704
+ const [integer, exact] = emitSafeIntegerCheck(emitter, value);
1705
+ entries.set(id, integer);
1706
+ if (ok === "true")
1707
+ ok = exact;
1708
+ else {
1709
+ const both = B.tmp();
1710
+ B.line(`${both} = and i1 ${ok}, ${exact}`);
1711
+ ok = both;
1712
+ }
1713
+ }
1714
+ const fast = B.newLabel("spec.fast"), slow = B.newLabel("spec.slow");
1715
+ B.condBr(ok, fast, slow);
1716
+ const resume = new Map();
1717
+ for (const s of plan.writes)
1718
+ resume.set(s, { label: B.newLabel("spec.resume"), placed: false });
1719
+ B.startBlock(slow);
1720
+ emitter.speculationResume = resume;
1721
+ try {
1722
+ emitCopy(exit);
1723
+ }
1724
+ finally {
1725
+ emitter.speculationResume = null;
1726
+ }
1727
+ B.startBlock(fast);
1728
+ if (![...resume.values()].every((r) => r.placed)) {
1729
+ B.br(slow);
1730
+ return;
1731
+ }
1732
+ for (const id of plan.locals.keys()) {
1733
+ const shadow = B.slot();
1734
+ B.entryAllocas.push(`${shadow} = alloca i64 ; speculative integer ${emitter.currentLocals.get(id)?.name ?? id}`);
1735
+ const entry = entries.get(id);
1736
+ if (entry !== undefined) {
1737
+ // The same double, now visibly an integer conversion: the double
1738
+ // phis of the fast copy fold into integer phis.
1739
+ const exact = B.tmp();
1740
+ B.line(`store i64 ${entry}, ptr ${shadow}`);
1741
+ B.line(`${exact} = sitofp i64 ${entry} to double`);
1742
+ B.line(`store double ${exact}, ptr ${emitter.binding(id).slot}`);
1743
+ }
1744
+ else
1745
+ B.line(`store i64 0, ptr ${shadow}`);
1746
+ emitter.integerLoopBindings.set(id, {
1747
+ slot: shadow,
1748
+ type: "i64",
1749
+ signed: true,
1750
+ range: SPECULATIVE_RANGE,
1751
+ });
1752
+ }
1753
+ // A global's store stays in the loop (calls may read it). When nothing
1754
+ // in the loop can observe it, its double is written once on leaving the
1755
+ // copy instead, so the loop keeps it in a register as the double copy
1756
+ // would.
1757
+ const deferred = new Set();
1758
+ // Worker loops also leave through their cancellation poll.
1759
+ if (plan.observerFree && !emitter.mod.workers)
1760
+ for (const s of plan.writes) {
1761
+ const id = speculativeWriteTarget(s).localId;
1762
+ if (!emitter.currentLocals.has(id))
1763
+ deferred.add(id);
1764
+ }
1765
+ emitter.speculation = {
1766
+ writes: plan.writes,
1767
+ resume: new Map([...resume].map(([s, r]) => [s, r.label])),
1768
+ deferred,
1769
+ };
1770
+ 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
+ }
1780
+ }
1781
+ finally {
1782
+ emitter.speculation = null;
1783
+ for (const id of plan.locals.keys())
1784
+ emitter.integerLoopBindings.delete(id);
1785
+ }
1786
+ }
1787
+ /** A proven integer loop (speculative-integers.ts) for this loop, or null.
1788
+ * A shadowed local's double is stale until the loop is left, which only
1789
+ * the loop's exit, a return and an exception do: the loop is planned only
1790
+ * where an exception leaves the function (no enclosing try or finally, no
1791
+ * coroutine frame), so no handler reads the stale double. */
1792
+ function planProvenLoop(emitter, loop) {
1793
+ if (loop.kind !== "for" ||
1794
+ !emitter.speculativeLoopsEnabled ||
1795
+ emitter.speculation !== null ||
1796
+ emitter.speculationResume !== null ||
1797
+ emitter.tryStack.length > 0 ||
1798
+ emitter.finallyStack.length > 0 ||
1799
+ emitter.currentCoro !== null)
1800
+ return null;
1801
+ const cursors = emitter.integerLoopRanges.get(loop);
1802
+ if (!cursors)
1803
+ return null;
1804
+ return planProvenIntegerLoop(loop, cursors, (id) => emitter.currentLocals.has(id) && emitter.speculativeLocal(id), (id) => emitter.integerLoopBindings.has(id) || emitter.int32Locals.has(id), (e) => {
1805
+ const range = emitter.integerRanges.get(e);
1806
+ return (range !== undefined &&
1807
+ range !== null &&
1808
+ range.min >= -Number.MAX_SAFE_INTEGER &&
1809
+ range.max <= Number.MAX_SAFE_INTEGER);
1810
+ });
1811
+ }
1812
+ /** Emit a proven integer loop: its shadowed locals start from their
1813
+ * doubles (integers in their loop ranges on entry), its planned writes
1814
+ * compute integers into the shadows only, and leaving the loop through its
1815
+ * exit writes each double back. */
1816
+ function emitProvenLoop(emitter, plan, exit, emitCopy) {
1817
+ const B = emitter.B;
1818
+ for (const [id, range] of plan.locals) {
1819
+ const shadow = B.slot();
1820
+ B.entryAllocas.push(`${shadow} = alloca i64 ; integer ${emitter.currentLocals.get(id)?.name ?? id}`);
1821
+ const value = B.tmp(), integer = B.tmp();
1822
+ B.line(`${value} = load double, ptr ${emitter.binding(id).slot}`);
1823
+ B.line(`${integer} = fptosi double ${value} to i64`);
1824
+ B.line(`store i64 ${integer}, ptr ${shadow}`);
1825
+ emitter.integerLoopBindings.set(id, { slot: shadow, type: "i64", signed: true, range });
1826
+ }
1827
+ const deferred = new Set();
1828
+ for (const id of plan.locals.keys())
1829
+ deferred.add(id);
1830
+ emitter.speculation = { writes: plan.writes, resume: new Map(), deferred };
1831
+ try {
1832
+ const leave = B.newLabel("integer.leave");
1833
+ emitCopy(leave);
1834
+ B.startBlock(leave);
1835
+ emitter.writeBackDeferred(deferred);
1836
+ B.br(exit);
1837
+ }
1838
+ finally {
1839
+ emitter.speculation = null;
1840
+ for (const id of plan.locals.keys())
1841
+ emitter.integerLoopBindings.delete(id);
1842
+ }
1843
+ }
1844
+ /** A speculated write in the fast copy: compute the value as a safe
1845
+ * integer, store it to the shadow and its exact double to the local.
1846
+ * Any failed check re-executes the statement in the ordinary copy. A
1847
+ * proven integer loop's write (no `resume`) has nothing to check. */
1848
+ export function emitSpeculativeWrite(emitter, s, resume) {
1849
+ const B = emitter.B;
1850
+ const target = speculativeWriteTarget(s);
1851
+ const binding = emitter.integerLoopBindings.get(target.localId);
1852
+ const failed = B.newLabel("spec.bail");
1853
+ let bails = false;
1854
+ emitter.declare("declare i1 @llvm.expect.i1(i1, i1)");
1855
+ const bail = (condition) => {
1856
+ if (condition === "false" || resume === undefined)
1857
+ return;
1858
+ bails = true;
1859
+ const expected = B.tmp();
1860
+ B.line(`${expected} = call i1 @llvm.expect.i1(i1 ${condition}, i1 false)`);
1861
+ const next = B.newLabel("spec.ok");
1862
+ B.condBr(expected, failed, next);
1863
+ B.startBlock(next);
1864
+ };
1865
+ // Heap reads come first, before any check, and release their temporaries
1866
+ // at once: a bailing path then owns nothing, and reads have no effect
1867
+ // whose reordering before the arithmetic could be observed.
1868
+ const reads = new Map();
1869
+ if (target.value !== null) {
1870
+ emitter.frames.push([]);
1871
+ for (const read of speculativeReads(target.value))
1872
+ reads.set(read, emitter.emitExpr(read));
1873
+ emitter.releaseTemps(emitter.frames.pop());
1874
+ }
1875
+ emitter.frames.push([]);
1876
+ let result;
1877
+ if (target.value === null) {
1878
+ const old = B.tmp();
1879
+ result = B.tmp();
1880
+ B.line(`${old} = load i64, ptr ${binding.slot}`);
1881
+ B.line(`${result} = ${target.op === "+" ? "add" : "sub"} nsw i64 ${old}, 1`);
1882
+ const biased = B.tmp(), outside = B.tmp();
1883
+ B.line(`${biased} = add i64 ${result}, ${Number.MAX_SAFE_INTEGER}`);
1884
+ B.line(`${outside} = icmp ugt i64 ${biased}, ${2 * Number.MAX_SAFE_INTEGER}`);
1885
+ bail(outside);
1886
+ }
1887
+ else
1888
+ result = emitSpeculativeInteger(emitter, target.value, bail, reads, resume === undefined);
1889
+ // Speculable values read only numbers past this point.
1890
+ if (emitter.frames.pop().length > 0)
1891
+ throw new InternalCompilerError("llvm emitter bug: speculative write owns a temporary");
1892
+ B.line(`store i64 ${result}, ptr ${binding.slot}`);
1893
+ const deferred = emitter.speculation.deferred;
1894
+ if (!deferred.has(target.localId)) {
1895
+ const number = B.tmp();
1896
+ B.line(`${number} = sitofp i64 ${result} to double`);
1897
+ B.line(`store double ${number}, ptr ${emitter.binding(target.localId).slot}`);
1898
+ }
1899
+ if (!bails)
1900
+ return;
1901
+ const done = B.newLabel("spec.done");
1902
+ B.br(done);
1903
+ B.startBlock(failed);
1904
+ emitter.writeBackDeferred(deferred);
1905
+ B.br(resume);
1906
+ B.startBlock(done);
1907
+ }
1908
+ /**
1909
+ * Lower canonical `target = target + suffix` after evaluating the old
1910
+ * left side and suffix in JavaScript order. The snapshot stays owned by
1911
+ * the statement frame while the destination relinquishes its CURRENT
1912
+ * value, making the snapshot unique unless a real observable alias exists.
1913
+ */
1914
+ export function emitStringSelfConcatAssign(emitter, localId, left, suffix, retainForYield) {
1915
+ const moved = emitter.emitMovedSelfConcat(localId, left, suffix, retainForYield);
1916
+ if (moved)
1917
+ return moved;
1918
+ const snapshot = emitter.emitExpr(left);
1919
+ // A suffix of several parts, or a number, appends each operand to the
1920
+ // snapshot directly (in place once the binding lets go of it) instead
1921
+ // of first building the suffix as a separate string.
1922
+ const parts = stringParts(suffix);
1923
+ const mixed = parts.length > 1 || numberPart(parts[0]) !== null;
1924
+ const charCode = mixed ? null : emitter.emitSingleCharCode(suffix);
1925
+ const inputs = mixed ? emitConcatInputs(emitter, parts) : [];
1926
+ // The concat only reads the suffix; relinquishing the binding below
1927
+ // runs no code that could rebind a borrowed local.
1928
+ const right = mixed || charCode !== null ? null : emitStringInputs(emitter, [suffix])[0];
1929
+ const b = emitter.binding(localId);
1930
+ const B = emitter.B;
1931
+ if (b.kind === "boxed") {
1932
+ // set_ref(NULL) unlinks then releases the binding's post-suffix value.
1933
+ emitter.boxSet(emitter.loadBox(b.slot), b.type, "null");
1934
+ }
1935
+ else {
1936
+ const old = B.tmp();
1937
+ B.line(`${old} = load ptr, ptr ${b.slot}`);
1938
+ B.line(`store ptr null, ptr ${b.slot}`);
1939
+ if (b.kind === "global")
1940
+ emitter.releaseHeap(old, b.type);
1941
+ else
1942
+ emitter.releaseFrame(old, b.type);
1943
+ }
1944
+ let raw;
1945
+ if (charCode !== null) {
1946
+ // The snapshot moves into the consuming character append.
1947
+ emitter.toFrame(snapshot);
1948
+ emitter.declare(`declare ptr @scr_str_concat_move_char_code(ptr, double)`);
1949
+ raw = B.tmp();
1950
+ B.line(`${raw} = call ptr @scr_str_concat_move_char_code(ptr ${snapshot.name}, double ${charCode.name})`);
1951
+ }
1952
+ else if (right === null) {
1953
+ raw = emitMixedConcat(emitter, snapshot.name, inputs);
1954
+ }
1955
+ else {
1956
+ emitter.declare(`declare ptr @scr_str_concat(ptr, ptr)`);
1957
+ raw = B.tmp();
1958
+ B.line(`${raw} = call ptr @scr_str_concat(ptr ${snapshot.name}, ptr ${right.name})`);
1959
+ }
1960
+ const result = emitter.own({ name: raw, type: left.type });
1961
+ if (retainForYield) {
1962
+ const stored = b.kind === "local"
1963
+ ? emitter.retainFrame(result.name, result.type)
1964
+ : emitter.retainHeap(result.name, result.type);
1965
+ if (b.kind === "boxed")
1966
+ emitter.boxSet(emitter.loadBox(b.slot), b.type, stored);
1967
+ else
1968
+ B.line(`store ptr ${stored}, ptr ${b.slot}`);
1969
+ }
1970
+ else {
1971
+ if (b.kind === "local")
1972
+ emitter.toFrame(result);
1973
+ else
1974
+ emitter.toHeap(result);
1975
+ if (b.kind === "boxed")
1976
+ emitter.boxSet(emitter.loadBox(b.slot), b.type, result.name);
1977
+ else
1978
+ B.line(`store ptr ${result.name}, ptr ${b.slot}`);
1979
+ }
1980
+ return result;
1981
+ }
1982
+ /** `switch (x)` on a `string | undefined` value whose case tests are all
1983
+ * string literals: the frontend's `switch (true)` over `x === "lit"` union
1984
+ * equalities against one switch local. The local and the cases with plain
1985
+ * string literal tests. */
1986
+ function nullableStringSwitch(emitter, s) {
1987
+ if (s.disc.kind !== "boolLit" || !s.disc.value)
1988
+ return null;
1989
+ let value = null;
1990
+ const cases = [];
1991
+ for (const c of s.cases) {
1992
+ const test = c.test;
1993
+ if (test === null) {
1994
+ cases.push(c);
1995
+ continue;
1996
+ }
1997
+ if (test.kind !== "unionEq" ||
1998
+ test.negated ||
1999
+ test.sameValue ||
2000
+ test.left.kind !== "varRef" ||
2001
+ test.right.kind !== "unionWrap" ||
2002
+ test.right.value.kind !== "strLit")
2003
+ return null;
2004
+ const nullable = emitter.nullableUnions.get(test.unionId);
2005
+ if (nullable === null ||
2006
+ nullable.repr !== "single" ||
2007
+ nullable.nullTag !== -1 ||
2008
+ nullable.arm.kind !== "string" ||
2009
+ test.right.tag !== nullable.refTag)
2010
+ return null;
2011
+ if (value !== null && value.localId !== test.left.localId)
2012
+ return null;
2013
+ value = test.left;
2014
+ cases.push({ ...c, test: test.right.value });
2015
+ }
2016
+ return value === null ? null : { value, cases };
2017
+ }
2018
+ /** `switch (s.charAt(i))` (or `switch (s[i])`) whose case tests are all
2019
+ * one-unit string literals, as a switch on `s.charCodeAt(i)` with the units
2020
+ * as cases: no character string is built. An index out of range answers
2021
+ * NaN, which matches no case, as "" matches no one-unit literal. */
2022
+ function charAtUnitSwitch(s) {
2023
+ const disc = s.disc;
2024
+ if (disc.kind !== "strIntrinsic" || disc.method !== "charAt" || disc.args.length !== 1)
2025
+ return null;
2026
+ if (!s.cases.some((c) => c.test !== null))
2027
+ return null;
2028
+ if (!s.cases.every((c) => c.test === null || (c.test.kind === "strLit" && c.test.value.length === 1)))
2029
+ return null;
2030
+ return {
2031
+ ...s,
2032
+ disc: { ...disc, method: "charCodeAt", type: F64 },
2033
+ cases: s.cases.map((c) => c.test?.kind === "strLit"
2034
+ ? {
2035
+ ...c,
2036
+ test: { kind: "numLit", value: c.test.value.charCodeAt(0), type: F64, loc: c.test.loc },
2037
+ }
2038
+ : c),
2039
+ };
2040
+ }
2041
+ //# sourceMappingURL=emit-statements.js.map