@scriptc/compiler 0.0.35 → 0.0.36

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 (418) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +7 -6
  2. package/dist/backend/build-cache.d.ts +44 -0
  3. package/dist/backend/build-cache.js +241 -0
  4. package/dist/backend/build-cache.js.map +1 -0
  5. package/dist/backend/{emission/emit-async.d.ts → c/async.d.ts} +21 -30
  6. package/dist/backend/{emission/emit-async.js → c/async.js} +270 -286
  7. package/dist/backend/c/async.js.map +1 -0
  8. package/dist/backend/{emission/emitter.d.ts → c/c-emitter.d.ts} +6 -23
  9. package/dist/backend/{emission/emitter.js → c/c-emitter.js} +53 -107
  10. package/dist/backend/c/c-emitter.js.map +1 -0
  11. package/dist/backend/c/exprs.d.ts +8 -0
  12. package/dist/backend/c/exprs.js +7913 -0
  13. package/dist/backend/c/exprs.js.map +1 -0
  14. package/dist/backend/{emission/emit-island.d.ts → c/island.d.ts} +5 -5
  15. package/dist/backend/{emission/emit-island.js → c/island.js} +24 -22
  16. package/dist/backend/c/island.js.map +1 -0
  17. package/dist/backend/{emission → c}/may-throw.d.ts +1 -1
  18. package/dist/backend/{emission → c}/may-throw.js +1 -1
  19. package/dist/backend/c/may-throw.js.map +1 -0
  20. package/dist/backend/{emission/emit-shapes.d.ts → c/shapes.d.ts} +19 -19
  21. package/dist/backend/{emission/emit-shapes.js → c/shapes.js} +78 -87
  22. package/dist/backend/c/shapes.js.map +1 -0
  23. package/dist/backend/{emission/emit-stmts.d.ts → c/stmts.d.ts} +12 -12
  24. package/dist/backend/{emission/emit-stmts.js → c/stmts.js} +377 -343
  25. package/dist/backend/c/stmts.js.map +1 -0
  26. package/dist/backend/{emission/emit-types.d.ts → c/types.d.ts} +1 -1
  27. package/dist/backend/{emission/emit-types.js → c/types.js} +42 -286
  28. package/dist/backend/c/types.js.map +1 -0
  29. package/dist/backend/c/types.test.js +25 -0
  30. package/dist/backend/c/types.test.js.map +1 -0
  31. package/dist/backend/{emission/emit-walkers.d.ts → c/walkers.d.ts} +19 -41
  32. package/dist/backend/{emission/emit-walkers.js → c/walkers.js} +238 -298
  33. package/dist/backend/c/walkers.js.map +1 -0
  34. package/dist/backend/ffi-callbacks.d.ts +1 -1
  35. package/dist/backend/ffi-callbacks.js +4 -3
  36. package/dist/backend/ffi-callbacks.js.map +1 -1
  37. package/dist/backend/{library-identity.d.ts → library-identity-markers.d.ts} +0 -4
  38. package/dist/backend/{library-identity.js → library-identity-markers.js} +10 -9
  39. package/dist/backend/library-identity-markers.js.map +1 -0
  40. package/dist/backend/llvm/blocks.d.ts +4 -0
  41. package/dist/backend/llvm/blocks.js +29 -0
  42. package/dist/backend/llvm/blocks.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +2 -19
  44. package/dist/backend/llvm/classes.js +20 -52
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/common.d.ts +4 -0
  47. package/dist/backend/llvm/common.js +27 -0
  48. package/dist/backend/llvm/common.js.map +1 -0
  49. package/dist/backend/llvm/dyn.d.ts +3 -8
  50. package/dist/backend/llvm/dyn.js +152 -224
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emitter.d.ts +4 -1
  53. package/dist/backend/llvm/emitter.js +514 -9981
  54. package/dist/backend/llvm/emitter.js.map +1 -1
  55. package/dist/backend/llvm/expr-async.d.ts +4 -0
  56. package/dist/backend/llvm/expr-async.js +726 -0
  57. package/dist/backend/llvm/expr-async.js.map +1 -0
  58. package/dist/backend/llvm/expr-bytes.d.ts +13 -0
  59. package/dist/backend/llvm/expr-bytes.js +456 -0
  60. package/dist/backend/llvm/expr-bytes.js.map +1 -0
  61. package/dist/backend/llvm/expr-callbacks.d.ts +22 -0
  62. package/dist/backend/llvm/expr-callbacks.js +520 -0
  63. package/dist/backend/llvm/expr-callbacks.js.map +1 -0
  64. package/dist/backend/llvm/expr-calls.d.ts +2 -0
  65. package/dist/backend/llvm/expr-calls.js +618 -0
  66. package/dist/backend/llvm/expr-calls.js.map +1 -0
  67. package/dist/backend/llvm/expr-containers.d.ts +25 -0
  68. package/dist/backend/llvm/expr-containers.js +623 -0
  69. package/dist/backend/llvm/expr-containers.js.map +1 -0
  70. package/dist/backend/llvm/expr-context.d.ts +255 -0
  71. package/dist/backend/llvm/expr-context.js +2 -0
  72. package/dist/backend/llvm/expr-context.js.map +1 -0
  73. package/dist/backend/llvm/expr-control.d.ts +2 -0
  74. package/dist/backend/llvm/expr-control.js +473 -0
  75. package/dist/backend/llvm/expr-control.js.map +1 -0
  76. package/dist/backend/llvm/expr-dispatch.d.ts +4 -0
  77. package/dist/backend/llvm/expr-dispatch.js +151 -0
  78. package/dist/backend/llvm/expr-dispatch.js.map +1 -0
  79. package/dist/backend/llvm/expr-dynamic.d.ts +2 -0
  80. package/dist/backend/llvm/expr-dynamic.js +810 -0
  81. package/dist/backend/llvm/expr-dynamic.js.map +1 -0
  82. package/dist/backend/llvm/expr-island.d.ts +15 -0
  83. package/dist/backend/llvm/expr-island.js +690 -0
  84. package/dist/backend/llvm/expr-island.js.map +1 -0
  85. package/dist/backend/llvm/expr-primitives.d.ts +6 -0
  86. package/dist/backend/llvm/expr-primitives.js +622 -0
  87. package/dist/backend/llvm/expr-primitives.js.map +1 -0
  88. package/dist/backend/llvm/expr-records.d.ts +9 -0
  89. package/dist/backend/llvm/expr-records.js +299 -0
  90. package/dist/backend/llvm/expr-records.js.map +1 -0
  91. package/dist/backend/llvm/expr-stream-bridges.d.ts +13 -0
  92. package/dist/backend/llvm/expr-stream-bridges.js +396 -0
  93. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -0
  94. package/dist/backend/llvm/expr-stream-callbacks.d.ts +12 -0
  95. package/dist/backend/llvm/expr-stream-callbacks.js +360 -0
  96. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -0
  97. package/dist/backend/llvm/lib-dispatch.d.ts +5 -0
  98. package/dist/backend/llvm/lib-dispatch.js +267 -0
  99. package/dist/backend/llvm/lib-dispatch.js.map +1 -0
  100. package/dist/backend/llvm/lib-filesystem.d.ts +6 -0
  101. package/dist/backend/llvm/lib-filesystem.js +594 -0
  102. package/dist/backend/llvm/lib-filesystem.js.map +1 -0
  103. package/dist/backend/llvm/lib-network.d.ts +2 -0
  104. package/dist/backend/llvm/lib-network.js +429 -0
  105. package/dist/backend/llvm/lib-network.js.map +1 -0
  106. package/dist/backend/llvm/lib-process.d.ts +5 -0
  107. package/dist/backend/llvm/lib-process.js +585 -0
  108. package/dist/backend/llvm/lib-process.js.map +1 -0
  109. package/dist/backend/llvm/lib-shared.d.ts +6 -0
  110. package/dist/backend/llvm/lib-shared.js +687 -0
  111. package/dist/backend/llvm/lib-shared.js.map +1 -0
  112. package/dist/backend/llvm/lib-stream.d.ts +2 -0
  113. package/dist/backend/llvm/lib-stream.js +470 -0
  114. package/dist/backend/llvm/lib-stream.js.map +1 -0
  115. package/dist/backend/llvm/shapes.d.ts +12 -2
  116. package/dist/backend/llvm/shapes.js +66 -307
  117. package/dist/backend/llvm/shapes.js.map +1 -1
  118. package/dist/backend/llvm/shapes.test.js +52 -0
  119. package/dist/backend/llvm/shapes.test.js.map +1 -0
  120. package/dist/backend/llvm/unsupported.d.ts +1 -1
  121. package/dist/backend/llvm/walkers.d.ts +2 -3
  122. package/dist/backend/llvm/walkers.js +164 -218
  123. package/dist/backend/llvm/walkers.js.map +1 -1
  124. package/dist/backend/native-codegen.d.ts +38 -0
  125. package/dist/backend/native-codegen.js +261 -0
  126. package/dist/backend/native-codegen.js.map +1 -0
  127. package/dist/backend/native-codegen.test.js +188 -0
  128. package/dist/backend/native-codegen.test.js.map +1 -0
  129. package/dist/backend/native-link-info.d.ts +96 -0
  130. package/dist/backend/native-link-info.js +219 -0
  131. package/dist/backend/native-link-info.js.map +1 -0
  132. package/dist/backend/native-link-info.test.d.ts +1 -0
  133. package/dist/backend/native-link-info.test.js +134 -0
  134. package/dist/backend/native-link-info.test.js.map +1 -0
  135. package/dist/backend/{cc.d.ts → native-toolchain.d.ts} +54 -34
  136. package/dist/backend/{cc.js → native-toolchain.js} +231 -810
  137. package/dist/backend/native-toolchain.js.map +1 -0
  138. package/dist/backend/native-toolchain.test.d.ts +1 -0
  139. package/dist/backend/{cc-cache.test.js → native-toolchain.test.js} +214 -6
  140. package/dist/backend/native-toolchain.test.js.map +1 -0
  141. package/dist/backend/object-localize.js +1 -1
  142. package/dist/backend/runtime-abi.d.ts +10 -0
  143. package/dist/backend/runtime-abi.js +11 -0
  144. package/dist/backend/runtime-abi.js.map +1 -0
  145. package/dist/backend/runtime-pack.d.ts +137 -0
  146. package/dist/backend/runtime-pack.js +400 -0
  147. package/dist/backend/runtime-pack.js.map +1 -0
  148. package/dist/backend/runtime-pack.test.d.ts +1 -0
  149. package/dist/backend/runtime-pack.test.js +438 -0
  150. package/dist/backend/runtime-pack.test.js.map +1 -0
  151. package/dist/backend/targets.d.ts +30 -0
  152. package/dist/backend/targets.js +46 -0
  153. package/dist/backend/targets.js.map +1 -0
  154. package/dist/backend/targets.test.d.ts +1 -0
  155. package/dist/backend/targets.test.js +19 -0
  156. package/dist/backend/targets.test.js.map +1 -0
  157. package/dist/backend/vendor-archives.d.ts +41 -0
  158. package/dist/backend/vendor-archives.js +462 -0
  159. package/dist/backend/vendor-archives.js.map +1 -0
  160. package/dist/compat/fetch-profile.d.ts +0 -1
  161. package/dist/compat/fetch-profile.js +0 -1
  162. package/dist/compat/fetch-profile.js.map +1 -1
  163. package/dist/coverage/report.js +3 -3
  164. package/dist/coverage/report.js.map +1 -1
  165. package/dist/coverage/surface-manifest.js +25 -32
  166. package/dist/coverage/surface-manifest.js.map +1 -1
  167. package/dist/diagnostics/diagnostic.d.ts +11 -12
  168. package/dist/diagnostics/diagnostic.js +19 -17
  169. package/dist/diagnostics/diagnostic.js.map +1 -1
  170. package/dist/diagnostics/render.d.ts +1 -1
  171. package/dist/diagnostics/render.js +1 -1
  172. package/dist/diagnostics/render.js.map +1 -1
  173. package/dist/errors.d.ts +5 -0
  174. package/dist/errors.js +9 -0
  175. package/dist/errors.js.map +1 -0
  176. package/dist/executable/{early-cache.d.ts → executable-cache.d.ts} +2 -2
  177. package/dist/executable/{early-cache.js → executable-cache.js} +36 -98
  178. package/dist/executable/executable-cache.js.map +1 -0
  179. package/dist/executable/executable-cache.test.d.ts +1 -0
  180. package/dist/executable/{early-cache.test.js → executable-cache.test.js} +3 -3
  181. package/dist/executable/executable-cache.test.js.map +1 -0
  182. package/dist/ffi/{profile.js → ffi-manifest.js} +1 -1
  183. package/dist/ffi/ffi-manifest.js.map +1 -0
  184. package/dist/frontend/builtin-modules.d.ts +21 -0
  185. package/dist/frontend/builtin-modules.js +82 -0
  186. package/dist/frontend/builtin-modules.js.map +1 -0
  187. package/dist/frontend/cjs-lexer.d.ts +7 -0
  188. package/dist/frontend/cjs-lexer.js +15 -17
  189. package/dist/frontend/cjs-lexer.js.map +1 -1
  190. package/dist/frontend/dts-paths.d.ts +26 -0
  191. package/dist/frontend/dts-paths.js +41 -0
  192. package/dist/frontend/dts-paths.js.map +1 -0
  193. package/dist/frontend/input-tracker.d.ts +0 -2
  194. package/dist/frontend/input-tracker.js +1 -4
  195. package/dist/frontend/input-tracker.js.map +1 -1
  196. package/dist/frontend/lib-contract.d.ts +1 -5
  197. package/dist/frontend/lib-contract.js +1 -1
  198. package/dist/frontend/lib-contract.js.map +1 -1
  199. package/dist/frontend/lib-exports.d.ts +1 -1
  200. package/dist/frontend/lowering/call-position.d.ts +4 -0
  201. package/dist/frontend/lowering/call-position.js +7 -0
  202. package/dist/frontend/lowering/call-position.js.map +1 -0
  203. package/dist/frontend/lowering/callback-arg.d.ts +20 -0
  204. package/dist/frontend/lowering/callback-arg.js +44 -0
  205. package/dist/frontend/lowering/callback-arg.js.map +1 -0
  206. package/dist/frontend/lowering/lib-boundary.d.ts +1 -1
  207. package/dist/frontend/lowering/lib-boundary.js +34 -34
  208. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  209. package/dist/frontend/lowering/lower-assert.d.ts +3 -3
  210. package/dist/frontend/lowering/lower-assert.js +214 -241
  211. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  212. package/dist/frontend/lowering/lower-builtins.d.ts +74 -146
  213. package/dist/frontend/lowering/lower-builtins.js +1124 -1232
  214. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  215. package/dist/frontend/lowering/lower-calls.d.ts +56 -188
  216. package/dist/frontend/lowering/lower-calls.js +1397 -1492
  217. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  218. package/dist/frontend/lowering/lower-classes.d.ts +62 -125
  219. package/dist/frontend/lowering/lower-classes.js +832 -866
  220. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  221. package/dist/frontend/lowering/lower-comptime.d.ts +5 -12
  222. package/dist/frontend/lowering/lower-comptime.js +32 -31
  223. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  224. package/dist/frontend/lowering/lower-containers.d.ts +35 -135
  225. package/dist/frontend/lowering/lower-containers.js +1384 -1700
  226. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  227. package/dist/frontend/lowering/lower-dgram.d.ts +3 -7
  228. package/dist/frontend/lowering/lower-dgram.js +97 -111
  229. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  230. package/dist/frontend/lowering/lower-enums.d.ts +4 -4
  231. package/dist/frontend/lowering/lower-enums.js +30 -30
  232. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  233. package/dist/frontend/lowering/{lower-emitter.d.ts → lower-event-emitter.d.ts} +7 -18
  234. package/dist/frontend/lowering/{lower-emitter.js → lower-event-emitter.js} +172 -174
  235. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -0
  236. package/dist/frontend/lowering/lower-expando.d.ts +5 -5
  237. package/dist/frontend/lowering/lower-expando.js +40 -40
  238. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  239. package/dist/frontend/lowering/lower-exprs.d.ts +56 -264
  240. package/dist/frontend/lowering/lower-exprs.js +1624 -1696
  241. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  242. package/dist/frontend/lowering/lower-generators.d.ts +6 -6
  243. package/dist/frontend/lowering/lower-generators.js +73 -72
  244. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  245. package/dist/frontend/lowering/lower-inspect.d.ts +5 -17
  246. package/dist/frontend/lowering/lower-inspect.js +236 -238
  247. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  248. package/dist/frontend/lowering/lower-island.d.ts +34 -45
  249. package/dist/frontend/lowering/lower-island.js +437 -508
  250. package/dist/frontend/lowering/lower-island.js.map +1 -1
  251. package/dist/frontend/lowering/lower-mixins.d.ts +7 -10
  252. package/dist/frontend/lowering/lower-mixins.js +85 -85
  253. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  254. package/dist/frontend/lowering/lower-modules.d.ts +12 -18
  255. package/dist/frontend/lowering/lower-modules.js +284 -283
  256. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  257. package/dist/frontend/lowering/lower-namespaces.d.ts +23 -49
  258. package/dist/frontend/lowering/lower-namespaces.js +123 -115
  259. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  260. package/dist/frontend/lowering/lower-server.d.ts +18 -25
  261. package/dist/frontend/lowering/lower-server.js +899 -899
  262. package/dist/frontend/lowering/lower-server.js.map +1 -1
  263. package/dist/frontend/lowering/lower-stmts.d.ts +30 -149
  264. package/dist/frontend/lowering/lower-stmts.js +1175 -1228
  265. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  266. package/dist/frontend/lowering/lower-stream.d.ts +12 -12
  267. package/dist/frontend/lowering/lower-stream.js +300 -301
  268. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  269. package/dist/frontend/lowering/lower-test.d.ts +5 -5
  270. package/dist/frontend/lowering/lower-test.js +82 -82
  271. package/dist/frontend/lowering/lower-test.js.map +1 -1
  272. package/dist/frontend/lowering/lowerer.d.ts +60 -20
  273. package/dist/frontend/lowering/lowerer.js +191 -117
  274. package/dist/frontend/lowering/lowerer.js.map +1 -1
  275. package/dist/frontend/lowering/pairs-snapshot.d.ts +11 -0
  276. package/dist/frontend/lowering/pairs-snapshot.js +85 -0
  277. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -0
  278. package/dist/frontend/lowering/static-this.d.ts +6 -0
  279. package/dist/frontend/lowering/static-this.js +24 -0
  280. package/dist/frontend/lowering/static-this.js.map +1 -0
  281. package/dist/frontend/lowering/surfaces.d.ts +14 -33
  282. package/dist/frontend/lowering/surfaces.js +63 -63
  283. package/dist/frontend/lowering/surfaces.js.map +1 -1
  284. package/dist/frontend/npm-static-rewrite.js +6 -28
  285. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  286. package/dist/frontend/npm-static.d.ts +0 -10
  287. package/dist/frontend/npm-static.js +4 -7
  288. package/dist/frontend/npm-static.js.map +1 -1
  289. package/dist/frontend/npm.d.ts +0 -24
  290. package/dist/frontend/npm.js +11 -85
  291. package/dist/frontend/npm.js.map +1 -1
  292. package/dist/frontend/program.d.ts +3 -1
  293. package/dist/frontend/program.js +9 -4
  294. package/dist/frontend/program.js.map +1 -1
  295. package/dist/frontend/provenance-registry.d.ts +0 -2
  296. package/dist/frontend/provenance-registry.js +0 -10
  297. package/dist/frontend/provenance-registry.js.map +1 -1
  298. package/dist/frontend/provenance.js +4 -7
  299. package/dist/frontend/provenance.js.map +1 -1
  300. package/dist/frontend/resolve.d.ts +7 -2
  301. package/dist/frontend/resolve.js +12 -17
  302. package/dist/frontend/resolve.js.map +1 -1
  303. package/dist/frontend/resolve.test.d.ts +1 -0
  304. package/dist/frontend/resolve.test.js +29 -0
  305. package/dist/frontend/resolve.test.js.map +1 -0
  306. package/dist/frontend/ts7/adapter.d.ts +2 -2
  307. package/dist/frontend/ts7/adapter.js +1 -1
  308. package/dist/frontend/ts7/adapter.js.map +1 -1
  309. package/dist/frontend/ts7/checker.js +2 -36
  310. package/dist/frontend/ts7/checker.js.map +1 -1
  311. package/dist/frontend/ts7/enums.js +2 -1
  312. package/dist/frontend/ts7/enums.js.map +1 -1
  313. package/dist/frontend/ts7/{program.js → program-adapter.js} +7 -6
  314. package/dist/frontend/ts7/program-adapter.js.map +1 -0
  315. package/dist/frontend/ts7/world-check.d.ts +1 -3
  316. package/dist/frontend/ts7/world-check.js +3 -1
  317. package/dist/frontend/ts7/world-check.js.map +1 -1
  318. package/dist/frontend/tsc-codes.d.ts +8 -0
  319. package/dist/frontend/tsc-codes.js +109 -0
  320. package/dist/frontend/tsc-codes.js.map +1 -0
  321. package/dist/frontend/{types.d.ts → type-mapper.d.ts} +2 -25
  322. package/dist/frontend/{types.js → type-mapper.js} +12 -11
  323. package/dist/frontend/type-mapper.js.map +1 -0
  324. package/dist/frontend/workspace-registry.d.ts +26 -0
  325. package/dist/frontend/workspace-registry.js +71 -0
  326. package/dist/frontend/workspace-registry.js.map +1 -0
  327. package/dist/index.d.ts +112 -30
  328. package/dist/index.js +512 -126
  329. package/dist/index.js.map +1 -1
  330. package/dist/ir/analysis.d.ts +37 -0
  331. package/dist/ir/analysis.js +118 -0
  332. package/dist/ir/analysis.js.map +1 -0
  333. package/dist/ir/analysis.test.d.ts +1 -0
  334. package/dist/ir/analysis.test.js +21 -0
  335. package/dist/ir/analysis.test.js.map +1 -0
  336. package/dist/ir/build.d.ts +9 -0
  337. package/dist/ir/build.js +33 -0
  338. package/dist/ir/build.js.map +1 -0
  339. package/dist/ir/integer-loops.d.ts +1 -1
  340. package/dist/ir/{nodes.d.ts → ir.d.ts} +54 -26
  341. package/dist/ir/{nodes.js → ir.js} +145 -141
  342. package/dist/ir/ir.js.map +1 -0
  343. package/dist/ir/ir.test.d.ts +1 -0
  344. package/dist/ir/ir.test.js +17 -0
  345. package/dist/ir/ir.test.js.map +1 -0
  346. package/dist/ir/serialize.d.ts +1 -1
  347. package/dist/ir/serialize.js +2 -1
  348. package/dist/ir/serialize.js.map +1 -1
  349. package/dist/ir/validate.d.ts +1 -1
  350. package/dist/ir/validate.js +10 -5
  351. package/dist/ir/validate.js.map +1 -1
  352. package/dist/library/cache-primitives.d.ts +24 -0
  353. package/dist/library/cache-primitives.js +83 -0
  354. package/dist/library/cache-primitives.js.map +1 -0
  355. package/dist/library/cache-reset.test.d.ts +1 -0
  356. package/dist/library/cache-reset.test.js +47 -0
  357. package/dist/library/cache-reset.test.js.map +1 -0
  358. package/dist/library/{implementation-identity.js → compiler-self-identity.js} +1 -1
  359. package/dist/library/compiler-self-identity.js.map +1 -0
  360. package/dist/library/fence-eval.d.ts +3 -1
  361. package/dist/library/fence-eval.js +5 -1
  362. package/dist/library/fence-eval.js.map +1 -1
  363. package/dist/library/int-infer.d.ts +1 -36
  364. package/dist/library/int-infer.js +17 -17
  365. package/dist/library/int-infer.js.map +1 -1
  366. package/dist/library/{early-cache.d.ts → library-cache.d.ts} +1 -1
  367. package/dist/library/{early-cache.js → library-cache.js} +34 -89
  368. package/dist/library/library-cache.js.map +1 -0
  369. package/dist/library/library-cache.test.d.ts +1 -0
  370. package/dist/library/{early-cache.test.js → library-cache.test.js} +2 -2
  371. package/dist/library/library-cache.test.js.map +1 -0
  372. package/dist/library/{profile.d.ts → library-profile.d.ts} +4 -7
  373. package/dist/library/{profile.js → library-profile.js} +18 -11
  374. package/dist/library/library-profile.js.map +1 -0
  375. package/dist/library/semantic-source.js +2 -1
  376. package/dist/library/semantic-source.js.map +1 -1
  377. package/dist/library/sidecar.d.ts +5 -2
  378. package/dist/library/sidecar.js +11 -5
  379. package/dist/library/sidecar.js.map +1 -1
  380. package/dist/startup-cache.d.ts +3 -3
  381. package/dist/startup-cache.js +2 -2
  382. package/dist/startup-cache.js.map +1 -1
  383. package/package.json +6 -2
  384. package/surface-manifest.json +1 -1
  385. package/dist/backend/cc-cache.test.js.map +0 -1
  386. package/dist/backend/cc.js.map +0 -1
  387. package/dist/backend/emission/emit-async.js.map +0 -1
  388. package/dist/backend/emission/emit-exprs.d.ts +0 -13
  389. package/dist/backend/emission/emit-exprs.js +0 -7407
  390. package/dist/backend/emission/emit-exprs.js.map +0 -1
  391. package/dist/backend/emission/emit-island.js.map +0 -1
  392. package/dist/backend/emission/emit-shapes.js.map +0 -1
  393. package/dist/backend/emission/emit-stmts.js.map +0 -1
  394. package/dist/backend/emission/emit-types.js.map +0 -1
  395. package/dist/backend/emission/emit-walkers.js.map +0 -1
  396. package/dist/backend/emission/emitter.js.map +0 -1
  397. package/dist/backend/emission/may-throw.js.map +0 -1
  398. package/dist/backend/library-identity.js.map +0 -1
  399. package/dist/executable/early-cache.js.map +0 -1
  400. package/dist/executable/early-cache.test.js.map +0 -1
  401. package/dist/ffi/profile.js.map +0 -1
  402. package/dist/frontend/lowering/lower-emitter.js.map +0 -1
  403. package/dist/frontend/shared.d.ts +0 -82
  404. package/dist/frontend/shared.js +0 -308
  405. package/dist/frontend/shared.js.map +0 -1
  406. package/dist/frontend/ts7/program.js.map +0 -1
  407. package/dist/frontend/types.js.map +0 -1
  408. package/dist/ir/nodes.js.map +0 -1
  409. package/dist/library/early-cache.js.map +0 -1
  410. package/dist/library/early-cache.test.js.map +0 -1
  411. package/dist/library/implementation-identity.js.map +0 -1
  412. package/dist/library/profile.js.map +0 -1
  413. /package/dist/backend/{cc-cache.test.d.ts → c/types.test.d.ts} +0 -0
  414. /package/dist/{executable/early-cache.test.d.ts → backend/llvm/shapes.test.d.ts} +0 -0
  415. /package/dist/{library/early-cache.test.d.ts → backend/native-codegen.test.d.ts} +0 -0
  416. /package/dist/ffi/{profile.d.ts → ffi-manifest.d.ts} +0 -0
  417. /package/dist/frontend/ts7/{program.d.ts → program-adapter.d.ts} +0 -0
  418. /package/dist/library/{implementation-identity.d.ts → compiler-self-identity.d.ts} +0 -0
