@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,637 @@
1
+ /* Focused LLVM expression emission extracted from emitter.ts. */
2
+ import { InternalCompilerError } from "../../errors.js";
3
+ import { undefinedArmTag } from "../../ir/analysis.js";
4
+ import { isRefCounted, typeEquals, typeKey } from "../../ir/ir.js";
5
+ import { mangleResolveThunk } from "../mangle.js";
6
+ import { elemAccess, FN_ATTRS, mapKeyAccess, mapKeyKindNum, mapValKindNum, traceArg, vAdapters } from "./shapes.js";
7
+ import { F64_INF, f64Lit } from "./common.js";
8
+ export function resolveThunkFor(host, inner) {
9
+ const key = typeKey(inner);
10
+ let sym = host.resolveThunks.get(key);
11
+ if (!sym) {
12
+ sym = mangleResolveThunk(host.resolveThunks.size);
13
+ host.resolveThunks.set(key, sym);
14
+ const v = vAdapters(host, inner);
15
+ host.declare(`declare void @scr_resolve_ref_impl(ptr, ptr, ptr, ptr, ptr)`);
16
+ host.resolveThunkDefs.push(`define internal void @${sym}(ptr %self, ptr %v) ${FN_ATTRS} { ; resolve<${key}>`, `entry:`, ` call void @scr_resolve_ref_impl(ptr %self, ptr %v, ptr ${v.retain}, ptr ${v.release}, ptr ${traceArg(host, inner)})`, ` ret void`, `}`, ``);
17
+ }
18
+ return sym;
19
+ }
20
+ export function tagInSet(host, uName, tags) {
21
+ const B = host.B;
22
+ const tag = host.unionTag(uName);
23
+ let acc = "";
24
+ for (const t of tags) {
25
+ const c = B.tmp();
26
+ B.line(`${c} = icmp eq i32 ${tag}, ${t}`);
27
+ if (acc === "") {
28
+ acc = c;
29
+ }
30
+ else {
31
+ const o = B.tmp();
32
+ B.line(`${o} = or i1 ${acc}, ${c}`);
33
+ acc = o;
34
+ }
35
+ }
36
+ return acc;
37
+ }
38
+ export function arrPush(host, arr, acc, value) {
39
+ const argTy = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
40
+ host.declare(`declare double @scr_arr_push_${acc}(ptr, ${argTy === "i1" ? "i1 zeroext" : argTy})`);
41
+ const t = host.B.tmp();
42
+ host.B.line(`${t} = call double @scr_arr_push_${acc}(ptr ${arr}, ${argTy} ${value})`);
43
+ return t;
44
+ }
45
+ export function emitArrayCopyLoop(host, dst, src, acc) {
46
+ void acc;
47
+ host.declare(`declare double @scr_arr_push_spread(ptr, ptr)`);
48
+ host.B.line(`call double @scr_arr_push_spread(ptr ${dst}, ptr ${src})`);
49
+ }
50
+ export function emitStrIntrinsic(host, e) {
51
+ // Receiver and string arguments are owned temps in the current frame;
52
+ // every scr_str_* method BORROWS them. String/array-returning methods
53
+ // hand back a +1 reference, which own() registers like any other.
54
+ // Omitted optional args get the C-side defaults from docs/ir.md.
55
+ const B = host.B;
56
+ const r = host.emitExpr(e.receiver);
57
+ const args = e.args.map((a) => host.emitExpr(a));
58
+ const call = (sym, sig, argText, retTy, owned) => {
59
+ // sig reads "<ret> (<params>)" — respelled to LLVM's declare form.
60
+ const m = /^(.+?) \((.*)\)$/.exec(sig);
61
+ if (!m)
62
+ throw new InternalCompilerError(`llvm emitter bug: bad strIntrinsic sig ${sig}`);
63
+ host.declare(`declare ${m[1]} @${sym}(${m[2]})`);
64
+ const t = B.tmp();
65
+ B.line(`${t} = call ${retTy} @${sym}(${argText})`);
66
+ return owned ? host.own({ name: t, type: e.type }) : { name: t, type: e.type };
67
+ };
68
+ const method = e.method;
69
+ switch (method) {
70
+ case "length":
71
+ return call("scr_str_utf16_len", "double (ptr)", `ptr ${r.name}`, "double", false);
72
+ case "charCodeAt":
73
+ return call("scr_str_char_code_at", "double (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "double", false);
74
+ case "charAt":
75
+ return call("scr_str_char_at", "ptr (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "ptr", true);
76
+ case "indexOf":
77
+ return call("scr_str_index_of", "double (ptr, ptr, double)", `ptr ${r.name}, ptr ${args[0].name}, double ${args[1]?.name ?? f64Lit(0)}`, "double", false);
78
+ case "includes": {
79
+ if (args[1]) {
80
+ // The position form is indexOf's clamp exactly: found ⇔ != -1.
81
+ const idx = call("scr_str_index_of", "double (ptr, ptr, double)", `ptr ${r.name}, ptr ${args[0].name}, double ${args[1].name}`, "double", false);
82
+ const t = B.tmp();
83
+ B.line(`${t} = fcmp une double ${idx.name}, ${f64Lit(-1)}`);
84
+ return { name: t, type: e.type };
85
+ }
86
+ return call("scr_str_includes", "zeroext i1 (ptr, ptr)", `ptr ${r.name}, ptr ${args[0].name}`, "i1", false);
87
+ }
88
+ case "startsWith":
89
+ return call("scr_str_starts_with", "zeroext i1 (ptr, ptr)", `ptr ${r.name}, ptr ${args[0].name}`, "i1", false);
90
+ case "endsWith":
91
+ return call("scr_str_ends_with", "zeroext i1 (ptr, ptr)", `ptr ${r.name}, ptr ${args[0].name}`, "i1", false);
92
+ case "slice":
93
+ return call("scr_str_slice", "ptr (ptr, double, double)", `ptr ${r.name}, double ${args[0]?.name ?? f64Lit(0)}, double ${args[1]?.name ?? F64_INF}`, "ptr", true);
94
+ case "substring":
95
+ return call("scr_str_substring", "ptr (ptr, double, double)", `ptr ${r.name}, double ${args[0].name}, double ${args[1]?.name ?? F64_INF}`, "ptr", true);
96
+ case "repeat":
97
+ return call("scr_str_repeat", "ptr (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "ptr", true);
98
+ case "trim":
99
+ return call("scr_str_trim", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
100
+ case "trimStart":
101
+ return call("scr_str_trim_start", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
102
+ case "trimEnd":
103
+ return call("scr_str_trim_end", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
104
+ case "split":
105
+ return call("scr_str_split_limit", "ptr (ptr, ptr, double)", `ptr ${r.name}, ptr ${args[0].name}, double ${args[1].name}`, "ptr", true);
106
+ case "padStart":
107
+ return call("scr_str_pad_start", "ptr (ptr, double, ptr)", `ptr ${r.name}, double ${args[0].name}, ptr ${args[1].name}`, "ptr", true);
108
+ case "padEnd":
109
+ return call("scr_str_pad_end", "ptr (ptr, double, ptr)", `ptr ${r.name}, double ${args[0].name}, ptr ${args[1].name}`, "ptr", true);
110
+ case "toLowerCase":
111
+ return call("scr_str_to_lower", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
112
+ case "toUpperCase":
113
+ return call("scr_str_to_upper", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
114
+ // The well-formedness pair: no-ops over well-formed storage
115
+ // (constant true / retained identity; scr_string.c).
116
+ case "isWellFormed":
117
+ return call("scr_str_is_well_formed", "zeroext i1 (ptr)", `ptr ${r.name}`, "i1", false);
118
+ case "toWellFormed":
119
+ return call("scr_str_to_well_formed", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
120
+ case "cpAt":
121
+ // The code point AT an index as a one-code-point string (+1) —
122
+ // the string-for-of desugar's read.
123
+ return call("scr_str_cp_at", "ptr (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "ptr", true);
124
+ default: {
125
+ const _exhaustive = method;
126
+ void _exhaustive;
127
+ throw new InternalCompilerError("unreachable");
128
+ }
129
+ }
130
+ }
131
+ export function emitArrIntrinsic(host, e) {
132
+ const B = host.B;
133
+ const r = host.emitExpr(e.receiver);
134
+ if (e.receiver.type.kind !== "array")
135
+ throw new InternalCompilerError("llvm emitter bug: arrIntrinsic on non-array");
136
+ const elem = e.receiver.type.elem;
137
+ const acc = elemAccess(elem);
138
+ const accTy = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
139
+ const accArg = acc === "bool" ? "i1 zeroext" : accTy;
140
+ const method = e.method;
141
+ switch (method) {
142
+ case "length": {
143
+ host.declare(`declare double @scr_arr_len(ptr)`);
144
+ const t = B.tmp();
145
+ B.line(`${t} = call double @scr_arr_len(ptr ${r.name})`);
146
+ return { name: t, type: e.type };
147
+ }
148
+ case "nextPresent": {
149
+ const start = host.emitExpr(e.args[0]);
150
+ host.declare(`declare double @scr_arr_next_present(ptr, double)`);
151
+ const t = B.tmp();
152
+ B.line(`${t} = call double @scr_arr_next_present(ptr ${r.name}, double ${start.name})`);
153
+ return { name: t, type: e.type };
154
+ }
155
+ case "push": {
156
+ // Variadic like JS: every argument evaluates first (left to
157
+ // right), then each appends in order. Ownership of refcounted
158
+ // arguments moves into the array; the result is the new length —
159
+ // the last push's return, or the unchanged length for Node's
160
+ // no-op zero-argument call.
161
+ const vs = e.args.map((a) => host.emitExpr(a));
162
+ if (acc === "ref")
163
+ vs.forEach((v) => host.moveTemp(v));
164
+ let last = "";
165
+ for (const v of vs)
166
+ last = host.arrPush(r.name, acc, v.name);
167
+ if (last !== "")
168
+ return { name: last, type: e.type };
169
+ host.declare(`declare double @scr_arr_len(ptr)`);
170
+ const t = B.tmp();
171
+ B.line(`${t} = call double @scr_arr_len(ptr ${r.name})`);
172
+ return { name: t, type: e.type };
173
+ }
174
+ case "pushSpread": {
175
+ // `a.push(...src)`: append src's elements in order (borrowed src,
176
+ // count snapshotted). Result: the new length.
177
+ const src = host.emitExpr(e.args[0]);
178
+ host.emitArrayCopyLoop(r.name, src.name, acc);
179
+ host.declare(`declare double @scr_arr_len(ptr)`);
180
+ const t = B.tmp();
181
+ B.line(`${t} = call double @scr_arr_len(ptr ${r.name})`);
182
+ return { name: t, type: e.type };
183
+ }
184
+ case "concatSpread": {
185
+ const src = host.emitExpr(e.args[0]);
186
+ host.declare(`declare double @scr_arr_concat_copy(ptr, ptr)`);
187
+ const t = B.tmp();
188
+ B.line(`${t} = call double @scr_arr_concat_copy(ptr ${r.name}, ptr ${src.name})`);
189
+ return { name: t, type: e.type };
190
+ }
191
+ case "unshift": {
192
+ // Evaluate every argument before the first mutation, then insert
193
+ // from right to left so the final front order is source order.
194
+ const vs = e.args.map((a) => host.emitExpr(a));
195
+ if (acc === "ref")
196
+ vs.forEach((v) => host.moveTemp(v));
197
+ host.declare(`declare double @scr_arr_unshift_${acc}(ptr, ${accArg})`);
198
+ let last = "";
199
+ for (let i = vs.length - 1; i >= 0; i--) {
200
+ last = B.tmp();
201
+ B.line(`${last} = call double @scr_arr_unshift_${acc}(ptr ${r.name}, ${accTy} ${vs[i].name})`);
202
+ }
203
+ if (last !== "")
204
+ return { name: last, type: e.type };
205
+ host.declare(`declare double @scr_arr_len(ptr)`);
206
+ const t = B.tmp();
207
+ B.line(`${t} = call double @scr_arr_len(ptr ${r.name})`);
208
+ return { name: t, type: e.type };
209
+ }
210
+ case "unshiftSpread": {
211
+ // The runtime snapshots the borrowed source and handles self-spread.
212
+ const src = host.emitExpr(e.args[0]);
213
+ host.declare(`declare double @scr_arr_unshift_spread(ptr, ptr)`);
214
+ const t = B.tmp();
215
+ B.line(`${t} = call double @scr_arr_unshift_spread(ptr ${r.name}, ptr ${src.name})`);
216
+ return { name: t, type: e.type };
217
+ }
218
+ case "pop":
219
+ case "shift": {
220
+ if (e.type.kind !== "union")
221
+ throw new InternalCompilerError("llvm emitter bug: array removal result is not a union");
222
+ const def = host.unionsById.get(e.type.unionId);
223
+ const tag = def ? def.arms.findIndex((arm) => typeEquals(arm, elem)) : -1;
224
+ const undefTag = undefinedArmTag(e.type, host.unionsById);
225
+ const sameUnion = elem.kind === "union" && typeEquals(elem, e.type);
226
+ if ((!sameUnion && tag < 0) || undefTag < 0)
227
+ throw new InternalCompilerError("llvm emitter bug: array removal union lacks its arms");
228
+ host.declare(`declare zeroext i8 @scr_arr_${method}_state(ptr, ptr)`);
229
+ const rawSlot = B.slot();
230
+ const resultSlot = B.slot();
231
+ B.entryAllocas.push(`${rawSlot} = alloca i64`, `${resultSlot} = alloca ptr`);
232
+ B.line(`store i64 0, ptr ${rawSlot}`);
233
+ const state = B.tmp();
234
+ const has = B.tmp();
235
+ B.line(`${state} = call zeroext i8 @scr_arr_${method}_state(ptr ${r.name}, ptr ${rawSlot})`);
236
+ B.line(`${has} = icmp eq i8 ${state}, 1`);
237
+ const lp = B.newLabel("remove.p");
238
+ const la = B.newLabel("remove.a");
239
+ const lj = B.newLabel("remove.j");
240
+ B.condBr(has, lp, la);
241
+ B.startBlock(lp);
242
+ const raw = B.tmp();
243
+ const value = B.tmp();
244
+ B.line(`${raw} = load i64, ptr ${rawSlot}`);
245
+ if (elem.kind === "f64")
246
+ B.line(`${value} = bitcast i64 ${raw} to double`);
247
+ else if (elem.kind === "bool")
248
+ B.line(`${value} = icmp ne i64 ${raw}, 0`);
249
+ else
250
+ B.line(`${value} = inttoptr i64 ${raw} to ptr`);
251
+ B.line(`store ptr ${sameUnion ? value : host.unionNewOwned(tag, { name: value, type: elem })}, ptr ${resultSlot}`);
252
+ B.br(lj);
253
+ B.startBlock(la);
254
+ B.line(`store ptr ${host.unitInstanceRef(e.type.unionId, undefTag)}, ptr ${resultSlot}`);
255
+ B.br(lj);
256
+ B.startBlock(lj);
257
+ const out = B.tmp();
258
+ B.line(`${out} = load ptr, ptr ${resultSlot}`);
259
+ return host.own({ name: out, type: e.type });
260
+ }
261
+ case "indexOf": {
262
+ // The needle is BORROWED (released with this statement's frame);
263
+ // the ref variant dispatches on the array's element kind (strings
264
+ // by content, everything else by pointer). Strict equality.
265
+ const v = host.emitExpr(e.args[0]);
266
+ host.declare(`declare double @scr_arr_index_of_${acc}(ptr, ${accArg})`);
267
+ const t = B.tmp();
268
+ B.line(`${t} = call double @scr_arr_index_of_${acc}(ptr ${r.name}, ${accTy} ${v.name})`);
269
+ return { name: t, type: e.type };
270
+ }
271
+ case "includes": {
272
+ // Borrowed needle, SameValueZero (NaN matches NaN).
273
+ const v = host.emitExpr(e.args[0]);
274
+ host.declare(`declare zeroext i1 @scr_arr_includes_${acc}(ptr, ${accArg})`);
275
+ const t = B.tmp();
276
+ B.line(`${t} = call zeroext i1 @scr_arr_includes_${acc}(ptr ${r.name}, ${accTy} ${v.name})`);
277
+ return { name: t, type: e.type };
278
+ }
279
+ case "join": {
280
+ // Separator borrowed; the result is an owned (+1) string. Union
281
+ // elements ride the per-union join walker (nullish arms print
282
+ // empty, everything else through the union ToString) — the C
283
+ // emitter's sc_uj_*, ported in walkers.ts.
284
+ const sep = host.emitExpr(e.args[0]);
285
+ if (elem.kind === "union") {
286
+ const helper = host.walkers.unionJoinHelper(elem.unionId);
287
+ const t = B.tmp();
288
+ B.line(`${t} = call ptr @${helper}(ptr ${r.name}, ptr ${sep.name})`);
289
+ return host.own({ name: t, type: e.type });
290
+ }
291
+ host.declare(`declare ptr @scr_arr_join(ptr, ptr)`);
292
+ const t = B.tmp();
293
+ B.line(`${t} = call ptr @scr_arr_join(ptr ${r.name}, ptr ${sep.name})`);
294
+ return host.own({ name: t, type: e.type });
295
+ }
296
+ case "slice": {
297
+ // Receiver borrowed; the result a fresh +1 shallow copy (ref
298
+ // elements retained). Omitted indices get the JS defaults.
299
+ const start = e.args[0] ? host.emitExpr(e.args[0]).name : f64Lit(0);
300
+ const end = e.args[1] ? host.emitExpr(e.args[1]).name : F64_INF;
301
+ host.declare(`declare ptr @scr_arr_slice(ptr, double, double)`);
302
+ const t = B.tmp();
303
+ B.line(`${t} = call ptr @scr_arr_slice(ptr ${r.name}, double ${start}, double ${end})`);
304
+ return host.own({ name: t, type: e.type });
305
+ }
306
+ case "toReversed": {
307
+ host.declare(`declare ptr @scr_arr_to_reversed(ptr)`);
308
+ const t = B.tmp();
309
+ B.line(`${t} = call ptr @scr_arr_to_reversed(ptr ${r.name})`);
310
+ return host.own({ name: t, type: e.type });
311
+ }
312
+ case "reverse": {
313
+ // Mutates in place and returns the same receiver as a fresh +1.
314
+ host.declare(`declare ptr @scr_arr_reverse(ptr)`);
315
+ const t = B.tmp();
316
+ B.line(`${t} = call ptr @scr_arr_reverse(ptr ${r.name})`);
317
+ return host.own({ name: t, type: e.type });
318
+ }
319
+ case "toSpliced": {
320
+ const start = host.emitExpr(e.args[0]);
321
+ const count = host.emitExpr(e.args[1]);
322
+ const items = host.emitExpr(e.args[2]);
323
+ host.declare(`declare ptr @scr_arr_to_spliced(ptr, double, double, ptr)`);
324
+ const t = B.tmp();
325
+ B.line(`${t} = call ptr @scr_arr_to_spliced(ptr ${r.name}, double ${start.name}, ` +
326
+ `double ${count.name}, ptr ${items.name})`);
327
+ return host.own({ name: t, type: e.type });
328
+ }
329
+ case "with": {
330
+ const index = host.emitExpr(e.args[0]);
331
+ const value = host.emitExpr(e.args[1]);
332
+ host.declare(`declare ptr @scr_arr_with_${acc}(ptr, double, ${accArg})`);
333
+ const t = B.tmp();
334
+ B.line(`${t} = call ptr @scr_arr_with_${acc}(ptr ${r.name}, double ${index.name}, ` +
335
+ `${accTy} ${value.name})`);
336
+ const out = host.own({ name: t, type: e.type });
337
+ host.emitPendingCheck();
338
+ return out;
339
+ }
340
+ case "withUndefined": {
341
+ const index = host.emitExpr(e.args[0]);
342
+ host.declare(`declare ptr @scr_arr_with_undefined(ptr, double)`);
343
+ const t = B.tmp();
344
+ B.line(`${t} = call ptr @scr_arr_with_undefined(ptr ${r.name}, double ${index.name})`);
345
+ const out = host.own({ name: t, type: e.type });
346
+ host.emitPendingCheck();
347
+ return out;
348
+ }
349
+ case "splice": {
350
+ // The removal splice: removed elements come back as a fresh +1
351
+ // array, ownership MOVED out of the receiver. An omitted count
352
+ // removes to the end (+Infinity, the slice convention).
353
+ const start = host.emitExpr(e.args[0]);
354
+ const cnt = e.args[1] ? host.emitExpr(e.args[1]).name : F64_INF;
355
+ host.declare(`declare ptr @scr_arr_splice(ptr, double, double)`);
356
+ const t = B.tmp();
357
+ B.line(`${t} = call ptr @scr_arr_splice(ptr ${r.name}, double ${start.name}, double ${cnt})`);
358
+ return host.own({ name: t, type: e.type });
359
+ }
360
+ default: {
361
+ const _exhaustive = method;
362
+ void _exhaustive;
363
+ throw new InternalCompilerError("unreachable");
364
+ }
365
+ }
366
+ }
367
+ export function wrapNullable(host, raw, present, valueType, valueTag, resultType, absentTag) {
368
+ const B = host.B;
369
+ const slot = B.slot();
370
+ B.entryAllocas.push(`${slot} = alloca ptr`);
371
+ const isnull = B.tmp();
372
+ B.line(`${isnull} = icmp eq ptr ${raw}, null`);
373
+ const lp = B.newLabel("nw.p");
374
+ const la = B.newLabel("nw.a");
375
+ const lj = B.newLabel("nw.j");
376
+ B.condBr(isnull, la, lp);
377
+ B.startBlock(lp);
378
+ B.line(`store ptr ${host.unionNewOwned(valueTag, { name: present, type: valueType })}, ptr ${slot}`);
379
+ B.br(lj);
380
+ B.startBlock(la);
381
+ B.line(`store ptr ${host.unitInstanceRef(resultType.unionId, absentTag)}, ptr ${slot}`);
382
+ B.br(lj);
383
+ B.startBlock(lj);
384
+ const t = B.tmp();
385
+ B.line(`${t} = load ptr, ptr ${slot}`);
386
+ return host.own({ name: t, type: resultType });
387
+ }
388
+ export function emitMapNew(host, e) {
389
+ // Empty map: the runtime stores the value kind's RC entry points as
390
+ // function pointers (scalar values pass nulls); the trace argument
391
+ // doubles as the cycle-capability flag — exactly the C mapNew.
392
+ if (e.type.kind !== "map")
393
+ throw new InternalCompilerError("llvm emitter bug: mapNew of non-map type");
394
+ const B = host.B;
395
+ const value = e.type.value;
396
+ const rc = isRefCounted(value) ? vAdapters(host, value) : { retain: "null", release: "null" };
397
+ host.declare(`declare ptr @scr_map_new(i32, i32, ptr, ptr, ptr)`);
398
+ const m = B.tmp();
399
+ B.line(`${m} = call ptr @scr_map_new(i32 ${mapKeyKindNum(e.type.key)}, i32 ${mapValKindNum(value)}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${isRefCounted(value) ? traceArg(host, value) : "null"})`);
400
+ const out = host.own({ name: m, type: e.type });
401
+ // Seeded construction: set() each pair in source order — a repeated
402
+ // key overwrites (the runtime releases the old value).
403
+ const kAcc = mapKeyAccess(e.type.key);
404
+ const vAcc = elemAccess(value);
405
+ for (const pair of e.seed ?? []) {
406
+ const k = host.emitExpr(pair.key);
407
+ const v = host.emitExpr(pair.value);
408
+ if (vAcc === "ref")
409
+ host.moveTemp(v); // the value MOVES in
410
+ host.mapSet(m, kAcc, vAcc, k.name, v.name);
411
+ }
412
+ return out;
413
+ }
414
+ export function mapSet(host, m, kAcc, vAcc, key, value) {
415
+ const kTy = kAcc === "f64" ? "double" : "ptr";
416
+ const vTy = vAcc === "f64" ? "double" : vAcc === "bool" ? "i1" : "ptr";
417
+ host.declare(`declare void @scr_map_set_${kAcc}_${vAcc}(ptr, ${kTy}, ${vTy === "i1" ? "i1 zeroext" : vTy})`);
418
+ host.B.line(`call void @scr_map_set_${kAcc}_${vAcc}(ptr ${m}, ${kTy} ${key}, ${vTy} ${value})`);
419
+ }
420
+ export function emitMapLikeIntrinsic(host, e) {
421
+ const B = host.B;
422
+ const r = host.emitExpr(e.receiver);
423
+ const receiverType = e.receiver.type;
424
+ if (e.kind === "mapIntrinsic" && receiverType.kind !== "map") {
425
+ throw new InternalCompilerError("llvm emitter bug: mapIntrinsic on non-map");
426
+ }
427
+ if (e.kind === "setIntrinsic" && receiverType.kind !== "set") {
428
+ throw new InternalCompilerError("llvm emitter bug: setIntrinsic on non-set");
429
+ }
430
+ if (receiverType.kind !== "map" && receiverType.kind !== "set") {
431
+ throw new InternalCompilerError("unreachable");
432
+ }
433
+ const key = receiverType.kind === "map" ? receiverType.key : receiverType.elem;
434
+ const kAcc = mapKeyAccess(key);
435
+ const kTy = kAcc === "f64" ? "double" : "ptr";
436
+ const method = e.method;
437
+ switch (method) {
438
+ case "get": {
439
+ if (receiverType.kind !== "map")
440
+ throw new InternalCompilerError("unreachable");
441
+ const value = receiverType.value;
442
+ // The union construction is type-directed HERE, like envGet — the
443
+ // runtime knows no tags. Ref values come back +1 (ownership MOVES
444
+ // into the fresh union box on a hit); scalars ride an out-param
445
+ // behind a found flag; a miss is the interned undefined-arm
446
+ // instance. When V is itself a union, the stored box IS the
447
+ // result (`undefined` sorts last in canonical arm order).
448
+ const k = host.emitExpr(e.args[0]);
449
+ if (e.type.kind !== "union")
450
+ throw new InternalCompilerError("llvm emitter bug: map get result is not a union");
451
+ const def = host.unionsById.get(e.type.unionId);
452
+ const undefTag = undefinedArmTag(e.type, host.unionsById);
453
+ if (!def || undefTag < 0)
454
+ throw new InternalCompilerError("llvm emitter bug: map get union lacks its undefined arm");
455
+ const absent = host.unitInstanceRef(e.type.unionId, undefTag);
456
+ if (value.kind === "union") {
457
+ host.declare(`declare ptr @scr_map_get_${kAcc}_ref(ptr, ${kTy})`);
458
+ const raw = B.tmp();
459
+ const isnull = B.tmp();
460
+ const t = B.tmp();
461
+ B.line(`${raw} = call ptr @scr_map_get_${kAcc}_ref(ptr ${r.name}, ${kTy} ${k.name})`);
462
+ B.line(`${isnull} = icmp eq ptr ${raw}, null`);
463
+ B.line(`${t} = select i1 ${isnull}, ptr ${absent}, ptr ${raw}`);
464
+ return host.own({ name: t, type: e.type });
465
+ }
466
+ const valueTag = def.arms.findIndex((a) => typeEquals(a, value));
467
+ if (valueTag < 0)
468
+ throw new InternalCompilerError("llvm emitter bug: map get union lacks its value arm");
469
+ if (value.kind === "f64" || value.kind === "bool") {
470
+ const outTy = value.kind === "f64" ? "double" : "i8";
471
+ const outSlot = B.slot();
472
+ B.entryAllocas.push(`${outSlot} = alloca ${outTy}`);
473
+ B.line(`store ${outTy} ${value.kind === "f64" ? f64Lit(0) : "0"}, ptr ${outSlot}`);
474
+ host.declare(`declare zeroext i1 @scr_map_get_${kAcc}_${value.kind === "f64" ? "f64" : "bool"}(ptr, ${kTy}, ptr)`);
475
+ const found = B.tmp();
476
+ B.line(`${found} = call zeroext i1 @scr_map_get_${kAcc}_${value.kind === "f64" ? "f64" : "bool"}(ptr ${r.name}, ${kTy} ${k.name}, ptr ${outSlot})`);
477
+ const slot = B.slot();
478
+ B.entryAllocas.push(`${slot} = alloca ptr`);
479
+ const lp = B.newLabel("mg.p");
480
+ const la = B.newLabel("mg.a");
481
+ const lj = B.newLabel("mg.j");
482
+ B.condBr(found, lp, la);
483
+ B.startBlock(lp);
484
+ const rawOut = B.tmp();
485
+ B.line(`${rawOut} = load ${outTy}, ptr ${outSlot}`);
486
+ let hit = rawOut;
487
+ if (value.kind === "bool") {
488
+ hit = B.tmp();
489
+ B.line(`${hit} = trunc i8 ${rawOut} to i1`);
490
+ }
491
+ B.line(`store ptr ${host.unionNewOwned(valueTag, { name: hit, type: value })}, ptr ${slot}`);
492
+ B.br(lj);
493
+ B.startBlock(la);
494
+ B.line(`store ptr ${absent}, ptr ${slot}`);
495
+ B.br(lj);
496
+ B.startBlock(lj);
497
+ const t = B.tmp();
498
+ B.line(`${t} = load ptr, ptr ${slot}`);
499
+ return host.own({ name: t, type: e.type });
500
+ }
501
+ host.declare(`declare ptr @scr_map_get_${kAcc}_ref(ptr, ${kTy})`);
502
+ const raw = B.tmp();
503
+ B.line(`${raw} = call ptr @scr_map_get_${kAcc}_ref(ptr ${r.name}, ${kTy} ${k.name})`);
504
+ return host.wrapNullable(raw, raw, value, valueTag, e.type, undefTag);
505
+ }
506
+ case "set": {
507
+ if (receiverType.kind !== "map")
508
+ throw new InternalCompilerError("unreachable");
509
+ // Key borrowed (the runtime retains stored string keys); the
510
+ // value MOVES in (replacement releases the old value inside).
511
+ const k = host.emitExpr(e.args[0]);
512
+ const v = host.emitExpr(e.args[1]);
513
+ const vAcc = elemAccess(receiverType.value);
514
+ if (vAcc === "ref")
515
+ host.moveTemp(v);
516
+ host.mapSet(r.name, kAcc, vAcc, k.name, v.name);
517
+ return { name: "", type: e.type };
518
+ }
519
+ case "add": {
520
+ if (receiverType.kind !== "set")
521
+ throw new InternalCompilerError("unreachable");
522
+ // Element borrowed (the runtime retains stored strings); the unit
523
+ // value is 0. Re-adding overwrites in place, preserving insertion.
524
+ const k = host.emitExpr(e.args[0]);
525
+ host.mapSet(r.name, kAcc, "f64", k.name, f64Lit(0));
526
+ return { name: "", type: e.type };
527
+ }
528
+ case "has": {
529
+ const k = host.emitExpr(e.args[0]);
530
+ host.declare(`declare zeroext i1 @scr_map_has_${kAcc}(ptr, ${kTy})`);
531
+ const t = B.tmp();
532
+ B.line(`${t} = call zeroext i1 @scr_map_has_${kAcc}(ptr ${r.name}, ${kTy} ${k.name})`);
533
+ return { name: t, type: e.type };
534
+ }
535
+ case "delete": {
536
+ const k = host.emitExpr(e.args[0]);
537
+ host.declare(`declare zeroext i1 @scr_map_delete_${kAcc}(ptr, ${kTy})`);
538
+ const t = B.tmp();
539
+ B.line(`${t} = call zeroext i1 @scr_map_delete_${kAcc}(ptr ${r.name}, ${kTy} ${k.name})`);
540
+ return { name: t, type: e.type };
541
+ }
542
+ case "size": {
543
+ host.declare(`declare double @scr_map_size(ptr)`);
544
+ const t = B.tmp();
545
+ B.line(`${t} = call double @scr_map_size(ptr ${r.name})`);
546
+ return { name: t, type: e.type };
547
+ }
548
+ case "clear":
549
+ host.declare(`declare void @scr_map_clear(ptr)`);
550
+ B.line(`call void @scr_map_clear(ptr ${r.name})`);
551
+ return { name: "", type: e.type };
552
+ case "iterCount": {
553
+ host.declare(`declare double @scr_map_iter_count(ptr)`);
554
+ const t = B.tmp();
555
+ B.line(`${t} = call double @scr_map_iter_count(ptr ${r.name})`);
556
+ return { name: t, type: e.type };
557
+ }
558
+ case "iterLive": {
559
+ const i = host.emitExpr(e.args[0]);
560
+ host.declare(`declare zeroext i1 @scr_map_iter_live(ptr, double)`);
561
+ const t = B.tmp();
562
+ B.line(`${t} = call zeroext i1 @scr_map_iter_live(ptr ${r.name}, double ${i.name})`);
563
+ return { name: t, type: e.type };
564
+ }
565
+ case "iterKey": {
566
+ // String/ref keys come back +1 (own registers the owned temp).
567
+ const i = host.emitExpr(e.args[0]);
568
+ const retTy = kAcc === "f64" ? "double" : "ptr";
569
+ host.declare(`declare ${retTy} @scr_map_iter_key_${kAcc}(ptr, double)`);
570
+ const t = B.tmp();
571
+ B.line(`${t} = call ${retTy} @scr_map_iter_key_${kAcc}(ptr ${r.name}, double ${i.name})`);
572
+ return host.own({ name: t, type: e.type });
573
+ }
574
+ case "iterValue": {
575
+ if (receiverType.kind !== "map")
576
+ throw new InternalCompilerError("unreachable");
577
+ const vAcc = elemAccess(receiverType.value);
578
+ const i = host.emitExpr(e.args[0]);
579
+ const retTy = vAcc === "f64" ? "double" : vAcc === "bool" ? "i1" : "ptr";
580
+ host.declare(`declare ${vAcc === "bool" ? "zeroext i1" : retTy} @scr_map_iter_val_${vAcc}(ptr, double)`);
581
+ const t = B.tmp();
582
+ B.line(`${t} = call ${retTy} @scr_map_iter_val_${vAcc}(ptr ${r.name}, double ${i.name})`);
583
+ return host.own({ name: t, type: e.type });
584
+ }
585
+ case "iterEnter":
586
+ host.declare(`declare void @scr_map_iter_enter(ptr)`);
587
+ B.line(`call void @scr_map_iter_enter(ptr ${r.name})`);
588
+ return { name: "", type: e.type };
589
+ case "iterExit":
590
+ host.declare(`declare void @scr_map_iter_exit(ptr)`);
591
+ B.line(`call void @scr_map_iter_exit(ptr ${r.name})`);
592
+ return { name: "", type: e.type };
593
+ case "toArray": {
594
+ if (receiverType.kind !== "set")
595
+ throw new InternalCompilerError("unreachable");
596
+ // Fresh +1 elem[] of the live entries in insertion order.
597
+ host.declare(`declare ptr @scr_set_to_arr_${kAcc}(ptr)`);
598
+ const t = B.tmp();
599
+ B.line(`${t} = call ptr @scr_set_to_arr_${kAcc}(ptr ${r.name})`);
600
+ return host.own({ name: t, type: e.type });
601
+ }
602
+ default: {
603
+ const _exhaustive = method;
604
+ void _exhaustive;
605
+ throw new InternalCompilerError("unreachable");
606
+ }
607
+ }
608
+ }
609
+ export function emitSetNew(host, e) {
610
+ // Empty set: the map runtime with the element as the KEY and the
611
+ // value slot pinned to the scalar kind. Handle-kind elements (symbol
612
+ // identity hashing) carry their RC adapters at construction.
613
+ if (e.type.kind !== "set")
614
+ throw new InternalCompilerError("llvm emitter bug: setNew of non-set type");
615
+ const B = host.B;
616
+ const kAcc = mapKeyAccess(e.type.elem);
617
+ const s = B.tmp();
618
+ if (kAcc === "ref") {
619
+ const rc = vAdapters(host, e.type.elem);
620
+ host.declare(`declare ptr @scr_set_new_ref(ptr, ptr)`);
621
+ B.line(`${s} = call ptr @scr_set_new_ref(ptr ${rc.retain}, ptr ${rc.release})`);
622
+ }
623
+ else {
624
+ host.declare(`declare ptr @scr_map_new(i32, i32, ptr, ptr, ptr)`);
625
+ B.line(`${s} = call ptr @scr_map_new(i32 ${mapKeyKindNum(e.type.elem)}, i32 0, ptr null, ptr null, ptr null)`);
626
+ }
627
+ const out = host.own({ name: s, type: e.type });
628
+ if (e.seed) {
629
+ // Seeded construction (`new Set(values)`): one borrowed T[] whose
630
+ // elements add() in order (duplicates keep first insertion position).
631
+ const arr = host.emitExpr(e.seed);
632
+ host.declare(`declare void @scr_set_add_all(ptr, ptr)`);
633
+ B.line(`call void @scr_set_add_all(ptr ${s}, ptr ${arr.name})`);
634
+ }
635
+ return out;
636
+ }
637
+ //# sourceMappingURL=expr-containers.js.map