@scriptc/compiler 0.0.35 → 0.1.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 (439) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +14 -11
  2. package/ambient/scriptc-overrides.d.ts +0 -7
  3. package/ambient/scriptc.d.ts +1 -1
  4. package/dist/backend/build-cache.d.ts +44 -0
  5. package/dist/backend/build-cache.js +241 -0
  6. package/dist/backend/build-cache.js.map +1 -0
  7. package/dist/backend/{emission/emit-async.d.ts → c/async.d.ts} +21 -30
  8. package/dist/backend/{emission/emit-async.js → c/async.js} +270 -286
  9. package/dist/backend/c/async.js.map +1 -0
  10. package/dist/backend/{emission/emitter.d.ts → c/c-emitter.d.ts} +6 -23
  11. package/dist/backend/{emission/emitter.js → c/c-emitter.js} +53 -107
  12. package/dist/backend/c/c-emitter.js.map +1 -0
  13. package/dist/backend/c/exprs.d.ts +8 -0
  14. package/dist/backend/c/exprs.js +7937 -0
  15. package/dist/backend/c/exprs.js.map +1 -0
  16. package/dist/backend/{emission/emit-island.d.ts → c/island.d.ts} +5 -5
  17. package/dist/backend/{emission/emit-island.js → c/island.js} +24 -22
  18. package/dist/backend/c/island.js.map +1 -0
  19. package/dist/backend/{emission → c}/may-throw.d.ts +1 -1
  20. package/dist/backend/{emission → c}/may-throw.js +4 -1
  21. package/dist/backend/c/may-throw.js.map +1 -0
  22. package/dist/backend/{emission/emit-shapes.d.ts → c/shapes.d.ts} +19 -19
  23. package/dist/backend/{emission/emit-shapes.js → c/shapes.js} +78 -87
  24. package/dist/backend/c/shapes.js.map +1 -0
  25. package/dist/backend/{emission/emit-stmts.d.ts → c/stmts.d.ts} +12 -12
  26. package/dist/backend/{emission/emit-stmts.js → c/stmts.js} +395 -343
  27. package/dist/backend/c/stmts.js.map +1 -0
  28. package/dist/backend/{emission/emit-types.d.ts → c/types.d.ts} +1 -1
  29. package/dist/backend/{emission/emit-types.js → c/types.js} +42 -286
  30. package/dist/backend/c/types.js.map +1 -0
  31. package/dist/backend/c/types.test.js +25 -0
  32. package/dist/backend/c/types.test.js.map +1 -0
  33. package/dist/backend/{emission/emit-walkers.d.ts → c/walkers.d.ts} +19 -41
  34. package/dist/backend/{emission/emit-walkers.js → c/walkers.js} +242 -304
  35. package/dist/backend/c/walkers.js.map +1 -0
  36. package/dist/backend/external-c.d.ts +33 -0
  37. package/dist/backend/external-c.js +51 -0
  38. package/dist/backend/external-c.js.map +1 -0
  39. package/dist/backend/ffi-callbacks.d.ts +1 -1
  40. package/dist/backend/ffi-callbacks.js +4 -3
  41. package/dist/backend/ffi-callbacks.js.map +1 -1
  42. package/dist/backend/{library-identity.d.ts → library-identity-markers.d.ts} +0 -4
  43. package/dist/backend/{library-identity.js → library-identity-markers.js} +10 -9
  44. package/dist/backend/library-identity-markers.js.map +1 -0
  45. package/dist/backend/link-plan.d.ts +37 -0
  46. package/dist/backend/link-plan.js +26 -0
  47. package/dist/backend/link-plan.js.map +1 -0
  48. package/dist/backend/linker.d.ts +22 -0
  49. package/dist/backend/linker.js +236 -0
  50. package/dist/backend/linker.js.map +1 -0
  51. package/dist/backend/llvm/blocks.d.ts +4 -0
  52. package/dist/backend/llvm/blocks.js +29 -0
  53. package/dist/backend/llvm/blocks.js.map +1 -1
  54. package/dist/backend/llvm/classes.d.ts +2 -19
  55. package/dist/backend/llvm/classes.js +20 -52
  56. package/dist/backend/llvm/classes.js.map +1 -1
  57. package/dist/backend/llvm/common.d.ts +4 -0
  58. package/dist/backend/llvm/common.js +27 -0
  59. package/dist/backend/llvm/common.js.map +1 -0
  60. package/dist/backend/llvm/dyn.d.ts +3 -8
  61. package/dist/backend/llvm/dyn.js +159 -224
  62. package/dist/backend/llvm/dyn.js.map +1 -1
  63. package/dist/backend/llvm/emitter.d.ts +4 -1
  64. package/dist/backend/llvm/emitter.js +548 -9988
  65. package/dist/backend/llvm/emitter.js.map +1 -1
  66. package/dist/backend/llvm/expr-async.d.ts +4 -0
  67. package/dist/backend/llvm/expr-async.js +726 -0
  68. package/dist/backend/llvm/expr-async.js.map +1 -0
  69. package/dist/backend/llvm/expr-bytes.d.ts +13 -0
  70. package/dist/backend/llvm/expr-bytes.js +456 -0
  71. package/dist/backend/llvm/expr-bytes.js.map +1 -0
  72. package/dist/backend/llvm/expr-callbacks.d.ts +22 -0
  73. package/dist/backend/llvm/expr-callbacks.js +520 -0
  74. package/dist/backend/llvm/expr-callbacks.js.map +1 -0
  75. package/dist/backend/llvm/expr-calls.d.ts +2 -0
  76. package/dist/backend/llvm/expr-calls.js +618 -0
  77. package/dist/backend/llvm/expr-calls.js.map +1 -0
  78. package/dist/backend/llvm/expr-containers.d.ts +25 -0
  79. package/dist/backend/llvm/expr-containers.js +637 -0
  80. package/dist/backend/llvm/expr-containers.js.map +1 -0
  81. package/dist/backend/llvm/expr-context.d.ts +255 -0
  82. package/dist/backend/llvm/expr-context.js +2 -0
  83. package/dist/backend/llvm/expr-context.js.map +1 -0
  84. package/dist/backend/llvm/expr-control.d.ts +2 -0
  85. package/dist/backend/llvm/expr-control.js +473 -0
  86. package/dist/backend/llvm/expr-control.js.map +1 -0
  87. package/dist/backend/llvm/expr-dispatch.d.ts +4 -0
  88. package/dist/backend/llvm/expr-dispatch.js +153 -0
  89. package/dist/backend/llvm/expr-dispatch.js.map +1 -0
  90. package/dist/backend/llvm/expr-dynamic.d.ts +2 -0
  91. package/dist/backend/llvm/expr-dynamic.js +810 -0
  92. package/dist/backend/llvm/expr-dynamic.js.map +1 -0
  93. package/dist/backend/llvm/expr-island.d.ts +15 -0
  94. package/dist/backend/llvm/expr-island.js +690 -0
  95. package/dist/backend/llvm/expr-island.js.map +1 -0
  96. package/dist/backend/llvm/expr-primitives.d.ts +6 -0
  97. package/dist/backend/llvm/expr-primitives.js +642 -0
  98. package/dist/backend/llvm/expr-primitives.js.map +1 -0
  99. package/dist/backend/llvm/expr-records.d.ts +9 -0
  100. package/dist/backend/llvm/expr-records.js +299 -0
  101. package/dist/backend/llvm/expr-records.js.map +1 -0
  102. package/dist/backend/llvm/expr-stream-bridges.d.ts +13 -0
  103. package/dist/backend/llvm/expr-stream-bridges.js +420 -0
  104. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -0
  105. package/dist/backend/llvm/expr-stream-callbacks.d.ts +12 -0
  106. package/dist/backend/llvm/expr-stream-callbacks.js +360 -0
  107. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -0
  108. package/dist/backend/llvm/lib-dispatch.d.ts +5 -0
  109. package/dist/backend/llvm/lib-dispatch.js +267 -0
  110. package/dist/backend/llvm/lib-dispatch.js.map +1 -0
  111. package/dist/backend/llvm/lib-filesystem.d.ts +6 -0
  112. package/dist/backend/llvm/lib-filesystem.js +594 -0
  113. package/dist/backend/llvm/lib-filesystem.js.map +1 -0
  114. package/dist/backend/llvm/lib-network.d.ts +2 -0
  115. package/dist/backend/llvm/lib-network.js +429 -0
  116. package/dist/backend/llvm/lib-network.js.map +1 -0
  117. package/dist/backend/llvm/lib-process.d.ts +5 -0
  118. package/dist/backend/llvm/lib-process.js +585 -0
  119. package/dist/backend/llvm/lib-process.js.map +1 -0
  120. package/dist/backend/llvm/lib-shared.d.ts +6 -0
  121. package/dist/backend/llvm/lib-shared.js +687 -0
  122. package/dist/backend/llvm/lib-shared.js.map +1 -0
  123. package/dist/backend/llvm/lib-stream.d.ts +2 -0
  124. package/dist/backend/llvm/lib-stream.js +470 -0
  125. package/dist/backend/llvm/lib-stream.js.map +1 -0
  126. package/dist/backend/llvm/shapes.d.ts +12 -2
  127. package/dist/backend/llvm/shapes.js +66 -307
  128. package/dist/backend/llvm/shapes.js.map +1 -1
  129. package/dist/backend/llvm/shapes.test.js +52 -0
  130. package/dist/backend/llvm/shapes.test.js.map +1 -0
  131. package/dist/backend/llvm/unsupported.d.ts +1 -1
  132. package/dist/backend/llvm/walkers.d.ts +2 -3
  133. package/dist/backend/llvm/walkers.js +195 -222
  134. package/dist/backend/llvm/walkers.js.map +1 -1
  135. package/dist/backend/native-codegen.d.ts +45 -0
  136. package/dist/backend/native-codegen.js +275 -0
  137. package/dist/backend/native-codegen.js.map +1 -0
  138. package/dist/backend/native-codegen.test.js +226 -0
  139. package/dist/backend/native-codegen.test.js.map +1 -0
  140. package/dist/backend/native-link-info.d.ts +96 -0
  141. package/dist/backend/native-link-info.js +243 -0
  142. package/dist/backend/native-link-info.js.map +1 -0
  143. package/dist/backend/native-link-info.test.d.ts +1 -0
  144. package/dist/backend/native-link-info.test.js +134 -0
  145. package/dist/backend/native-link-info.test.js.map +1 -0
  146. package/dist/backend/{cc.d.ts → native-toolchain.d.ts} +54 -34
  147. package/dist/backend/{cc.js → native-toolchain.js} +231 -810
  148. package/dist/backend/native-toolchain.js.map +1 -0
  149. package/dist/backend/native-toolchain.test.d.ts +1 -0
  150. package/dist/backend/{cc-cache.test.js → native-toolchain.test.js} +219 -7
  151. package/dist/backend/native-toolchain.test.js.map +1 -0
  152. package/dist/backend/object-localize.js +1 -1
  153. package/dist/backend/runtime-abi.d.ts +10 -0
  154. package/dist/backend/runtime-abi.js +11 -0
  155. package/dist/backend/runtime-abi.js.map +1 -0
  156. package/dist/backend/runtime-pack-targets.test.d.ts +1 -0
  157. package/dist/backend/runtime-pack-targets.test.js +54 -0
  158. package/dist/backend/runtime-pack-targets.test.js.map +1 -0
  159. package/dist/backend/runtime-pack.d.ts +112 -0
  160. package/dist/backend/runtime-pack.js +305 -0
  161. package/dist/backend/runtime-pack.js.map +1 -0
  162. package/dist/backend/runtime-pack.test.d.ts +1 -0
  163. package/dist/backend/runtime-pack.test.js +473 -0
  164. package/dist/backend/runtime-pack.test.js.map +1 -0
  165. package/dist/backend/targets.d.ts +76 -0
  166. package/dist/backend/targets.js +262 -0
  167. package/dist/backend/targets.js.map +1 -0
  168. package/dist/backend/targets.test.d.ts +1 -0
  169. package/dist/backend/targets.test.js +41 -0
  170. package/dist/backend/targets.test.js.map +1 -0
  171. package/dist/backend/vendor-archives.d.ts +41 -0
  172. package/dist/backend/vendor-archives.js +462 -0
  173. package/dist/backend/vendor-archives.js.map +1 -0
  174. package/dist/compat/fetch-profile.d.ts +0 -1
  175. package/dist/compat/fetch-profile.js +0 -1
  176. package/dist/compat/fetch-profile.js.map +1 -1
  177. package/dist/coverage/report.js +3 -3
  178. package/dist/coverage/report.js.map +1 -1
  179. package/dist/coverage/surface-manifest.js +35 -33
  180. package/dist/coverage/surface-manifest.js.map +1 -1
  181. package/dist/diagnostics/diagnostic.d.ts +11 -12
  182. package/dist/diagnostics/diagnostic.js +19 -17
  183. package/dist/diagnostics/diagnostic.js.map +1 -1
  184. package/dist/diagnostics/render.d.ts +1 -1
  185. package/dist/diagnostics/render.js +1 -1
  186. package/dist/diagnostics/render.js.map +1 -1
  187. package/dist/errors.d.ts +5 -0
  188. package/dist/errors.js +9 -0
  189. package/dist/errors.js.map +1 -0
  190. package/dist/executable/{early-cache.d.ts → executable-cache.d.ts} +2 -2
  191. package/dist/executable/{early-cache.js → executable-cache.js} +36 -98
  192. package/dist/executable/executable-cache.js.map +1 -0
  193. package/dist/executable/executable-cache.test.d.ts +1 -0
  194. package/dist/executable/{early-cache.test.js → executable-cache.test.js} +3 -3
  195. package/dist/executable/executable-cache.test.js.map +1 -0
  196. package/dist/ffi/{profile.js → ffi-manifest.js} +1 -1
  197. package/dist/ffi/ffi-manifest.js.map +1 -0
  198. package/dist/frontend/builtin-modules.d.ts +21 -0
  199. package/dist/frontend/builtin-modules.js +82 -0
  200. package/dist/frontend/builtin-modules.js.map +1 -0
  201. package/dist/frontend/cjs-lexer.d.ts +7 -0
  202. package/dist/frontend/cjs-lexer.js +15 -17
  203. package/dist/frontend/cjs-lexer.js.map +1 -1
  204. package/dist/frontend/dts-paths.d.ts +26 -0
  205. package/dist/frontend/dts-paths.js +41 -0
  206. package/dist/frontend/dts-paths.js.map +1 -0
  207. package/dist/frontend/input-tracker.d.ts +0 -2
  208. package/dist/frontend/input-tracker.js +1 -4
  209. package/dist/frontend/input-tracker.js.map +1 -1
  210. package/dist/frontend/lib-contract.d.ts +1 -5
  211. package/dist/frontend/lib-contract.js +1 -1
  212. package/dist/frontend/lib-contract.js.map +1 -1
  213. package/dist/frontend/lib-exports.d.ts +1 -1
  214. package/dist/frontend/lowering/array-values.d.ts +8 -0
  215. package/dist/frontend/lowering/array-values.js +60 -0
  216. package/dist/frontend/lowering/array-values.js.map +1 -0
  217. package/dist/frontend/lowering/call-position.d.ts +4 -0
  218. package/dist/frontend/lowering/call-position.js +7 -0
  219. package/dist/frontend/lowering/call-position.js.map +1 -0
  220. package/dist/frontend/lowering/callback-arg.d.ts +20 -0
  221. package/dist/frontend/lowering/callback-arg.js +44 -0
  222. package/dist/frontend/lowering/callback-arg.js.map +1 -0
  223. package/dist/frontend/lowering/lib-boundary.d.ts +1 -1
  224. package/dist/frontend/lowering/lib-boundary.js +34 -34
  225. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  226. package/dist/frontend/lowering/lower-array-sort.d.ts +22 -0
  227. package/dist/frontend/lowering/lower-array-sort.js +619 -0
  228. package/dist/frontend/lowering/lower-array-sort.js.map +1 -0
  229. package/dist/frontend/lowering/lower-assert.d.ts +3 -3
  230. package/dist/frontend/lowering/lower-assert.js +214 -241
  231. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  232. package/dist/frontend/lowering/lower-builtins.d.ts +74 -146
  233. package/dist/frontend/lowering/lower-builtins.js +1285 -1233
  234. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  235. package/dist/frontend/lowering/lower-calls.d.ts +59 -192
  236. package/dist/frontend/lowering/lower-calls.js +1644 -1506
  237. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  238. package/dist/frontend/lowering/lower-classes.d.ts +62 -125
  239. package/dist/frontend/lowering/lower-classes.js +832 -866
  240. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  241. package/dist/frontend/lowering/lower-comptime.d.ts +5 -12
  242. package/dist/frontend/lowering/lower-comptime.js +32 -31
  243. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  244. package/dist/frontend/lowering/lower-containers.d.ts +35 -135
  245. package/dist/frontend/lowering/lower-containers.js +1984 -2227
  246. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  247. package/dist/frontend/lowering/lower-dgram.d.ts +3 -7
  248. package/dist/frontend/lowering/lower-dgram.js +97 -111
  249. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  250. package/dist/frontend/lowering/lower-enums.d.ts +4 -4
  251. package/dist/frontend/lowering/lower-enums.js +30 -30
  252. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  253. package/dist/frontend/lowering/{lower-emitter.d.ts → lower-event-emitter.d.ts} +7 -18
  254. package/dist/frontend/lowering/{lower-emitter.js → lower-event-emitter.js} +172 -174
  255. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -0
  256. package/dist/frontend/lowering/lower-expando.d.ts +5 -5
  257. package/dist/frontend/lowering/lower-expando.js +40 -40
  258. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  259. package/dist/frontend/lowering/lower-exprs.d.ts +60 -264
  260. package/dist/frontend/lowering/lower-exprs.js +2361 -1765
  261. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  262. package/dist/frontend/lowering/lower-generators.d.ts +6 -6
  263. package/dist/frontend/lowering/lower-generators.js +73 -72
  264. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  265. package/dist/frontend/lowering/lower-inspect.d.ts +5 -17
  266. package/dist/frontend/lowering/lower-inspect.js +273 -261
  267. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  268. package/dist/frontend/lowering/lower-island.d.ts +39 -49
  269. package/dist/frontend/lowering/lower-island.js +447 -513
  270. package/dist/frontend/lowering/lower-island.js.map +1 -1
  271. package/dist/frontend/lowering/lower-mixins.d.ts +7 -10
  272. package/dist/frontend/lowering/lower-mixins.js +85 -85
  273. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  274. package/dist/frontend/lowering/lower-modules.d.ts +12 -18
  275. package/dist/frontend/lowering/lower-modules.js +284 -283
  276. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  277. package/dist/frontend/lowering/lower-namespaces.d.ts +23 -49
  278. package/dist/frontend/lowering/lower-namespaces.js +123 -115
  279. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  280. package/dist/frontend/lowering/lower-server.d.ts +18 -25
  281. package/dist/frontend/lowering/lower-server.js +909 -899
  282. package/dist/frontend/lowering/lower-server.js.map +1 -1
  283. package/dist/frontend/lowering/lower-stmts.d.ts +30 -149
  284. package/dist/frontend/lowering/lower-stmts.js +1463 -1285
  285. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  286. package/dist/frontend/lowering/lower-stream.d.ts +12 -12
  287. package/dist/frontend/lowering/lower-stream.js +300 -301
  288. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  289. package/dist/frontend/lowering/lower-test.d.ts +5 -5
  290. package/dist/frontend/lowering/lower-test.js +82 -82
  291. package/dist/frontend/lowering/lower-test.js.map +1 -1
  292. package/dist/frontend/lowering/lowerer.d.ts +134 -22
  293. package/dist/frontend/lowering/lowerer.js +1277 -126
  294. package/dist/frontend/lowering/lowerer.js.map +1 -1
  295. package/dist/frontend/lowering/pairs-snapshot.d.ts +11 -0
  296. package/dist/frontend/lowering/pairs-snapshot.js +85 -0
  297. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -0
  298. package/dist/frontend/lowering/static-this.d.ts +6 -0
  299. package/dist/frontend/lowering/static-this.js +24 -0
  300. package/dist/frontend/lowering/static-this.js.map +1 -0
  301. package/dist/frontend/lowering/surfaces.d.ts +24 -35
  302. package/dist/frontend/lowering/surfaces.js +78 -66
  303. package/dist/frontend/lowering/surfaces.js.map +1 -1
  304. package/dist/frontend/npm-static-rewrite.js +6 -28
  305. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  306. package/dist/frontend/npm-static.d.ts +0 -10
  307. package/dist/frontend/npm-static.js +4 -7
  308. package/dist/frontend/npm-static.js.map +1 -1
  309. package/dist/frontend/npm.d.ts +0 -24
  310. package/dist/frontend/npm.js +11 -85
  311. package/dist/frontend/npm.js.map +1 -1
  312. package/dist/frontend/program.d.ts +3 -1
  313. package/dist/frontend/program.js +9 -4
  314. package/dist/frontend/program.js.map +1 -1
  315. package/dist/frontend/provenance-registry.d.ts +0 -2
  316. package/dist/frontend/provenance-registry.js +0 -10
  317. package/dist/frontend/provenance-registry.js.map +1 -1
  318. package/dist/frontend/provenance.js +4 -7
  319. package/dist/frontend/provenance.js.map +1 -1
  320. package/dist/frontend/resolve.d.ts +7 -2
  321. package/dist/frontend/resolve.js +12 -17
  322. package/dist/frontend/resolve.js.map +1 -1
  323. package/dist/frontend/resolve.test.d.ts +1 -0
  324. package/dist/frontend/resolve.test.js +29 -0
  325. package/dist/frontend/resolve.test.js.map +1 -0
  326. package/dist/frontend/ts7/adapter.d.ts +2 -2
  327. package/dist/frontend/ts7/adapter.js +1 -1
  328. package/dist/frontend/ts7/adapter.js.map +1 -1
  329. package/dist/frontend/ts7/checker.js +2 -36
  330. package/dist/frontend/ts7/checker.js.map +1 -1
  331. package/dist/frontend/ts7/enums.js +2 -1
  332. package/dist/frontend/ts7/enums.js.map +1 -1
  333. package/dist/frontend/ts7/{program.js → program-adapter.js} +7 -6
  334. package/dist/frontend/ts7/program-adapter.js.map +1 -0
  335. package/dist/frontend/ts7/world-check.d.ts +1 -3
  336. package/dist/frontend/ts7/world-check.js +3 -1
  337. package/dist/frontend/ts7/world-check.js.map +1 -1
  338. package/dist/frontend/tsc-codes.d.ts +8 -0
  339. package/dist/frontend/tsc-codes.js +109 -0
  340. package/dist/frontend/tsc-codes.js.map +1 -0
  341. package/dist/frontend/{types.d.ts → type-mapper.d.ts} +2 -25
  342. package/dist/frontend/{types.js → type-mapper.js} +12 -11
  343. package/dist/frontend/type-mapper.js.map +1 -0
  344. package/dist/frontend/workspace-registry.d.ts +26 -0
  345. package/dist/frontend/workspace-registry.js +71 -0
  346. package/dist/frontend/workspace-registry.js.map +1 -0
  347. package/dist/index.d.ts +113 -31
  348. package/dist/index.js +536 -128
  349. package/dist/index.js.map +1 -1
  350. package/dist/ir/analysis.d.ts +37 -0
  351. package/dist/ir/analysis.js +118 -0
  352. package/dist/ir/analysis.js.map +1 -0
  353. package/dist/ir/analysis.test.d.ts +1 -0
  354. package/dist/ir/analysis.test.js +21 -0
  355. package/dist/ir/analysis.test.js.map +1 -0
  356. package/dist/ir/build.d.ts +9 -0
  357. package/dist/ir/build.js +33 -0
  358. package/dist/ir/build.js.map +1 -0
  359. package/dist/ir/integer-loops.d.ts +1 -1
  360. package/dist/ir/{nodes.d.ts → ir.d.ts} +119 -37
  361. package/dist/ir/{nodes.js → ir.js} +170 -166
  362. package/dist/ir/ir.js.map +1 -0
  363. package/dist/ir/ir.test.d.ts +1 -0
  364. package/dist/ir/ir.test.js +17 -0
  365. package/dist/ir/ir.test.js.map +1 -0
  366. package/dist/ir/serialize.d.ts +2 -2
  367. package/dist/ir/serialize.js +3 -2
  368. package/dist/ir/serialize.js.map +1 -1
  369. package/dist/ir/validate.d.ts +1 -1
  370. package/dist/ir/validate.js +93 -41
  371. package/dist/ir/validate.js.map +1 -1
  372. package/dist/library/cache-primitives.d.ts +24 -0
  373. package/dist/library/cache-primitives.js +83 -0
  374. package/dist/library/cache-primitives.js.map +1 -0
  375. package/dist/library/cache-reset.test.d.ts +1 -0
  376. package/dist/library/cache-reset.test.js +47 -0
  377. package/dist/library/cache-reset.test.js.map +1 -0
  378. package/dist/library/{implementation-identity.js → compiler-self-identity.js} +1 -1
  379. package/dist/library/compiler-self-identity.js.map +1 -0
  380. package/dist/library/fence-eval.d.ts +3 -1
  381. package/dist/library/fence-eval.js +8 -2
  382. package/dist/library/fence-eval.js.map +1 -1
  383. package/dist/library/int-infer.d.ts +1 -36
  384. package/dist/library/int-infer.js +29 -18
  385. package/dist/library/int-infer.js.map +1 -1
  386. package/dist/library/int-infer.test.js +4 -4
  387. package/dist/library/{early-cache.d.ts → library-cache.d.ts} +1 -1
  388. package/dist/library/{early-cache.js → library-cache.js} +34 -89
  389. package/dist/library/library-cache.js.map +1 -0
  390. package/dist/library/library-cache.test.d.ts +1 -0
  391. package/dist/library/{early-cache.test.js → library-cache.test.js} +7 -7
  392. package/dist/library/library-cache.test.js.map +1 -0
  393. package/dist/library/{profile.d.ts → library-profile.d.ts} +4 -7
  394. package/dist/library/{profile.js → library-profile.js} +18 -11
  395. package/dist/library/library-profile.js.map +1 -0
  396. package/dist/library/semantic-source.js +2 -1
  397. package/dist/library/semantic-source.js.map +1 -1
  398. package/dist/library/sidecar.d.ts +5 -2
  399. package/dist/library/sidecar.js +11 -5
  400. package/dist/library/sidecar.js.map +1 -1
  401. package/dist/startup-cache.d.ts +11 -3
  402. package/dist/startup-cache.js +17 -2
  403. package/dist/startup-cache.js.map +1 -1
  404. package/package.json +19 -2
  405. package/surface-manifest.json +5 -5
  406. package/dist/backend/cc-cache.test.js.map +0 -1
  407. package/dist/backend/cc.js.map +0 -1
  408. package/dist/backend/emission/emit-async.js.map +0 -1
  409. package/dist/backend/emission/emit-exprs.d.ts +0 -13
  410. package/dist/backend/emission/emit-exprs.js +0 -7407
  411. package/dist/backend/emission/emit-exprs.js.map +0 -1
  412. package/dist/backend/emission/emit-island.js.map +0 -1
  413. package/dist/backend/emission/emit-shapes.js.map +0 -1
  414. package/dist/backend/emission/emit-stmts.js.map +0 -1
  415. package/dist/backend/emission/emit-types.js.map +0 -1
  416. package/dist/backend/emission/emit-walkers.js.map +0 -1
  417. package/dist/backend/emission/emitter.js.map +0 -1
  418. package/dist/backend/emission/may-throw.js.map +0 -1
  419. package/dist/backend/library-identity.js.map +0 -1
  420. package/dist/executable/early-cache.js.map +0 -1
  421. package/dist/executable/early-cache.test.js.map +0 -1
  422. package/dist/ffi/profile.js.map +0 -1
  423. package/dist/frontend/lowering/lower-emitter.js.map +0 -1
  424. package/dist/frontend/shared.d.ts +0 -82
  425. package/dist/frontend/shared.js +0 -308
  426. package/dist/frontend/shared.js.map +0 -1
  427. package/dist/frontend/ts7/program.js.map +0 -1
  428. package/dist/frontend/types.js.map +0 -1
  429. package/dist/ir/nodes.js.map +0 -1
  430. package/dist/library/early-cache.js.map +0 -1
  431. package/dist/library/early-cache.test.js.map +0 -1
  432. package/dist/library/implementation-identity.js.map +0 -1
  433. package/dist/library/profile.js.map +0 -1
  434. /package/dist/backend/{cc-cache.test.d.ts → c/types.test.d.ts} +0 -0
  435. /package/dist/{executable/early-cache.test.d.ts → backend/llvm/shapes.test.d.ts} +0 -0
  436. /package/dist/{library/early-cache.test.d.ts → backend/native-codegen.test.d.ts} +0 -0
  437. /package/dist/ffi/{profile.d.ts → ffi-manifest.d.ts} +0 -0
  438. /package/dist/frontend/ts7/{program.d.ts → program-adapter.d.ts} +0 -0
  439. /package/dist/library/{implementation-identity.d.ts → compiler-self-identity.d.ts} +0 -0
