@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,1557 @@
1
+ /* LlEmitter's module-level output: module parts, helper definitions, library declarations and FFI callback definitions. */
2
+ import { emitWasmModules } from "./wasm-modules.js";
3
+ import { ffiCallbackDummyLl, llStrBytes } from "./emitter.js";
4
+ import { JS_IC_WORDS } from "./js-ic.js";
5
+ import { mangleAsyncSpawn, mangleClassObj, mangleFnClosure, mangleFunction, mangleGlobal, mangleVtInstance, } from "../mangle.js";
6
+ import { RUNTIME_ERROR_CLASSES, RUNTIME_EVENT_CLASS, RUNTIME_EVENT_TARGET_CLASS, ffiCallbackType, isFfiContextParam, isRefCounted, typeKey, } from "../../ir/ir.js";
7
+ import { FN_ATTRS, limitInlineDynReleases, releaseSym, typedRefConstructor, vAdapters, } from "./shapes.js";
8
+ import { emitLlvmLayouts } from "./layouts.js";
9
+ import { moduleRuntimeFeatures } from "../../ir/runtime-features.js";
10
+ import { emitArraySearchHelpers } from "./array-search.js";
11
+ import { emitClassMembershipHelper } from "./classes.js";
12
+ import { compileRegexMatcher } from "./regex-matchers.js";
13
+ import { MAP_ITER_DECL, MAP_ITER_NUM_DECL, SCR_MAP_NUM_DEAD, NUMBER_MAP_ENTRY_DECL, STRING_MAP_ENTRY_DECL, } from "./map-number-lookup.js";
14
+ import { RUNTIME_ABI_MARKER } from "../runtime-abi.js";
15
+ import { threadSlotsBlockDefinitions } from "./thread-slots.js";
16
+ import { ABSENT_FIELD_PAYLOAD, exactIndexLines, f64Lit, ffiNativeParamLl, ffiNativeReturnLl, ffiNativeTypeLl, } from "./common.js";
17
+ import { literalCapWord, literalCapWord32 } from "./string-key-hash.js";
18
+ import { hasLoneSurrogate, wtf8Bytes } from "../literals.js";
19
+ import { undefinedArmTag } from "../../ir/analysis.js";
20
+ import { NULLABLE_ABSENT, NULLABLE_NULL } from "./nullable-unions.js";
21
+ import { literalEqualityDefinition } from "./string-literal-equality.js";
22
+ import { STRING_READ_HELPERS, stringScanDecl } from "./string-reads.js";
23
+ import { emitLibraryIdentityLines } from "../library-identity-markers.js";
24
+ import { InternalCompilerError } from "../../errors.js";
25
+ export function emitModuleParts(emitter) {
26
+ // Function bodies first (the literal/unit/fn-value tables fill as they
27
+ // emit), then the file assembles around them — the runtime ABI’s order.
28
+ const fnDefs = [];
29
+ for (const fn of emitter.mod.functions) {
30
+ const def = emitter.emitFunction(fn);
31
+ fnDefs.push(def);
32
+ emitter.fnDefText.set(fn.name, def);
33
+ }
34
+ emitter.selectStacklessAsync(fnDefs);
35
+ const errorViews = [];
36
+ for (const property of ["name", "message"])
37
+ if (emitter.mod.functions.some((fn) => fn.name === `%error.${property}.read`)) {
38
+ emitter.declare(`declare void @scr_error_install_${property}_reader(ptr)`);
39
+ errorViews.push(` call void @scr_error_install_${property}_reader(ptr @${mangleFunction(`%error.${property}.read`)})`);
40
+ }
41
+ for (const meta of emitter.classMeta.values()) {
42
+ if (meta.def.runtime || meta.root.def.name !== "%Error")
43
+ continue;
44
+ const type = { kind: "object", className: meta.def.name };
45
+ const adapter = emitter.liveDynRefAdapter(type);
46
+ const rc = vAdapters(emitter.shapeHost, type);
47
+ const key = typeKey(type);
48
+ const name = `sc_error_view_${errorViews.length}`;
49
+ emitter.resolveThunkDefs.push(`define internal ptr @${name}(ptr %v) ${FN_ATTRS} {`, `entry:`, ` %d = call ptr ${typedRefConstructor(emitter.shapeHost, type)}(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ptr ${emitter.cstr(key)}, ${emitter.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr @${adapter.snapshot}, ptr ${adapter.commit})`, ` ret ptr %d`, `}`, ``);
50
+ emitter.declare(`declare void @scr_error_register_dyn(ptr, ptr)`);
51
+ errorViews.push(` call void @scr_error_register_dyn(ptr @${mangleVtInstance(meta.def.name)}, ptr @${name})`);
52
+ }
53
+ const layouts = emitLlvmLayouts(emitter.shapeHost, emitter.mod, emitter.classMeta, emitter.classObjs, emitter.fnByName, (t) => emitter.llType(t), emitter.nullableFields, emitter.int32Slots);
54
+ const shapes = layouts.records;
55
+ const classShapes = layouts.classes;
56
+ const classObjDefs = layouts.classObjects;
57
+ const wrappers = emitter.emitFnValueDefs();
58
+ const asyncDefs = emitter.emitAsyncScaffolding();
59
+ const ffiCallbacks = emitter.emitFfiCallbackDefs();
60
+ const hasNoInlineRecordClone = [...emitter.recordCloneShapes].some((shapeId) => (emitter.recordsById.get(shapeId)?.fields.length ?? 0) >= 16);
61
+ // Module globals, FIRST OCCURRENCE per id: a class-expression static
62
+ // instantiated through several mixin applications registers one global
63
+ // id several times (2041-mixin-values) — C's tentative definitions
64
+ // accept the duplicates without an error, LLVM rejects redefinition, so the
65
+ // storage AND the release emit once per id here.
66
+ const seenGlobalIds = new Set();
67
+ const globals = (emitter.mod.globals ?? []).filter((g) => {
68
+ if (seenGlobalIds.has(g.id))
69
+ return false;
70
+ seenGlobalIds.add(g.id);
71
+ return true;
72
+ });
73
+ // Refcounted globals release before main returns — the runtime ABI’s
74
+ // sc_release_globals, keeping the RC audit's live count exact. Built
75
+ // before the declaration table flushes (it adds the release symbols).
76
+ // Two spellings with distinct temp names: the normal exit and the
77
+ // uncaught-exception exit are separate blocks of the same function.
78
+ // Interned function-value closures are IMMORTAL (rc == SIZE_MAX), so
79
+ // an own-property table Object.defineProperties hung on one would
80
+ // outlive the RC audit — release it with the globals (the runtime ABI’s
81
+ // sc_release_globals tail). Only when the dispatch unit is even
82
+ // linked (defineProps is the only writer).
83
+ const runtimeFeatures = moduleRuntimeFeatures(emitter.mod);
84
+ const fnValueProps = [...emitter.fnValues];
85
+ if (fnValueProps.length > 0)
86
+ emitter.declare(`declare void @scr_box_release(ptr)`);
87
+ if (emitter.classObjs.size > 0)
88
+ emitter.declare(`declare void @scr_classobj_clear_properties(ptr)`);
89
+ const globalReleaseLines = (prefix) => {
90
+ const lines = [];
91
+ globals.forEach((g, i) => {
92
+ if (!isRefCounted(g.type))
93
+ return;
94
+ lines.push(` %${prefix}${i} = load ptr, ptr @${mangleGlobal(g.id)}`, ` call void ${releaseSym(emitter.shapeHost, g.type)}(ptr %${prefix}${i}) ; ${g.name}`);
95
+ });
96
+ fnValueProps.forEach((name, i) => {
97
+ // props sits at %ScrClosure field 3; release is NULL-tolerant —
98
+ // cleared so a second release path stays idempotent.
99
+ lines.push(` %${prefix}fp${i} = load ptr, ptr getelementptr inbounds (%ScrClosure, ptr @${mangleFnClosure(name)}, i64 0, i32 3)`, ` call void @scr_box_release(ptr %${prefix}fp${i}) ; ${name}.props`, ` store ptr null, ptr getelementptr inbounds (%ScrClosure, ptr @${mangleFnClosure(name)}, i64 0, i32 3)`);
100
+ });
101
+ for (const name of emitter.classObjs.keys())
102
+ lines.push(` call void @scr_classobj_clear_properties(ptr @${mangleClassObj(name)})`);
103
+ return lines;
104
+ };
105
+ // Exit listeners can read MODULE GLOBALS directly, so they must run
106
+ // BEFORE the global releases (the runtime ABI’s runExitListeners
107
+ // ordering — the atexit half becomes an idempotent no-op).
108
+ const usesEvents = runtimeFeatures.processEvents;
109
+ const usesChildProcess = runtimeFeatures.childProcess;
110
+ const usesFsWatch = runtimeFeatures.fsWatch;
111
+ // Stream-surface programs fill the loop's stream hook (the deferred
112
+ // next-tick emissions) and the emitter's post-registration flow kick
113
+ // before %main — scr_stream.c links only when the line is emitted
114
+ // (native/executable.ts gates on the same predicate).
115
+ const usesStream = runtimeFeatures.stream;
116
+ // Net-surface programs fill the loop's net hooks (and the netSocket
117
+ // handle-dispatch ops for the checked-dynamic boundary); http-surface
118
+ // programs additionally stamp the httpReq/httpRes ops — the C main's
119
+ // install lines, gated on the same predicates native/executable.ts links by.
120
+ const usesNet = runtimeFeatures.net;
121
+ const usesNetLookup = runtimeFeatures.netLookup;
122
+ const usesDgram = runtimeFeatures.dgram;
123
+ const usesHttp2 = runtimeFeatures.http2;
124
+ const usesHttp = runtimeFeatures.http;
125
+ // Fetch-referencing programs register native fetch before main.
126
+ // Runtime selection compiles scr_fetch.c on the same predicate.
127
+ const usesFetch = runtimeFeatures.fetch;
128
+ const snapshotsTlsCa = runtimeFeatures.tls || runtimeFeatures.tlsCa;
129
+ // The process verdict has the same precedence as the C reference
130
+ // emitter: node:test owns the final status when present; otherwise an
131
+ // embedded process.exitCode owns it; ordinary programs return zero.
132
+ const usesNodeTest = runtimeFeatures.nodeTest;
133
+ // Declared NOW — the extern block flushes before main assembles.
134
+ if (usesEvents)
135
+ emitter.declare(`declare void @scr_events_install()`);
136
+ if (usesChildProcess)
137
+ emitter.declare(`declare void @scr_child_dyn_install()`);
138
+ const childStreamBoxes = usesChildProcess &&
139
+ usesStream &&
140
+ emitter.classMeta.has("%Readable") &&
141
+ emitter.classMeta.has("%Writable")
142
+ ? [
143
+ emitter.dyn.toDynHelper({ kind: "object", className: "%Readable" }),
144
+ emitter.dyn.toDynHelper({ kind: "object", className: "%Writable" }),
145
+ ]
146
+ : null;
147
+ // worker.stdout and worker.stderr box the stream unit's Readable the
148
+ // same way, and worker.stdin its Writable when the program has one
149
+ // (scr_worker_stdio_install, scr_worker_events.c).
150
+ const workerStdioBox = emitter.mod.workers === true && usesStream && emitter.classMeta.has("%Readable")
151
+ ? (childStreamBoxes?.[0] ??
152
+ emitter.dyn.toDynHelper({ kind: "object", className: "%Readable" }))
153
+ : null;
154
+ const workerStdinBox = emitter.mod.workers === true && usesStream && emitter.classMeta.has("%Writable")
155
+ ? (childStreamBoxes?.[1] ??
156
+ emitter.dyn.toDynHelper({ kind: "object", className: "%Writable" }))
157
+ : null;
158
+ if (childStreamBoxes || workerStdioBox || workerStdinBox) {
159
+ emitter.declare(`@scr_stream_child_ops = external constant { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }`);
160
+ }
161
+ if (childStreamBoxes)
162
+ emitter.declare(`declare void @scr_child_dyn_streams_install(ptr, ptr, ptr)`);
163
+ if (workerStdioBox || workerStdinBox)
164
+ emitter.declare(`declare void @scr_worker_stdio_install(ptr, ptr, ptr)`);
165
+ if (usesFsWatch)
166
+ emitter.declare(`declare void @scr_watch_install()`);
167
+ if (emitter.ffiHasForeignCallback)
168
+ emitter.declare(`declare void @scr_ffi_install()`);
169
+ if (usesStream)
170
+ emitter.declare(`declare void @scr_stream_install()`);
171
+ if (usesNetLookup)
172
+ emitter.declare(`declare void @scr_net_lookup_install()`);
173
+ if (usesNet) {
174
+ emitter.declare(`declare void @scr_net_install()`);
175
+ emitter.declare(`declare void @scr_net_dyn_install()`);
176
+ }
177
+ if (usesDgram)
178
+ emitter.declare(`declare void @scr_dgram_install()`);
179
+ if (usesHttp2)
180
+ emitter.declare(`declare void @scr_http2_dyn_install()`);
181
+ if (usesHttp)
182
+ emitter.declare(`declare void @scr_http_dyn_install()`);
183
+ if (usesFetch)
184
+ emitter.declare(`declare void @scr_fetch_install()`);
185
+ if (usesNodeTest) {
186
+ emitter.declare(`declare i32 @scr_test_exit_code()`);
187
+ emitter.declare(`declare void @scr_test_init()`);
188
+ }
189
+ if (snapshotsTlsCa) {
190
+ emitter.declare(`declare void @scr_tls_ca_install()`);
191
+ }
192
+ // Inline exit listeners run when something they must beat exists:
193
+ // the refcounted-global releases, or the retained-FFI atexit ledger
194
+ // sweep (a listener may legitimately release or pump a registration,
195
+ // and only the inline call orders ahead of every atexit handler —
196
+ // the runtime ABI’s runExitListeners stance). Plain event programs
197
+ // with neither keep the atexit path, so their listener timing is
198
+ // unchanged.
199
+ const hasRefGlobals = globals.some((g) => isRefCounted(g.type)) || fnValueProps.length > 0;
200
+ const inlineExitListeners = usesEvents && (emitter.mod.workers || hasRefGlobals || emitter.ffiHasRetainedCallback);
201
+ emitter.declare(`declare i32 @scr_exit_code_hint_get()`);
202
+ if (inlineExitListeners) {
203
+ emitter.declare(`declare void @scr_run_exit_listeners(double)`);
204
+ emitter.declare(`declare i32 @scr_exit_code_hint_get()`);
205
+ }
206
+ const exitListenerLines = (prefix) => {
207
+ if (!inlineExitListeners)
208
+ return [];
209
+ return [
210
+ ` %${prefix}h = call i32 @scr_exit_code_hint_get()`,
211
+ ` %${prefix}hd = sitofp i32 %${prefix}h to double`,
212
+ ` call void @scr_run_exit_listeners(double %${prefix}hd)`,
213
+ ];
214
+ };
215
+ // The entry's exits release the module globals only where the thread
216
+ // frees its heap when its script ends (scr_exit_frees: workers, and
217
+ // builds that check for leaks); the main thread of other builds leaves
218
+ // it to the operating system.
219
+ const exitReleaseLines = (prefix) => {
220
+ const releases = globalReleaseLines(prefix);
221
+ if (releases.length === 0)
222
+ return releases;
223
+ emitter.declare(`declare zeroext i1 @scr_exit_frees()`);
224
+ return [
225
+ ` %${prefix}.frees = call zeroext i1 @scr_exit_frees()`,
226
+ ` br i1 %${prefix}.frees, label %${prefix}.release, label %${prefix}.kept`,
227
+ `${prefix}.release:`,
228
+ ...releases,
229
+ ` br label %${prefix}.kept`,
230
+ `${prefix}.kept:`,
231
+ ];
232
+ };
233
+ const globalReleases = exitReleaseLines("g");
234
+ const asyncEntry = emitter.fnByName.get(emitter.mod.entry)?.async === true;
235
+ const entryMayThrow = emitter.mayThrow.has(emitter.mod.entry);
236
+ // The event loop runs when timers appeared OR any async/generator
237
+ // function exists (the C main's hasAsync || hasGenerators ||
238
+ // usesTimers gate). Generator programs run
239
+ // the loop too: its exit accounting notes still-suspended generator
240
+ // fibers as abandoned, so the RC audit downgrades exactly like the
241
+ // async loop-exhaustion story.
242
+ const runsLoop = emitter.usesTimers ||
243
+ emitter.ffiHasForeignCallback ||
244
+ emitter.mod.functions.some((f) => f.async === true || f.generator !== undefined);
245
+ const uncaughtReleases = entryMayThrow && !asyncEntry ? exitReleaseLines("gu") : [];
246
+ const loopReleasesU = runsLoop ? exitReleaseLines("gl") : [];
247
+ const loopReleasesR = runsLoop ? exitReleaseLines("gr") : [];
248
+ const topRejectReleases = asyncEntry ? exitReleaseLines("gt") : [];
249
+ const topPendingReleases = asyncEntry ? exitReleaseLines("gp") : [];
250
+ const loopReportedReleases = runsLoop ? exitReleaseLines("gq") : [];
251
+ // main's epilogues read the flag / the loop entry points — declared
252
+ // HERE, before the extern block flushes. They run once, so they keep
253
+ // the out-of-line scr_exc_pending call; per-call checks inline the
254
+ // test (pendingTestLines).
255
+ if (entryMayThrow || runsLoop)
256
+ emitter.declare(`declare zeroext i1 @scr_exc_pending()`);
257
+ if (runsLoop) {
258
+ emitter.declare(`declare zeroext i1 @scr_loop_run(ptr)`);
259
+ if (emitter.mod.commonJsEntry === true)
260
+ emitter.declare(`declare void @scr_loop_commonjs_entry()`);
261
+ if (emitter.readsLoopMetrics())
262
+ emitter.declare(`declare void @scr_perf_loop_mark()`);
263
+ emitter.declare(`declare zeroext i1 @scr_report_unhandled_rejections()`);
264
+ emitter.declare(`declare void @scr_discard_unhandled_rejections()`);
265
+ }
266
+ if (asyncEntry) {
267
+ emitter.declare(`declare i32 @scr_promise_finish_top_level(ptr)`);
268
+ emitter.declare(`declare void @scr_promise_rethrow_top_level(ptr)`);
269
+ emitter.declare(`declare void @scr_promise_release(ptr)`);
270
+ emitter.declare(`declare void @scr_exit_code_note(i32)`);
271
+ }
272
+ const topPendingExitLines = () => {
273
+ if (!asyncEntry)
274
+ return [];
275
+ const lines = [];
276
+ // finish_top_level noted 13 unless the program set process.exitCode.
277
+ // A failed node:test run outranks either before exit listeners run.
278
+ if (usesNodeTest) {
279
+ lines.push(` %tla_program_exit = call i32 @scr_test_exit_code()`, ` %tla_program_exit_zero = icmp eq i32 %tla_program_exit, 0`, ` %tla_hint = call i32 @scr_exit_code_hint_get()`, ` %tla_exit_status = select i1 %tla_program_exit_zero, i32 %tla_hint, i32 %tla_program_exit`, ` call void @scr_exit_code_note(i32 %tla_exit_status)`);
280
+ }
281
+ for (const line of exitListenerLines("xp"))
282
+ lines.push(line);
283
+ for (const line of topPendingReleases)
284
+ lines.push(line);
285
+ // An exit listener may set process.exitCode again, as in Node.
286
+ lines.push(` %tla_exit_code = call i32 @scr_exit_code_hint_get()`, ` ret i32 %tla_exit_code`);
287
+ return lines;
288
+ };
289
+ // LIBRARY mode: the runtime entry points the generated library
290
+ // symbols delegate to — declared before the extern block flushes.
291
+ if (emitter.mod.lib !== undefined) {
292
+ if (emitter.wasi) {
293
+ emitter.declare(`declare ptr @malloc(${emitter.sizeType})`);
294
+ emitter.declare(`declare void @free(ptr)`);
295
+ }
296
+ emitter.declare(`declare void @scr_library_entry(i1 zeroext, ptr)`);
297
+ emitter.declare(`declare void @scr_library_reset()`);
298
+ emitter.declare(`declare void @scr_library_check_exc()`);
299
+ emitter.declare(`declare void @scr_library_set_sink(ptr, ptr)`);
300
+ emitter.declare(`declare void @scr_library_callback_entry_guard(ptr)`);
301
+ emitter.declare(`declare void @scr_library_arena_reset()`);
302
+ emitter.declare(`declare void @scr_library_collect()`);
303
+ if ((emitter.mod.lib.callbacks?.length ?? 0) > 0) {
304
+ // Host-callback channels: the registration define's dispatch
305
+ // (strcmp over the declared names + the runtime slot store).
306
+ // The call-site fetch pair (scr_library_cb_require/_ctx) is
307
+ // declared at ffiCall emission like every body-driven runtime
308
+ // symbol.
309
+ emitter.declare(`declare void @scr_library_cb_set(${emitter.sizeType}, ptr, ptr)`);
310
+ emitter.declare(`declare i32 @strcmp(ptr, ptr)`);
311
+ }
312
+ if (emitter.mod.lib.exports.some((e) => e.params.includes("string"))) {
313
+ emitter.declare(`declare ptr @scr_library_str_in(ptr, ${emitter.sizeType})`);
314
+ }
315
+ if (emitter.mod.lib.exports.some((e) => e.params.includes("bytes"))) {
316
+ emitter.declare(`declare ptr @scr_library_bytes_in(ptr, ${emitter.sizeType}, ptr)`);
317
+ }
318
+ if (emitter.mod.lib.exports.some((e) => e.params.includes("i64"))) {
319
+ emitter.declare(`declare double @scr_library_i64_in(i64, ptr)`);
320
+ }
321
+ if (emitter.mod.lib.exports.some((e) => e.params.includes("u64"))) {
322
+ emitter.declare(`declare double @scr_library_u64_in(i64, ptr)`);
323
+ }
324
+ if (emitter.mod.lib.exports.some((e) => e.returns === "string")) {
325
+ emitter.declare(`declare void @scr_library_str_out(ptr, ptr, ptr)`);
326
+ }
327
+ if (emitter.mod.lib.exports.some((e) => e.returns === "bytes")) {
328
+ emitter.declare(`declare void @scr_library_bytes_out(ptr, ptr, ptr)`);
329
+ }
330
+ if (emitter.mod.lib.exports.some((e) => e.params.includes("cstring"))) {
331
+ emitter.declare(`declare ptr @scr_library_cstr_in(ptr, ptr)`);
332
+ }
333
+ if (emitter.mod.lib.exports.some((e) => e.returns === "cstring")) {
334
+ emitter.declare(`declare ptr @scr_library_cstr_out(ptr)`);
335
+ }
336
+ }
337
+ // Helpers assemble BEFORE the declaration table flushes (they add
338
+ // write/abort declarations).
339
+ const helpers = [
340
+ ...emitter.helperDefs(),
341
+ ...emitArraySearchHelpers(emitter.arraySearchKinds, emitter.sizeType, (line) => emitter.declare(line)),
342
+ ...emitClassMembershipHelper(emitter.classMeta, emitter.sizeType),
343
+ ...(emitter.publishWalkersCache?.defs() ?? []),
344
+ ...emitter.publishedClassNamesDefs(),
345
+ ...(emitter.regions?.moduleDefs() ?? []),
346
+ ];
347
+ if (emitter.constantNumericTables.size > 0)
348
+ emitter.declare(`declare double @scr_arr_get_number(ptr, double)`);
349
+ // Native matchers of the regex literals inside the compiled subset.
350
+ const regexMatchers = new Map();
351
+ for (const [key, re] of emitter.regexInstances) {
352
+ const code = compileRegexMatcher(`${re.sym}_match`, re.pattern, re.flags, emitter.sizeType, !emitter.wasi);
353
+ if (code === null)
354
+ continue;
355
+ regexMatchers.set(key, code);
356
+ for (const decl of code.decls)
357
+ emitter.declare(decl);
358
+ }
359
+ const out = [
360
+ `; Generated by scriptc (LLVM backend) from ${emitter.mod.sourceFile}. Do not edit.`,
361
+ ``,
362
+ // Type shapes shared with the runtime's C ABI. ScrStr is the header
363
+ // prefix only (the flexible-array tail is concrete per literal);
364
+ // ScrLogArg is { i32 tag; 8-byte union } — i64 at offset 8 matches
365
+ // the C layout (4 bytes padding after the tag). ScrUnion/ScrClosure
366
+ // mirror scr_runtime.h field-for-field (tag reads, slot peeks, the
367
+ // fn pointer, and the caps[] tail all address through them).
368
+ `%ScrStr = type { ${emitter.sizeType}, ${emitter.sizeType}, ${emitter.sizeType} }`,
369
+ `%ScrLogArg = type { i32, i64 }`,
370
+ `%ScrVt = type { ${emitter.sizeType}, ${emitter.sizeType}, ptr }`,
371
+ `%ScrUnion = type { ${emitter.sizeType}, i32, ptr, ptr, ptr, i64 }`,
372
+ `%ScrClosure = type { ${emitter.sizeType}, ptr, ${emitter.sizeType}, ptr, i32, i32, ptr, ptr }`,
373
+ `%ScrFfiTable = type { ptr, ${emitter.sizeType}, ${emitter.sizeType}, ptr, i8, ptr, ptr, ${emitter.sizeType}, ${emitter.sizeType}, ${emitter.sizeType}, ptr, ptr }`,
374
+ `%ScrRegex = type { ${emitter.sizeType}, ptr, ptr, ptr, double, ptr, ptr, ptr }`,
375
+ // ScrArr mirrors scr_runtime.h field-for-field: { rc, len (i32), cap
376
+ // (i32), elem, cyc, spare, filled, ops, data, ext } (field numbers in
377
+ // SCR_ARR_FIELD), where the dense states follow the cap value slots at
378
+ // data, filled bounds the hole-free prefix, ops points at the element type's constant RC descriptor
379
+ // (%ScrArrOps, SCR_ELEM_REF only) and ext at the out-of-line sparse,
380
+ // property and metadata storage (NULL until first used). Live dynamic
381
+ // stream commits swap its dense, presence and out-of-line storage while
382
+ // preserving the target object's identity.
383
+ `%ScrArr = type { ${emitter.sizeType}, i32, i32, i8, i8, i16, i32, ptr, ptr, ptr }`,
384
+ `%ScrArrOps = type { ptr, ptr, ptr }`,
385
+ // The ScrMap prefix { rc, key_kind, val_kind, traced } — the inline
386
+ // RC fast paths test the traced byte (shapes.ts).
387
+ ...(emitter.rcHelpers === null ? [] : [`%ScrMapRc = type { ${emitter.sizeType}, i8, i8, i8 }`]),
388
+ // The complete ScrMap and its entries, read by the inline number-key
389
+ // lookup (sc_map_entry_f64) and the inline iteration steps
390
+ // (sc_map_iter_entry, sc_map_iter_entry_num): field 8 is the i32 entry
391
+ // count, field 10 the i64 absent-key filter, entries is field 11,
392
+ // nbuckets and buckets fields 13 and 14, the direct index and its i32
393
+ // length fields 15 and 16.
394
+ ...(emitter.decls.has(NUMBER_MAP_ENTRY_DECL) ||
395
+ emitter.decls.has(STRING_MAP_ENTRY_DECL) ||
396
+ emitter.decls.has(MAP_ITER_DECL) ||
397
+ emitter.decls.has(MAP_ITER_NUM_DECL)
398
+ ? [
399
+ `%ScrMapIx = type { ${emitter.sizeType}, i8, i8, i8, i8, i32, ptr, ptr, i32, i32, i64, ptr, i32, i32, ptr, ptr, i32, i32 }`,
400
+ ]
401
+ : []),
402
+ // The { key, val, hash } entry of every map but a number-key one, whose
403
+ // entry is { key, val } (scr_map.h ScrMapNumEntry). String-keyed
404
+ // reference reads load the value slot of the entry scr_map_entry_str
405
+ // returns (map-number-lookup.ts).
406
+ ...(emitter.decls.has(NUMBER_MAP_ENTRY_DECL) ||
407
+ emitter.decls.has(STRING_MAP_ENTRY_DECL) ||
408
+ emitter.decls.has(MAP_ITER_DECL) ||
409
+ emitter.decls.has(MAP_ITER_NUM_DECL)
410
+ ? [`%ScrMapEntry = type { i64, i64, i64 }`, `%ScrMapNumEntry = type { i64, i64 }`]
411
+ : []),
412
+ // The runtime error prefix { rc, vt, name, message, code, cause } and the
413
+ // class-object shape { rc, pre, post, ctor, name } — field reads on
414
+ // builtin errors and classval loads GEP through these.
415
+ `%ScrError = type { ${emitter.sizeType}, ptr, ptr, ptr, ptr, ptr, i8, i8, i8, i8, i8, ptr, ptr }`,
416
+ `%ScrClassObj = type { ${emitter.sizeType}, ${emitter.sizeType}, ${emitter.sizeType}, ptr, ptr, ${emitter.sizeType}, ${emitter.sizeType}, ptr, ptr }`,
417
+ // The runtime emitter prefix { rc, vt, reg, cls } — user subclasses
418
+ // embed it (classes.ts), and bare-emitter GEPs address through it.
419
+ `%ScrEmitter = type { ${emitter.sizeType}, ptr, ptr, ptr }`,
420
+ // The runtime stream layout { rc, vt, reg, cls, st } — one struct
421
+ // for all five stream classes; stream subclasses embed it.
422
+ `%ScrStream = type { ${emitter.sizeType}, ptr, ptr, ptr, ptr }`,
423
+ // The EventTarget and Event subclass prefixes { rc, vt, state, cls }.
424
+ ...(emitter.classMeta.has(RUNTIME_EVENT_TARGET_CLASS)
425
+ ? [`%ScrEventTargetObj = type { ${emitter.sizeType}, ptr, ptr, ptr }`]
426
+ : []),
427
+ ...(emitter.classMeta.has(RUNTIME_EVENT_CLASS)
428
+ ? [`%ScrEventObj = type { ${emitter.sizeType}, ptr, ptr, ptr }`]
429
+ : []),
430
+ // The catch-binding snapshot box { rc, kind, f64, b, payload,
431
+ // retain_fn, release_fn, trace_fn } — caughtTest kind reads and
432
+ // caughtNarrow payload extraction GEP through it (offsets match
433
+ // scr_runtime.h's natural alignment: kind at 8, f64 at 16, b at 24,
434
+ // payload at 32).
435
+ `%ScrCaught = type { ${emitter.sizeType}, i32, double, i8, ptr, ptr, ptr, ptr }`,
436
+ // ScrBytes { rc, len, elem(i32+pad), data, backing, brands, shared }. Indexed
437
+ // typed-array access GEPs through this directly: the IR type already
438
+ // fixes elem, so the hot path needs neither a runtime kind load nor
439
+ // the generic scr_bytes_get/set call.
440
+ `%ScrBytes = type { ${emitter.sizeType}, ${emitter.sizeType}, i32, ptr, ptr, i8, i8, i8, i8, ptr }`,
441
+ // The capture box { rc, kind, obj_retain, obj_release, obj_trace,
442
+ // slot } — TDZ reads peek the payload slot (offset 40) directly.
443
+ `%ScrBox = type { ${emitter.sizeType}, i32, ptr, ptr, ptr, i64 }`,
444
+ // The stack buffer of the emitted JSON serializers { data, len, cap }.
445
+ `%ScrJsonBuf = type { ptr, ${emitter.sizeType}, ${emitter.sizeType}, ptr, ${emitter.sizeType}, ${emitter.sizeType} }`,
446
+ // The dynCheck error-path spine { parent, key, index } — the emitted
447
+ // builders stack-allocate one per recursion level (dyn.ts).
448
+ `%ScrDynPath = type { ptr, ptr, ${emitter.sizeType} }`,
449
+ `%ScrIslandModule = type { ptr, ptr, ${emitter.sizeType}, ${emitter.sizeType}, i32, ptr, ${emitter.sizeType}, ${emitter.sizeType} }`,
450
+ `%ScrIslandEdge = type { ptr, ptr, ptr, i32 }`,
451
+ // A generator's prefix { rc, receiver, fiber, state, out } and its
452
+ // value slot { kind, f64, b, payload, release_fn } (scr_async.c pins
453
+ // both): number and boolean yields and drives address OUT directly.
454
+ ...(emitter.usesGenSlots
455
+ ? [
456
+ `%ScrGenSlot = type { i32, double, i8, ptr, ptr }`,
457
+ `%ScrGenHead = type { ${emitter.sizeType}, ptr, ptr, i32, %ScrGenSlot }`,
458
+ ]
459
+ : []),
460
+ ];
461
+ for (const line of shapes.typeDefs)
462
+ out.push(line);
463
+ for (const line of classShapes.typeDefs)
464
+ out.push(line);
465
+ // Thread-instanced library state (abi.instance_per_thread): the
466
+ // program TU's mutable globals — module globals, run-once guards, the
467
+ // lazily-compiled regex literal caches — and the runtime globals its
468
+ // init stamps live in thread-local storage, matching the runtime
469
+ // objects compiled with -DSCR_THREAD_INSTANCES. Immutable interned
470
+ // data (string literals, unit arms, template arrays, vtables) stays
471
+ // shared.
472
+ const tl = emitter.mod.workers === true || emitter.mod.lib?.threadInstances === true
473
+ ? "thread_local "
474
+ : "";
475
+ out.push(``, `@scr_error_vts = external ${tl}global [${RUNTIME_ERROR_CLASSES.size} x %ScrVt]`, `declare void @scr_init()`, `declare void @scr_lib_init(i32, ptr)`, ...(emitter.mod.workers ? [`declare void @scr_runtime_workers_v8()`] : []), ...(emitter.stackChecks?.size ? [`declare void @scr_stack_guard_init()`] : []), ...(emitter.runtimeAbiMarker && emitter.mod.lib === undefined
476
+ ? [`declare void @${RUNTIME_ABI_MARKER}()`]
477
+ : []),
478
+ // Overrides the runtime's weak default (scr_lib.c).
479
+ ...(emitter.detachedExit && emitter.mod.lib === undefined
480
+ ? [`@scr_detached_exit = constant i8 1`]
481
+ : []));
482
+ for (const d of emitter.decls)
483
+ out.push(d);
484
+ out.push(``);
485
+ const flushedDecls = new Set(emitter.decls);
486
+ {
487
+ const tl = emitter.mod.workers === true || emitter.mod.lib?.threadInstances === true
488
+ ? "thread_local "
489
+ : "";
490
+ out.push(...threadSlotsBlockDefinitions(emitter.threadSlotsBlocks, tl !== ""));
491
+ for (let site = 0; site < emitter.dynReadIcSites; site++)
492
+ out.push(`@sc_dyn_read_ic_${site} = internal ${tl}global { ptr, ${emitter.sizeType}, ${emitter.sizeType}, ptr } zeroinitializer`);
493
+ for (let site = 0; site < emitter.jsIcSiteCount; site++)
494
+ out.push(`@sc_js_ic_${site} = internal ${tl}global [${JS_IC_WORDS} x i64] zeroinitializer`);
495
+ }
496
+ for (const table of emitter.constantNumericTables.values()) {
497
+ const n = table.values.length;
498
+ let tableTmp = 0;
499
+ const tableIndex = exactIndexLines("%i", String(n), "i64", () => `%ix${tableTmp++}`);
500
+ out.push(`@${table.symbol} = private constant [${n} x double] [${table.values.map((v) => `double ${f64Lit(v)}`).join(", ")}]`, `define internal double @${table.symbol}_get(ptr %a, double %i) alwaysinline #0 {`, `entry:`, ` %initialized = icmp ne ptr %a, null`, ...tableIndex.lines.map((line) => ` ${line}`), ` %safe = and i1 %initialized, ${tableIndex.ok}`, ` br i1 %safe, label %read, label %fallback`, `read:`, ` %slot = getelementptr inbounds [${n} x double], ptr @${table.symbol}, i64 0, i64 ${tableIndex.wide}`, ` %value = load double, ptr %slot`, ` ret double %value`, `fallback:`, ` %generic = call double @scr_arr_get_number(ptr %a, double %i)`, ` ret double %generic`, `}`, ``);
501
+ }
502
+ for (const [text, lit] of emitter.literals) {
503
+ // Immortal interned ScrStr: { rc = SIZE_MAX, len, cap = len, bytes\0 } —
504
+ // the runtime ABI’s static table, retain/release skip rc == SIZE_MAX.
505
+ // 64-bit (little-endian) targets split the capacity word: the high
506
+ // half carries the precomputed Map key hash (SCR_STR_HASH_CACHE).
507
+ // Bit 31 marks all-ASCII literals (SCR_STR_ASCII_BIT) on every target.
508
+ const capWord = emitter.sizeType === "i64"
509
+ ? literalCapWord(wtf8Bytes(text))
510
+ : literalCapWord32(wtf8Bytes(text));
511
+ out.push(`@${lit.sym} = internal global { ${emitter.sizeType}, ${emitter.sizeType}, ${emitter.sizeType}, [${lit.len + 1} x i8] } ` +
512
+ `{ ${emitter.sizeType} -1, ${emitter.sizeType} ${lit.len}, ${emitter.sizeType} ${capWord}, [${lit.len + 1} x i8] c"${llStrBytes(text)}" }`);
513
+ }
514
+ if (emitter.literals.size > 0)
515
+ out.push(``);
516
+ for (const lit of emitter.bigintLiterals.values()) {
517
+ // Immortal ScrBigInt: { rc = SIZE_MAX, len, sign, cap, limbs } with
518
+ // pointer-sized little-endian limbs (scr_bigint.c); zero keeps one
519
+ // zero limb so limb 0 is always readable.
520
+ const size = emitter.sizeType;
521
+ const limbBits = size === "i64" ? 64n : 32n;
522
+ const mask = (1n << limbBits) - 1n;
523
+ const limbs = [];
524
+ for (let m = lit.value < 0n ? -lit.value : lit.value; m > 0n; m = m >> limbBits) {
525
+ limbs.push(`${size} ${m & mask}`);
526
+ }
527
+ const len = limbs.length;
528
+ if (len === 0)
529
+ limbs.push(`${size} 0`);
530
+ const sign = lit.value < 0n ? -1 : lit.value > 0n ? 1 : 0;
531
+ out.push(`@${lit.sym} = internal global { ${size}, ${size}, i32, i32, [${limbs.length} x ${size}] } ` +
532
+ `{ ${size} -1, ${size} ${len}, i32 ${sign}, i32 ${limbs.length}, [${limbs.length} x ${size}] [${limbs.join(", ")}] }`);
533
+ }
534
+ if (emitter.bigintLiterals.size > 0)
535
+ out.push(``);
536
+ for (const [key, sym] of emitter.unitInstances) {
537
+ // One immortal instance per unit-armed (union, tag): tag set, payload
538
+ // slot and RC entry points zero — retain/release/collector all skip
539
+ // rc == SIZE_MAX, so these never join the RC audit or a trace walk.
540
+ const [unionId, tag] = key.split(":");
541
+ out.push(`@${sym} = internal global %ScrUnion { ${emitter.sizeType} -1, i32 ${tag}, ptr null, ptr null, ptr null, i64 0 } ; ${unionId} unit arm`);
542
+ }
543
+ if (emitter.unitInstances.size > 0)
544
+ out.push(``);
545
+ for (const [unionId, sym] of emitter.retypeGuards) {
546
+ // Thread-local like module globals: a thread's cast caches hold only
547
+ // its own boxes. Never written, the flag folds to false.
548
+ out.push(`@${sym} = internal ${tl}global i8 0 ; ${unionId} boxes in a cast cache`);
549
+ }
550
+ if (emitter.retypeGuards.size > 0)
551
+ out.push(``);
552
+ for (const [unionId, sym] of emitter.absentInstances) {
553
+ // One immortal ABSENT field-slot instance per undefined-armed union:
554
+ // the undefined arm's tag with payload 1 (ordinary unit instances
555
+ // carry 0). Every tag reader sees undefined; recordHas and the
556
+ // field reads compare tag and payload, never the address, so the
557
+ // per-object copies of separately compiled units agree.
558
+ const tag = undefinedArmTag({ kind: "union", unionId }, emitter.unionsById);
559
+ out.push(`@${sym} = internal global %ScrUnion { ${emitter.sizeType} -1, i32 ${tag}, ptr null, ptr null, ptr null, i64 ${ABSENT_FIELD_PAYLOAD} } ; ${unionId} absent field`);
560
+ }
561
+ if (emitter.absentInstances.size > 0)
562
+ out.push(``);
563
+ if (emitter.needsUnionNone)
564
+ out.push(`@sc_union_none = internal constant %ScrUnion zeroinitializer ; NULL union dummy read by inline stores`, ``);
565
+ if (emitter.nullableUnions.usesNullSentinel) {
566
+ // `null` in every `C | null | undefined` union (NULL is undefined):
567
+ // one module-scope immortal object like the ABSENT sentinel.
568
+ const S = emitter.sizeType;
569
+ out.push(`${NULLABLE_NULL} = internal global { ${S}, ${S}, ${S}, ${S} } { ${S} -1, ${S} 0, ${S} 0, ${S} 0 } ; nullable null arm`, ``);
570
+ }
571
+ if (emitter.needsNullableAbsent) {
572
+ // The ABSENT field-slot state of every nullable-pointer union: one
573
+ // module-scope immortal object (rc == SIZE_MAX), distinct from NULL
574
+ // (undefined) and from every instance. RC entry points and the
575
+ // collector skip it like any immortal; field reads compare its address.
576
+ const S = emitter.sizeType;
577
+ out.push(`${NULLABLE_ABSENT} = internal global { ${S}, ${S}, ${S}, ${S} } { ${S} -1, ${S} 0, ${S} 0, ${S} 0 } ; nullable absent field`, ``);
578
+ }
579
+ for (const [key, re] of emitter.regexInstances) {
580
+ // One immortal ScrRegex per (pattern, flags) literal, pointing at
581
+ // the interned source/flags strings. The bc and translated-program
582
+ // slots start null (lazy compile, cached by the runtime) — a mutable
583
+ // global, not constant. The last slot is the build-time matcher.
584
+ const matcher = regexMatchers.has(key) ? `@${re.sym}_match` : "null";
585
+ out.push(`@${re.sym} = internal ${tl}global %ScrRegex { ${emitter.sizeType} -1, ptr ${re.src}, ptr ${re.fl}, ptr null, double 0.0, ptr null, ptr null, ptr ${matcher} } ; ${key.replace(/\n/g, "\\n")}`);
586
+ }
587
+ if (emitter.regexInstances.size > 0)
588
+ out.push(``);
589
+ for (const code of regexMatchers.values())
590
+ out.push(...code.lines, ``);
591
+ for (const [, inst] of emitter.templateStringsInstances) {
592
+ // One immortal ScrArr per tagged-template site: a data global of
593
+ // interned cooked-string literals followed by their states (the
594
+ // runtime finds them before data + cap * 9), and the ScrArr header over
595
+ // it (rc == SIZE_MAX, len == cap == filled, SCR_ELEM_STR = 2, no REF
596
+ // entry points). Every dense slot is present; reads retain immortal
597
+ // strings — a no-op. Slots are 8 bytes on every target: on 32-bit
598
+ // targets each holds the pointer in its low half and zero in its high
599
+ // half, so the states start where the runtime looks for them.
600
+ const n = inst.slots.length;
601
+ const present = n === 0 ? "zeroinitializer" : `[ ${inst.slots.map(() => "i8 1").join(", ")} ]`;
602
+ const wide = emitter.sizeType === "i64";
603
+ const slot = wide ? "ptr" : "<{ ptr, i32 }>";
604
+ const slotValue = (s) => wide ? `ptr ${s}` : `<{ ptr, i32 }> <{ ptr ${s}, i32 0 }>`;
605
+ out.push(`@${inst.sym}_data = internal constant <{ [${n} x ${slot}], [${n} x i8] }> <{ [${n} x ${slot}] [ ${inst.slots.map(slotValue).join(", ")} ], [${n} x i8] ${present} }>, align 8`, `@${inst.sym} = internal global %ScrArr { ${emitter.sizeType} -1, i32 ${n}, i32 ${n}, i8 2, i8 0, i16 0, i32 ${n}, ptr null, ptr @${inst.sym}_data, ptr null }`);
606
+ }
607
+ if (emitter.templateStringsInstances.size > 0)
608
+ out.push(``);
609
+ for (const [text, c] of emitter.cstrs) {
610
+ // NUL-terminated byte-array constants for scr_jb_puts and indentation.
611
+ out.push(`@${c.sym} = internal constant [${c.len + 1} x i8] c"${llStrBytes(text)}"`);
612
+ }
613
+ if (emitter.cstrs.size > 0)
614
+ out.push(``);
615
+ for (const [body, sym] of emitter.mapOpsConsts) {
616
+ out.push(`@${sym} = internal constant { ptr, ptr, ptr, ptr, ptr, ptr, ptr } { ${body} }`);
617
+ }
618
+ if (emitter.mapOpsConsts.size > 0)
619
+ out.push(``);
620
+ for (const line of ffiCallbacks.globals)
621
+ out.push(line);
622
+ if (ffiCallbacks.globals.length > 0)
623
+ out.push(``);
624
+ for (const g of globals) {
625
+ const ty = emitter.llType(g.type);
626
+ const zero = ty === "double" ? f64Lit(0) : ty === "ptr" ? "null" : "false";
627
+ const debug = emitter.debug?.global(g);
628
+ out.push(`@${mangleGlobal(g.id)} = internal ${tl}global ${ty} ${zero}${debug ? `, !dbg ${debug}` : ""} ; ${g.name}`);
629
+ }
630
+ if (globals.length > 0)
631
+ out.push(``);
632
+ for (const line of helpers)
633
+ out.push(line);
634
+ for (const line of ffiCallbacks.defs)
635
+ out.push(line);
636
+ for (const line of shapes.defs)
637
+ out.push(line);
638
+ for (const line of classShapes.defs)
639
+ out.push(line);
640
+ for (const line of classObjDefs)
641
+ out.push(line);
642
+ for (const line of emitter.walkers.defs)
643
+ out.push(line);
644
+ for (const line of emitter.dyn.defs)
645
+ out.push(line);
646
+ for (const line of wrappers)
647
+ out.push(line);
648
+ for (const line of asyncDefs)
649
+ out.push(line);
650
+ for (const line of emitter.resolveThunkDefs)
651
+ out.push(line);
652
+ out.push(fnDefs[0] ?? "");
653
+ for (let i = 1; i < fnDefs.length; i++)
654
+ out.push("", fnDefs[i]);
655
+ out.push("");
656
+ // WebAssembly modules translated into this program, and the registry.
657
+ for (const line of emitWasmModules(emitter.mod, flushedDecls, emitter.wasmBoundsChecks))
658
+ out.push(line);
659
+ // main(): scr_init, the program-dependent error-vt interval stamps,
660
+ // scr_lib_init(argc, argv), then the entry function. An uncaught
661
+ // exception escaping top-level code prints and exits 1 (Node).
662
+ // The exception epilogue is emitted when the entry may throw.
663
+ const stamps = [...errorViews];
664
+ for (const iv of emitter.errorIntervals) {
665
+ const fields = [
666
+ [0, iv.pre],
667
+ [1, iv.post],
668
+ ];
669
+ for (const [field, value] of fields) {
670
+ stamps.push(` store ${emitter.sizeType} ${value}, ptr getelementptr inbounds ([${RUNTIME_ERROR_CLASSES.size} x %ScrVt], ptr @scr_error_vts, i64 0, i64 ${iv.kind}, i32 ${field})${field === 1 ? ` ; ${iv.lib}` : ""}`);
671
+ }
672
+ }
673
+ if (emitter.emitterInterval !== null) {
674
+ // The runtime emitter vtable's interval (emitterVtStampLines): bare
675
+ // EventEmitter instances answer instanceof and dispatch dynamic
676
+ // teardown under THIS module's preorder numbering.
677
+ out.push(`@scr_emitter_vt = external ${tl}global %ScrVt`, ``);
678
+ stamps.push(` store ${emitter.sizeType} ${emitter.emitterInterval.pre}, ptr getelementptr inbounds (%ScrVt, ptr @scr_emitter_vt, i64 0, i32 0)`, ` store ${emitter.sizeType} ${emitter.emitterInterval.post}, ptr getelementptr inbounds (%ScrVt, ptr @scr_emitter_vt, i64 0, i32 1) ; EventEmitter`);
679
+ }
680
+ for (const iv of emitter.streamIntervals) {
681
+ // The runtime stream vtables' intervals (streamVtStampLines) — the
682
+ // emitter story: instanceof and dynamic teardown dispatch through
683
+ // them.
684
+ out.push(`@${iv.vt} = external ${tl}global %ScrVt`);
685
+ stamps.push(` store ${emitter.sizeType} ${iv.pre}, ptr getelementptr inbounds (%ScrVt, ptr @${iv.vt}, i64 0, i32 0)`, ` store ${emitter.sizeType} ${iv.post}, ptr getelementptr inbounds (%ScrVt, ptr @${iv.vt}, i64 0, i32 1) ; ${iv.lib}`);
686
+ }
687
+ if (emitter.streamIntervals.length > 0)
688
+ out.push(``);
689
+ if ([...emitter.literals.keys(), ...emitter.cstrs.keys()].some(hasLoneSurrogate)) {
690
+ // The runtime skips surrogate work until a lone surrogate may exist
691
+ // (scr_wtf8_any); its own producers note one, and literals do here.
692
+ out.push(`declare void @scr_wtf8_note()`, ``);
693
+ stamps.push(` call void @scr_wtf8_note()`);
694
+ }
695
+ if (emitter.errorIntervals.length > 0 && emitter.tracedShapes.has("object:%Error")) {
696
+ // The cycle fixpoint marked the Error hierarchy (a user subclass
697
+ // holds cycle-capable fields — capability is hierarchy-uniform), so
698
+ // the runtime's own error allocations need collector headers too.
699
+ // Declared inline: the extern block already flushed (LLVM is
700
+ // order-free, the helper-defs precedent).
701
+ out.push(`declare void @scr_error_set_traced()`, ``);
702
+ stamps.push(` call void @scr_error_set_traced()`);
703
+ }
704
+ if ((entryMayThrow || runsLoop) && emitter.mod.lib === undefined) {
705
+ // Declared inline: the extern block already flushed (LLVM is
706
+ // order-free — the scr_error_set_traced precedent). Only the
707
+ // printer emits here (nothing else declares it); scr_exc_pending
708
+ // and the loop entry points rode the Set before the flush.
709
+ out.push(`declare void @scr_exc_print_uncaught()`, `declare zeroext i1 @scr_exc_handle_uncaught(i1 zeroext)`, ``);
710
+ }
711
+ if (emitter.mod.lib !== undefined) {
712
+ // LIBRARY mode: no @main — the profile-declared external
713
+ // symbols specified by the library IR instead.
714
+ for (const line of emitter.emitLibDefs(globals, globalReleaseLines, stamps))
715
+ out.push(line);
716
+ out.push(...emitter.inlineRcTail(flushedDecls));
717
+ out.push(`attributes #0 = { sanitize_address }`);
718
+ if (emitter.usesCoroutines)
719
+ out.push(`attributes #1 = { sanitize_address presplitcoroutine }`);
720
+ if (hasNoInlineRecordClone)
721
+ out.push(`attributes #2 = { noinline sanitize_address }`);
722
+ out.push(``);
723
+ out.push(...emitter.fieldAliasMetadata());
724
+ if (emitter.debug !== null)
725
+ out.push(emitter.debug.render());
726
+ return out;
727
+ }
728
+ out.push(`define i32 @${emitter.mod.workers ? "sc_context_entry" : emitter.wasi ? "__main_argc_argv" : "main"}(i32 %argc, ptr %argv) ${FN_ATTRS} {`, `entry:`, ...(emitter.runtimeAbiMarker ? [` call void @${RUNTIME_ABI_MARKER}()`] : []), ...(emitter.mod.workers ? [` call void @scr_runtime_workers_v8()`] : []), ` call void @scr_init()`,
729
+ // Each context (the main thread, every worker) installs its stack
730
+ // guard before running compiled code that checks it.
731
+ ...(emitter.stackChecks?.size ? [` call void @scr_stack_guard_init()`] : []), ...stamps,
732
+ // Event-surface programs (signal/exit listeners) fill the loop's
733
+ // nullable event hooks before %main — scr_events.c links only when
734
+ // this line is emitted (native/executable.ts gates on the same predicate).
735
+ ...(usesEvents ? [` call void @scr_events_install()`] : []), ...(usesChildProcess ? [` call void @scr_child_dyn_install()`] : []), ...(childStreamBoxes
736
+ ? [
737
+ ` call void @scr_child_dyn_streams_install(ptr @scr_stream_child_ops, ptr @${childStreamBoxes[0]}, ptr @${childStreamBoxes[1]})`,
738
+ ]
739
+ : []), ...(workerStdioBox || workerStdinBox
740
+ ? [
741
+ ` call void @scr_worker_stdio_install(ptr @scr_stream_child_ops, ptr ${workerStdioBox ? `@${workerStdioBox}` : "null"}, ptr ${workerStdinBox ? `@${workerStdinBox}` : "null"})`,
742
+ ]
743
+ : []),
744
+ // fs.watch programs fill the loop's watch hooks the same way —
745
+ // scr_watch.c links only when this line is emitted.
746
+ ...(usesFsWatch ? [` call void @scr_watch_install()`] : []), ...(emitter.ffiHasForeignCallback ? [` call void @scr_ffi_install()`] : []), ...(snapshotsTlsCa ? [` call void @scr_tls_ca_install()`] : []), ...(usesFetch ? [` call void @scr_fetch_install()`] : []), ...(usesNet ? [` call void @scr_net_install()`, ` call void @scr_net_dyn_install()`] : []), ...(usesNetLookup ? [` call void @scr_net_lookup_install()`] : []), ...(usesHttp ? [` call void @scr_http_dyn_install()`] : []), ...(usesDgram ? [` call void @scr_dgram_install()`] : []), ...(usesHttp2 ? [` call void @scr_http2_dyn_install()`] : []), ...(usesStream ? [` call void @scr_stream_install()`] : []), ` call void @scr_lib_init(i32 %argc, ptr %argv)`,
747
+ // node:test takes Node's --test-update-snapshots out of argv first.
748
+ ...(usesNodeTest ? [` call void @scr_test_init()`] : []), ...(asyncEntry
749
+ ? [` %top = call ptr @${mangleAsyncSpawn(emitter.mod.entry)}()`]
750
+ : [` call void @${mangleFunction(emitter.mod.entry)}()`]),
751
+ // Uncaught exception from top-level code: Node exits 1.
752
+ ...(entryMayThrow && !asyncEntry
753
+ ? [
754
+ ` %exc = call zeroext i1 @scr_exc_pending()`,
755
+ ` br i1 %exc, label %uncaught, label %ok`,
756
+ `uncaught:`,
757
+ ` %handled = call zeroext i1 @scr_exc_handle_uncaught(i1 false)`,
758
+ ` br i1 %handled, label %ok, label %fatal`,
759
+ `fatal:`,
760
+ ` call void @scr_exc_print_uncaught()`,
761
+ ...exitListenerLines("xu"),
762
+ ...uncaughtReleases,
763
+ ` %failure_code_0 = call i32 @scr_exit_code_hint_get()`,
764
+ ` ret i32 %failure_code_0`,
765
+ `ok:`,
766
+ ]
767
+ : []),
768
+ // The event loop runs to exhaustion (microtasks before timers). A
769
+ // throw escaping a timer callback and unhandled promise rejections
770
+ // both exit 1, like Node — the C main's loop block exactly.
771
+ ...(runsLoop
772
+ ? [
773
+ ...(emitter.mod.commonJsEntry === true ? [` call void @scr_loop_commonjs_entry()`] : []),
774
+ // performance.eventLoopUtilization measures from here on.
775
+ ...(emitter.readsLoopMetrics() ? [` call void @scr_perf_loop_mark()`] : []),
776
+ ` %loop_rejection = call zeroext i1 @scr_loop_run(ptr ${asyncEntry ? "%top" : "null"})`,
777
+ ` %lexc = call zeroext i1 @scr_exc_pending()`,
778
+ ` br i1 %lexc, label %luncaught, label %lok`,
779
+ `luncaught:`,
780
+ ` call void @scr_exc_print_uncaught()`,
781
+ ...(asyncEntry ? [` call void @scr_promise_release(ptr %top)`] : []),
782
+ ...exitListenerLines("xl"),
783
+ ...loopReleasesU,
784
+ ` %failure_code_1 = call i32 @scr_exit_code_hint_get()`,
785
+ ` ret i32 %failure_code_1`,
786
+ `lok:`,
787
+ ` br i1 %loop_rejection, label %lreported, label %lclean`,
788
+ `lreported:`,
789
+ ` call void @scr_discard_unhandled_rejections()`,
790
+ ...(asyncEntry ? [` call void @scr_promise_release(ptr %top)`] : []),
791
+ ...exitListenerLines("xq"),
792
+ ...loopReportedReleases,
793
+ ` %failure_code_2 = call i32 @scr_exit_code_hint_get()`,
794
+ ` ret i32 %failure_code_2`,
795
+ `lclean:`,
796
+ ...(asyncEntry
797
+ ? [
798
+ ` %tla_status = call i32 @scr_promise_finish_top_level(ptr %top)`,
799
+ ` %tla_rejected = icmp eq i32 %tla_status, 1`,
800
+ ` br i1 %tla_rejected, label %tla_fail, label %tla_not_rejected`,
801
+ `tla_fail:`,
802
+ // The loop already delivered every earlier-checkpoint
803
+ // rejection. Drop same-checkpoint competitors before
804
+ // surfacing the fatal module verdict.
805
+ ` call void @scr_discard_unhandled_rejections()`,
806
+ ` call void @scr_promise_rethrow_top_level(ptr %top)`,
807
+ ` call void @scr_promise_release(ptr %top)`,
808
+ ` call void @scr_exc_print_uncaught()`,
809
+ ...exitListenerLines("xt"),
810
+ ...topRejectReleases,
811
+ ` %failure_code_3 = call i32 @scr_exit_code_hint_get()`,
812
+ ` ret i32 %failure_code_3`,
813
+ `tla_not_rejected:`,
814
+ ` call void @scr_promise_release(ptr %top)`,
815
+ ]
816
+ : []),
817
+ ` %rej = call zeroext i1 @scr_report_unhandled_rejections()`,
818
+ ` br i1 %rej, label %lrej, label %lrok`,
819
+ `lrej:`,
820
+ ...exitListenerLines("xr"),
821
+ ...loopReleasesR,
822
+ ` %failure_code_4 = call i32 @scr_exit_code_hint_get()`,
823
+ ` ret i32 %failure_code_4`,
824
+ `lrok:`,
825
+ ...(asyncEntry
826
+ ? [
827
+ ` %tla_pending = icmp eq i32 %tla_status, 13`,
828
+ ` br i1 %tla_pending, label %tla_stuck, label %tla_ok`,
829
+ `tla_stuck:`,
830
+ ...topPendingExitLines(),
831
+ `tla_ok:`,
832
+ ]
833
+ : []),
834
+ ]
835
+ : []), ...exitListenerLines("xn"), ...globalReleases, ...(usesNodeTest
836
+ ? [` %test_exit = call i32 @scr_test_exit_code()`, ` ret i32 %test_exit`]
837
+ : [` %native_exit = call i32 @scr_exit_code_hint_get()`, ` ret i32 %native_exit`]), `}`, ``, ...emitter.inlineRcTail(flushedDecls),
838
+ // sanitize_address is inert under the plain pipeline; the sanitized
839
+ // lane's -fsanitize=address link activates instrumentation over the
840
+ // emitted functions too (the runtime TUs get theirs from clang).
841
+ `attributes #0 = { sanitize_address }`, ...(emitter.usesCoroutines ? [`attributes #1 = { sanitize_address presplitcoroutine }`] : []), ...(hasNoInlineRecordClone ? [`attributes #2 = { noinline sanitize_address }`] : []), ``);
842
+ if (emitter.mod.workers) {
843
+ out.push(`declare void @scr_context_cleanup()`, `declare i32 @scr_worker_argc()`, `declare ptr @scr_worker_argv()`, `define i32 @sc_worker_entry(i32 %root) ${FN_ATTRS} {`, `entry:`, ` %argc = call i32 @scr_worker_argc()`, ` %argv = call ptr @scr_worker_argv()`, ` %result = call i32 @sc_context_entry(i32 %argc, ptr %argv)`, ` ret i32 %result`, `}`, `define i32 @main(i32 %argc, ptr %argv) ${FN_ATTRS} {`, `entry:`, ` %result = call i32 @sc_context_entry(i32 %argc, ptr %argv)`, ` call void @scr_context_cleanup()`, ` ret i32 %result`, `}`);
844
+ }
845
+ out.push(...emitter.fieldAliasMetadata());
846
+ if (emitter.debug !== null)
847
+ out.push(emitter.debug.render());
848
+ return out;
849
+ }
850
+ /** The shared abort helpers (emitted only when referenced): the OOM
851
+ * abort of untraced shape allocation and the invalid-union-tag abort —
852
+ * both print the runtime ABI’s exact message on fd 2 and abort. */
853
+ export function helperDefs(emitter) {
854
+ const defs = [];
855
+ const msgHelper = (fnName, msgSym, msg) => {
856
+ // The message routes through the runtime's trap funnel: executable
857
+ // builds expand to the historical bytes-on-stderr + abort; library
858
+ // builds route to the registered panic sink (scr_runtime.h).
859
+ const bytes = Buffer.byteLength(msg, "utf8");
860
+ emitter.declare(`declare void @scr_trap(ptr)`);
861
+ defs.push(`@${msgSym} = internal constant [${bytes + 1} x i8] c"${llStrBytes(msg)}"`, `define internal void @${fnName}() ${FN_ATTRS} {`, `entry:`, ` call void @scr_trap(ptr @${msgSym})`, ` unreachable`, `}`, ``);
862
+ };
863
+ if (emitter.needsOom)
864
+ msgHelper("sc_oom", "sc_oom_msg", "scriptc: out of memory\n");
865
+ if (emitter.needsBadTag) {
866
+ msgHelper("sc_bad_tag", "sc_bad_tag_msg", "scriptc: internal error: invalid union tag\n");
867
+ }
868
+ if (emitter.needsBadKey) {
869
+ // The keyed-read miss on a result type that cannot say `undefined`:
870
+ // trap like an array OOB read instead of corrupting a typed slot
871
+ // (SEMANTICS.md; the C helper's message additionally interpolates
872
+ // the runtime key — a trap-path debugging nicety, never reachable
873
+ // by a program whose behavior matches Node).
874
+ msgHelper("sc_bad_key", "sc_bad_key_msg", "scriptc: TypeError: record has no key (typed slot — no undefined is representable)\n");
875
+ }
876
+ if (emitter.needsRetainBox) {
877
+ // scr_box_retain is a static inline (increment-unless-immortal);
878
+ // emitted once with internal linkage, like the record retains.
879
+ defs.push(`define internal ptr @sc_retain_box(ptr %b) ${FN_ATTRS} {`, `entry:`, ` %rc = load ${emitter.sizeType}, ptr %b`, ` %imm = icmp eq ${emitter.sizeType} %rc, -1`, ` br i1 %imm, label %done, label %inc`, `inc:`, ` %n = add ${emitter.sizeType} %rc, 1`, ` store ${emitter.sizeType} %n, ptr %b`, ` br label %done`, `done:`, ` ret ptr %b`, `}`, ``);
880
+ }
881
+ // Number-key Map/Set lookups probe the runtime's direct index inline:
882
+ // while ndense is nonzero every live key is an integer below it, so an
883
+ // in-range integral key reads its slot (entry index + 1, 0 = absent) and
884
+ // any other key is absent. Maps without the index (ndense 0) hash the
885
+ // key in sc_map_entry_f64_hashed, which scans the entries of a small map
886
+ // or probes a compact bucket table as scr_map_find_f64 does, and calls
887
+ // the runtime lookup for a wide table. It stays out of line so that the
888
+ // direct-index path stays small at every call site. Both only read
889
+ // memory, so LLVM merges lookups of one key when nothing is stored in
890
+ // between (a has() followed by get(), for example).
891
+ if (emitter.decls.has(NUMBER_MAP_ENTRY_DECL)) {
892
+ const sz = emitter.sizeType;
893
+ let mapTmp = 0;
894
+ const mapIndex = exactIndexLines("%k", "%nd", sz, () => `%ix${mapTmp++}`);
895
+ defs.push(`define internal ptr @sc_map_entry_f64(ptr %m, double %k) ${FN_ATTRS} {`, `entry:`, ` %ndp = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 16`, ...(sz === "i64"
896
+ ? [` %nd32 = load i32, ptr %ndp`, ` %nd = zext i32 %nd32 to i64`]
897
+ : [` %nd = load i32, ptr %ndp`]),
898
+ // A non-integral key inside the table is as absent as one outside it.
899
+ ...mapIndex.lines.map((line) => ` ${line}`), ` br i1 ${mapIndex.ok}, label %slot, label %outside`, `slot:`, sz === "i64"
900
+ ? ` %i = add i64 ${mapIndex.wide}, 0`
901
+ : ` %i = trunc i64 ${mapIndex.wide} to ${sz}`, ` %dp = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 15`, ` %dense = load ptr, ptr %dp`, ` %sp = getelementptr inbounds i32, ptr %dense, ${sz} %i`, ` %s = load i32, ptr %sp`, ` %empty = icmp eq i32 %s, 0`, ` br i1 %empty, label %miss, label %hit`, `hit:`, ` %e32 = sub i32 %s, 1`, sz === "i32" ? ` %e = add i32 %e32, 0` : ` %e = zext i32 %e32 to ${sz}`, ` %ep = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 11`, ` %entries = load ptr, ptr %ep`, ` %found = getelementptr inbounds %ScrMapNumEntry, ptr %entries, ${sz} %e`, ` ret ptr %found`, `miss:`, ` ret ptr null`, `outside:`, ` %dense.any = icmp ne ${sz} %nd, 0`, ` br i1 %dense.any, label %miss, label %slow`, `slow:`, ` %hashed = call ptr @sc_map_entry_f64_hashed(ptr %m, double %k)`, ` ret ptr %hashed`, `}`, ``,
902
+ // Hashing (scr_map_find_f64): the SameValueZero key word, its
903
+ // scr_key_mix hash (zero remapped to one) and the absent-key filter.
904
+ `define internal ptr @sc_map_entry_f64_hashed(ptr %m, double %k) noinline ${FN_ATTRS} {`, `entry:`, ` %nan = fcmp uno double %k, %k`, ` %zero = fcmp oeq double %k, 0.0`, ` %kz = select i1 %zero, double 0.0, double %k`, ` %kzb = bitcast double %kz to i64`, ` %kb = select i1 %nan, i64 9221120237041090560, i64 %kzb`, ` %x1s = lshr i64 %kb, 30`, ` %x1 = xor i64 %kb, %x1s`, ` %x2 = mul i64 %x1, -4658895280553007687`, ` %x3s = lshr i64 %x2, 27`, ` %x3 = xor i64 %x2, %x3s`, ` %x4 = mul i64 %x3, -7723592293110705685`, ` %x5s = lshr i64 %x4, 31`, ` %x5 = xor i64 %x4, %x5s`, ` %hz = icmp eq i64 %x5, 0`, ` %h = select i1 %hz, i64 1, i64 %x5`, ` %f1s = lshr i64 %h, 44`, ` %f1a = and i64 %f1s, 63`, ` %f1 = shl i64 1, %f1a`, ` %f2s = lshr i64 %h, 50`, ` %f2a = and i64 %f2s, 63`, ` %f2 = shl i64 1, %f2a`, ` %fb = or i64 %f1, %f2`, ` %fp = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 10`, ` %filter = load i64, ptr %fp`, ` %fm = and i64 %filter, %fb`, ` %fin = icmp eq i64 %fm, %fb`, ` br i1 %fin, label %table, label %miss`, `table:`, ` %nbp = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 13`, ...(sz === "i64"
905
+ ? [` %nb32 = load i32, ptr %nbp`, ` %nb = zext i32 %nb32 to i64`]
906
+ : [` %nb = load i32, ptr %nbp`]), ` %eps = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 11`, ` %ents = load ptr, ptr %eps`, ` %linear = icmp eq ${sz} %nb, 0`, ` br i1 %linear, label %scan, label %buckets`,
907
+ // Small maps keep no bucket table: scan the entries' keys. A number-key
908
+ // entry has no cached hash; a dead entry's key matches no key.
909
+ `scan:`, ` %nep = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 8`, ...(sz === "i64"
910
+ ? [` %ne32 = load i32, ptr %nep`, ` %ne = zext i32 %ne32 to i64`]
911
+ : [` %ne = load i32, ptr %nep`]), ` br label %scan.loop`, `scan.loop:`, ` %si = phi ${sz} [ 0, %scan ], [ %si.next, %scan.next ]`, ` %sdone = icmp eq ${sz} %si, %ne`, ` br i1 %sdone, label %miss, label %scan.entry`, `scan.entry:`, ` %se = getelementptr inbounds %ScrMapNumEntry, ptr %ents, ${sz} %si`, ` %sk = load i64, ptr %se`, ` %skq = icmp eq i64 %sk, %kb`, ` br i1 %skq, label %scan.found, label %scan.next`, `scan.found:`, ` ret ptr %se`, `scan.next:`, ` %si.next = add ${sz} %si, 1`, ` br label %scan.loop`,
912
+ // Compact tables tag each 24-bit entry index (+1) with the hash's
913
+ // top byte; wider tables take the runtime lookup.
914
+ `buckets:`, ` %wide = icmp ugt ${sz} %nb, 16777216`, ` br i1 %wide, label %runtime, label %probe`, `probe:`, ` %bp = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 14`, ` %bk = load ptr, ptr %bp`, ` %mask = sub ${sz} %nb, 1`, ` %ht = lshr i64 %h, 32`, ` %ht32 = trunc i64 %ht to i32`, ` %tag = and i32 %ht32, -16777216`, sz === "i64" ? ` %hi = add i64 %h, 0` : ` %hi = trunc i64 %h to ${sz}`, ` %i0 = and ${sz} %hi, %mask`, ` br label %probe.loop`, `probe.loop:`, ` %pi = phi ${sz} [ %i0, %probe ], [ %pi.next, %probe.next ]`, ` %bep = getelementptr inbounds i32, ptr %bk, ${sz} %pi`, ` %b = load i32, ptr %bep`, ` %bempty = icmp eq i32 %b, 0`, ` br i1 %bempty, label %miss, label %probe.tag`, `probe.tag:`, ` %bt = and i32 %b, -16777216`, ` %btq = icmp eq i32 %bt, %tag`, ` br i1 %btq, label %probe.entry, label %probe.next`, `probe.entry:`, ` %bix = and i32 %b, 16777215`, ` %bix1 = sub i32 %bix, 1`, sz === "i32" ? ` %bi = add i32 %bix1, 0` : ` %bi = zext i32 %bix1 to ${sz}`, ` %pe = getelementptr inbounds %ScrMapNumEntry, ptr %ents, ${sz} %bi`, ` %pk = load i64, ptr %pe`, ` %pkq = icmp eq i64 %pk, %kb`, ` br i1 %pkq, label %probe.found, label %probe.next`, `probe.found:`, ` ret ptr %pe`, `probe.next:`, ` %pi.inc = add ${sz} %pi, 1`, ` %pi.next = and ${sz} %pi.inc, %mask`, ` br label %probe.loop`, `miss:`, ` ret ptr null`, `runtime:`, ` %r = call ptr @scr_map_entry_f64(ptr %m, double %k) memory(read) nounwind willreturn`, ` ret ptr %r`, `}`, ``);
915
+ }
916
+ // Map/Set iteration steps read the entries array inline: an index is
917
+ // live when it is below the entry count and its entry's cached hash is
918
+ // nonzero (a tombstone's is zero), as scr_map_iter_live decides, or for
919
+ // a number-key map when its key is not SCR_MAP_NUM_DEAD. The entry count
920
+ // is read again at every step, so entries appended during the iteration
921
+ // are visited.
922
+ if (emitter.decls.has(MAP_ITER_DECL) || emitter.decls.has(MAP_ITER_NUM_DECL)) {
923
+ const sz = emitter.sizeType;
924
+ if (emitter.decls.has(MAP_ITER_DECL))
925
+ defs.push(`define internal ptr @sc_map_iter_entry(ptr %m, double %i) ${FN_ATTRS} {`, `entry:`, ` %np = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 8`, ` %n = load i32, ptr %np`, ` %nf = uitofp i32 %n to double`, ` %lo = fcmp oge double %i, 0.0`, ` %hi = fcmp olt double %i, %nf`, ` %in = and i1 %lo, %hi`, ` br i1 %in, label %load, label %none`, `load:`, ` %ix = fptoui double %i to ${sz}`, ` %ep = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 11`, ` %entries = load ptr, ptr %ep`, ` %e = getelementptr inbounds %ScrMapEntry, ptr %entries, ${sz} %ix`, ` %hp = getelementptr inbounds %ScrMapEntry, ptr %e, i32 0, i32 2`, ` %h = load i64, ptr %hp`, ` %live = icmp ne i64 %h, 0`, ` br i1 %live, label %yes, label %none`, `yes:`, ` ret ptr %e`, `none:`, ` ret ptr null`, `}`, ``);
926
+ if (emitter.decls.has(MAP_ITER_NUM_DECL))
927
+ defs.push(`define internal ptr @sc_map_iter_entry_num(ptr %m, double %i) ${FN_ATTRS} {`, `entry:`, ` %np = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 8`, ` %n = load i32, ptr %np`, ` %nf = uitofp i32 %n to double`, ` %lo = fcmp oge double %i, 0.0`, ` %hi = fcmp olt double %i, %nf`, ` %in = and i1 %lo, %hi`, ` br i1 %in, label %load, label %none`, `load:`, ` %ix = fptoui double %i to ${sz}`, ` %ep = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 11`, ` %entries = load ptr, ptr %ep`, ` %e = getelementptr inbounds %ScrMapNumEntry, ptr %entries, ${sz} %ix`, ` %key = load i64, ptr %e`, ` %live = icmp ne i64 %key, ${SCR_MAP_NUM_DEAD}`, ` br i1 %live, label %yes, label %none`, `yes:`, ` ret ptr %e`, `none:`, ` ret ptr null`, `}`, ``);
928
+ defs.push(`define internal double @sc_map_iter_count(ptr %m) ${FN_ATTRS} {`, `entry:`, ` %np = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 8`, ` %n = load i32, ptr %np`, ` %nf = uitofp i32 %n to double`, ` ret double %nf`, `}`, ``);
929
+ }
930
+ // String-key Map/Set lookups test the map's absent-key filter inline
931
+ // (scr_map.c scr_map_filter_bits): a key whose two filter bits are not
932
+ // both set is absent, so most misses on small and medium maps return
933
+ // without a call. On 64-bit targets the key's cached hash h is the high
934
+ // half of its capacity word, the runtime's widened hash is (h << 32) | h,
935
+ // and the filter reads its bits 44..55, which are the capacity word's
936
+ // own. A key without a cached hash, and every possible hit, take the
937
+ // runtime lookup.
938
+ if (emitter.decls.has(STRING_MAP_ENTRY_DECL)) {
939
+ defs.push(`define internal ptr @sc_map_entry_str(ptr %m, ptr %k) ${FN_ATTRS} {`, `entry:`, ...(emitter.sizeType === "i64"
940
+ ? [
941
+ ` %fp = getelementptr inbounds %ScrMapIx, ptr %m, i32 0, i32 10`,
942
+ ` %filter = load i64, ptr %fp`,
943
+ ` %capp = getelementptr inbounds %ScrStr, ptr %k, i32 0, i32 2`,
944
+ ` %cap = load i64, ptr %capp`,
945
+ ` %cached = icmp uge i64 %cap, 4294967296`,
946
+ ` br i1 %cached, label %test, label %slow`,
947
+ `test:`,
948
+ ` %s1 = lshr i64 %cap, 44`,
949
+ ` %i1 = and i64 %s1, 63`,
950
+ ` %b1 = shl i64 1, %i1`,
951
+ ` %s2 = lshr i64 %cap, 50`,
952
+ ` %i2 = and i64 %s2, 63`,
953
+ ` %b2 = shl i64 1, %i2`,
954
+ ` %bits = or i64 %b1, %b2`,
955
+ ` %have = and i64 %filter, %bits`,
956
+ ` %maybe = icmp eq i64 %have, %bits`,
957
+ ` br i1 %maybe, label %slow, label %absent`,
958
+ `absent:`,
959
+ ` ret ptr null`,
960
+ ]
961
+ : [` br label %slow`]), `slow:`, ` %r = call ptr @scr_map_entry_str(ptr %m, ptr %k)`, ` ret ptr %r`, `}`, ``);
962
+ }
963
+ // String comparisons enter through small internal wrappers that LLVM
964
+ // inlines at each site: interned literals and shared values compare by
965
+ // identity, and equality rejects different byte lengths, before any
966
+ // runtime call (scr_str_eq/scr_str_cmp keep the complete semantics).
967
+ if (emitter.decls.has(`declare zeroext i1 @scr_str_eq(ptr, ptr)`)) {
968
+ defs.push(`define internal zeroext i1 @sc_str_eq(ptr %a, ptr %b) ${FN_ATTRS} {`, `entry:`, ` %same = icmp eq ptr %a, %b`, ` br i1 %same, label %yes, label %lengths`, `lengths:`, ` %alen.p = getelementptr inbounds %ScrStr, ptr %a, i32 0, i32 1`, ` %blen.p = getelementptr inbounds %ScrStr, ptr %b, i32 0, i32 1`, ` %alen = load ${emitter.sizeType}, ptr %alen.p`, ` %blen = load ${emitter.sizeType}, ptr %blen.p`, ` %samelen = icmp eq ${emitter.sizeType} %alen, %blen`, ` br i1 %samelen, label %bytes, label %no`, `bytes:`, ` %eq = call zeroext i1 @scr_str_eq(ptr %a, ptr %b)`, ` ret i1 %eq`, `yes:`, ` ret i1 true`, `no:`, ` ret i1 false`, `}`, ``);
969
+ }
970
+ for (const [text, name] of emitter.literalEqualities) {
971
+ defs.push(...literalEqualityDefinition(name, wtf8Bytes(text), emitter.internLiteral(text), emitter.sizeType, FN_ATTRS), ``);
972
+ }
973
+ // String length and charCodeAt read proven-ASCII strings inline: bit 31
974
+ // of the capacity word (SCR_STR_ASCII_BIT, the low half's sign bit on
975
+ // little-endian targets) makes UTF-16 units bytes. Unproven strings and
976
+ // anything but an in-range index take the runtime's UTF-16 mapping.
977
+ // A scan's receiver reads inline too (ScrStrScan): from ordinary global
978
+ // storage, or, in worker executables, from the thread's static TLS block,
979
+ // one thread-pointer-relative load (see executableTls).
980
+ const scanInline = emitter.executableTls ||
981
+ (emitter.mod.workers !== true && emitter.mod.lib?.threadInstances !== true);
982
+ let scanDeclared = false;
983
+ for (const helper of STRING_READ_HELPERS) {
984
+ if (!emitter.decls.has(helper.decl))
985
+ continue;
986
+ if (scanInline && !scanDeclared) {
987
+ defs.push(stringScanDecl(emitter.sizeType, emitter.executableTls), ``);
988
+ scanDeclared = true;
989
+ }
990
+ defs.push(...helper.define(emitter.sizeType, FN_ATTRS, scanInline), ``);
991
+ }
992
+ // Ordering decides inline from the first differing bytes. The bytes
993
+ // before them are equal, so both strings are at the same position of a
994
+ // character: either both bytes continue characters with the same lead
995
+ // byte, or both start a character. Byte order is the UTF-16 order for
996
+ // two continuation bytes, and for two lead bytes when one starts a
997
+ // character below U+D000, whose UTF-16 unit is below every unit of a
998
+ // character with a lead byte of at least 0xED. Between lead bytes of at
999
+ // least 0xED, a supplementary character (0xF0..0xF4, a high surrogate
1000
+ // unit) orders below U+E000..U+FFFF (0xEE, 0xEF), and a lead byte of
1001
+ // 0xED (U+D000..U+D7FF or a lone surrogate) takes the runtime.
1002
+ // Differing words without a byte of at least 0xED decide in byte
1003
+ // order; other differing words decide by their first differing byte,
1004
+ // and strings shorter than a word by their first byte. Otherwise a
1005
+ // proven-ASCII string on either side orders by bytes (scr_str_cmp), and
1006
+ // other pairs call scr_str_cmp_u16_bytes, which only reads the two
1007
+ // strings, so LLVM can merge repeated comparisons of one pair. Callers
1008
+ // only test the sign of the result.
1009
+ if (emitter.decls.has(`declare i32 @scr_str_cmp_u16(ptr, ptr)`)) {
1010
+ const fn = "scr_str_cmp_u16";
1011
+ emitter.declare("declare i64 @llvm.bswap.i64(i64)");
1012
+ emitter.declare("declare i64 @llvm.cttz.i64(i64, i1 immarg)");
1013
+ emitter.declare("declare i8 @llvm.umin.i8(i8, i8)");
1014
+ emitter.declare("declare i32 @scr_str_cmp(ptr, ptr)");
1015
+ emitter.declare("declare i32 @scr_str_cmp_u16_bytes(ptr, ptr)");
1016
+ defs.push(`define internal i32 @${fn.replace(/^scr_/, "sc_")}(ptr %a, ptr %b) ${FN_ATTRS} {`, `entry:`, ` %same = icmp eq ptr %a, %b`, ` br i1 %same, label %equal, label %lengths`, `lengths:`, ` %alen.p = getelementptr inbounds %ScrStr, ptr %a, i32 0, i32 1`, ` %blen.p = getelementptr inbounds %ScrStr, ptr %b, i32 0, i32 1`, ` %alen = load ${emitter.sizeType}, ptr %alen.p`, ` %blen = load ${emitter.sizeType}, ptr %blen.p`, ` %aempty = icmp eq ${emitter.sizeType} %alen, 0`, ` %bempty = icmp eq ${emitter.sizeType} %blen, 0`, ` %empty = or i1 %aempty, %bempty`, ` br i1 %empty, label %order, label %words`,
1017
+ // Both at least 8 bytes: the first word of each.
1018
+ `words:`, ` %along = icmp uge ${emitter.sizeType} %alen, 8`, ` %blong = icmp uge ${emitter.sizeType} %blen, 8`, ` %long = and i1 %along, %blong`, ` br i1 %long, label %word, label %first`, `word:`, ` %awp = getelementptr inbounds %ScrStr, ptr %a, i32 1`, ` %bwp = getelementptr inbounds %ScrStr, ptr %b, i32 1`, ` %aw = load i64, ptr %awp, align 1`, ` %bw = load i64, ptr %bwp, align 1`, ` %wdiffer = icmp ne i64 %aw, %bw`, ` br i1 %wdiffer, label %differ, label %wsame`,
1019
+ // Equal first words and one length of at most 16 bytes: the word
1020
+ // ending at that length covers the rest, and any difference lies
1021
+ // past the equal first word.
1022
+ `wsame:`, ` %samelen = icmp eq ${emitter.sizeType} %alen, %blen`, ` %short = icmp ule ${emitter.sizeType} %alen, 16`, ` %tailable = and i1 %samelen, %short`, ` br i1 %tailable, label %tail, label %order`, `tail:`, ` %toff = sub ${emitter.sizeType} %alen, 8`, ` %atp = getelementptr inbounds i8, ptr %awp, ${emitter.sizeType} %toff`, ` %btp = getelementptr inbounds i8, ptr %bwp, ${emitter.sizeType} %toff`, ` %at = load i64, ptr %atp, align 1`, ` %bt = load i64, ptr %btp, align 1`, ` %tdiffer = icmp ne i64 %at, %bt`, ` br i1 %tdiffer, label %differ, label %equal`, `first:`, ` %adata = getelementptr inbounds %ScrStr, ptr %a, i32 1`, ` %bdata = getelementptr inbounds %ScrStr, ptr %b, i32 1`, ` %x = load i8, ptr %adata`, ` %y = load i8, ptr %bdata`, ` %fdiffer = icmp ne i8 %x, %y`, ` br i1 %fdiffer, label %bytes, label %order`,
1023
+ // Two differing words. When neither has a byte of at least 0xED
1024
+ // (a byte b is when its high bit and bit 7 of (b & 0x7f) + 0x13 are
1025
+ // set), byte-swapped little-endian words compare in byte order.
1026
+ // Otherwise the lowest set byte of their xor is the first differing
1027
+ // byte.
1028
+ `differ:`, ` %dx = phi i64 [ %aw, %word ], [ %at, %tail ]`, ` %dy = phi i64 [ %bw, %word ], [ %bt, %tail ]`, ` %xl = and i64 %dx, 9187201950435737471`, ` %yl = and i64 %dy, 9187201950435737471`, ` %xa = add i64 %xl, 1374463283923456787`, ` %ya = add i64 %yl, 1374463283923456787`, ` %xh = and i64 %dx, %xa`, ` %yh = and i64 %dy, %ya`, ` %hh = or i64 %xh, %yh`, ` %whigh = and i64 %hh, -9187201950435737472`, ` %dlow = icmp eq i64 %whigh, 0`, ` br i1 %dlow, label %wordorder, label %locate`, `wordorder:`, ` %xsw = call i64 @llvm.bswap.i64(i64 %dx)`, ` %ysw = call i64 @llvm.bswap.i64(i64 %dy)`, ` %wbelow = icmp ult i64 %xsw, %ysw`, ` %wsign = select i1 %wbelow, i32 -1, i32 1`, ` ret i32 %wsign`, `locate:`, ` %dxor = xor i64 %dx, %dy`, ` %dtz = call i64 @llvm.cttz.i64(i64 %dxor, i1 true)`, ` %dshift = and i64 %dtz, 56`, ` %dxs = lshr i64 %dx, %dshift`, ` %dys = lshr i64 %dy, %dshift`, ` %dxb = trunc i64 %dxs to i8`, ` %dyb = trunc i64 %dys to i8`, ` br label %bytes`,
1029
+ // The first differing bytes.
1030
+ `bytes:`, ` %bx = phi i8 [ %x, %first ], [ %dxb, %locate ]`, ` %by = phi i8 [ %y, %first ], [ %dyb, %locate ]`, ` %bmin = call i8 @llvm.umin.i8(i8 %bx, i8 %by)`, ` %blow = icmp ult i8 %bmin, -19`, ` br i1 %blow, label %byte, label %high`,
1031
+ // Both at least 0xED. A lone surrogate (0xED) takes the runtime;
1032
+ // supplementary lead bytes (0xF0..0xF4) order below 0xEE and 0xEF
1033
+ // once 0x10 is subtracted from them.
1034
+ `high:`, ` %xed = icmp eq i8 %bx, -19`, ` %yed = icmp eq i8 %by, -19`, ` %ed = or i1 %xed, %yed`, ` br i1 %ed, label %order, label %planes`, `planes:`, ` %xsupp = icmp uge i8 %bx, -16`, ` %ysupp = icmp uge i8 %by, -16`, ` %xlow = add i8 %bx, -16`, ` %ylow = add i8 %by, -16`, ` %xk = select i1 %xsupp, i8 %xlow, i8 %bx`, ` %yk = select i1 %ysupp, i8 %ylow, i8 %by`, ` %kbelow = icmp ult i8 %xk, %yk`, ` %ksign = select i1 %kbelow, i32 -1, i32 1`, ` ret i32 %ksign`, `byte:`, ` %below = icmp ult i8 %bx, %by`, ` %sign = select i1 %below, i32 -1, i32 1`, ` ret i32 %sign`, `order:`, ` %acw.p = getelementptr inbounds %ScrStr, ptr %a, i32 0, i32 2`, ` %bcw.p = getelementptr inbounds %ScrStr, ptr %b, i32 0, i32 2`, ` %acw = load i32, ptr %acw.p`, ` %bcw = load i32, ptr %bcw.p`, ` %cws = or i32 %acw, %bcw`, ` %anyascii = icmp slt i32 %cws, 0`, ` br i1 %anyascii, label %memorder, label %units`, `memorder:`, ` %m = call i32 @scr_str_cmp(ptr %a, ptr %b)`, ` ret i32 %m`, `units:`, ` %c = call i32 @scr_str_cmp_u16_bytes(ptr %a, ptr %b) nounwind willreturn memory(argmem: read)`, ` ret i32 %c`, `equal:`, ` ret i32 0`, `}`, ``);
1035
+ }
1036
+ // The declarations these helpers added must land in the extern block,
1037
+ // which already flushed — append here instead (LLVM is order-free).
1038
+ return defs.length > 0 ? [...defs] : defs;
1039
+ }
1040
+ /** LIBRARY mode: the profile-declared external definitions — the
1041
+ * export-map wrappers plus init / sink-registration / reset / collect.
1042
+ * Plain `define` (not `define internal`) — the exact linkage distinction
1043
+ * that separates the executable lane's @main from everything else. The
1044
+ * bodies delegate every runtime half to scr_library.c, mirroring the C
1045
+ * emission line for line, so the two lanes are identical by
1046
+ * construction. */
1047
+ export function emitLibDefs(emitter, globals, globalReleaseLines, stamps) {
1048
+ const lib = emitter.mod.lib;
1049
+ const autoReset = lib.resultResetSymbol === null;
1050
+ const out = [``, `; ── library-mode entries (profile: ${lib.profileName}) ──`, ``];
1051
+ // Every entry's prologue records its external symbol in the funnel's
1052
+ // current-entry slot (structured trap-teaching field 2); the symbols
1053
+ // live as internal constants, one per entry.
1054
+ const symConst = (sym) => `@sc_lib_sym_${sym}`;
1055
+ const emitSymConst = (sym) => {
1056
+ out.push(`${symConst(sym)} = internal constant [${Buffer.byteLength(sym, "utf8") + 1} x i8] c"${llStrBytes(sym)}"`);
1057
+ };
1058
+ emitSymConst(lib.initSymbol);
1059
+ emitSymConst(lib.sinkRegisterSymbol);
1060
+ if (lib.callbackRegisterSymbol !== null && lib.callbackRegisterSymbol !== undefined)
1061
+ emitSymConst(lib.callbackRegisterSymbol);
1062
+ if (lib.resultResetSymbol !== null)
1063
+ emitSymConst(lib.resultResetSymbol);
1064
+ if (lib.collectSymbol !== null)
1065
+ emitSymConst(lib.collectSymbol);
1066
+ for (const e of lib.exports)
1067
+ emitSymConst(e.symbol);
1068
+ out.push(``);
1069
+ if (emitter.wasi) {
1070
+ for (const symbol of ["scriptc_alloc", "scriptc_free"])
1071
+ emitSymConst(symbol);
1072
+ out.push(`define ptr @scriptc_alloc(i32 %size) ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_entry(i1 zeroext false, ptr ${symConst("scriptc_alloc")})`, ` %p = call ptr @malloc(i32 %size)`, ` ret ptr %p`, `}`, ``, `define void @scriptc_free(ptr %p) ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_entry(i1 zeroext false, ptr ${symConst("scriptc_free")})`, ` call void @free(ptr %p)`, ` ret void`, `}`, ``);
1073
+ }
1074
+ // The runtime detected-trap overlay table (scr_runtime.h declares it,
1075
+ // the library trap funnel consults it): flat code/teaching/remediation
1076
+ // triples, one per runtime trap code (SC4013–SC4019) the profile
1077
+ // declares text for. The funnel assembles the structured sink message.
1078
+ // The empty table still defines the symbols the funnel links against.
1079
+ const ovlCells = [];
1080
+ lib.trapOverlays.forEach((o, i) => {
1081
+ const cell = (name, text) => {
1082
+ if (text === undefined) {
1083
+ ovlCells.push("ptr null");
1084
+ return;
1085
+ }
1086
+ const sym = `@sc_lib_ovl_${i}_${name}`;
1087
+ out.push(`${sym} = internal constant [${Buffer.byteLength(text, "utf8") + 1} x i8] c"${llStrBytes(text)}"`);
1088
+ ovlCells.push(`ptr ${sym}`);
1089
+ };
1090
+ cell("code", o.code);
1091
+ cell("teach", o.teaching);
1092
+ cell("rem", o.remediation);
1093
+ });
1094
+ out.push(ovlCells.length === 0
1095
+ ? `@scr_library_trap_overlays = constant [1 x ptr] zeroinitializer`
1096
+ : `@scr_library_trap_overlays = constant [${ovlCells.length} x ptr] [${ovlCells.join(", ")}]`, `@scr_library_trap_overlays_len = constant ${emitter.sizeType} ${lib.trapOverlays.length}`, ``);
1097
+ // The init entry: full deterministic reset-and-reevaluate. Program
1098
+ // globals release and zero first (run-once guards included), then the
1099
+ // runtime session reset, the error-vt interval stamps verbatim from
1100
+ // the executable main, %main itself, and the escaped-exception check.
1101
+ const zeroStores = globals.map((g) => {
1102
+ const ty = emitter.llType(g.type);
1103
+ const zero = ty === "double" ? f64Lit(0) : ty === "ptr" ? "null" : "false";
1104
+ return ` store ${ty} ${zero}, ptr @${mangleGlobal(g.id)} ; ${g.name}`;
1105
+ });
1106
+ out.push(`define void @${lib.initSymbol}() ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_entry(i1 zeroext true, ptr ${symConst(lib.initSymbol)}) ; init always resets the result arena`, ...globalReleaseLines("ci"), ...zeroStores, ` call void @scr_library_reset()`, ...stamps, ` call void @${mangleFunction(emitter.mod.entry)}()`, ` call void @scr_library_check_exc()`, ` ret void`, `}`, ``, `define void @${lib.sinkRegisterSymbol}(ptr %fn, ptr %ctx) ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_callback_entry_guard(ptr ${symConst(lib.sinkRegisterSymbol)})`, ` call void @scr_library_set_sink(ptr %fn, ptr %ctx)`, ` ret void`, `}`, ``);
1107
+ if (lib.callbacks !== undefined && lib.callbacks.length > 0) {
1108
+ // Host-callback channels: the per-channel name constants (the
1109
+ // registration dispatch's strcmp operands), the per-channel
1110
+ // unregistered-call trap constants (the ffiCall sites'
1111
+ // scr_library_cb_require operands), and the registration function:
1112
+ // a pure store dispatch
1113
+ // (the sink registration's rule — no entry prologue, no poison
1114
+ // guard) whose first operation rejects callback-time re-entry
1115
+ // (SC4026). An unknown or NULL name is a defined -1, never a store.
1116
+ for (const cb of lib.callbacks) {
1117
+ out.push(`@sc_lib_cb_name_${cb.slot} = internal constant [${Buffer.byteLength(cb.name, "utf8") + 1} x i8] c"${llStrBytes(cb.name)}"`, `@sc_lib_cb_trap_${cb.slot} = internal constant [${Buffer.byteLength(cb.unregisteredTrap, "utf8") + 1} x i8] c"${llStrBytes(cb.unregisteredTrap)}"`);
1118
+ }
1119
+ out.push(``, `define i32 @${lib.callbackRegisterSymbol}(ptr %name, ptr %fn, ptr %ctx) ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_callback_entry_guard(ptr ${symConst(lib.callbackRegisterSymbol)})`, ` %isnull = icmp eq ptr %name, null`, ` br i1 %isnull, label %miss, label %try0`);
1120
+ lib.callbacks.forEach((cb, i) => {
1121
+ const next = i + 1 < lib.callbacks.length ? `try${i + 1}` : "miss";
1122
+ out.push(`try${i}: ; channel '${cb.name}'`, ` %cmp${i} = call i32 @strcmp(ptr %name, ptr @sc_lib_cb_name_${cb.slot})`, ` %eq${i} = icmp eq i32 %cmp${i}, 0`, ` br i1 %eq${i}, label %set${i}, label %${next}`, `set${i}:`, ` call void @scr_library_cb_set(${emitter.sizeType} ${cb.slot}, ptr %fn, ptr %ctx)`, ` ret i32 0`);
1123
+ });
1124
+ out.push(`miss:`, ` ret i32 -1`, `}`, ``);
1125
+ }
1126
+ if (lib.identity !== undefined && emitter.emitLibraryIdentity) {
1127
+ // Profile-declared identity getters (the ask-2 sidecar's boot-time
1128
+ // pairing fence): pure data returns with NO entry prologue — exempt
1129
+ // from the poisoned guard and every runtime touch (ratified), so a
1130
+ // host can read them before init and after a trap. The u64 rides
1131
+ // i64 two's-complement (LLVM integer constants are signed).
1132
+ for (const line of emitLibraryIdentityLines(lib.identity, FN_ATTRS))
1133
+ out.push(line);
1134
+ }
1135
+ if (lib.resultResetSymbol !== null) {
1136
+ out.push(`define void @${lib.resultResetSymbol}() ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_entry(i1 zeroext false, ptr ${symConst(lib.resultResetSymbol)})`, ` call void @scr_library_arena_reset()`, ` ret void`, `}`, ``);
1137
+ }
1138
+ if (lib.collectSymbol !== null) {
1139
+ out.push(`define void @${lib.collectSymbol}() ${FN_ATTRS} {`, `entry:`, ` call void @scr_library_entry(i1 zeroext false, ptr ${symConst(lib.collectSymbol)})`, ` call void @scr_library_collect() ; arena reset + a full cycle collection`, ` ret void`, `}`, ``);
1140
+ }
1141
+ for (const e of lib.exports) {
1142
+ const params = [];
1143
+ const body = [
1144
+ ` call void @scr_library_entry(i1 zeroext ${autoReset ? "true" : "false"}, ptr ${symConst(e.symbol)})`,
1145
+ ];
1146
+ const args = [];
1147
+ if (e.inboundBytesTrap !== undefined) {
1148
+ // The bytes-in helper's trap message: the compiler-assembled
1149
+ // structured trap-teaching form (0x01 text 0x1F SC4012 0x1F symbol
1150
+ // [0x1F remediation]) consumed by the runtime sink.
1151
+ const trapBytes = Buffer.byteLength(e.inboundBytesTrap, "utf8");
1152
+ out.push(`@sc_lib_bytes_trap_${e.symbol} = internal constant [${trapBytes + 1} x i8] c"${llStrBytes(e.inboundBytesTrap)}"`, ``);
1153
+ }
1154
+ if (e.inboundIntTrap !== undefined) {
1155
+ // The i64/u64-in helpers' host-contract trap message (ask 4): an
1156
+ // inbound integer past ±(2^53−1) cannot ride f64 exactly. Same
1157
+ // assembled structured form, same SC4012 code, same
1158
+ // emission-invariance argument as the bytes trap.
1159
+ const trapBytes = Buffer.byteLength(e.inboundIntTrap, "utf8");
1160
+ out.push(`@sc_lib_int_trap_${e.symbol} = internal constant [${trapBytes + 1} x i8] c"${llStrBytes(e.inboundIntTrap)}"`, ``);
1161
+ }
1162
+ if (e.inboundCstringTrap !== undefined) {
1163
+ // The cstring-in helper's host-contract trap message (a NULL
1164
+ // `const char *`): same assembled structured form and SC4012 code.
1165
+ const trapBytes = Buffer.byteLength(e.inboundCstringTrap, "utf8");
1166
+ out.push(`@sc_lib_cstr_trap_${e.symbol} = internal constant [${trapBytes + 1} x i8] c"${llStrBytes(e.inboundCstringTrap)}"`, ``);
1167
+ }
1168
+ e.params.forEach((cls, i) => {
1169
+ switch (cls) {
1170
+ case "f64":
1171
+ params.push(`double %a${i}`);
1172
+ args.push(`double %a${i}`);
1173
+ break;
1174
+ case "bool":
1175
+ params.push(`i8 %a${i}`);
1176
+ body.push(` %c${i} = icmp ne i8 %a${i}, 0`);
1177
+ args.push(`i1 %c${i}`);
1178
+ break;
1179
+ case "u8":
1180
+ params.push(`i8 %a${i}`);
1181
+ body.push(` %c${i} = uitofp i8 %a${i} to double`);
1182
+ args.push(`double %c${i}`);
1183
+ break;
1184
+ case "u32":
1185
+ params.push(`i32 %a${i}`);
1186
+ body.push(` %c${i} = uitofp i32 %a${i} to double`);
1187
+ args.push(`double %c${i}`);
1188
+ break;
1189
+ case "i32":
1190
+ params.push(`i32 %a${i}`);
1191
+ body.push(` %c${i} = sitofp i32 %a${i} to double`);
1192
+ args.push(`double %c${i}`);
1193
+ break;
1194
+ case "i64":
1195
+ // Inbound declared-integer edge (ask 4): the helper converts
1196
+ // exactly or delivers the host-contract trap (past ±(2^53−1)
1197
+ // the value cannot ride f64 without rounding).
1198
+ params.push(`i64 %a${i}`);
1199
+ body.push(` %c${i} = call double @scr_library_i64_in(i64 %a${i}, ptr @sc_lib_int_trap_${e.symbol})`);
1200
+ args.push(`double %c${i}`);
1201
+ break;
1202
+ case "u64":
1203
+ params.push(`i64 %a${i}`);
1204
+ body.push(` %c${i} = call double @scr_library_u64_in(i64 %a${i}, ptr @sc_lib_int_trap_${e.symbol})`);
1205
+ args.push(`double %c${i}`);
1206
+ break;
1207
+ case "string":
1208
+ params.push(`ptr %a${i}_ptr`, `${emitter.sizeType} %a${i}_len`);
1209
+ body.push(` %c${i} = call ptr @scr_library_str_in(ptr %a${i}_ptr, ${emitter.sizeType} %a${i}_len)`);
1210
+ args.push(`ptr %c${i}`);
1211
+ break;
1212
+ case "bytes":
1213
+ params.push(`ptr %a${i}_ptr`, `${emitter.sizeType} %a${i}_len`);
1214
+ body.push(` %c${i} = call ptr @scr_library_bytes_in(ptr %a${i}_ptr, ${emitter.sizeType} %a${i}_len, ptr @sc_lib_bytes_trap_${e.symbol})`);
1215
+ args.push(`ptr %c${i}`);
1216
+ break;
1217
+ case "cstring":
1218
+ params.push(`ptr %a${i}`);
1219
+ body.push(` %c${i} = call ptr @scr_library_cstr_in(ptr %a${i}, ptr @sc_lib_cstr_trap_${e.symbol})`);
1220
+ args.push(`ptr %c${i}`);
1221
+ break;
1222
+ }
1223
+ });
1224
+ if (e.returns === "string" || e.returns === "bytes") {
1225
+ params.push(`ptr %out`, `ptr %out_len`);
1226
+ }
1227
+ const target = `@${mangleFunction(e.fnName)}`;
1228
+ const callArgs = args.join(", ");
1229
+ let retType = "void";
1230
+ switch (e.returns) {
1231
+ case "void":
1232
+ body.push(` call void ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` ret void`);
1233
+ break;
1234
+ case "f64":
1235
+ retType = "double";
1236
+ body.push(` %r = call double ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` ret double %r`);
1237
+ break;
1238
+ case "i64":
1239
+ case "u64":
1240
+ // The outbound declared-integer edge (ask 4): every value
1241
+ // reaching this return was PROVEN whole and inside the class's
1242
+ // range at compile time, so the fp-to-int conversion is exact
1243
+ // by construction — the crossing carries the mathematically
1244
+ // exact integer the f64 held.
1245
+ retType = "i64";
1246
+ body.push(` %r = call double ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` %z = ${e.returns === "i64" ? "fptosi" : "fptoui"} double %r to i64`, ` ret i64 %z`);
1247
+ break;
1248
+ case "bool":
1249
+ retType = "i8";
1250
+ body.push(` %r = call i1 ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` %z = zext i1 %r to i8`, ` ret i8 %z`);
1251
+ break;
1252
+ case "string":
1253
+ body.push(` %r = call ptr ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` call void @scr_library_str_out(ptr %r, ptr %out, ptr %out_len)`, ` ret void`);
1254
+ break;
1255
+ case "bytes":
1256
+ body.push(` %r = call ptr ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` call void @scr_library_bytes_out(ptr %r, ptr %out, ptr %out_len)`, ` ret void`);
1257
+ break;
1258
+ case "cstring":
1259
+ // The result's arena copy, returned as `const char *`.
1260
+ retType = "ptr";
1261
+ body.push(` %r = call ptr ${target}(${callArgs})`, ` call void @scr_library_check_exc()`, ` %z = call ptr @scr_library_cstr_out(ptr %r)`, ` ret ptr %z`);
1262
+ break;
1263
+ }
1264
+ out.push(`define ${retType} @${e.symbol}(${params.join(", ")}) ${FN_ATTRS} { ; library export ${e.fnName}`, `entry:`, ...body, `}`, ``);
1265
+ }
1266
+ return out;
1267
+ }
1268
+ /** C-callable scalar callback trampolines. A callback with an explicit
1269
+ * context entry receives the closure at that exact ABI position. A raw
1270
+ * callback loads it from a call-scoped TLS slot installed around the
1271
+ * outer native call. */
1272
+ export function emitFfiCallbackDefs(emitter) {
1273
+ const globals = [];
1274
+ const defs = [];
1275
+ if (emitter.ffiCallbackAdapters.size === 0)
1276
+ return { globals, defs };
1277
+ emitter.declare(`declare void @scr_trap(ptr)`);
1278
+ const expired = emitter.cstr("scriptc: native callback invoked outside its call-scoped lifetime\n");
1279
+ const released = emitter.cstr("scriptc: native callback invoked outside its retained lifetime\n");
1280
+ for (const adapter of emitter.ffiCallbackAdapters.values()) {
1281
+ const cb = adapter.callback;
1282
+ if (adapter.tls !== null)
1283
+ globals.push(`@${adapter.tls} = internal thread_local global ptr null`);
1284
+ if (adapter.global !== null)
1285
+ globals.push(`@${adapter.global} = internal thread_local global ptr null`);
1286
+ if (adapter.table !== null) {
1287
+ globals.push(`@${adapter.table} = internal ${emitter.mod.workers ? "thread_local " : ""}global %ScrFfiTable zeroinitializer`);
1288
+ }
1289
+ const params = cb.params.flatMap((param, i) => {
1290
+ if (isFfiContextParam(param))
1291
+ return [`ptr %ctx`];
1292
+ if (param === "string" || param === "bytes") {
1293
+ return [`ptr %a${i}`, `${emitter.sizeType} %a${i}_len`];
1294
+ }
1295
+ return [`${ffiNativeParamLl(param, emitter.ffiExtendNarrowIntegers)} %a${i}`];
1296
+ });
1297
+ if (cb.invoke === "foreign") {
1298
+ if (adapter.table === null ||
1299
+ !cb.params.some(isFfiContextParam) ||
1300
+ cb.returns !== "void" ||
1301
+ cb.params.some((param) => param === "i64" || param === "u64" || param === "pointer")) {
1302
+ throw new InternalCompilerError("llvm emitter bug: invalid foreign FFI callback descriptor");
1303
+ }
1304
+ const dispatch = `${adapter.symbol}_dispatch`;
1305
+ const scriptArgs = [];
1306
+ const dispatchBody = [
1307
+ `define internal void @${dispatch}(ptr %cb, ptr %call) ${FN_ATTRS} {`,
1308
+ `entry:`,
1309
+ ` %fnp = getelementptr inbounds %ScrClosure, ptr %cb, i64 0, i32 1`,
1310
+ ` %fn = load ptr, ptr %fnp`,
1311
+ ];
1312
+ for (let i = 0; i < cb.params.length; i++) {
1313
+ const param = cb.params[i];
1314
+ if (isFfiContextParam(param))
1315
+ continue;
1316
+ switch (param) {
1317
+ case "f64":
1318
+ case "f32":
1319
+ case "i8":
1320
+ case "u16":
1321
+ case "i16":
1322
+ emitter.declare(`declare double @scr_ffi_call_get_f64(ptr, ${emitter.sizeType})`);
1323
+ dispatchBody.push(` %s${i} = call double @scr_ffi_call_get_f64(ptr %call, ${emitter.sizeType} ${i})`);
1324
+ scriptArgs.push(`double %s${i}`);
1325
+ break;
1326
+ case "bool":
1327
+ emitter.declare(`declare zeroext i1 @scr_ffi_call_get_bool(ptr, ${emitter.sizeType})`);
1328
+ dispatchBody.push(` %s${i} = call zeroext i1 @scr_ffi_call_get_bool(ptr %call, ${emitter.sizeType} ${i})`);
1329
+ scriptArgs.push(`i1 %s${i}`);
1330
+ break;
1331
+ case "u8":
1332
+ case "u32":
1333
+ case "i32":
1334
+ emitter.declare(`declare double @scr_ffi_call_get_${param}(ptr, ${emitter.sizeType})`);
1335
+ dispatchBody.push(` %s${i} = call double @scr_ffi_call_get_${param}(ptr %call, ${emitter.sizeType} ${i})`);
1336
+ scriptArgs.push(`double %s${i}`);
1337
+ break;
1338
+ case "cstring":
1339
+ case "string":
1340
+ case "bytes": {
1341
+ emitter.declare(`declare ptr @scr_ffi_call_get_data(ptr, ${emitter.sizeType})`);
1342
+ emitter.declare(`declare ${emitter.sizeType} @scr_ffi_call_get_len(ptr, ${emitter.sizeType})`);
1343
+ dispatchBody.push(` %data${i} = call ptr @scr_ffi_call_get_data(ptr %call, ${emitter.sizeType} ${i})`, ` %len${i} = call ${emitter.sizeType} @scr_ffi_call_get_len(ptr %call, ${emitter.sizeType} ${i})`);
1344
+ if (param === "bytes") {
1345
+ emitter.declare(`declare ptr @scr_bytes_from_data(ptr, ${emitter.sizeType})`);
1346
+ dispatchBody.push(` %s${i} = call ptr @scr_bytes_from_data(ptr %data${i}, ${emitter.sizeType} %len${i})`);
1347
+ }
1348
+ else {
1349
+ emitter.declare(`declare ptr @scr_str_from_utf8_lossy(ptr, ${emitter.sizeType})`);
1350
+ dispatchBody.push(` %s${i} = call ptr @scr_str_from_utf8_lossy(ptr %data${i}, ${emitter.sizeType} %len${i})`);
1351
+ }
1352
+ scriptArgs.push(`ptr %s${i}`);
1353
+ break;
1354
+ }
1355
+ }
1356
+ }
1357
+ dispatchBody.push(` call void %fn(${[`ptr %cb`, ...scriptArgs].join(", ")})`, ` ret void`, `}`, ``);
1358
+ for (const line of dispatchBody)
1359
+ defs.push(line);
1360
+ emitter.declare(`declare ptr @scr_ffi_call_new(ptr, ptr, ptr, ${emitter.sizeType})`);
1361
+ emitter.declare(`declare void @scr_ffi_post(ptr)`);
1362
+ defs.push(`define internal void @${adapter.symbol}(${params.join(", ")}) ${FN_ATTRS} {`, `entry:`, ` %cb = getelementptr inbounds i8, ptr %ctx, i64 0`, ` %call = call ptr @scr_ffi_call_new(ptr @${adapter.table}, ptr %cb, ptr @${dispatch}, ${emitter.sizeType} ${cb.params.length})`);
1363
+ for (let i = 0; i < cb.params.length; i++) {
1364
+ const param = cb.params[i];
1365
+ if (isFfiContextParam(param))
1366
+ continue;
1367
+ if (param === "cstring") {
1368
+ emitter.declare(`declare void @scr_ffi_call_copy_cstring(ptr, ${emitter.sizeType}, ptr)`);
1369
+ defs.push(` call void @scr_ffi_call_copy_cstring(ptr %call, ${emitter.sizeType} ${i}, ptr %a${i})`);
1370
+ }
1371
+ else if (param === "string" || param === "bytes") {
1372
+ emitter.declare(`declare void @scr_ffi_call_copy_${param}(ptr, ${emitter.sizeType}, ptr, ${emitter.sizeType})`);
1373
+ defs.push(` call void @scr_ffi_call_copy_${param}(ptr %call, ${emitter.sizeType} ${i}, ptr %a${i}, ${emitter.sizeType} %a${i}_len)`);
1374
+ }
1375
+ else if (param === "f32" || param === "i8" || param === "u16" || param === "i16") {
1376
+ const nativeTy = ffiNativeTypeLl(param);
1377
+ const op = param === "f32" ? "fpext" : param === "u16" ? "uitofp" : "sitofp";
1378
+ emitter.declare(`declare void @scr_ffi_call_set_f64(ptr, ${emitter.sizeType}, double)`);
1379
+ defs.push(` %wide${i} = ${op} ${nativeTy} %a${i} to double`, ` call void @scr_ffi_call_set_f64(ptr %call, ${emitter.sizeType} ${i}, double %wide${i})`);
1380
+ }
1381
+ else {
1382
+ const nativeTy = ffiNativeTypeLl(param);
1383
+ emitter.declare(`declare void @scr_ffi_call_set_${param}(ptr, ${emitter.sizeType}, ${nativeTy})`);
1384
+ defs.push(` call void @scr_ffi_call_set_${param}(ptr %call, ${emitter.sizeType} ${i}, ${nativeTy} %a${i})`);
1385
+ }
1386
+ }
1387
+ defs.push(` call void @scr_ffi_post(ptr %call)`, ` ret void`, `}`, ``);
1388
+ continue;
1389
+ }
1390
+ defs.push(`define internal ${ffiNativeReturnLl(cb.returns, emitter.ffiExtendNarrowIntegers)} @${adapter.symbol}(${params.join(", ")}) ${FN_ATTRS} {`, `entry:`, adapter.tls !== null
1391
+ ? ` %cb = load ptr, ptr @${adapter.tls}`
1392
+ : adapter.global !== null
1393
+ ? ` %cb = load ptr, ptr @${adapter.global}`
1394
+ : ` %cb = getelementptr inbounds i8, ptr %ctx, i64 0`, ` %missing = icmp eq ptr %cb, null`, ` br i1 %missing, label %expired, label %ready`, `expired:`, ` call void @scr_trap(ptr ${adapter.callback.lifetime === "call" ? expired : released})`, ` unreachable`, `ready:`, ...emitter.pendingTestLines("%pending"), ` br i1 %pending, label %skip, label %invoke`, `skip:`, ` ret ${ffiCallbackDummyLl(cb)}`, `invoke:`);
1395
+ // Validate every native pointer before allocating any copy-in value.
1396
+ // A later bad slot therefore cannot leak an earlier materialization.
1397
+ for (let i = 0; i < cb.params.length; i++) {
1398
+ const param = cb.params[i];
1399
+ if (param !== "cstring" && param !== "string" && param !== "bytes")
1400
+ continue;
1401
+ const invalid = `%invalid${i}`;
1402
+ defs.push(` %null${i} = icmp eq ptr %a${i}, null`);
1403
+ if (param === "cstring") {
1404
+ defs.push(` ${invalid} = or i1 %null${i}, false`);
1405
+ }
1406
+ else {
1407
+ defs.push(` %nonempty${i} = icmp ne ${emitter.sizeType} %a${i}_len, 0`, ` ${invalid} = and i1 %null${i}, %nonempty${i}`);
1408
+ }
1409
+ const message = param === "cstring"
1410
+ ? "scriptc: native callback passed a NULL cstring\n"
1411
+ : `scriptc: native callback passed a NULL ${param} span with nonzero length\n`;
1412
+ defs.push(` br i1 ${invalid}, label %invalid_param${i}, label %param_ok${i}`, `invalid_param${i}:`, ` call void @scr_trap(ptr ${emitter.cstr(message)})`, ` unreachable`, `param_ok${i}:`);
1413
+ }
1414
+ defs.push(` %fnp = getelementptr inbounds %ScrClosure, ptr %cb, i64 0, i32 1`, ` %fn = load ptr, ptr %fnp`);
1415
+ const scriptArgs = [];
1416
+ for (let i = 0; i < cb.params.length; i++) {
1417
+ const param = cb.params[i];
1418
+ if (isFfiContextParam(param))
1419
+ continue;
1420
+ switch (param) {
1421
+ case "i64":
1422
+ case "u64":
1423
+ case "pointer": {
1424
+ const ty = ffiNativeTypeLl(param);
1425
+ emitter.declare(`declare ptr @scr_bigint_from_${param}(${ty})`);
1426
+ defs.push(` %s${i} = call ptr @scr_bigint_from_${param}(${ty} %a${i})`);
1427
+ scriptArgs.push(`ptr %s${i}`);
1428
+ break;
1429
+ }
1430
+ case "f64":
1431
+ scriptArgs.push(`double %a${i}`);
1432
+ break;
1433
+ case "f32":
1434
+ case "i8":
1435
+ case "u16":
1436
+ case "i16": {
1437
+ const nativeTy = ffiNativeTypeLl(param);
1438
+ const op = param === "f32" ? "fpext" : param === "u16" ? "uitofp" : "sitofp";
1439
+ defs.push(` %s${i} = ${op} ${nativeTy} %a${i} to double`);
1440
+ scriptArgs.push(`double %s${i}`);
1441
+ break;
1442
+ }
1443
+ case "bool":
1444
+ defs.push(` %s${i} = icmp ne i8 %a${i}, 0`);
1445
+ scriptArgs.push(`i1 %s${i}`);
1446
+ break;
1447
+ case "u8":
1448
+ defs.push(` %s${i} = uitofp i8 %a${i} to double`);
1449
+ scriptArgs.push(`double %s${i}`);
1450
+ break;
1451
+ case "u32":
1452
+ defs.push(` %s${i} = uitofp i32 %a${i} to double`);
1453
+ scriptArgs.push(`double %s${i}`);
1454
+ break;
1455
+ case "i32":
1456
+ defs.push(` %s${i} = sitofp i32 %a${i} to double`);
1457
+ scriptArgs.push(`double %s${i}`);
1458
+ break;
1459
+ case "cstring":
1460
+ emitter.declare(`declare ${emitter.sizeType} @strlen(ptr)`);
1461
+ emitter.declare(`declare ptr @scr_str_from_utf8_lossy(ptr, ${emitter.sizeType})`);
1462
+ defs.push(` %len${i} = call ${emitter.sizeType} @strlen(ptr %a${i})`, ` %s${i} = call ptr @scr_str_from_utf8_lossy(ptr %a${i}, ${emitter.sizeType} %len${i})`);
1463
+ scriptArgs.push(`ptr %s${i}`);
1464
+ break;
1465
+ case "string":
1466
+ emitter.declare(`declare ptr @scr_str_from_utf8_lossy(ptr, ${emitter.sizeType})`);
1467
+ defs.push(` %s${i} = call ptr @scr_str_from_utf8_lossy(ptr %a${i}, ${emitter.sizeType} %a${i}_len)`);
1468
+ scriptArgs.push(`ptr %s${i}`);
1469
+ break;
1470
+ case "bytes":
1471
+ emitter.declare(`declare ptr @scr_bytes_from_data(ptr, ${emitter.sizeType})`);
1472
+ defs.push(` %s${i} = call ptr @scr_bytes_from_data(ptr %a${i}, ${emitter.sizeType} %a${i}_len)`);
1473
+ scriptArgs.push(`ptr %s${i}`);
1474
+ break;
1475
+ }
1476
+ }
1477
+ const ft = ffiCallbackType(cb);
1478
+ const internalRet = emitter.llType(ft.ret);
1479
+ const callArgs = [`ptr %cb`, ...scriptArgs].join(", ");
1480
+ if (cb.lifetime === "retained") {
1481
+ emitter.declare(`declare ptr @scr_closure_retain_v(ptr)`);
1482
+ emitter.declare(`declare void @scr_closure_release_v(ptr)`);
1483
+ defs.push(` %invoke_pin = call ptr @scr_closure_retain_v(ptr %cb)`);
1484
+ }
1485
+ if (cb.returns === "void") {
1486
+ defs.push(` call void %fn(${callArgs})`, ...(cb.lifetime === "retained"
1487
+ ? [` call void @scr_closure_release_v(ptr %invoke_pin)`]
1488
+ : []), ` ret void`, `}`, ``);
1489
+ continue;
1490
+ }
1491
+ defs.push(` %result = call ${internalRet} %fn(${callArgs})`);
1492
+ if (cb.lifetime === "retained") {
1493
+ defs.push(` call void @scr_closure_release_v(ptr %invoke_pin)`);
1494
+ }
1495
+ switch (cb.returns) {
1496
+ case "i64":
1497
+ case "u64":
1498
+ case "pointer": {
1499
+ const ty = ffiNativeTypeLl(cb.returns);
1500
+ emitter.declare(`declare ${ty} @scr_bigint_to_${cb.returns}(ptr)`);
1501
+ emitter.declare(`declare void @scr_bigint_release(ptr)`);
1502
+ defs.push(` %out = call ${ty} @scr_bigint_to_${cb.returns}(ptr %result)`, ` call void @scr_bigint_release(ptr %result)`, ` ret ${ty} %out`);
1503
+ break;
1504
+ }
1505
+ case "f64":
1506
+ defs.push(` ret double %result`);
1507
+ break;
1508
+ case "f32":
1509
+ defs.push(` %out = fptrunc double %result to float`, ` ret float %out`);
1510
+ break;
1511
+ case "bool":
1512
+ defs.push(` %out = zext i1 %result to i8`, ` ret i8 %out`);
1513
+ break;
1514
+ case "u8":
1515
+ case "i8":
1516
+ case "u16":
1517
+ case "i16":
1518
+ case "u32":
1519
+ emitter.declare(`declare double @scr_bit_ushr(double, double)`);
1520
+ defs.push(` %coerced = call double @scr_bit_ushr(double %result, double ${f64Lit(0)})`, ` %wide = fptoui double %coerced to i32`);
1521
+ if (cb.returns !== "u32") {
1522
+ const nativeTy = ffiNativeTypeLl(cb.returns);
1523
+ defs.push(` %out = trunc i32 %wide to ${nativeTy}`, ` ret ${nativeTy} %out`);
1524
+ }
1525
+ else {
1526
+ defs.push(` ret i32 %wide`);
1527
+ }
1528
+ break;
1529
+ case "i32":
1530
+ emitter.declare(`declare double @scr_bit_or(double, double)`);
1531
+ defs.push(` %coerced = call double @scr_bit_or(double %result, double ${f64Lit(0)})`, ` %out = fptosi double %coerced to i32`, ` ret i32 %out`);
1532
+ break;
1533
+ }
1534
+ defs.push(`}`, ``);
1535
+ }
1536
+ return { globals, defs };
1537
+ }
1538
+ export function emitParts(emitter) {
1539
+ const parts = [
1540
+ ...limitInlineDynReleases(emitter.emitModuleParts()),
1541
+ ...emitter.disposeObserverGates(),
1542
+ ];
1543
+ if (!emitter.executableTls)
1544
+ return parts;
1545
+ // A worker executable's thread-locals all live in the executable's own
1546
+ // TLS block: the program's internal ones, and the runtime's external
1547
+ // ones, because the runtime is always linked statically into the
1548
+ // executable. So on ELF they can all use the local-exec model: LLVM's
1549
+ // default general-dynamic sequence (relaxed by the linker to `mov %fs:0`
1550
+ // plus an add), and even initial-exec (relaxed to `mov $offset` plus an
1551
+ // indexed access), become one %fs-relative operand LLVM can fold into
1552
+ // loads and compares. Darwin's thread-local variables have one model.
1553
+ return parts.map((part) => part
1554
+ .replace(/^(@[-$._A-Za-z0-9]+ = internal )thread_local global /gm, "$1thread_local(localexec) global ")
1555
+ .replace(/^(@[-$._A-Za-z0-9]+ = external )thread_local global /gm, "$1thread_local(localexec) global "));
1556
+ }
1557
+ //# sourceMappingURL=emit-module.js.map