@@ -0,0 +1,690 @@
1
+ /* Focused LLVM expression emission extracted from emitter.ts. */
2
+ import { InternalCompilerError } from "../../errors.js";
3
+ import { undefinedArmTag } from "../../ir/analysis.js";
4
+ import { canMarshalFuncIntoIsland, islandCallbackRet, islandPromisePayloadTag, isRefCounted, isUnitType, STRING, typeKey } from "../../ir/ir.js";
5
+ import { FN_ATTRS, releaseSym } from "./shapes.js";
6
+ import { f64Lit } from "./common.js";
7
+ export function emitJsMarshal(host, e) {
8
+ const B = host.B;
9
+ const v = host.emitExpr(e.value);
10
+ const simple = (sym, argTy, fallible) => {
11
+ host.declare(`declare ptr @${sym}(${argTy === "i1" ? "i1 zeroext" : argTy})`);
12
+ const t = B.tmp();
13
+ B.line(`${t} = call ptr @${sym}(${argTy} ${v.name})`);
14
+ const out = host.own({ name: t, type: e.type });
15
+ if (fallible)
16
+ host.emitPendingCheck();
17
+ return out;
18
+ };
19
+ switch (e.value.type.kind) {
20
+ case "f64":
21
+ return simple("scr_jsval_from_f64", "double", false);
22
+ case "bool":
23
+ return simple("scr_jsval_from_bool", "i1", false);
24
+ case "string":
25
+ return simple("scr_jsval_from_str", "ptr", false);
26
+ case "dyn":
27
+ // A CHECKED-DYNAMIC (dyn) value entering the island: deep copy,
28
+ // data kinds only — boxed functions/handles/promises throw the
29
+ // catchable TypeError in the runtime, and a wrapped island value
30
+ // unwraps to the SAME engine value (the identity round trip).
31
+ // The C emitter's rule, mirrored.
32
+ return simple("scr_jsval_from_dyn", "ptr", true);
33
+ case "bytes":
34
+ // A typed array crossing IN: a COPY (the boundary's copy stance).
35
+ return simple("scr_jsval_from_bytes", "ptr", true);
36
+ case "url":
37
+ // A URL crossing IN: an engine URL instance built from href.
38
+ return simple("scr_jsval_from_url", "ptr", true);
39
+ case "promise": {
40
+ // A STATIC promise crossing IN: a real engine thenable settled
41
+ // when the scriptc promise settles (the async-callback return
42
+ // bridge). from_promise takes ownership of a +1 — retain past
43
+ // the borrowed frame temp. The C emitter's rule, mirrored.
44
+ const tag = islandPromisePayloadTag(e.value.type.inner);
45
+ if (!tag)
46
+ throw new InternalCompilerError("llvm emitter bug: jsMarshal of a promise outside the bridge payload domain");
47
+ const tagN = { void: 0, f64: 1, bool: 2, string: 3, jsval: 4, jsvalArr: 5 }[tag];
48
+ host.declare(`declare ptr @scr_promise_retain(ptr)`);
49
+ host.declare(`declare ptr @scr_jsval_from_promise(ptr, i32)`);
50
+ const pr = B.tmp();
51
+ B.line(`${pr} = call ptr @scr_promise_retain(ptr ${v.name})`);
52
+ const t = B.tmp();
53
+ B.line(`${t} = call ptr @scr_jsval_from_promise(ptr ${pr}, i32 ${tagN})`);
54
+ const out = host.own({ name: t, type: e.type });
55
+ host.emitPendingCheck();
56
+ return out;
57
+ }
58
+ case "func": {
59
+ // A closure entering the island as a host function: from_closure
60
+ // retains it; the engine's finalizer releases it at teardown. The
61
+ // per-signature adapter gives the runtime one uniform call shape.
62
+ const fn = e.value.type;
63
+ const adapter = canMarshalFuncIntoIsland(fn)
64
+ ? host.islandAdapter(fn.params.length, fn.ret.kind)
65
+ : host.islandTypedAdapter(fn);
66
+ host.declare(`declare ptr @scr_jsval_from_closure(ptr, i32, ptr)`);
67
+ // ISLAND-REST closures encode a NEGATIVE arity (the C emitter's
68
+ // rule): the wrapper hands the trailing slot the engine array of
69
+ // the surplus arguments.
70
+ const arity = fn.rest === true && fn.restAbi === "jsval" ? -fn.params.length : fn.params.length;
71
+ const t = B.tmp();
72
+ B.line(`${t} = call ptr @scr_jsval_from_closure(ptr ${v.name}, i32 ${arity}, ptr @${adapter})`);
73
+ return host.own({ name: t, type: e.type });
74
+ }
75
+ default: {
76
+ // JSON-safe composite: deep copy through the emitted serializer
77
+ // and the engine's JSON parser (documented aliasing divergence).
78
+ const helper = host.walkers.jsonWriteHelper(e.value.type);
79
+ host.declare(`declare void @scr_jb_init(ptr)`);
80
+ host.declare(`declare ptr @scr_jb_finish(ptr)`);
81
+ host.declare(`declare ptr @scr_jsval_from_json(ptr)`);
82
+ const buf = B.slot();
83
+ B.entryAllocas.push(`${buf} = alloca %ScrJsonBuf`);
84
+ B.line(`call void @scr_jb_init(ptr ${buf})`);
85
+ B.line(`call void @${helper}(ptr ${buf}, ${host.llType(e.value.type)} ${v.name})`);
86
+ const js = B.tmp();
87
+ B.line(`${js} = call ptr @scr_jb_finish(ptr ${buf})`);
88
+ host.own({ name: js, type: STRING });
89
+ const t = B.tmp();
90
+ B.line(`${t} = call ptr @scr_jsval_from_json(ptr ${js})`);
91
+ const out = host.own({ name: t, type: e.type });
92
+ host.emitPendingCheck();
93
+ return out;
94
+ }
95
+ }
96
+ }
97
+ export function emitJsOp(host, e) {
98
+ const B = host.B;
99
+ const args = e.args.map((a) => host.emitExpr(a));
100
+ const a = (i) => args[i].name;
101
+ const nameSym = () => host.internLiteral(e.name);
102
+ const fallible = (call) => {
103
+ const t = call();
104
+ const out = host.own({ name: t, type: e.type });
105
+ host.emitPendingCheck();
106
+ return out;
107
+ };
108
+ const argPack = (list) => {
109
+ if (list.length === 0)
110
+ return "null";
111
+ const arr = B.slot();
112
+ B.entryAllocas.push(`${arr} = alloca [${list.length} x ptr]`);
113
+ list.forEach((x, i) => {
114
+ const p = B.tmp();
115
+ B.line(`${p} = getelementptr inbounds [${list.length} x ptr], ptr ${arr}, i64 0, i64 ${i}`);
116
+ B.line(`store ptr ${x}, ptr ${p}`);
117
+ });
118
+ return arr;
119
+ };
120
+ const JSOP = {
121
+ add: 0, sub: 1, mul: 2, div: 3, mod: 4, pow: 5,
122
+ lt: 6, le: 7, gt: 8, ge: 9, eq: 10, neq: 11,
123
+ };
124
+ switch (e.op) {
125
+ case "add":
126
+ case "sub":
127
+ case "mul":
128
+ case "div":
129
+ case "mod":
130
+ case "pow":
131
+ host.declare(`declare ptr @scr_jsval_binop(i32, ptr, ptr)`);
132
+ return fallible(() => {
133
+ const t = B.tmp();
134
+ B.line(`${t} = call ptr @scr_jsval_binop(i32 ${JSOP[e.op]}, ptr ${a(0)}, ptr ${a(1)})`);
135
+ return t;
136
+ });
137
+ case "lt":
138
+ case "le":
139
+ case "gt":
140
+ case "ge":
141
+ case "eq":
142
+ case "neq": {
143
+ host.declare(`declare i32 @scr_jsval_cmp(i32, ptr, ptr)`);
144
+ const r = B.tmp();
145
+ B.line(`${r} = call i32 @scr_jsval_cmp(i32 ${JSOP[e.op]}, ptr ${a(0)}, ptr ${a(1)})`);
146
+ const t = B.tmp();
147
+ B.line(`${t} = icmp eq i32 ${r}, 1`);
148
+ const out = { name: t, type: e.type };
149
+ host.emitPendingCheck();
150
+ return out;
151
+ }
152
+ case "neg":
153
+ case "plus": {
154
+ const sym = e.op === "neg" ? "scr_jsval_neg" : "scr_jsval_plus";
155
+ host.declare(`declare ptr @${sym}(ptr)`);
156
+ return fallible(() => {
157
+ const t = B.tmp();
158
+ B.line(`${t} = call ptr @${sym}(ptr ${a(0)})`);
159
+ return t;
160
+ });
161
+ }
162
+ case "truthy":
163
+ case "not": {
164
+ host.declare(`declare i32 @scr_jsval_truthy(ptr)`);
165
+ const r = B.tmp();
166
+ B.line(`${r} = call i32 @scr_jsval_truthy(ptr ${a(0)})`);
167
+ const t = B.tmp();
168
+ B.line(`${t} = icmp ${e.op === "truthy" ? "ne" : "eq"} i32 ${r}, 0`);
169
+ return { name: t, type: e.type };
170
+ }
171
+ case "typeof": {
172
+ host.declare(`declare ptr @scr_jsval_typeof(ptr)`);
173
+ const t = B.tmp();
174
+ B.line(`${t} = call ptr @scr_jsval_typeof(ptr ${a(0)})`);
175
+ return host.own({ name: t, type: e.type });
176
+ }
177
+ case "toStr":
178
+ host.declare(`declare ptr @scr_jsval_to_str(ptr)`);
179
+ return fallible(() => {
180
+ const t = B.tmp();
181
+ B.line(`${t} = call ptr @scr_jsval_to_str(ptr ${a(0)})`);
182
+ return t;
183
+ });
184
+ case "getProp":
185
+ host.declare(`declare ptr @scr_jsval_get_prop(ptr, ptr)`);
186
+ return fallible(() => {
187
+ const t = B.tmp();
188
+ B.line(`${t} = call ptr @scr_jsval_get_prop(ptr ${a(0)}, ptr ${nameSym()})`);
189
+ return t;
190
+ });
191
+ case "globalGet":
192
+ host.declare(`declare ptr @scr_jsval_global_get(ptr)`);
193
+ return fallible(() => {
194
+ const t = B.tmp();
195
+ B.line(`${t} = call ptr @scr_jsval_global_get(ptr ${nameSym()})`);
196
+ return t;
197
+ });
198
+ case "setProp": {
199
+ host.declare(`declare i32 @scr_jsval_set_prop(ptr, ptr, ptr)`);
200
+ B.line(`${B.tmp()} = call i32 @scr_jsval_set_prop(ptr ${a(0)}, ptr ${nameSym()}, ptr ${a(1)})`);
201
+ host.emitPendingCheck();
202
+ return { name: "", type: e.type };
203
+ }
204
+ case "getIdx":
205
+ host.declare(`declare ptr @scr_jsval_get_idx(ptr, ptr)`);
206
+ return fallible(() => {
207
+ const t = B.tmp();
208
+ B.line(`${t} = call ptr @scr_jsval_get_idx(ptr ${a(0)}, ptr ${a(1)})`);
209
+ return t;
210
+ });
211
+ case "iterNew":
212
+ host.declare(`declare ptr @scr_jsval_iter_new(ptr)`);
213
+ return fallible(() => {
214
+ const t = B.tmp();
215
+ B.line(`${t} = call ptr @scr_jsval_iter_new(ptr ${a(0)})`);
216
+ return t;
217
+ });
218
+ case "setIdx": {
219
+ host.declare(`declare i32 @scr_jsval_set_idx(ptr, ptr, ptr)`);
220
+ B.line(`${B.tmp()} = call i32 @scr_jsval_set_idx(ptr ${a(0)}, ptr ${a(1)}, ptr ${a(2)})`);
221
+ host.emitPendingCheck();
222
+ return { name: "", type: e.type };
223
+ }
224
+ case "callMethod": {
225
+ const pack = argPack(args.slice(1).map((x) => x.name));
226
+ host.declare(`declare ptr @scr_jsval_call_method(ptr, ptr, i32, ptr)`);
227
+ return fallible(() => {
228
+ const t = B.tmp();
229
+ B.line(`${t} = call ptr @scr_jsval_call_method(ptr ${a(0)}, ptr ${nameSym()}, i32 ${args.length - 1}, ptr ${pack})`);
230
+ return t;
231
+ });
232
+ }
233
+ case "optCallMethod": {
234
+ const pack = argPack(args.slice(1).map((x) => x.name));
235
+ host.declare(`declare ptr @scr_jsval_opt_call_method(ptr, ptr, i32, ptr)`);
236
+ return fallible(() => {
237
+ const t = B.tmp();
238
+ B.line(`${t} = call ptr @scr_jsval_opt_call_method(ptr ${a(0)}, ptr ${nameSym()}, i32 ${args.length - 1}, ptr ${pack})`);
239
+ return t;
240
+ });
241
+ }
242
+ case "callFn": {
243
+ const pack = argPack(args.slice(1).map((x) => x.name));
244
+ host.declare(`declare ptr @scr_jsval_call(ptr, i32, ptr)`);
245
+ return fallible(() => {
246
+ const t = B.tmp();
247
+ B.line(`${t} = call ptr @scr_jsval_call(ptr ${a(0)}, i32 ${args.length - 1}, ptr ${pack})`);
248
+ return t;
249
+ });
250
+ }
251
+ case "callFnThis": {
252
+ const pack = argPack(args.slice(2).map((x) => x.name));
253
+ host.declare(`declare ptr @scr_jsval_call_this(ptr, ptr, i32, ptr)`);
254
+ return fallible(() => {
255
+ const t = B.tmp();
256
+ B.line(`${t} = call ptr @scr_jsval_call_this(ptr ${a(0)}, ptr ${a(1)}, i32 ${args.length - 2}, ptr ${pack})`);
257
+ return t;
258
+ });
259
+ }
260
+ case "callSpread": {
261
+ // Spread application (`f(...pre, ...s)`): the prelude helper's
262
+ // real spread syntax — iterator protocols are the engine's own,
263
+ // the guards front-run V8's spread-call TypeError texts (the name
264
+ // literal is the spread expression's spelling).
265
+ host.declare(`declare ptr @scr_jsval_call_spread(ptr, ptr, ptr, ptr)`);
266
+ return fallible(() => {
267
+ const t = B.tmp();
268
+ B.line(`${t} = call ptr @scr_jsval_call_spread(ptr ${a(0)}, ptr ${a(1)}, ptr ${a(2)}, ptr ${nameSym()})`);
269
+ return t;
270
+ });
271
+ }
272
+ case "construct": {
273
+ const pack = argPack(args.slice(1).map((x) => x.name));
274
+ host.declare(`declare ptr @scr_jsval_construct(ptr, i32, ptr)`);
275
+ return fallible(() => {
276
+ const t = B.tmp();
277
+ B.line(`${t} = call ptr @scr_jsval_construct(ptr ${a(0)}, i32 ${args.length - 1}, ptr ${pack})`);
278
+ return t;
279
+ });
280
+ }
281
+ case "objLit": {
282
+ const pack = argPack(args.map((x) => x.name));
283
+ host.declare(`declare ptr @scr_jsval_obj_lit(i32, ptr)`);
284
+ const t = B.tmp();
285
+ B.line(`${t} = call ptr @scr_jsval_obj_lit(i32 ${args.length / 2}, ptr ${pack})`);
286
+ return host.own({ name: t, type: e.type });
287
+ }
288
+ case "tplStrings": {
289
+ const pack = argPack(args.map((x) => x.name));
290
+ host.declare(`declare ptr @scr_jsval_tpl_strings(i32, ptr)`);
291
+ const t = B.tmp();
292
+ B.line(`${t} = call ptr @scr_jsval_tpl_strings(i32 ${args.length / 2}, ptr ${pack})`);
293
+ return host.own({ name: t, type: e.type });
294
+ }
295
+ case "objSpread": {
296
+ host.declare(`declare ptr @scr_jsval_obj_spread(ptr, ptr)`);
297
+ return fallible(() => {
298
+ const t = B.tmp();
299
+ B.line(`${t} = call ptr @scr_jsval_obj_spread(ptr ${a(0)}, ptr ${a(1)})`);
300
+ return t;
301
+ });
302
+ }
303
+ case "defineGetter": {
304
+ // Getter completion for an island literal (the C emitter's
305
+ // scr_jsval_define_getter shape): defines key a(1) on obj a(0)
306
+ // as an engine getter invoking a(2); answers the object (+1).
307
+ host.declare(`declare ptr @scr_jsval_define_getter(ptr, ptr, ptr)`);
308
+ const t = B.tmp();
309
+ B.line(`${t} = call ptr @scr_jsval_define_getter(ptr ${a(0)}, ptr ${a(1)}, ptr ${a(2)})`);
310
+ return host.own({ name: t, type: e.type });
311
+ }
312
+ case "arrLit": {
313
+ const pack = argPack(args.map((x) => x.name));
314
+ host.declare(`declare ptr @scr_jsval_arr_lit(i32, ptr)`);
315
+ const t = B.tmp();
316
+ B.line(`${t} = call ptr @scr_jsval_arr_lit(i32 ${args.length}, ptr ${pack})`);
317
+ return host.own({ name: t, type: e.type });
318
+ }
319
+ case "instanceOf": {
320
+ // JS_IsInstanceOf through the engine: 1 true, 0 false, -1 threw
321
+ // (Symbol.hasInstance can raise) — the fallible pattern, result
322
+ // narrowed to bool by comparing against 1 (the C emitter's shape).
323
+ host.declare(`declare i32 @scr_jsval_instance_of(ptr, ptr)`);
324
+ return fallible(() => {
325
+ const r = B.tmp();
326
+ B.line(`${r} = call i32 @scr_jsval_instance_of(ptr ${a(0)}, ptr ${a(1)})`);
327
+ const t = B.tmp();
328
+ B.line(`${t} = icmp eq i32 ${r}, 1`);
329
+ return t;
330
+ });
331
+ }
332
+ case "undefLit": {
333
+ host.declare(`declare ptr @scr_jsval_undefined()`);
334
+ const t = B.tmp();
335
+ B.line(`${t} = call ptr @scr_jsval_undefined()`);
336
+ return host.own({ name: t, type: e.type });
337
+ }
338
+ case "nullLit": {
339
+ host.declare(`declare ptr @scr_jsval_null()`);
340
+ const t = B.tmp();
341
+ B.line(`${t} = call ptr @scr_jsval_null()`);
342
+ return host.own({ name: t, type: e.type });
343
+ }
344
+ default:
345
+ throw new InternalCompilerError(`llvm emitter bug: jsOp ${e.op}`);
346
+ }
347
+ }
348
+ export function emitJsExit(host, e) {
349
+ const B = host.B;
350
+ const v = host.emitExpr(e.value);
351
+ switch (e.type.kind) {
352
+ case "f64":
353
+ case "bool": {
354
+ const isF64 = e.type.kind === "f64";
355
+ const sym = isF64 ? "scr_jsval_exit_f64" : "scr_jsval_exit_bool";
356
+ host.declare(`declare i32 @${sym}(ptr, ptr)`);
357
+ const slot = B.slot();
358
+ B.entryAllocas.push(`${slot} = alloca ${isF64 ? "double" : "i8"}`);
359
+ B.line(`store ${isF64 ? `double ${f64Lit(0)}` : "i8 0"}, ptr ${slot}`);
360
+ B.line(`${B.tmp()} = call i32 @${sym}(ptr ${v.name}, ptr ${slot})`);
361
+ host.emitPendingCheck();
362
+ const t = B.tmp();
363
+ if (isF64) {
364
+ B.line(`${t} = load double, ptr ${slot}`);
365
+ return { name: t, type: e.type };
366
+ }
367
+ B.line(`${t} = load i8, ptr ${slot}`);
368
+ const b = B.tmp();
369
+ B.line(`${b} = trunc i8 ${t} to i1`);
370
+ return { name: b, type: e.type };
371
+ }
372
+ case "string": {
373
+ host.declare(`declare ptr @scr_jsval_exit_str(ptr)`);
374
+ const t = B.tmp();
375
+ B.line(`${t} = call ptr @scr_jsval_exit_str(ptr ${v.name})`);
376
+ const out = host.own({ name: t, type: e.type });
377
+ host.emitPendingCheck();
378
+ return out;
379
+ }
380
+ case "bytes": {
381
+ // Uint8Array exit: kind-checked, copied out (+1).
382
+ host.declare(`declare ptr @scr_jsval_exit_bytes(ptr)`);
383
+ const t = B.tmp();
384
+ B.line(`${t} = call ptr @scr_jsval_exit_bytes(ptr ${v.name})`);
385
+ const out = host.own({ name: t, type: e.type });
386
+ host.emitPendingCheck();
387
+ return out;
388
+ }
389
+ default: {
390
+ // `any[]`-declared slot: Array.isArray-gated, elements BY
391
+ // REFERENCE (identity crosses; the spine is a snapshot copy).
392
+ // JSON-safe element types keep the round trip below.
393
+ if (e.type.kind === "array" && e.type.elem.kind === "jsval") {
394
+ host.declare(`declare ptr @scr_jsval_exit_jsval_arr(ptr)`);
395
+ const t = B.tmp();
396
+ B.line(`${t} = call ptr @scr_jsval_exit_jsval_arr(ptr ${v.name})`);
397
+ const out = host.own({ name: t, type: e.type });
398
+ host.emitPendingCheck();
399
+ return out;
400
+ }
401
+ // An undefined-armed union target: the engine's undefined takes
402
+ // the undefined arm FIRST (JSON cannot spell it); then null and
403
+ // data ride the round trip into the union's dynCheck like any
404
+ // composite.
405
+ const roundTrip = () => {
406
+ host.declare(`declare ptr @scr_jsval_to_json(ptr)`);
407
+ host.declare(`declare ptr @scr_json_parse(ptr)`);
408
+ const js = B.tmp();
409
+ B.line(`${js} = call ptr @scr_jsval_to_json(ptr ${v.name})`);
410
+ host.own({ name: js, type: STRING });
411
+ host.emitPendingCheck();
412
+ const dom = B.tmp();
413
+ B.line(`${dom} = call ptr @scr_json_parse(ptr ${js})`);
414
+ host.own({ name: dom, type: { kind: "dyn" } });
415
+ host.emitPendingCheck();
416
+ const helper = host.dyn.dynCheckHelper(e.type);
417
+ const t = B.tmp();
418
+ B.line(`${t} = call ${host.llType(e.type)} @${helper}(ptr ${dom}, ptr null)`);
419
+ return t;
420
+ };
421
+ const undefTag = e.type.kind === "union" ? undefinedArmTag(e.type, host.unionsById) : -1;
422
+ if (e.type.kind === "union" && undefTag >= 0) {
423
+ host.declare(`declare zeroext i1 @scr_jsval_is_undefined(ptr)`);
424
+ const isU = B.tmp();
425
+ B.line(`${isU} = call zeroext i1 @scr_jsval_is_undefined(ptr ${v.name})`);
426
+ const slot = B.slot();
427
+ B.entryAllocas.push(`${slot} = alloca ptr`);
428
+ const lu = B.newLabel("jx.u");
429
+ const ld = B.newLabel("jx.d");
430
+ const lj = B.newLabel("jx.j");
431
+ B.condBr(isU, lu, ld);
432
+ B.startBlock(lu);
433
+ B.line(`store ptr ${host.unitInstanceRef(e.type.unionId, undefTag)}, ptr ${slot}`);
434
+ B.br(lj);
435
+ B.startBlock(ld);
436
+ host.frames.push([]);
437
+ const unionDef = host.unionsById.get(e.type.unionId);
438
+ const dataArms = unionDef ? unionDef.arms.flatMap((a, i) => (isUnitType(a) ? [] : [{ a, i }])) : [];
439
+ const jsvalArr = dataArms.length === 1 && dataArms[0].a.kind === "array" && dataArms[0].a.elem.kind === "jsval" ? dataArms[0] : null;
440
+ let t;
441
+ if (jsvalArr) {
442
+ // The `any[] | undefined` defaulted-parameter spelling: the
443
+ // engine array exits BY REFERENCE into the data arm.
444
+ host.declare(`declare ptr @scr_jsval_exit_jsval_arr(ptr)`);
445
+ host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
446
+ host.declare(`declare ptr @scr_arr_retain_v(ptr)`);
447
+ host.declare(`declare void @scr_arr_release_v(ptr)`);
448
+ const arr = B.tmp();
449
+ B.line(`${arr} = call ptr @scr_jsval_exit_jsval_arr(ptr ${v.name})`);
450
+ host.emitPendingCheck();
451
+ t = B.tmp();
452
+ B.line(`${t} = call ptr @scr_union_new_ref(i32 ${jsvalArr.i}, ptr ${arr}, ptr @scr_arr_retain_v, ptr @scr_arr_release_v, ptr null)`);
453
+ B.line(`store ptr ${t}, ptr ${slot}`);
454
+ }
455
+ else {
456
+ t = roundTrip();
457
+ host.own({ name: t, type: e.type });
458
+ host.emitPendingCheck();
459
+ host.moveTemp({ name: t, type: e.type });
460
+ B.line(`store ptr ${t}, ptr ${slot}`);
461
+ }
462
+ host.releaseFrame(host.frames.pop());
463
+ B.br(lj);
464
+ B.startBlock(lj);
465
+ const out = B.tmp();
466
+ B.line(`${out} = load ptr, ptr ${slot}`);
467
+ return host.own({ name: out, type: e.type });
468
+ }
469
+ const t = roundTrip();
470
+ const out = host.own({ name: t, type: e.type });
471
+ host.emitPendingCheck();
472
+ return out;
473
+ }
474
+ }
475
+ }
476
+ export function islandAdapter(host, arity, retKind) {
477
+ const tag = { void: "v", jsval: "j", f64: "f", bool: "b", string: "s" }[retKind];
478
+ const key = `ia:${arity}:${tag}`;
479
+ let sym = host.resolveThunks.get(key);
480
+ if (sym)
481
+ return sym;
482
+ sym = `sc_ia_${arity}${tag}`;
483
+ host.resolveThunks.set(key, sym);
484
+ host.declare(`declare ptr @scr_jsval_retain_v(ptr)`);
485
+ const d = [
486
+ `define internal ptr @${sym}(ptr %c, ptr %argv) ${FN_ATTRS} { ; island host-call adapter (${arity} arg${arity === 1 ? "" : "s"}, ${retKind})`,
487
+ `entry:`,
488
+ ];
489
+ const passed = ["ptr %c"];
490
+ for (let i = 0; i < arity; i++) {
491
+ d.push(` %ap${i} = getelementptr inbounds ptr, ptr %argv, i64 ${i}`, ` %av${i} = load ptr, ptr %ap${i}`, ` %ar${i} = call ptr @scr_jsval_retain_v(ptr %av${i})`);
492
+ passed.push(`ptr %ar${i}`);
493
+ }
494
+ d.push(` %fnp = getelementptr inbounds %ScrClosure, ptr %c, i64 0, i32 1`, ` %fn = load ptr, ptr %fnp`);
495
+ switch (retKind) {
496
+ case "void":
497
+ d.push(` call void %fn(${passed.join(", ")})`, ` ret ptr null`);
498
+ break;
499
+ case "jsval":
500
+ d.push(` %r = call ptr %fn(${passed.join(", ")})`, ` ret ptr %r`);
501
+ break;
502
+ case "f64":
503
+ host.declare(`declare ptr @scr_jsval_from_f64(double)`);
504
+ d.push(` %r = call double %fn(${passed.join(", ")})`, ` %j = call ptr @scr_jsval_from_f64(double %r)`, ` ret ptr %j`);
505
+ break;
506
+ case "bool":
507
+ host.declare(`declare ptr @scr_jsval_from_bool(i1 zeroext)`);
508
+ d.push(` %r = call i1 %fn(${passed.join(", ")})`, ` %j = call ptr @scr_jsval_from_bool(i1 %r)`, ` ret ptr %j`);
509
+ break;
510
+ case "string":
511
+ // The closure's +1 string marshals in, then releases. NULL is the
512
+ // throw-path dummy — the wrapper reverse-bridges the pending
513
+ // exception.
514
+ host.declare(`declare ptr @scr_jsval_from_str(ptr)`);
515
+ host.declare(`declare void @scr_str_release(ptr)`);
516
+ d.push(` %r = call ptr %fn(${passed.join(", ")})`, ` %isnull = icmp eq ptr %r, null`, ` br i1 %isnull, label %bad, label %ok`, `bad:`, ` ret ptr null`, `ok:`, ` %j = call ptr @scr_jsval_from_str(ptr %r)`, ` call void @scr_str_release(ptr %r)`, ` ret ptr %j`);
517
+ break;
518
+ }
519
+ d.push(`}`, ``);
520
+ host.resolveThunkDefs.push(...d);
521
+ return sym;
522
+ }
523
+ export function islandTypedAdapter(host, fn) {
524
+ const ret = islandCallbackRet(fn.ret, (id) => host.recordsById.get(id), (id) => host.unionsById.get(id));
525
+ if (!ret)
526
+ throw new InternalCompilerError("llvm emitter bug: typed island adapter with unsupported return");
527
+ const key = `ita:${fn.params.map((p) => typeKey(p)).join(",")}=>${ret.async ? "P:" : ""}${ret.tag}`;
528
+ let sym = host.resolveThunks.get(key);
529
+ if (sym)
530
+ return sym;
531
+ sym = `sc_ita_${host.resolveThunks.size}`;
532
+ host.resolveThunks.set(key, sym);
533
+ const d = [
534
+ `define internal ptr @${sym}(ptr %c, ptr %argv) ${FN_ATTRS} { ; typed island host-call adapter: ${key}`,
535
+ `entry:`,
536
+ ];
537
+ // One slot per param: scalars hold the converted value; refs start
538
+ // NULL so the convfail path can release NULL-tolerantly. Unit-arm
539
+ // instances are immortal — their release is a no-op.
540
+ const slotTy = [];
541
+ fn.params.forEach((p, i) => {
542
+ const ty = host.llType(p);
543
+ const st = ty === "double" ? "double" : ty === "i1" ? "i8" : "ptr";
544
+ slotTy.push(st);
545
+ d.push(` %sl${i} = alloca ${st}`);
546
+ d.push(` store ${st} ${st === "double" ? f64Lit(0) : st === "i8" ? "0" : "null"}, ptr %sl${i}`);
547
+ });
548
+ let canFail = false;
549
+ const cleanup = [];
550
+ fn.params.forEach((p, i) => {
551
+ if (isRefCounted(p)) {
552
+ cleanup.push(` %cf${i} = load ptr, ptr %sl${i}`, ` call void ${releaseSym(host, p)}(ptr %cf${i})`);
553
+ }
554
+ });
555
+ let blk = 0;
556
+ const failCheckPtr = (val) => {
557
+ // NULL result → convfail.
558
+ canFail = true;
559
+ const b = blk++;
560
+ d.push(` %cn${b} = icmp eq ptr ${val}, null`, ` br i1 %cn${b}, label %convfail, label %cont${b}`, `cont${b}:`);
561
+ };
562
+ host.declare(`declare zeroext i1 @scr_exc_pending()`);
563
+ fn.params.forEach((p, i) => {
564
+ d.push(` %ap${i} = getelementptr inbounds ptr, ptr %argv, i64 ${i}`, ` %av${i} = load ptr, ptr %ap${i}`);
565
+ switch (p.kind) {
566
+ case "jsval":
567
+ host.declare(`declare ptr @scr_jsval_retain_v(ptr)`);
568
+ d.push(` %jr${i} = call ptr @scr_jsval_retain_v(ptr %av${i})`, ` store ptr %jr${i}, ptr %sl${i}`);
569
+ break;
570
+ case "f64": {
571
+ canFail = true;
572
+ host.declare(`declare i32 @scr_jsval_exit_f64(ptr, ptr)`);
573
+ const b = blk++;
574
+ d.push(` %fx${i} = call i32 @scr_jsval_exit_f64(ptr %av${i}, ptr %sl${i})`, ` %fk${i} = icmp eq i32 %fx${i}, 0`, ` br i1 %fk${i}, label %convfail, label %cont${b}`, `cont${b}:`);
575
+ break;
576
+ }
577
+ case "bool": {
578
+ canFail = true;
579
+ host.declare(`declare i32 @scr_jsval_exit_bool(ptr, ptr)`);
580
+ const b = blk++;
581
+ d.push(` %bx${i} = call i32 @scr_jsval_exit_bool(ptr %av${i}, ptr %sl${i})`, ` %bk${i} = icmp eq i32 %bx${i}, 0`, ` br i1 %bk${i}, label %convfail, label %cont${b}`, `cont${b}:`);
582
+ break;
583
+ }
584
+ case "string": {
585
+ host.declare(`declare ptr @scr_jsval_exit_str(ptr)`);
586
+ d.push(` %sx${i} = call ptr @scr_jsval_exit_str(ptr %av${i})`);
587
+ failCheckPtr(`%sx${i}`);
588
+ d.push(` store ptr %sx${i}, ptr %sl${i}`);
589
+ break;
590
+ }
591
+ default: {
592
+ // Composite (record/array/union): the jsExit pipeline — engine
593
+ // JSON.stringify, json.parse, the interned dynCheck builder.
594
+ canFail = true;
595
+ host.declare(`declare ptr @scr_jsval_to_json(ptr)`);
596
+ host.declare(`declare ptr @scr_json_parse(ptr)`);
597
+ host.declare(`declare void @scr_str_release(ptr)`);
598
+ host.declare(`declare void @scr_dyn_release(ptr)`);
599
+ const utag = p.kind === "union" ? undefinedArmTag(p, host.unionsById) : -1;
600
+ const b = blk++;
601
+ if (p.kind === "union" && utag >= 0) {
602
+ host.declare(`declare zeroext i1 @scr_jsval_is_undefined(ptr)`);
603
+ d.push(` %iu${i} = call zeroext i1 @scr_jsval_is_undefined(ptr %av${i})`, ` br i1 %iu${i}, label %undef${b}, label %conv${b}`, `undef${b}:`, ` store ptr ${host.unitInstanceRef(p.unionId, utag)}, ptr %sl${i} ; absent/undefined argument -> the undefined arm`, ` br label %cont${b}`, `conv${b}:`);
604
+ }
605
+ d.push(` %tj${i} = call ptr @scr_jsval_to_json(ptr %av${i})`);
606
+ const b2 = blk++;
607
+ d.push(` %tjn${i} = icmp eq ptr %tj${i}, null`, ` br i1 %tjn${i}, label %convfail, label %cont${b2}`, `cont${b2}:`, ` %dp${i} = call ptr @scr_json_parse(ptr %tj${i})`, ` call void @scr_str_release(ptr %tj${i})`);
608
+ const b3 = blk++;
609
+ d.push(` %dpn${i} = icmp eq ptr %dp${i}, null`, ` br i1 %dpn${i}, label %convfail, label %cont${b3}`, `cont${b3}:`, ` %cv${i} = call ${host.llType(p)} @${host.dyn.dynCheckHelper(p)}(ptr %dp${i}, ptr null)`, ` call void @scr_dyn_release(ptr %dp${i})`, ` %pe${i} = call zeroext i1 @scr_exc_pending()`);
610
+ const b4 = blk++;
611
+ d.push(` br i1 %pe${i}, label %convfail, label %cont${b4}`, `cont${b4}:`, ` store ${host.llType(p)} %cv${i}, ptr %sl${i}`);
612
+ if (p.kind === "union" && utag >= 0)
613
+ d.push(` br label %cont${b}`, `cont${b}:`);
614
+ }
615
+ }
616
+ });
617
+ // The call over the converted slots (each moves into the callee).
618
+ const passed = ["ptr %c"];
619
+ fn.params.forEach((p, i) => {
620
+ const ty = host.llType(p);
621
+ if (ty === "i1") {
622
+ d.push(` %ld${i} = load i8, ptr %sl${i}`, ` %lb${i} = trunc i8 %ld${i} to i1`);
623
+ passed.push(`i1 %lb${i}`);
624
+ }
625
+ else {
626
+ d.push(` %ld${i} = load ${ty}, ptr %sl${i}`);
627
+ passed.push(`${ty} %ld${i}`);
628
+ }
629
+ });
630
+ d.push(` %fnp = getelementptr inbounds %ScrClosure, ptr %c, i64 0, i32 1`, ` %fn = load ptr, ptr %fnp`);
631
+ if (ret.async) {
632
+ // The closure returns a +1 ScrPromise; from_promise takes ownership.
633
+ const tagN = { void: 0, f64: 1, bool: 2, string: 3, jsval: 4, json: 0, dyn: 0 }[ret.tag];
634
+ host.declare(`declare ptr @scr_jsval_from_promise(ptr, i32)`);
635
+ d.push(` %pr = call ptr %fn(${passed.join(", ")})`, ` %prn = icmp eq ptr %pr, null`, ` br i1 %prn, label %pnull, label %pok`, `pnull:`, ` ret ptr null`, `pok:`, ` %pj = call ptr @scr_jsval_from_promise(ptr %pr, i32 ${tagN})`, ` ret ptr %pj`);
636
+ }
637
+ else {
638
+ switch (ret.tag) {
639
+ case "void":
640
+ d.push(` call void %fn(${passed.join(", ")})`, ` ret ptr null`);
641
+ break;
642
+ case "jsval":
643
+ d.push(` %r = call ptr %fn(${passed.join(", ")})`, ` ret ptr %r`);
644
+ break;
645
+ case "f64":
646
+ host.declare(`declare ptr @scr_jsval_from_f64(double)`);
647
+ d.push(` %r = call double %fn(${passed.join(", ")})`, ` %j = call ptr @scr_jsval_from_f64(double %r)`, ` ret ptr %j`);
648
+ break;
649
+ case "bool":
650
+ host.declare(`declare ptr @scr_jsval_from_bool(i1 zeroext)`);
651
+ d.push(` %r = call i1 %fn(${passed.join(", ")})`, ` %j = call ptr @scr_jsval_from_bool(i1 %r)`, ` ret ptr %j`);
652
+ break;
653
+ case "string":
654
+ host.declare(`declare ptr @scr_jsval_from_str(ptr)`);
655
+ host.declare(`declare void @scr_str_release(ptr)`);
656
+ d.push(` %r = call ptr %fn(${passed.join(", ")})`, ` %rn = icmp eq ptr %r, null`, ` br i1 %rn, label %snull, label %sok`, `snull:`, ` ret ptr null`, `sok:`, ` %j = call ptr @scr_jsval_from_str(ptr %r)`, ` call void @scr_str_release(ptr %r)`, ` ret ptr %j`);
657
+ break;
658
+ case "dyn":
659
+ // A checked-dynamic (+1 dyn) result: deep copy into the engine
660
+ // (the jsMarshal dyn rule); NULL is the throw-path dummy.
661
+ host.declare(`declare ptr @scr_jsval_from_dyn(ptr)`);
662
+ host.declare(`declare void @scr_dyn_release(ptr)`);
663
+ d.push(` %r = call ptr %fn(${passed.join(", ")})`, ` %rn = icmp eq ptr %r, null`, ` br i1 %rn, label %dnull, label %dok`, `dnull:`, ` ret ptr null`, `dok:`, ` %j = call ptr @scr_jsval_from_dyn(ptr %r)`, ` call void @scr_dyn_release(ptr %r)`, ` ret ptr %j`);
664
+ break;
665
+ case "json": {
666
+ // A JSON-safe composite return: the jsMarshal path — the type-
667
+ // directed serializer, then the engine's JSON parser (deep
668
+ // copy). NULL result is the throw-path dummy.
669
+ const helper = host.walkers.jsonWriteHelper(fn.ret);
670
+ host.declare(`declare void @scr_jb_init(ptr)`);
671
+ host.declare(`declare ptr @scr_jb_finish(ptr)`);
672
+ host.declare(`declare ptr @scr_jsval_from_json(ptr)`);
673
+ host.declare(`declare void @scr_str_release(ptr)`);
674
+ d.push(` %jbuf = alloca %ScrJsonBuf`, ` %rv = call ${host.llType(fn.ret)} %fn(${passed.join(", ")})`, ` %rpend = call zeroext i1 @scr_exc_pending()`, ` br i1 %rpend, label %jfail, label %jok`, `jfail:`, ...(isRefCounted(fn.ret) ? [` call void ${releaseSym(host, fn.ret)}(${host.llType(fn.ret)} %rv)`] : []), ` ret ptr null`, `jok:`, ` call void @scr_jb_init(ptr %jbuf)`, ` call void @${helper}(ptr %jbuf, ${host.llType(fn.ret)} %rv)`, ...(isRefCounted(fn.ret) ? [` call void ${releaseSym(host, fn.ret)}(${host.llType(fn.ret)} %rv)`] : []), ` %rj = call ptr @scr_jb_finish(ptr %jbuf)`, ` %j = call ptr @scr_jsval_from_json(ptr %rj)`, ` call void @scr_str_release(ptr %rj)`, ` ret ptr %j`);
675
+ break;
676
+ }
677
+ }
678
+ }
679
+ if (canFail) {
680
+ d.push(`convfail:`,
681
+ // Params already converted release here (NULL-tolerant; unit-arm
682
+ // instances are immortal — their release is a no-op). The pending
683
+ // TypeError reverse-bridges in the wrapper.
684
+ ...cleanup, ` ret ptr null`);
685
+ }
686
+ d.push(`}`, ``);
687
+ host.resolveThunkDefs.push(...d);
688
+ return sym;
689
+ }
690
+ //# sourceMappingURL=expr-island.js.map