@@ -0,0 +1,726 @@
1
+ /* Focused LLVM expression emission extracted from emitter.ts. */
2
+ import { InternalCompilerError } from "../../errors.js";
3
+ import { isRefCounted, isUnitType, typeEquals } from "../../ir/ir.js";
4
+ import { mangleRecordNew } from "../mangle.js";
5
+ import { arrNewCall, traceAdapter, traceArg, vAdapters } from "./shapes.js";
6
+ import { LlvmUnsupportedError } from "./unsupported.js";
7
+ export function emitIntrinsicExpr(host, e) {
8
+ const B = host.B;
9
+ switch (e.kind) {
10
+ case "intrinsic": {
11
+ if (e.name === "module.await") {
12
+ // Internal ESM dependency wait: pending promises park the module
13
+ // fiber, while settled ones continue synchronously.
14
+ const p = host.emitExpr(e.args[0]);
15
+ if (host.wasi) {
16
+ const coro = host.currentWasiCoro;
17
+ if (coro === null)
18
+ throw new InternalCompilerError("llvm emitter bug: module await outside wasm coroutine");
19
+ host.declare(`declare zeroext i1 @scr_wasi_module_await_prepare(ptr, ptr)`);
20
+ const needsSuspend = B.tmp();
21
+ const suspend = B.newLabel("ma.suspend");
22
+ const ready = B.newLabel("ma.ready");
23
+ B.line(`${needsSuspend} = call zeroext i1 @scr_wasi_module_await_prepare(ptr ${coro.self}, ptr ${p.name})`);
24
+ B.condBr(needsSuspend, suspend, ready);
25
+ B.startBlock(suspend);
26
+ host.emitWasiSuspendPrepared();
27
+ B.br(ready);
28
+ B.startBlock(ready);
29
+ host.declare(`declare void @scr_module_await(ptr)`);
30
+ B.line(`call void @scr_module_await(ptr ${p.name})`);
31
+ }
32
+ else {
33
+ host.declare(`declare void @scr_module_await(ptr)`);
34
+ B.line(`call void @scr_module_await(ptr ${p.name})`);
35
+ }
36
+ host.emitPendingCheck();
37
+ return { name: "", type: e.type };
38
+ }
39
+ if (e.name === "promise.all") {
40
+ // The runtime countdown combinator (exprs.ts): a pre-sized
41
+ // values array filled per INPUT index as entries fulfill, plus
42
+ // one subscription per entry. Entry and values arrays both stay
43
+ // frame-owned; the combinator BORROWS them.
44
+ if (e.type.kind !== "promise")
45
+ throw new InternalCompilerError("llvm emitter bug: promise.all type");
46
+ const entries = e.args[0];
47
+ if (entries.type.kind !== "array" || entries.type.elem.kind !== "promise") {
48
+ throw new InternalCompilerError("llvm emitter bug: promise.all argument");
49
+ }
50
+ const ps = host.emitExpr(entries);
51
+ host.declare(`declare ptr @scr_promise_all(ptr, ptr, ptr)`);
52
+ if (e.type.inner.kind === "void") {
53
+ const t = B.tmp();
54
+ B.line(`${t} = call ptr @scr_promise_all(ptr ${ps.name}, ptr null, ptr null)`);
55
+ return host.own({ name: t, type: e.type });
56
+ }
57
+ if (e.type.inner.kind !== "array")
58
+ throw new InternalCompilerError("llvm emitter bug: promise.all result");
59
+ const elem = e.type.inner.elem;
60
+ const store = elem.kind === "f64" ? "scr_promise_all_store_f64"
61
+ : elem.kind === "bool" ? "scr_promise_all_store_bool"
62
+ : elem.kind === "string" ? "scr_promise_all_store_str"
63
+ : "scr_promise_all_store_ref";
64
+ host.declare(`declare void @${store}(ptr, double, ptr)`);
65
+ host.declare(`declare double @scr_arr_len(ptr)`);
66
+ const len = B.tmp();
67
+ const cap = B.tmp();
68
+ B.line(`${len} = call double @scr_arr_len(ptr ${ps.name})`);
69
+ B.line(`${cap} = fptoui double ${len} to ${host.sizeType}`);
70
+ const vals = B.tmp();
71
+ B.line(`${vals} = ${arrNewCall(host, elem, cap)}`);
72
+ host.own({ name: vals, type: e.type.inner });
73
+ const t = B.tmp();
74
+ B.line(`${t} = call ptr @scr_promise_all(ptr ${ps.name}, ptr ${vals}, ptr @${store})`);
75
+ return host.own({ name: t, type: e.type });
76
+ }
77
+ if (e.name === "promise.reject") {
78
+ // A fresh promise rejected through the exception cell: the
79
+ // %Error-rooted reason moves in as the cell's OBJ payload (a
80
+ // checked-dynamic reason rides the thrown-dyn REF representation
81
+ // instead — identity flows to catch/unhandledRejection observers,
82
+ // emitThrowValue's dyn arm), and reject_pending moves the cell
83
+ // into the promise (consumed immediately — no pending check runs
84
+ // in between).
85
+ if (e.type.kind !== "promise")
86
+ throw new InternalCompilerError("llvm emitter bug: promise.reject type");
87
+ const reasonT = e.args[0].type;
88
+ if (reasonT.kind !== "object" && reasonT.kind !== "dyn") {
89
+ throw new InternalCompilerError("llvm emitter bug: promise.reject reason");
90
+ }
91
+ host.declare(`declare ptr @scr_promise_new()`);
92
+ host.declare(`declare void @scr_promise_reject_pending(ptr)`);
93
+ const reason = host.emitExpr(e.args[0]);
94
+ const p = B.tmp();
95
+ B.line(`${p} = call ptr @scr_promise_new()`);
96
+ const out = host.own({ name: p, type: e.type });
97
+ host.moveTemp(reason); // the cell takes ownership
98
+ host.emitThrowValue({ name: reason.name, type: reasonT });
99
+ B.line(`call void @scr_promise_reject_pending(ptr ${p})`);
100
+ return out;
101
+ }
102
+ if (e.name === "promise.resolve") {
103
+ // A fresh promise fulfilled immediately: void/f64/bool by
104
+ // value, strings and refs MOVE in — the async-return
105
+ // trampoline's fulfill exactly. No waiters exist yet.
106
+ if (e.type.kind !== "promise")
107
+ throw new InternalCompilerError("llvm emitter bug: promise.resolve type");
108
+ host.declare(`declare ptr @scr_promise_new()`);
109
+ const p = B.tmp();
110
+ B.line(`${p} = call ptr @scr_promise_new()`);
111
+ const out = host.own({ name: p, type: e.type });
112
+ if (e.args.length === 0) {
113
+ host.declare(`declare void @scr_promise_fulfill_void(ptr)`);
114
+ B.line(`call void @scr_promise_fulfill_void(ptr ${p})`);
115
+ return out;
116
+ }
117
+ const v = host.emitExpr(e.args[0]);
118
+ const t = e.args[0].type;
119
+ if (t.kind === "f64" || t.kind === "date") {
120
+ host.declare(`declare void @scr_promise_fulfill_f64(ptr, double)`);
121
+ B.line(`call void @scr_promise_fulfill_f64(ptr ${p}, double ${v.name})`);
122
+ }
123
+ else if (t.kind === "bool") {
124
+ host.declare(`declare void @scr_promise_fulfill_bool(ptr, i1 zeroext)`);
125
+ B.line(`call void @scr_promise_fulfill_bool(ptr ${p}, i1 ${v.name})`);
126
+ }
127
+ else if (t.kind === "string") {
128
+ host.moveTemp(v);
129
+ host.declare(`declare void @scr_promise_fulfill_str(ptr, ptr)`);
130
+ B.line(`call void @scr_promise_fulfill_str(ptr ${p}, ptr ${v.name})`);
131
+ }
132
+ else {
133
+ const rc = vAdapters(host, t);
134
+ host.moveTemp(v);
135
+ host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
136
+ B.line(`call void @scr_promise_fulfill_ref(ptr ${p}, ptr ${v.name}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, t)})`);
137
+ }
138
+ return out;
139
+ }
140
+ if (e.name === "promise.race") {
141
+ // A fresh result promise + one race_add per entry: settled
142
+ // entries settle it immediately (first add wins), pending ones
143
+ // park a callback waiter. Entry temps stay frame-owned
144
+ // (race_add retains what it keeps).
145
+ if (e.type.kind !== "promise")
146
+ throw new InternalCompilerError("llvm emitter bug: promise.race type");
147
+ host.declare(`declare ptr @scr_promise_new()`);
148
+ host.declare(`declare void @scr_promise_race_add(ptr, ptr, ptr)`);
149
+ const result = B.tmp();
150
+ B.line(`${result} = call ptr @scr_promise_new()`);
151
+ const out = host.own({ name: result, type: e.type });
152
+ for (const entry of e.args) {
153
+ if (entry.type.kind !== "promise")
154
+ throw new InternalCompilerError("llvm emitter bug: promise.race entry");
155
+ const p = host.emitExpr(entry);
156
+ const adapter = host.raceAdapterFor(entry.type.inner, e.type.inner);
157
+ B.line(`call void @scr_promise_race_add(ptr ${result}, ptr ${p.name}, ptr @${adapter})`);
158
+ }
159
+ return out;
160
+ }
161
+ if (e.name !== "console.log" && e.name !== "console.error") {
162
+ throw new LlvmUnsupportedError(`intrinsic:${e.name}`, e.loc);
163
+ }
164
+ // The ScrLogArg protocol: one entry-block array (sized to the
165
+ // function's max arity), tag + 8-byte union slot per argument.
166
+ // String args are BORROWED — their temps stay frame-owned and
167
+ // release at statement end, after the call.
168
+ const args = e.args.map((a) => host.emitExpr(a));
169
+ host.logArgSlots = Math.max(host.logArgSlots, Math.max(args.length, 1));
170
+ args.forEach((a, i) => {
171
+ const tagOf = { f64: 0, string: 1, bool: 2 };
172
+ const tag = tagOf[a.type.kind];
173
+ if (tag === undefined)
174
+ throw new LlvmUnsupportedError(`logArg:${a.type.kind}`, e.loc);
175
+ const tp = B.tmp();
176
+ const vp = B.tmp();
177
+ B.line(`${tp} = getelementptr inbounds %ScrLogArg, ptr %logargs, i64 ${i}, i32 0`);
178
+ B.line(`store i32 ${tag}, ptr ${tp}`);
179
+ B.line(`${vp} = getelementptr inbounds %ScrLogArg, ptr %logargs, i64 ${i}, i32 1`);
180
+ if (a.type.kind === "f64")
181
+ B.line(`store double ${a.name}, ptr ${vp}`);
182
+ else if (a.type.kind === "string")
183
+ B.line(`store ptr ${a.name}, ptr ${vp}`);
184
+ else {
185
+ const z = B.tmp();
186
+ B.line(`${z} = zext i1 ${a.name} to i8`);
187
+ B.line(`store i8 ${z}, ptr ${vp}`);
188
+ }
189
+ });
190
+ const fn = e.name === "console.error" ? "scr_console_error" : "scr_console_log";
191
+ host.declare(`declare void @${fn}(${host.sizeType}, ptr)`);
192
+ B.line(`call void @${fn}(${host.sizeType} ${args.length}, ptr %logargs)`);
193
+ return { name: "", type: e.type };
194
+ }
195
+ default: {
196
+ throw new InternalCompilerError("unreachable");
197
+ }
198
+ }
199
+ }
200
+ export function emitSerializationExpr(host, e) {
201
+ const B = host.B;
202
+ switch (e.kind) {
203
+ case "jsonStringify": {
204
+ // Type-directed serialization: the STATIC type picks an emitted
205
+ // serializer (interned per typeKey) — no dyn, no runtime dispatch.
206
+ // The value temp is BORROWED (released with this statement's
207
+ // frame); the result string is owned (+1). Never throws — except
208
+ // the dyn root below.
209
+ const v = host.emitExpr(e.value);
210
+ let compact;
211
+ if (e.value.type.kind === "dyn") {
212
+ // A dyn root: the runtime's dyn walker (scr_dyn_format_j — the
213
+ // C backend's dispatch exactly): number/string/bool/null/array/
214
+ // object exact, dropped members omitted, and a dropped ROOT
215
+ // becomes the TEXT "undefined" (JSON.stringify(undefined) is
216
+ // the undefined value; printing it spells the word — Node's
217
+ // answer, where the nested-position writer would spell null).
218
+ // Fallible (a runtime handle inside the tree throws) — the
219
+ // pending check runs.
220
+ host.declare(`declare ptr @scr_dyn_format_j(ptr)`);
221
+ const t = B.tmp();
222
+ B.line(`${t} = call ptr @scr_dyn_format_j(ptr ${v.name})`);
223
+ compact = host.own({ name: t, type: e.type });
224
+ host.emitPendingCheck();
225
+ }
226
+ else {
227
+ const helper = host.walkers.jsonWriteHelper(e.value.type);
228
+ host.declare(`declare void @scr_jb_init(ptr)`);
229
+ host.declare(`declare ptr @scr_jb_finish(ptr)`);
230
+ const buf = B.slot();
231
+ B.entryAllocas.push(`${buf} = alloca %ScrJsonBuf`);
232
+ B.line(`call void @scr_jb_init(ptr ${buf})`);
233
+ B.line(`call void @${helper}(ptr ${buf}, ${host.llType(e.value.type)} ${v.name})`);
234
+ const t = B.tmp();
235
+ B.line(`${t} = call ptr @scr_jb_finish(ptr ${buf})`);
236
+ compact = host.own({ name: t, type: e.type });
237
+ // A cycle-capable root can throw the circular-structure
238
+ // TypeError mid-walk: finish still runs (frees the buffer, the
239
+ // partial string joins the frame and releases on unwind), then
240
+ // the pending check unwinds — the C emitter's contract exactly.
241
+ if (traceAdapter(host, e.value.type) !== null)
242
+ host.emitPendingCheck();
243
+ }
244
+ // A pretty-print form (`stringify(v, null, 2)`): the frontend
245
+ // resolved the space to a compile-time indent string (Node's
246
+ // clamp/truncate rules); the interned re-indenter rewrites the
247
+ // compact text with Node's gap algorithm. Compact temp stays
248
+ // frame-owned; the pretty string is a fresh +1.
249
+ const indent = e.indent;
250
+ if (indent === undefined || indent === "")
251
+ return compact;
252
+ const rewriter = host.walkers.jsonIndentHelper();
253
+ const t2 = B.tmp();
254
+ B.line(`${t2} = call ptr @${rewriter}(ptr ${compact.name}, ptr ${host.cstr(indent)}, ${host.sizeType} ${Buffer.byteLength(indent, "utf8")})`);
255
+ return host.own({ name: t2, type: e.type });
256
+ }
257
+ case "dynCheck": {
258
+ // The dynamic boundary: validate the checked-dynamic tree against the target type
259
+ // and BUILD the typed value (+1) — or throw the catchable
260
+ // path-annotated TypeError. The dyn temp is BORROWED; the result
261
+ // joins the frame BEFORE the pending check so an unwind releases
262
+ // the dummy harmlessly.
263
+ const dynV = host.emitExpr(e.value);
264
+ const helper = host.dyn.dynCheckHelper(e.type);
265
+ const ty = host.llType(e.type);
266
+ const t = B.tmp();
267
+ B.line(`${t} = call ${ty === "i1" ? "zeroext i1" : ty} @${helper}(ptr ${dynV.name}, ptr null)`);
268
+ const out = host.own({ name: t, type: e.type });
269
+ host.emitPendingCheck();
270
+ return out;
271
+ }
272
+ default: {
273
+ const _exhaustive = e;
274
+ void _exhaustive;
275
+ throw new InternalCompilerError("unreachable");
276
+ }
277
+ }
278
+ }
279
+ export function emitAsyncExpr(host, e) {
280
+ const B = host.B;
281
+ switch (e.kind) {
282
+ case "yieldExpr": {
283
+ // Park the operand in the generator's OUT slot (moved in, typed by
284
+ // the function's yield channel) and switch back to the resumer.
285
+ // Control returns at the next resume — possibly with an injected
286
+ // .throw payload or the GENRET sentinel pending, hence the check.
287
+ // The result is the .next(v) argument, moved out of the IN slot.
288
+ const gen = host.currentGenerator;
289
+ if (!gen)
290
+ throw new InternalCompilerError("llvm emitter bug: yieldExpr outside a generator body");
291
+ if (e.value === null)
292
+ throw new InternalCompilerError("llvm emitter bug: yieldExpr with no operand (frontend fills undefined)");
293
+ const v = host.emitExpr(e.value);
294
+ const yt = e.value.type;
295
+ if (yt.kind === "f64" || yt.kind === "date") {
296
+ if (host.wasi) {
297
+ const coro = host.currentWasiCoro;
298
+ host.declare(`declare ptr @scr_gen_of_fiber(ptr)`);
299
+ host.declare(`declare void @scr_gen_out_f64(ptr, double)`);
300
+ const g = B.tmp();
301
+ B.line(`${g} = call ptr @scr_gen_of_fiber(ptr ${coro.self})`);
302
+ B.line(`call void @scr_gen_out_f64(ptr ${g}, double ${v.name})`);
303
+ }
304
+ else {
305
+ host.declare(`declare void @scr_gen_yield_f64(double)`);
306
+ B.line(`call void @scr_gen_yield_f64(double ${v.name})`);
307
+ }
308
+ }
309
+ else if (yt.kind === "bool") {
310
+ if (host.wasi) {
311
+ const coro = host.currentWasiCoro;
312
+ host.declare(`declare ptr @scr_gen_of_fiber(ptr)`);
313
+ host.declare(`declare void @scr_gen_out_bool(ptr, i1 zeroext)`);
314
+ const g = B.tmp();
315
+ B.line(`${g} = call ptr @scr_gen_of_fiber(ptr ${coro.self})`);
316
+ B.line(`call void @scr_gen_out_bool(ptr ${g}, i1 ${v.name})`);
317
+ }
318
+ else {
319
+ host.declare(`declare void @scr_gen_yield_bool(i1 zeroext)`);
320
+ B.line(`call void @scr_gen_yield_bool(i1 ${v.name})`);
321
+ }
322
+ }
323
+ else {
324
+ host.moveTemp(v); // the OUT slot takes ownership
325
+ if (host.wasi) {
326
+ const coro = host.currentWasiCoro;
327
+ host.declare(`declare ptr @scr_gen_of_fiber(ptr)`);
328
+ host.declare(`declare void @scr_gen_out_ref(ptr, ptr, ptr)`);
329
+ const g = B.tmp();
330
+ B.line(`${g} = call ptr @scr_gen_of_fiber(ptr ${coro.self})`);
331
+ B.line(`call void @scr_gen_out_ref(ptr ${g}, ptr ${v.name}, ptr ${vAdapters(host, yt).release})`);
332
+ }
333
+ else {
334
+ host.declare(`declare void @scr_gen_yield_ref(ptr, ptr)`);
335
+ B.line(`call void @scr_gen_yield_ref(ptr ${v.name}, ptr ${vAdapters(host, yt).release})`);
336
+ }
337
+ }
338
+ if (host.wasi)
339
+ host.emitWasiSuspendPrepared();
340
+ host.emitPendingCheck();
341
+ if (e.type.kind === "void") {
342
+ // An undefined next-channel: nothing to read (the frontend
343
+ // fences value-position yields on this channel).
344
+ return { name: "", type: e.type };
345
+ }
346
+ const t = B.tmp();
347
+ if (e.type.kind === "f64" || e.type.kind === "date") {
348
+ host.declare(`declare double @scr_gen_take_in_f64()`);
349
+ B.line(`${t} = call double @scr_gen_take_in_f64()`);
350
+ return { name: t, type: e.type };
351
+ }
352
+ if (e.type.kind === "bool") {
353
+ host.declare(`declare zeroext i1 @scr_gen_take_in_bool()`);
354
+ B.line(`${t} = call zeroext i1 @scr_gen_take_in_bool()`);
355
+ return { name: t, type: e.type };
356
+ }
357
+ // Refcounted channels: the slot's +1 moves out.
358
+ host.declare(`declare ptr @scr_gen_take_in_ref()`);
359
+ B.line(`${t} = call ptr @scr_gen_take_in_ref()`);
360
+ return host.own({ name: t, type: e.type });
361
+ }
362
+ case "genResume": {
363
+ // One consumer resume: park the sent value (typed per mode), hop
364
+ // into the fiber, propagate a body exception (pending check), and
365
+ // build the IteratorResult record through the interned helper.
366
+ const genT = e.gen.type;
367
+ if (genT.kind !== "generator")
368
+ throw new InternalCompilerError("llvm emitter bug: genResume on a non-generator");
369
+ if (e.type.kind !== "record")
370
+ throw new InternalCompilerError("llvm emitter bug: genResume result is not a record");
371
+ const g = host.emitExpr(e.gen); // borrowed for the calls below
372
+ const sendArg = (store) => {
373
+ const a = host.emitExpr(e.arg);
374
+ if (isRefCounted(e.arg.type))
375
+ host.moveTemp(a); // the slot takes ownership
376
+ store(a.name, e.arg.type);
377
+ };
378
+ const parkIn = (name, t) => {
379
+ if (t.kind === "f64" || t.kind === "date") {
380
+ host.declare(`declare void @scr_gen_in_f64(ptr, double)`);
381
+ B.line(`call void @scr_gen_in_f64(ptr ${g.name}, double ${name})`);
382
+ }
383
+ else if (t.kind === "bool") {
384
+ host.declare(`declare void @scr_gen_in_bool(ptr, i1 zeroext)`);
385
+ B.line(`call void @scr_gen_in_bool(ptr ${g.name}, i1 ${name})`);
386
+ }
387
+ else {
388
+ host.declare(`declare void @scr_gen_in_ref(ptr, ptr, ptr)`);
389
+ B.line(`call void @scr_gen_in_ref(ptr ${g.name}, ptr ${name}, ptr ${vAdapters(host, t).release})`);
390
+ }
391
+ };
392
+ if (e.mode === "next") {
393
+ if (e.arg === null) {
394
+ if (genT.nextT.kind === "dyn") {
395
+ // Valueless resume on a dyn channel: JS's undefined — the
396
+ // dyn singleton rides the IN slot (+1 moves in).
397
+ host.declare(`declare ptr @scr_dyn_undefined()`);
398
+ host.declare(`declare ptr @scr_dyn_retain_v(ptr)`);
399
+ host.declare(`declare void @scr_dyn_release_v(ptr)`);
400
+ host.declare(`declare void @scr_gen_in_ref(ptr, ptr, ptr)`);
401
+ const u = B.tmp();
402
+ const r = B.tmp();
403
+ B.line(`${u} = call ptr @scr_dyn_undefined()`);
404
+ B.line(`${r} = call ptr @scr_dyn_retain_v(ptr ${u})`);
405
+ B.line(`call void @scr_gen_in_ref(ptr ${g.name}, ptr ${r}, ptr @scr_dyn_release_v)`);
406
+ }
407
+ else {
408
+ host.declare(`declare void @scr_gen_in_none(ptr)`);
409
+ B.line(`call void @scr_gen_in_none(ptr ${g.name})`);
410
+ }
411
+ }
412
+ else {
413
+ sendArg(parkIn);
414
+ }
415
+ host.declare(`declare void @scr_gen_resume(ptr)`);
416
+ B.line(`call void @scr_gen_resume(ptr ${g.name})`);
417
+ }
418
+ else if (e.mode === "return") {
419
+ if (e.arg === null) {
420
+ host.declare(`declare void @scr_gen_ret_none(ptr)`);
421
+ B.line(`call void @scr_gen_ret_none(ptr ${g.name})`);
422
+ }
423
+ else {
424
+ sendArg((name, t) => {
425
+ if (t.kind === "f64" || t.kind === "date") {
426
+ host.declare(`declare void @scr_gen_ret_f64(ptr, double)`);
427
+ B.line(`call void @scr_gen_ret_f64(ptr ${g.name}, double ${name})`);
428
+ }
429
+ else if (t.kind === "bool") {
430
+ host.declare(`declare void @scr_gen_ret_bool(ptr, i1 zeroext)`);
431
+ B.line(`call void @scr_gen_ret_bool(ptr ${g.name}, i1 ${name})`);
432
+ }
433
+ else {
434
+ host.declare(`declare void @scr_gen_ret_ref(ptr, ptr, ptr)`);
435
+ B.line(`call void @scr_gen_ret_ref(ptr ${g.name}, ptr ${name}, ptr ${vAdapters(host, t).release})`);
436
+ }
437
+ });
438
+ }
439
+ host.declare(`declare void @scr_gen_resume_return(ptr)`);
440
+ B.line(`call void @scr_gen_resume_return(ptr ${g.name})`);
441
+ }
442
+ else {
443
+ // .throw(e): park the payload in the CALLER's cell (the throw
444
+ // statement's exact kind dispatch), then resume — the runtime
445
+ // moves it into the fiber, or leaves it pending (non-suspended
446
+ // generators: the .throw call itself throws at the check below).
447
+ if (e.arg === null)
448
+ throw new InternalCompilerError("llvm emitter bug: genResume throw with no payload");
449
+ const a = host.emitExpr(e.arg);
450
+ if (isRefCounted(e.arg.type))
451
+ host.moveTemp(a); // the cell takes ownership
452
+ host.emitThrowValue({ name: a.name, type: e.arg.type });
453
+ host.declare(`declare void @scr_gen_resume_throw(ptr)`);
454
+ B.line(`call void @scr_gen_resume_throw(ptr ${g.name})`);
455
+ }
456
+ const helper = host.genResultThunkFor(genT, e.type);
457
+ // The record builds before the check so an unwind (a propagated
458
+ // body exception) releases it as the frame's never-read dummy.
459
+ const t = B.tmp();
460
+ B.line(`${t} = call ptr @${helper}(ptr ${g.name})`);
461
+ const out = host.own({ name: t, type: e.type });
462
+ host.emitPendingCheck();
463
+ return out;
464
+ }
465
+ case "awaitExpr": {
466
+ // Parks the fiber until the promise settles; rejected promises
467
+ // re-throw here (hence the pending check). Promise temp borrowed;
468
+ // refcounted results arrive +1 and join the frame pre-check so an
469
+ // unwind releases the dummy (NULL) harmlessly.
470
+ const pr = host.emitExpr(e.value);
471
+ if (host.wasi)
472
+ host.emitWasiSuspend(pr.name);
473
+ if (e.type.kind === "void") {
474
+ host.declare(`declare void @scr_await_void(ptr)`);
475
+ B.line(`call void @scr_await_void(ptr ${pr.name})`);
476
+ host.emitPendingCheck();
477
+ return { name: "", type: e.type };
478
+ }
479
+ const t = B.tmp();
480
+ if (e.type.kind === "f64" || e.type.kind === "date") {
481
+ host.declare(`declare double @scr_await_f64(ptr)`);
482
+ B.line(`${t} = call double @scr_await_f64(ptr ${pr.name})`);
483
+ }
484
+ else if (e.type.kind === "bool") {
485
+ host.declare(`declare zeroext i1 @scr_await_bool(ptr)`);
486
+ B.line(`${t} = call zeroext i1 @scr_await_bool(ptr ${pr.name})`);
487
+ }
488
+ else if (e.type.kind === "string") {
489
+ host.declare(`declare ptr @scr_await_str(ptr)`);
490
+ B.line(`${t} = call ptr @scr_await_str(ptr ${pr.name})`);
491
+ }
492
+ else {
493
+ host.declare(`declare ptr @scr_await_ref(ptr)`);
494
+ B.line(`${t} = call ptr @scr_await_ref(ptr ${pr.name})`);
495
+ }
496
+ const out = host.own({ name: t, type: e.type });
497
+ host.emitPendingCheck();
498
+ return out;
499
+ }
500
+ case "awaitUnionExpr": {
501
+ // Await of a promise-or-absent union: the promise arm awaits like
502
+ // awaitExpr (parks, re-throws rejections); a unit arm takes
503
+ // exactly one microtask hop (JS: await of a non-thenable) and
504
+ // yields itself. The union temp is borrowed; the value-carrying
505
+ // result parks in a slot, joins the frame at the load, and the
506
+ // pending check runs after the join (exprs.ts's shape).
507
+ if (e.value.type.kind !== "union")
508
+ throw new InternalCompilerError("llvm emitter bug: awaitUnion of a non-union");
509
+ const def = host.unionsById.get(e.value.type.unionId);
510
+ const promiseArm = def?.arms[e.promiseTag];
511
+ if (!def || promiseArm?.kind !== "promise") {
512
+ throw new InternalCompilerError("llvm emitter bug: awaitUnion arm is not a promise");
513
+ }
514
+ const inner = promiseArm.inner;
515
+ const u = host.emitExpr(e.value);
516
+ const tag = host.unionTag(u.name);
517
+ const isP = B.tmp();
518
+ B.line(`${isP} = icmp eq i32 ${tag}, ${e.promiseTag}`);
519
+ host.declare(`declare void @scr_await_hop()`);
520
+ if (e.type.kind === "void") {
521
+ const lp = B.newLabel("au.p");
522
+ const lh = B.newLabel("au.h");
523
+ const lj = B.newLabel("au.j");
524
+ B.condBr(isP, lp, lh);
525
+ B.startBlock(lp);
526
+ host.declare(`declare void @scr_await_void(ptr)`);
527
+ {
528
+ const promise = host.unionPeek(u.name);
529
+ if (host.wasi)
530
+ host.emitWasiSuspend(promise);
531
+ B.line(`call void @scr_await_void(ptr ${promise})`);
532
+ }
533
+ B.br(lj);
534
+ B.startBlock(lh);
535
+ if (host.wasi)
536
+ host.emitWasiSuspend(null);
537
+ else
538
+ B.line(`call void @scr_await_hop()`);
539
+ B.br(lj);
540
+ B.startBlock(lj);
541
+ host.emitPendingCheck();
542
+ return { name: "", type: e.type };
543
+ }
544
+ if (e.type.kind !== "union") {
545
+ throw new InternalCompilerError("llvm emitter bug: awaitUnion result is neither void nor a union");
546
+ }
547
+ const resUnionId = e.type.unionId;
548
+ const resDef = host.unionsById.get(resUnionId);
549
+ if (!resDef)
550
+ throw new InternalCompilerError("llvm emitter bug: awaitUnion result union unknown");
551
+ const resTagOf = (arm) => {
552
+ const t = resDef.arms.findIndex((a) => typeEquals(a, arm));
553
+ if (t < 0)
554
+ throw new InternalCompilerError("llvm emitter bug: awaitUnion result arm missing");
555
+ return t;
556
+ };
557
+ const innerTag = resTagOf(inner);
558
+ const slot = B.slot();
559
+ B.entryAllocas.push(`${slot} = alloca ptr`);
560
+ B.line(`store ptr null, ptr ${slot}`);
561
+ const lp = B.newLabel("au.p");
562
+ const lh = B.newLabel("au.h");
563
+ const lj = B.newLabel("au.j");
564
+ B.condBr(isP, lp, lh);
565
+ B.startBlock(lp);
566
+ const peek = host.unionPeek(u.name);
567
+ if (host.wasi)
568
+ host.emitWasiSuspend(peek);
569
+ let awaited;
570
+ if (inner.kind === "f64" || inner.kind === "date") {
571
+ host.declare(`declare double @scr_await_f64(ptr)`);
572
+ const x = B.tmp();
573
+ B.line(`${x} = call double @scr_await_f64(ptr ${peek})`);
574
+ awaited = { name: x, type: inner };
575
+ }
576
+ else if (inner.kind === "bool") {
577
+ host.declare(`declare zeroext i1 @scr_await_bool(ptr)`);
578
+ const x = B.tmp();
579
+ B.line(`${x} = call zeroext i1 @scr_await_bool(ptr ${peek})`);
580
+ awaited = { name: x, type: inner };
581
+ }
582
+ else if (inner.kind === "string") {
583
+ host.declare(`declare ptr @scr_await_str(ptr)`);
584
+ const x = B.tmp();
585
+ B.line(`${x} = call ptr @scr_await_str(ptr ${peek})`);
586
+ awaited = { name: x, type: inner };
587
+ }
588
+ else {
589
+ host.declare(`declare ptr @scr_await_ref(ptr)`);
590
+ const x = B.tmp();
591
+ B.line(`${x} = call ptr @scr_await_ref(ptr ${peek})`);
592
+ awaited = { name: x, type: inner };
593
+ }
594
+ B.line(`store ptr ${host.unionNewOwned(innerTag, awaited)}, ptr ${slot}`);
595
+ B.br(lj);
596
+ B.startBlock(lh);
597
+ if (host.wasi)
598
+ host.emitWasiSuspend(null);
599
+ else
600
+ B.line(`call void @scr_await_hop()`);
601
+ const unitTags = def.arms.flatMap((a, i) => (isUnitType(a) ? [i] : []));
602
+ if (unitTags.length === 1) {
603
+ B.line(`store ptr ${host.unitInstanceRef(resUnionId, resTagOf(def.arms[unitTags[0]]))}, ptr ${slot}`);
604
+ B.br(lj);
605
+ }
606
+ else {
607
+ // Several unit arms: dispatch on the source tag (each maps to
608
+ // its own interned instance in the result union).
609
+ const bad = B.newLabel("au.b");
610
+ const labels = unitTags.map(() => B.newLabel("au.u"));
611
+ B.terminate(`switch i32 ${tag}, label %${bad} [ ${unitTags.map((t2, i) => `i32 ${t2}, label %${labels[i]}`).join(" ")} ]`);
612
+ unitTags.forEach((t2, i) => {
613
+ B.startBlock(labels[i]);
614
+ B.line(`store ptr ${host.unitInstanceRef(resUnionId, resTagOf(def.arms[t2]))}, ptr ${slot}`);
615
+ B.br(lj);
616
+ });
617
+ B.startBlock(bad);
618
+ host.needsBadTag = true;
619
+ B.line(`call void @sc_bad_tag()`);
620
+ B.terminate(`unreachable`);
621
+ }
622
+ B.startBlock(lj);
623
+ const t = B.tmp();
624
+ B.line(`${t} = load ptr, ptr ${slot}`);
625
+ const out = host.own({ name: t, type: e.type });
626
+ host.emitPendingCheck();
627
+ return out;
628
+ }
629
+ case "newPromise": {
630
+ // Pending promise + resolve closure, executor run synchronously
631
+ // (its throw rejects — handled inside the runtime helper, so no
632
+ // pending check here). Executor/resolve temps are frame-owned;
633
+ // the run call takes ownership of the resolve/reject closures.
634
+ if (e.type.kind !== "promise")
635
+ throw new InternalCompilerError("llvm emitter bug: newPromise type");
636
+ const inner = e.type.inner;
637
+ host.declare(`declare ptr @scr_promise_new()`);
638
+ const p = B.tmp();
639
+ B.line(`${p} = call ptr @scr_promise_new()`);
640
+ const out = host.own({ name: p, type: e.type });
641
+ // Zero-param executor: no resolve exists — a forever-pending
642
+ // promise unless the executor throws (which rejects it).
643
+ if (e.executor.type.kind === "func" && e.executor.type.params.length === 0) {
644
+ const exec0 = host.emitExpr(e.executor);
645
+ host.declare(`declare void @scr_promise_run_executor0(ptr, ptr)`);
646
+ B.line(`call void @scr_promise_run_executor0(ptr ${p}, ptr ${exec0.name})`);
647
+ return out;
648
+ }
649
+ let resolve;
650
+ const kindNums = { f64: 0, date: 0, bool: 1, string: 2, void: 3 };
651
+ const kindNum = kindNums[inner.kind];
652
+ if (kindNum !== undefined) {
653
+ host.declare(`declare ptr @scr_make_resolve(ptr, i32)`);
654
+ resolve = B.tmp();
655
+ B.line(`${resolve} = call ptr @scr_make_resolve(ptr ${p}, i32 ${kindNum})`);
656
+ }
657
+ else {
658
+ host.declare(`declare ptr @scr_make_resolve_fn(ptr, ptr)`);
659
+ resolve = B.tmp();
660
+ B.line(`${resolve} = call ptr @scr_make_resolve_fn(ptr ${p}, ptr @${host.resolveThunkFor(inner)})`);
661
+ }
662
+ if (e.executor.type.kind === "func" && e.executor.type.params.length === 2) {
663
+ // Two-param executor: reject is a runtime-provided closure
664
+ // rejecting the promise with its Error reason. First settle
665
+ // wins in the runtime; both closures' +1 move into the call.
666
+ host.declare(`declare ptr @scr_make_reject(ptr)`);
667
+ const reject = B.tmp();
668
+ B.line(`${reject} = call ptr @scr_make_reject(ptr ${p})`);
669
+ const exec2 = host.emitExpr(e.executor);
670
+ host.declare(`declare void @scr_promise_run_executor2(ptr, ptr, ptr, ptr)`);
671
+ B.line(`call void @scr_promise_run_executor2(ptr ${p}, ptr ${exec2.name}, ptr ${resolve}, ptr ${reject})`);
672
+ return out;
673
+ }
674
+ const exec = host.emitExpr(e.executor);
675
+ host.declare(`declare void @scr_promise_run_executor(ptr, ptr, ptr)`);
676
+ B.line(`call void @scr_promise_run_executor(ptr ${p}, ptr ${exec.name}, ptr ${resolve})`);
677
+ return out;
678
+ }
679
+ case "promiseWithResolvers": {
680
+ // The newPromise pieces without an executor: a pending promise,
681
+ // its runtime resolve closure (typed per the inner kind), and the
682
+ // reject closure, written into the fresh record. Closure +1s move
683
+ // into the record's fields; never throws.
684
+ if (e.type.kind !== "record")
685
+ throw new InternalCompilerError("llvm emitter bug: promiseWithResolvers type");
686
+ const shape = host.recordsById.get(e.type.shapeId);
687
+ const promT = shape?.fields.find((f) => f.name === "promise")?.type;
688
+ if (!shape || promT?.kind !== "promise") {
689
+ throw new InternalCompilerError("llvm emitter bug: promiseWithResolvers record shape");
690
+ }
691
+ const inner = promT.inner;
692
+ host.declare(`declare ptr @scr_promise_new()`);
693
+ host.declare(`declare ptr @scr_make_reject(ptr)`);
694
+ const p = B.tmp();
695
+ B.line(`${p} = call ptr @scr_promise_new()`);
696
+ const kindNums = { f64: 0, date: 0, bool: 1, string: 2, void: 3 };
697
+ const kindNum = kindNums[inner.kind];
698
+ const resolve = B.tmp();
699
+ if (kindNum !== undefined) {
700
+ host.declare(`declare ptr @scr_make_resolve(ptr, i32)`);
701
+ B.line(`${resolve} = call ptr @scr_make_resolve(ptr ${p}, i32 ${kindNum})`);
702
+ }
703
+ else {
704
+ host.declare(`declare ptr @scr_make_resolve_fn(ptr, ptr)`);
705
+ B.line(`${resolve} = call ptr @scr_make_resolve_fn(ptr ${p}, ptr @${host.resolveThunkFor(inner)})`);
706
+ }
707
+ const reject = B.tmp();
708
+ B.line(`${reject} = call ptr @scr_make_reject(ptr ${p})`);
709
+ const rec = B.tmp();
710
+ B.line(`${rec} = call ptr @${mangleRecordNew(e.type.shapeId)}()`);
711
+ const out = host.own({ name: rec, type: e.type });
712
+ // The three +1s move straight into the fresh record's fields.
713
+ for (const [field, value] of [["promise", p], ["resolve", resolve], ["reject", reject]]) {
714
+ const { ptr } = host.recordFieldPtr(rec, e.type.shapeId, field);
715
+ B.line(`store ptr ${value}, ptr ${ptr}`);
716
+ }
717
+ return out;
718
+ }
719
+ default: {
720
+ const _exhaustive = e;
721
+ void _exhaustive;
722
+ throw new InternalCompilerError("unreachable");
723
+ }
724
+ }
725
+ }
726
+ //# sourceMappingURL=expr-async.js.map