@scriptc/compiler 0.1.6 → 0.2.0

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 (1060) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +73 -25
  2. package/ambient/scriptc-overrides.d.ts +10 -6
  3. package/ambient/scriptc.d.ts +28 -5
  4. package/dist/backend/build-cache.d.ts +1 -3
  5. package/dist/backend/build-cache.js +3 -22
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cache-root.d.ts +3 -0
  8. package/dist/backend/cache-root.js +23 -0
  9. package/dist/backend/cache-root.js.map +1 -0
  10. package/dist/backend/cycle-analysis.d.ts +15 -0
  11. package/dist/backend/cycle-analysis.js +107 -0
  12. package/dist/backend/cycle-analysis.js.map +1 -0
  13. package/dist/backend/cycle-analysis.test.js +124 -0
  14. package/dist/backend/cycle-analysis.test.js.map +1 -0
  15. package/dist/backend/debug-symbols.d.ts +8 -0
  16. package/dist/backend/debug-symbols.js +52 -0
  17. package/dist/backend/debug-symbols.js.map +1 -0
  18. package/dist/backend/executable-features.d.ts +4 -0
  19. package/dist/backend/executable-features.js +42 -0
  20. package/dist/backend/executable-features.js.map +1 -0
  21. package/dist/backend/external-c.d.ts +5 -27
  22. package/dist/backend/external-c.js +5 -40
  23. package/dist/backend/external-c.js.map +1 -1
  24. package/dist/backend/ffi-callbacks.d.ts +2 -3
  25. package/dist/backend/ffi-callbacks.js +2 -3
  26. package/dist/backend/ffi-callbacks.js.map +1 -1
  27. package/dist/backend/library-identity-markers.d.ts +4 -9
  28. package/dist/backend/library-identity-markers.js +11 -49
  29. package/dist/backend/library-identity-markers.js.map +1 -1
  30. package/dist/backend/library-pack.d.ts +5 -0
  31. package/dist/backend/library-pack.js +123 -0
  32. package/dist/backend/library-pack.js.map +1 -0
  33. package/dist/backend/link-plan-core.d.ts +20 -0
  34. package/dist/backend/link-plan-core.js +18 -0
  35. package/dist/backend/link-plan-core.js.map +1 -0
  36. package/dist/backend/link-plan.d.ts +2 -1
  37. package/dist/backend/link-plan.js +18 -17
  38. package/dist/backend/link-plan.js.map +1 -1
  39. package/dist/backend/link-trace.d.ts +2 -0
  40. package/dist/backend/link-trace.js +24 -0
  41. package/dist/backend/link-trace.js.map +1 -0
  42. package/dist/backend/linker.js +9 -1
  43. package/dist/backend/linker.js.map +1 -1
  44. package/dist/backend/literals.d.ts +9 -0
  45. package/dist/backend/literals.js +35 -0
  46. package/dist/backend/literals.js.map +1 -0
  47. package/dist/backend/literals.test.d.ts +1 -0
  48. package/dist/backend/literals.test.js +53 -0
  49. package/dist/backend/literals.test.js.map +1 -0
  50. package/dist/backend/llvm/blocks.d.ts +4 -0
  51. package/dist/backend/llvm/blocks.js +25 -4
  52. package/dist/backend/llvm/blocks.js.map +1 -1
  53. package/dist/backend/llvm/blocks.test.d.ts +1 -0
  54. package/dist/backend/llvm/blocks.test.js +91 -0
  55. package/dist/backend/llvm/blocks.test.js.map +1 -0
  56. package/dist/backend/llvm/classes.d.ts +14 -8
  57. package/dist/backend/llvm/classes.js +70 -28
  58. package/dist/backend/llvm/classes.js.map +1 -1
  59. package/dist/backend/llvm/common.d.ts +5 -1
  60. package/dist/backend/llvm/common.js +45 -4
  61. package/dist/backend/llvm/common.js.map +1 -1
  62. package/dist/backend/llvm/debug-info.d.ts +32 -0
  63. package/dist/backend/llvm/debug-info.js +198 -0
  64. package/dist/backend/llvm/debug-info.js.map +1 -0
  65. package/dist/backend/llvm/debug-info.test.d.ts +1 -0
  66. package/dist/backend/llvm/debug-info.test.js +110 -0
  67. package/dist/backend/llvm/debug-info.test.js.map +1 -0
  68. package/dist/backend/llvm/dyn.d.ts +16 -2
  69. package/dist/backend/llvm/dyn.js +498 -175
  70. package/dist/backend/llvm/dyn.js.map +1 -1
  71. package/dist/backend/llvm/emitter.d.ts +598 -1
  72. package/dist/backend/llvm/emitter.js +739 -409
  73. package/dist/backend/llvm/emitter.js.map +1 -1
  74. package/dist/backend/llvm/emitter.test.d.ts +1 -0
  75. package/dist/backend/llvm/emitter.test.js +179 -0
  76. package/dist/backend/llvm/emitter.test.js.map +1 -0
  77. package/dist/backend/llvm/expr-async.js +23 -14
  78. package/dist/backend/llvm/expr-async.js.map +1 -1
  79. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  80. package/dist/backend/llvm/expr-bytes.js +32 -14
  81. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  82. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  83. package/dist/backend/llvm/expr-callbacks.js +25 -22
  84. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  85. package/dist/backend/llvm/expr-calls.js +136 -35
  86. package/dist/backend/llvm/expr-calls.js.map +1 -1
  87. package/dist/backend/llvm/expr-containers.d.ts +1 -1
  88. package/dist/backend/llvm/expr-containers.js +43 -14
  89. package/dist/backend/llvm/expr-containers.js.map +1 -1
  90. package/dist/backend/llvm/expr-context.d.ts +5 -260
  91. package/dist/backend/llvm/expr-control.js +9 -5
  92. package/dist/backend/llvm/expr-control.js.map +1 -1
  93. package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
  94. package/dist/backend/llvm/expr-dispatch.js +2 -0
  95. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  96. package/dist/backend/llvm/expr-dynamic.js +72 -74
  97. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  98. package/dist/backend/llvm/expr-island.d.ts +1 -1
  99. package/dist/backend/llvm/expr-island.js +11 -7
  100. package/dist/backend/llvm/expr-island.js.map +1 -1
  101. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +51 -30
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  105. package/dist/backend/llvm/expr-records.d.ts +5 -1
  106. package/dist/backend/llvm/expr-records.js +43 -4
  107. package/dist/backend/llvm/expr-records.js.map +1 -1
  108. package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
  109. package/dist/backend/llvm/expr-stream-bridges.js +102 -121
  110. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  111. package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
  115. package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/layouts.d.ts +19 -0
  118. package/dist/backend/llvm/layouts.js +12 -0
  119. package/dist/backend/llvm/layouts.js.map +1 -0
  120. package/dist/backend/llvm/lib-abi.d.ts +19 -0
  121. package/dist/backend/llvm/lib-abi.js +82 -0
  122. package/dist/backend/llvm/lib-abi.js.map +1 -0
  123. package/dist/backend/llvm/lib-connect.d.ts +2 -0
  124. package/dist/backend/llvm/lib-connect.js +51 -0
  125. package/dist/backend/llvm/lib-connect.js.map +1 -0
  126. package/dist/backend/llvm/lib-datagram.d.ts +2 -0
  127. package/dist/backend/llvm/lib-datagram.js +135 -0
  128. package/dist/backend/llvm/lib-datagram.js.map +1 -0
  129. package/dist/backend/llvm/lib-dispatch.js +50 -6
  130. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  131. package/dist/backend/llvm/lib-filesystem.js +59 -18
  132. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  133. package/dist/backend/llvm/lib-http2.d.ts +2 -0
  134. package/dist/backend/llvm/lib-http2.js +215 -0
  135. package/dist/backend/llvm/lib-http2.js.map +1 -0
  136. package/dist/backend/llvm/lib-lookup.d.ts +2 -0
  137. package/dist/backend/llvm/lib-lookup.js +39 -0
  138. package/dist/backend/llvm/lib-lookup.js.map +1 -0
  139. package/dist/backend/llvm/lib-network.js +25 -2
  140. package/dist/backend/llvm/lib-network.js.map +1 -1
  141. package/dist/backend/llvm/lib-process.js +21 -16
  142. package/dist/backend/llvm/lib-process.js.map +1 -1
  143. package/dist/backend/llvm/lib-shared.js +125 -1
  144. package/dist/backend/llvm/lib-shared.js.map +1 -1
  145. package/dist/backend/llvm/lib-stream.js +3 -2
  146. package/dist/backend/llvm/lib-stream.js.map +1 -1
  147. package/dist/backend/llvm/lib-test.d.ts +2 -0
  148. package/dist/backend/llvm/lib-test.js +34 -0
  149. package/dist/backend/llvm/lib-test.js.map +1 -0
  150. package/dist/backend/llvm/lib-tls.d.ts +2 -0
  151. package/dist/backend/llvm/lib-tls.js +82 -0
  152. package/dist/backend/llvm/lib-tls.js.map +1 -0
  153. package/dist/backend/llvm/shapes.d.ts +10 -9
  154. package/dist/backend/llvm/shapes.js +35 -130
  155. package/dist/backend/llvm/shapes.js.map +1 -1
  156. package/dist/backend/llvm/split.js +4 -1
  157. package/dist/backend/llvm/split.js.map +1 -1
  158. package/dist/backend/llvm/split.test.js +26 -1
  159. package/dist/backend/llvm/split.test.js.map +1 -1
  160. package/dist/backend/llvm/unsupported.d.ts +1 -0
  161. package/dist/backend/llvm/unsupported.js +1 -2
  162. package/dist/backend/llvm/unsupported.js.map +1 -1
  163. package/dist/backend/llvm/walkers.js +1 -7
  164. package/dist/backend/llvm/walkers.js.map +1 -1
  165. package/dist/backend/mangle.d.ts +2 -2
  166. package/dist/backend/mangle.js +16 -5
  167. package/dist/backend/mangle.js.map +1 -1
  168. package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
  169. package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
  170. package/dist/backend/may-throw.js.map +1 -0
  171. package/dist/backend/may-throw.test.d.ts +1 -0
  172. package/dist/backend/may-throw.test.js +58 -0
  173. package/dist/backend/may-throw.test.js.map +1 -0
  174. package/dist/backend/native-codegen-core.d.ts +22 -0
  175. package/dist/backend/native-codegen-core.js +44 -0
  176. package/dist/backend/native-codegen-core.js.map +1 -0
  177. package/dist/backend/native-codegen.d.ts +3 -19
  178. package/dist/backend/native-codegen.js +5 -44
  179. package/dist/backend/native-codegen.js.map +1 -1
  180. package/dist/backend/native-codegen.test.js +2 -2
  181. package/dist/backend/native-codegen.test.js.map +1 -1
  182. package/dist/backend/native-link-info-core.d.ts +94 -0
  183. package/dist/backend/native-link-info-core.js +62 -0
  184. package/dist/backend/native-link-info-core.js.map +1 -0
  185. package/dist/backend/native-link-info.d.ts +3 -88
  186. package/dist/backend/native-link-info.js +12 -243
  187. package/dist/backend/native-link-info.js.map +1 -1
  188. package/dist/backend/native-link-info.test.js +41 -146
  189. package/dist/backend/native-link-info.test.js.map +1 -1
  190. package/dist/backend/native-toolchain.d.ts +10 -25
  191. package/dist/backend/native-toolchain.js +89 -219
  192. package/dist/backend/native-toolchain.js.map +1 -1
  193. package/dist/backend/native-toolchain.test.js +15 -5
  194. package/dist/backend/native-toolchain.test.js.map +1 -1
  195. package/dist/backend/native-tools.d.ts +24 -0
  196. package/dist/backend/native-tools.js +33 -0
  197. package/dist/backend/native-tools.js.map +1 -0
  198. package/dist/backend/object-localize.js +19 -8
  199. package/dist/backend/object-localize.js.map +1 -1
  200. package/dist/backend/object-localize.test.js +22 -0
  201. package/dist/backend/object-localize.test.js.map +1 -1
  202. package/dist/backend/runtime-abi.d.ts +2 -2
  203. package/dist/backend/runtime-abi.js +2 -2
  204. package/dist/backend/runtime-pack-core.d.ts +101 -0
  205. package/dist/backend/runtime-pack-core.js +172 -0
  206. package/dist/backend/runtime-pack-core.js.map +1 -0
  207. package/dist/backend/runtime-pack-native.d.ts +21 -0
  208. package/dist/backend/runtime-pack-native.js +70 -0
  209. package/dist/backend/runtime-pack-native.js.map +1 -0
  210. package/dist/backend/runtime-pack-targets.test.js +1 -1
  211. package/dist/backend/runtime-pack.d.ts +3 -83
  212. package/dist/backend/runtime-pack.js +8 -151
  213. package/dist/backend/runtime-pack.js.map +1 -1
  214. package/dist/backend/runtime-pack.test.js +24 -1
  215. package/dist/backend/runtime-pack.test.js.map +1 -1
  216. package/dist/backend/source-locations.d.ts +12 -0
  217. package/dist/backend/source-locations.js +32 -0
  218. package/dist/backend/source-locations.js.map +1 -0
  219. package/dist/backend/source-locations.test.d.ts +1 -0
  220. package/dist/backend/source-locations.test.js +16 -0
  221. package/dist/backend/source-locations.test.js.map +1 -0
  222. package/dist/backend/target-diagnostics.d.ts +22 -0
  223. package/dist/backend/target-diagnostics.js +108 -0
  224. package/dist/backend/target-diagnostics.js.map +1 -0
  225. package/dist/backend/target-platform.d.ts +15 -0
  226. package/dist/backend/target-platform.js +72 -0
  227. package/dist/backend/target-platform.js.map +1 -0
  228. package/dist/backend/targets.d.ts +13 -4
  229. package/dist/backend/targets.js +95 -30
  230. package/dist/backend/targets.js.map +1 -1
  231. package/dist/backend/targets.test.js +65 -4
  232. package/dist/backend/targets.test.js.map +1 -1
  233. package/dist/backend/toolchain-environment.d.ts +6 -0
  234. package/dist/backend/toolchain-environment.js +99 -0
  235. package/dist/backend/toolchain-environment.js.map +1 -0
  236. package/dist/backend/vendor-archives.d.ts +1 -9
  237. package/dist/backend/vendor-archives.js +2 -9
  238. package/dist/backend/vendor-archives.js.map +1 -1
  239. package/dist/backend/vendor-inputs.d.ts +9 -0
  240. package/dist/backend/vendor-inputs.js +10 -0
  241. package/dist/backend/vendor-inputs.js.map +1 -0
  242. package/dist/backend/warm-cache.d.ts +3 -0
  243. package/dist/backend/warm-cache.js +41 -0
  244. package/dist/backend/warm-cache.js.map +1 -0
  245. package/dist/cli/command.d.ts +3 -0
  246. package/dist/cli/command.js +328 -0
  247. package/dist/cli/command.js.map +1 -0
  248. package/dist/cli/host.d.ts +24 -0
  249. package/dist/cli/host.js +2 -0
  250. package/dist/cli/host.js.map +1 -0
  251. package/dist/cli/output-options.d.ts +26 -0
  252. package/dist/cli/output-options.js +60 -0
  253. package/dist/cli/output-options.js.map +1 -0
  254. package/dist/cli/paths.d.ts +12 -0
  255. package/dist/cli/paths.js +42 -0
  256. package/dist/cli/paths.js.map +1 -0
  257. package/dist/cli/usage.d.ts +74 -0
  258. package/dist/cli/usage.js +86 -0
  259. package/dist/cli/usage.js.map +1 -0
  260. package/dist/cli/wasi-paths.d.ts +8 -0
  261. package/dist/cli/wasi-paths.js +41 -0
  262. package/dist/cli/wasi-paths.js.map +1 -0
  263. package/dist/cli/wasi-runner.d.ts +2 -0
  264. package/dist/cli/wasi-runner.js +28 -0
  265. package/dist/cli/wasi-runner.js.map +1 -0
  266. package/dist/compat/fetch-profile.js +3 -3
  267. package/dist/compat/fetch-profile.js.map +1 -1
  268. package/dist/compile-types.d.ts +162 -0
  269. package/dist/compile-types.js +2 -0
  270. package/dist/compile-types.js.map +1 -0
  271. package/dist/coverage/report.js +11 -5
  272. package/dist/coverage/report.js.map +1 -1
  273. package/dist/coverage/surface-manifest.js +5 -2
  274. package/dist/coverage/surface-manifest.js.map +1 -1
  275. package/dist/diagnostics/diagnostic.d.ts +4 -0
  276. package/dist/diagnostics/diagnostic.js +15 -3
  277. package/dist/diagnostics/diagnostic.js.map +1 -1
  278. package/dist/executable/executable-cache.d.ts +3 -4
  279. package/dist/executable/executable-cache.js +33 -10
  280. package/dist/executable/executable-cache.js.map +1 -1
  281. package/dist/executable/executable-cache.test.js +38 -16
  282. package/dist/executable/executable-cache.test.js.map +1 -1
  283. package/dist/executable/prepare.d.ts +14 -0
  284. package/dist/executable/prepare.js +66 -0
  285. package/dist/executable/prepare.js.map +1 -0
  286. package/dist/ffi/ffi-manifest.d.ts +11 -4
  287. package/dist/ffi/ffi-manifest.js +170 -58
  288. package/dist/ffi/ffi-manifest.js.map +1 -1
  289. package/dist/ffi/ffi-manifest.test.d.ts +1 -0
  290. package/dist/ffi/ffi-manifest.test.js +111 -0
  291. package/dist/ffi/ffi-manifest.test.js.map +1 -0
  292. package/dist/format-integer.d.ts +3 -0
  293. package/dist/format-integer.js +14 -0
  294. package/dist/format-integer.js.map +1 -0
  295. package/dist/frontend/analysis.d.ts +5 -0
  296. package/dist/frontend/analysis.js +88 -0
  297. package/dist/frontend/analysis.js.map +1 -0
  298. package/dist/frontend/arguments-usage.d.ts +4 -0
  299. package/dist/frontend/arguments-usage.js +40 -0
  300. package/dist/frontend/arguments-usage.js.map +1 -0
  301. package/dist/frontend/binding-source.d.ts +4 -0
  302. package/dist/frontend/binding-source.js +18 -0
  303. package/dist/frontend/binding-source.js.map +1 -0
  304. package/dist/frontend/builtin-modules.d.ts +1 -1
  305. package/dist/frontend/builtin-modules.js +1 -1
  306. package/dist/frontend/builtin-modules.js.map +1 -1
  307. package/dist/frontend/cjs-lexer.d.ts +4 -25
  308. package/dist/frontend/cjs-lexer.js +6 -806
  309. package/dist/frontend/cjs-lexer.js.map +1 -1
  310. package/dist/frontend/cjs-resolve.d.ts +5 -0
  311. package/dist/frontend/cjs-resolve.js +429 -0
  312. package/dist/frontend/cjs-resolve.js.map +1 -0
  313. package/dist/frontend/cjs-syntax.d.ts +26 -0
  314. package/dist/frontend/cjs-syntax.js +806 -0
  315. package/dist/frontend/cjs-syntax.js.map +1 -0
  316. package/dist/frontend/comptime-node.d.ts +4 -0
  317. package/dist/frontend/comptime-node.js +16 -0
  318. package/dist/frontend/comptime-node.js.map +1 -0
  319. package/dist/frontend/comptime-node.test.d.ts +1 -0
  320. package/dist/frontend/comptime-node.test.js +37 -0
  321. package/dist/frontend/comptime-node.test.js.map +1 -0
  322. package/dist/frontend/dts-paths.d.ts +3 -4
  323. package/dist/frontend/dts-paths.js +15 -8
  324. package/dist/frontend/dts-paths.js.map +1 -1
  325. package/dist/frontend/fork-target.js +2 -2
  326. package/dist/frontend/fork-target.js.map +1 -1
  327. package/dist/frontend/helper-tokens.d.ts +1 -0
  328. package/dist/frontend/helper-tokens.js +147 -0
  329. package/dist/frontend/helper-tokens.js.map +1 -0
  330. package/dist/frontend/helper-tokens.test.d.ts +1 -0
  331. package/dist/frontend/helper-tokens.test.js +35 -0
  332. package/dist/frontend/helper-tokens.test.js.map +1 -0
  333. package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
  334. package/dist/frontend/inferred-js-diagnostics.js +69 -0
  335. package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
  336. package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
  337. package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
  338. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
  339. package/dist/frontend/input-tracker.d.ts +5 -2
  340. package/dist/frontend/input-tracker.js +24 -3
  341. package/dist/frontend/input-tracker.js.map +1 -1
  342. package/dist/frontend/input-tracker.test.js +23 -0
  343. package/dist/frontend/input-tracker.test.js.map +1 -1
  344. package/dist/frontend/lib-contract.js +32 -24
  345. package/dist/frontend/lib-contract.js.map +1 -1
  346. package/dist/frontend/literal-values.d.ts +4 -0
  347. package/dist/frontend/literal-values.js +21 -0
  348. package/dist/frontend/literal-values.js.map +1 -0
  349. package/dist/frontend/literal-values.test.d.ts +1 -0
  350. package/dist/frontend/literal-values.test.js +91 -0
  351. package/dist/frontend/literal-values.test.js.map +1 -0
  352. package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
  353. package/dist/frontend/lowering/abstract-equality.js +3 -0
  354. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  355. package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
  356. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  357. package/dist/frontend/lowering/array-values.d.ts +4 -1
  358. package/dist/frontend/lowering/array-values.js +43 -1
  359. package/dist/frontend/lowering/array-values.js.map +1 -1
  360. package/dist/frontend/lowering/callback-arg.js +1 -0
  361. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  362. package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
  363. package/dist/frontend/lowering/class-callbacks.js +63 -0
  364. package/dist/frontend/lowering/class-callbacks.js.map +1 -0
  365. package/dist/frontend/lowering/class-descriptors.d.ts +9 -0
  366. package/dist/frontend/lowering/class-descriptors.js +73 -0
  367. package/dist/frontend/lowering/class-descriptors.js.map +1 -0
  368. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +41 -0
  369. package/dist/frontend/lowering/class-dynamic-dispatch.js +803 -0
  370. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
  371. package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
  372. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +92 -0
  373. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
  374. package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
  375. package/dist/frontend/lowering/class-instance-constructor.js +64 -0
  376. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
  377. package/dist/frontend/lowering/class-method-values.d.ts +10 -0
  378. package/dist/frontend/lowering/class-method-values.js +170 -0
  379. package/dist/frontend/lowering/class-method-values.js.map +1 -0
  380. package/dist/frontend/lowering/class-prototypes.d.ts +16 -0
  381. package/dist/frontend/lowering/class-prototypes.js +134 -0
  382. package/dist/frontend/lowering/class-prototypes.js.map +1 -0
  383. package/dist/frontend/lowering/class-static-data.d.ts +6 -0
  384. package/dist/frontend/lowering/class-static-data.js +56 -0
  385. package/dist/frontend/lowering/class-static-data.js.map +1 -0
  386. package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
  387. package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
  388. package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
  389. package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
  390. package/dist/frontend/lowering/containers/bytes.js +164 -155
  391. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  392. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
  393. package/dist/frontend/lowering/containers/string-and-regexp.js +39 -16
  394. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  395. package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
  396. package/dist/frontend/lowering/containers/string-replacement.js +217 -0
  397. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
  398. package/dist/frontend/lowering/error-methods.d.ts +11 -0
  399. package/dist/frontend/lowering/error-methods.js +78 -0
  400. package/dist/frontend/lowering/error-methods.js.map +1 -0
  401. package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
  402. package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
  403. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
  404. package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
  405. package/dist/frontend/lowering/expressions/native-proxy.js +49 -0
  406. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
  407. package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
  408. package/dist/frontend/lowering/expressions/nullish-assignment.js +124 -0
  409. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
  410. package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
  411. package/dist/frontend/lowering/expressions/object-literals.js +485 -185
  412. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  413. package/dist/frontend/lowering/expressions/optional-chains.d.ts +5 -6
  414. package/dist/frontend/lowering/expressions/optional-chains.js +27 -14
  415. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  416. package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
  417. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
  418. package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
  419. package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
  420. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
  421. package/dist/frontend/lowering/function-context.d.ts +93 -0
  422. package/dist/frontend/lowering/function-context.js +103 -0
  423. package/dist/frontend/lowering/function-context.js.map +1 -0
  424. package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
  425. package/dist/frontend/lowering/generator-delegation.js +85 -0
  426. package/dist/frontend/lowering/generator-delegation.js.map +1 -0
  427. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +10 -0
  428. package/dist/frontend/lowering/generator-dynamic-dispatch.js +105 -0
  429. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
  430. package/dist/frontend/lowering/lib-boundary.d.ts +2 -1
  431. package/dist/frontend/lowering/lib-boundary.js +59 -20
  432. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  433. package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
  434. package/dist/frontend/lowering/lib-boundary.test.js +45 -0
  435. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
  436. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  437. package/dist/frontend/lowering/lower-assert.d.ts +1 -1
  438. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  439. package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
  440. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  441. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  442. package/dist/frontend/lowering/lower-builtin-values.js +139 -0
  443. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
  444. package/dist/frontend/lowering/lower-builtins.d.ts +27 -41
  445. package/dist/frontend/lowering/lower-builtins.js +553 -346
  446. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  447. package/dist/frontend/lowering/lower-calls.d.ts +22 -26
  448. package/dist/frontend/lowering/lower-calls.js +1373 -380
  449. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  450. package/dist/frontend/lowering/lower-classes.d.ts +83 -45
  451. package/dist/frontend/lowering/lower-classes.js +952 -339
  452. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  453. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  454. package/dist/frontend/lowering/lower-comptime.js +23 -32
  455. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  456. package/dist/frontend/lowering/lower-containers.d.ts +27 -32
  457. package/dist/frontend/lowering/lower-containers.js +796 -151
  458. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  459. package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
  460. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  461. package/dist/frontend/lowering/lower-enums.d.ts +1 -1
  462. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  463. package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
  464. package/dist/frontend/lowering/lower-event-emitter.js +58 -26
  465. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  466. package/dist/frontend/lowering/lower-expando.d.ts +7 -1
  467. package/dist/frontend/lowering/lower-expando.js +14 -6
  468. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  469. package/dist/frontend/lowering/lower-exprs.d.ts +35 -11
  470. package/dist/frontend/lowering/lower-exprs.js +1785 -790
  471. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  472. package/dist/frontend/lowering/lower-generators.d.ts +2 -5
  473. package/dist/frontend/lowering/lower-generators.js +77 -46
  474. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  475. package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
  476. package/dist/frontend/lowering/lower-global-value.js +17 -0
  477. package/dist/frontend/lowering/lower-global-value.js.map +1 -0
  478. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  479. package/dist/frontend/lowering/lower-inspect.js +17 -8
  480. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  481. package/dist/frontend/lowering/lower-island.d.ts +5 -8
  482. package/dist/frontend/lowering/lower-island.js +34 -23
  483. package/dist/frontend/lowering/lower-island.js.map +1 -1
  484. package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
  485. package/dist/frontend/lowering/lower-mixins.js +5 -3
  486. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  487. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  488. package/dist/frontend/lowering/lower-modules.js +252 -38
  489. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  490. package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
  491. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  492. package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
  493. package/dist/frontend/lowering/lower-node-module.js +13 -10
  494. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  496. package/dist/frontend/lowering/lower-server.js +6 -10
  497. package/dist/frontend/lowering/lower-server.js.map +1 -1
  498. package/dist/frontend/lowering/lower-stmts.d.ts +10 -14
  499. package/dist/frontend/lowering/lower-stmts.js +731 -532
  500. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  501. package/dist/frontend/lowering/lower-stream.d.ts +1 -1
  502. package/dist/frontend/lowering/lower-stream.js +19 -10
  503. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  504. package/dist/frontend/lowering/lower-test.d.ts +1 -1
  505. package/dist/frontend/lowering/lower-test.js.map +1 -1
  506. package/dist/frontend/lowering/lower-url.d.ts +6 -0
  507. package/dist/frontend/lowering/lower-url.js +77 -0
  508. package/dist/frontend/lowering/lower-url.js.map +1 -0
  509. package/dist/frontend/lowering/lowerer.d.ts +113 -189
  510. package/dist/frontend/lowering/lowerer.js +1033 -663
  511. package/dist/frontend/lowering/lowerer.js.map +1 -1
  512. package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
  513. package/dist/frontend/lowering/lowerer.test.js +26 -0
  514. package/dist/frontend/lowering/lowerer.test.js.map +1 -0
  515. package/dist/frontend/lowering/native-ffi.d.ts +5 -0
  516. package/dist/frontend/lowering/native-ffi.js +40 -0
  517. package/dist/frontend/lowering/native-ffi.js.map +1 -0
  518. package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
  519. package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
  520. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
  521. package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
  522. package/dist/frontend/lowering/object-factory-new.js +68 -0
  523. package/dist/frontend/lowering/object-factory-new.js.map +1 -0
  524. package/dist/frontend/lowering/optional-arguments.js +6 -1
  525. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  526. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  527. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  528. package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
  529. package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
  530. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
  531. package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
  532. package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
  533. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
  534. package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
  535. package/dist/frontend/lowering/sanitize-class-types.js +79 -0
  536. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
  537. package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
  538. package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
  539. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
  540. package/dist/frontend/lowering/static-this.d.ts +5 -1
  541. package/dist/frontend/lowering/static-this.js +28 -2
  542. package/dist/frontend/lowering/static-this.js.map +1 -1
  543. package/dist/frontend/lowering/string-index.d.ts +7 -0
  544. package/dist/frontend/lowering/string-index.js +39 -0
  545. package/dist/frontend/lowering/string-index.js.map +1 -0
  546. package/dist/frontend/lowering/surfaces.d.ts +9 -4
  547. package/dist/frontend/lowering/surfaces.js +98 -35
  548. package/dist/frontend/lowering/surfaces.js.map +1 -1
  549. package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
  550. package/dist/frontend/lowering/symbol-fields.js +183 -0
  551. package/dist/frontend/lowering/symbol-fields.js.map +1 -0
  552. package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
  553. package/dist/frontend/lowering/symbol-methods.js +30 -0
  554. package/dist/frontend/lowering/symbol-methods.js.map +1 -0
  555. package/dist/frontend/lowering/text-decoder-encoding.d.ts +10 -0
  556. package/dist/frontend/lowering/text-decoder-encoding.js +77 -0
  557. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
  558. package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
  559. package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
  560. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
  561. package/dist/frontend/lowering/union-narrow.d.ts +9 -0
  562. package/dist/frontend/lowering/union-narrow.js +59 -0
  563. package/dist/frontend/lowering/union-narrow.js.map +1 -0
  564. package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
  565. package/dist/frontend/lowering/union-narrow.test.js +72 -0
  566. package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
  567. package/dist/frontend/lowering/union-retag.d.ts +43 -0
  568. package/dist/frontend/lowering/union-retag.js +259 -0
  569. package/dist/frontend/lowering/union-retag.js.map +1 -0
  570. package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
  571. package/dist/frontend/lowering/union-retag.test.js +405 -0
  572. package/dist/frontend/lowering/union-retag.test.js.map +1 -0
  573. package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
  574. package/dist/frontend/lowering/unregistered-class-types.js +94 -0
  575. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
  576. package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
  577. package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
  578. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
  579. package/dist/frontend/lowering/width-lift.d.ts +40 -0
  580. package/dist/frontend/lowering/width-lift.js +2 -0
  581. package/dist/frontend/lowering/width-lift.js.map +1 -0
  582. package/dist/frontend/module-syntax.d.ts +58 -0
  583. package/dist/frontend/module-syntax.js +123 -0
  584. package/dist/frontend/module-syntax.js.map +1 -0
  585. package/dist/frontend/module-syntax.test.d.ts +1 -0
  586. package/dist/frontend/module-syntax.test.js +78 -0
  587. package/dist/frontend/module-syntax.test.js.map +1 -0
  588. package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
  589. package/dist/frontend/npm-fetch-analysis.js +100 -0
  590. package/dist/frontend/npm-fetch-analysis.js.map +1 -0
  591. package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
  592. package/dist/frontend/npm-fetch-analysis.test.js +107 -0
  593. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
  594. package/dist/frontend/npm-fetch-node.d.ts +2 -0
  595. package/dist/frontend/npm-fetch-node.js +12 -0
  596. package/dist/frontend/npm-fetch-node.js.map +1 -0
  597. package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
  598. package/dist/frontend/npm-fetch-syntax.js +207 -0
  599. package/dist/frontend/npm-fetch-syntax.js.map +1 -0
  600. package/dist/frontend/npm-node.d.ts +10 -0
  601. package/dist/frontend/npm-node.js +14 -0
  602. package/dist/frontend/npm-node.js.map +1 -0
  603. package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
  604. package/dist/frontend/npm-static-bundled-cjs.js +236 -0
  605. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
  606. package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
  607. package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
  608. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
  609. package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
  610. package/dist/frontend/npm-static-declaration-syntax.js +944 -0
  611. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
  612. package/dist/frontend/npm-static-declarations.d.ts +11 -39
  613. package/dist/frontend/npm-static-declarations.js +22 -561
  614. package/dist/frontend/npm-static-declarations.js.map +1 -1
  615. package/dist/frontend/npm-static-declarations.test.js +245 -6
  616. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  617. package/dist/frontend/npm-static-prune.d.ts +1 -1
  618. package/dist/frontend/npm-static-prune.js +5 -4
  619. package/dist/frontend/npm-static-prune.js.map +1 -1
  620. package/dist/frontend/npm-static-prune.test.js +1 -1
  621. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  622. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
  623. package/dist/frontend/npm-static-rewrite-host.js +179 -0
  624. package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
  625. package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
  626. package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
  627. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
  628. package/dist/frontend/npm-static-rewrite.d.ts +0 -5
  629. package/dist/frontend/npm-static-rewrite.js +2 -1079
  630. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  631. package/dist/frontend/npm-static-subtyping.d.ts +5 -0
  632. package/dist/frontend/npm-static-subtyping.js +55 -0
  633. package/dist/frontend/npm-static-subtyping.js.map +1 -0
  634. package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
  635. package/dist/frontend/npm-static-subtyping.test.js +58 -0
  636. package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
  637. package/dist/frontend/npm-static.d.ts +7 -15
  638. package/dist/frontend/npm-static.js +19 -28
  639. package/dist/frontend/npm-static.js.map +1 -1
  640. package/dist/frontend/npm.d.ts +8 -69
  641. package/dist/frontend/npm.js +21 -361
  642. package/dist/frontend/npm.js.map +1 -1
  643. package/dist/frontend/npm.test.js +2 -2
  644. package/dist/frontend/npm.test.js.map +1 -1
  645. package/dist/frontend/pipeline-native.d.ts +6 -0
  646. package/dist/frontend/pipeline-native.js +32 -0
  647. package/dist/frontend/pipeline-native.js.map +1 -0
  648. package/dist/frontend/pipeline.d.ts +54 -0
  649. package/dist/frontend/pipeline.js +382 -0
  650. package/dist/frontend/pipeline.js.map +1 -0
  651. package/dist/frontend/pipeline.test.d.ts +1 -0
  652. package/dist/frontend/pipeline.test.js +77 -0
  653. package/dist/frontend/pipeline.test.js.map +1 -0
  654. package/dist/frontend/program-analysis.d.ts +10 -0
  655. package/dist/frontend/program-analysis.js +14 -0
  656. package/dist/frontend/program-analysis.js.map +1 -0
  657. package/dist/frontend/program-node.d.ts +9 -0
  658. package/dist/frontend/program-node.js +48 -0
  659. package/dist/frontend/program-node.js.map +1 -0
  660. package/dist/frontend/program.d.ts +43 -19
  661. package/dist/frontend/program.js +556 -197
  662. package/dist/frontend/program.js.map +1 -1
  663. package/dist/frontend/program.test.d.ts +1 -0
  664. package/dist/frontend/program.test.js +202 -0
  665. package/dist/frontend/program.test.js.map +1 -0
  666. package/dist/frontend/provenance-core.d.ts +9 -0
  667. package/dist/frontend/provenance-core.js +435 -0
  668. package/dist/frontend/provenance-core.js.map +1 -0
  669. package/dist/frontend/provenance.d.ts +0 -4
  670. package/dist/frontend/provenance.js +4 -459
  671. package/dist/frontend/provenance.js.map +1 -1
  672. package/dist/frontend/resolve.d.ts +3 -1
  673. package/dist/frontend/resolve.js +6 -3
  674. package/dist/frontend/resolve.js.map +1 -1
  675. package/dist/frontend/runtime-resolve.d.ts +4 -3
  676. package/dist/frontend/runtime-resolve.js +22 -18
  677. package/dist/frontend/runtime-resolve.js.map +1 -1
  678. package/dist/frontend/runtime-resolve.test.js +53 -0
  679. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  680. package/dist/frontend/services-node.d.ts +5 -0
  681. package/dist/frontend/services-node.js +19 -0
  682. package/dist/frontend/services-node.js.map +1 -0
  683. package/dist/frontend/services-node.test.d.ts +1 -0
  684. package/dist/frontend/services-node.test.js +70 -0
  685. package/dist/frontend/services-node.test.js.map +1 -0
  686. package/dist/frontend/services.d.ts +44 -0
  687. package/dist/frontend/services.js +90 -0
  688. package/dist/frontend/services.js.map +1 -0
  689. package/dist/frontend/services.test.d.ts +1 -0
  690. package/dist/frontend/services.test.js +174 -0
  691. package/dist/frontend/services.test.js.map +1 -0
  692. package/dist/frontend/ts7/adapter.d.ts +3 -3
  693. package/dist/frontend/ts7/adapter.js +14 -31
  694. package/dist/frontend/ts7/adapter.js.map +1 -1
  695. package/dist/frontend/ts7/api.d.ts +16 -0
  696. package/dist/frontend/ts7/api.js +24 -0
  697. package/dist/frontend/ts7/api.js.map +1 -0
  698. package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
  699. package/dist/frontend/ts7/ast-bytes.js +137 -0
  700. package/dist/frontend/ts7/ast-bytes.js.map +1 -0
  701. package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
  702. package/dist/frontend/ts7/ast-bytes.test.js +73 -0
  703. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
  704. package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
  705. package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
  706. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
  707. package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
  708. package/dist/frontend/ts7/ast-guards.test.js +43 -0
  709. package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
  710. package/dist/frontend/ts7/ast-node.d.ts +194 -0
  711. package/dist/frontend/ts7/ast-node.js +448 -0
  712. package/dist/frontend/ts7/ast-node.js.map +1 -0
  713. package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
  714. package/dist/frontend/ts7/ast-node.test.js +266 -0
  715. package/dist/frontend/ts7/ast-node.test.js.map +1 -0
  716. package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
  717. package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
  718. package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
  719. package/dist/frontend/ts7/ast-text.d.ts +6 -0
  720. package/dist/frontend/ts7/ast-text.js +124 -0
  721. package/dist/frontend/ts7/ast-text.js.map +1 -0
  722. package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
  723. package/dist/frontend/ts7/ast-text.test.js +38 -0
  724. package/dist/frontend/ts7/ast-text.test.js.map +1 -0
  725. package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
  726. package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
  727. package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
  728. package/dist/frontend/ts7/ast-types.d.ts +42 -0
  729. package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
  730. package/dist/frontend/ts7/ast-types.generated.js +5 -0
  731. package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
  732. package/dist/frontend/ts7/ast-types.js +3 -0
  733. package/dist/frontend/ts7/ast-types.js.map +1 -0
  734. package/dist/frontend/ts7/ast-wire.d.ts +58 -0
  735. package/dist/frontend/ts7/ast-wire.js +267 -0
  736. package/dist/frontend/ts7/ast-wire.js.map +1 -0
  737. package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
  738. package/dist/frontend/ts7/ast-wire.test.js +151 -0
  739. package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
  740. package/dist/frontend/ts7/ast.d.ts +14 -14
  741. package/dist/frontend/ts7/ast.js +21 -15
  742. package/dist/frontend/ts7/ast.js.map +1 -1
  743. package/dist/frontend/ts7/census-check.js +1 -0
  744. package/dist/frontend/ts7/census-check.js.map +1 -1
  745. package/dist/frontend/ts7/checker-cache.d.ts +48 -0
  746. package/dist/frontend/ts7/checker-cache.js +92 -0
  747. package/dist/frontend/ts7/checker-cache.js.map +1 -0
  748. package/dist/frontend/ts7/checker.d.ts +19 -46
  749. package/dist/frontend/ts7/checker.js +231 -161
  750. package/dist/frontend/ts7/checker.js.map +1 -1
  751. package/dist/frontend/ts7/checker.test.d.ts +1 -0
  752. package/dist/frontend/ts7/checker.test.js +335 -0
  753. package/dist/frontend/ts7/checker.test.js.map +1 -0
  754. package/dist/frontend/ts7/enums.d.ts +4 -27
  755. package/dist/frontend/ts7/enums.generated.d.ts +878 -0
  756. package/dist/frontend/ts7/enums.generated.js +1313 -0
  757. package/dist/frontend/ts7/enums.generated.js.map +1 -0
  758. package/dist/frontend/ts7/enums.js +4 -45
  759. package/dist/frontend/ts7/enums.js.map +1 -1
  760. package/dist/frontend/ts7/enums.test.d.ts +1 -0
  761. package/dist/frontend/ts7/enums.test.js +48 -0
  762. package/dist/frontend/ts7/enums.test.js.map +1 -0
  763. package/dist/frontend/ts7/native-api.d.ts +10 -0
  764. package/dist/frontend/ts7/native-api.js +10 -0
  765. package/dist/frontend/ts7/native-api.js.map +1 -0
  766. package/dist/frontend/ts7/native-host.d.ts +2 -0
  767. package/dist/frontend/ts7/native-host.js +11 -0
  768. package/dist/frontend/ts7/native-host.js.map +1 -0
  769. package/dist/frontend/ts7/native-process.d.ts +14 -0
  770. package/dist/frontend/ts7/native-process.js +62 -0
  771. package/dist/frontend/ts7/native-process.js.map +1 -0
  772. package/dist/frontend/ts7/program-adapter.d.ts +10 -98
  773. package/dist/frontend/ts7/program-adapter.js +16 -310
  774. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  775. package/dist/frontend/ts7/program-host.d.ts +115 -0
  776. package/dist/frontend/ts7/program-host.js +347 -0
  777. package/dist/frontend/ts7/program-host.js.map +1 -0
  778. package/dist/frontend/ts7/program-host.test.d.ts +1 -0
  779. package/dist/frontend/ts7/program-host.test.js +207 -0
  780. package/dist/frontend/ts7/program-host.test.js.map +1 -0
  781. package/dist/frontend/ts7/rpc-api.d.ts +12 -0
  782. package/dist/frontend/ts7/rpc-api.js +23 -0
  783. package/dist/frontend/ts7/rpc-api.js.map +1 -0
  784. package/dist/frontend/ts7/rpc-client.d.ts +27 -0
  785. package/dist/frontend/ts7/rpc-client.js +102 -0
  786. package/dist/frontend/ts7/rpc-client.js.map +1 -0
  787. package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
  788. package/dist/frontend/ts7/rpc-client.test.js +133 -0
  789. package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
  790. package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
  791. package/dist/frontend/ts7/rpc-filesystem.js +42 -0
  792. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
  793. package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
  794. package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
  795. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
  796. package/dist/frontend/ts7/rpc-process.d.ts +2 -0
  797. package/dist/frontend/ts7/rpc-process.js +148 -0
  798. package/dist/frontend/ts7/rpc-process.js.map +1 -0
  799. package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
  800. package/dist/frontend/ts7/rpc-process.test.js +29 -0
  801. package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
  802. package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
  803. package/dist/frontend/ts7/rpc-wire.js +195 -0
  804. package/dist/frontend/ts7/rpc-wire.js.map +1 -0
  805. package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
  806. package/dist/frontend/ts7/rpc-wire.test.js +168 -0
  807. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
  808. package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
  809. package/dist/frontend/ts7/semantic-checker.js +221 -0
  810. package/dist/frontend/ts7/semantic-checker.js.map +1 -0
  811. package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
  812. package/dist/frontend/ts7/semantic-checker.test.js +119 -0
  813. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
  814. package/dist/frontend/ts7/semantic-json.d.ts +5 -0
  815. package/dist/frontend/ts7/semantic-json.js +52 -0
  816. package/dist/frontend/ts7/semantic-json.js.map +1 -0
  817. package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
  818. package/dist/frontend/ts7/semantic-json.test.js +42 -0
  819. package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
  820. package/dist/frontend/ts7/semantic-model.d.ts +222 -0
  821. package/dist/frontend/ts7/semantic-model.js +423 -0
  822. package/dist/frontend/ts7/semantic-model.js.map +1 -0
  823. package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
  824. package/dist/frontend/ts7/semantic-model.test.js +322 -0
  825. package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
  826. package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
  827. package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
  828. package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
  829. package/dist/frontend/ts7/semantic-types.d.ts +5 -0
  830. package/dist/frontend/ts7/semantic-types.js +2 -0
  831. package/dist/frontend/ts7/semantic-types.js.map +1 -0
  832. package/dist/frontend/ts7/session-cache.d.ts +17 -0
  833. package/dist/frontend/ts7/session-cache.js +97 -0
  834. package/dist/frontend/ts7/session-cache.js.map +1 -0
  835. package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
  836. package/dist/frontend/ts7/session-cache.test.js +87 -0
  837. package/dist/frontend/ts7/session-cache.test.js.map +1 -0
  838. package/dist/frontend/ts7/session-path.d.ts +18 -0
  839. package/dist/frontend/ts7/session-path.js +203 -0
  840. package/dist/frontend/ts7/session-path.js.map +1 -0
  841. package/dist/frontend/ts7/session-path.test.d.ts +1 -0
  842. package/dist/frontend/ts7/session-path.test.js +34 -0
  843. package/dist/frontend/ts7/session-path.test.js.map +1 -0
  844. package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
  845. package/dist/frontend/ts7/session-schema.generated.js +5 -0
  846. package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
  847. package/dist/frontend/ts7/session-timing.d.ts +50 -0
  848. package/dist/frontend/ts7/session-timing.js +61 -0
  849. package/dist/frontend/ts7/session-timing.js.map +1 -0
  850. package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
  851. package/dist/frontend/ts7/session-timing.test.js +52 -0
  852. package/dist/frontend/ts7/session-timing.test.js.map +1 -0
  853. package/dist/frontend/ts7/session.d.ts +105 -0
  854. package/dist/frontend/ts7/session.js +233 -0
  855. package/dist/frontend/ts7/session.js.map +1 -0
  856. package/dist/frontend/ts7/session.test.d.ts +1 -0
  857. package/dist/frontend/ts7/session.test.js +215 -0
  858. package/dist/frontend/ts7/session.test.js.map +1 -0
  859. package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
  860. package/dist/frontend/ts7/source-parser-node.js +15 -0
  861. package/dist/frontend/ts7/source-parser-node.js.map +1 -0
  862. package/dist/frontend/ts7/source-parser.d.ts +25 -0
  863. package/dist/frontend/ts7/source-parser.js +96 -0
  864. package/dist/frontend/ts7/source-parser.js.map +1 -0
  865. package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
  866. package/dist/frontend/ts7/source-parser.test.js +151 -0
  867. package/dist/frontend/ts7/source-parser.test.js.map +1 -0
  868. package/dist/frontend/ts7/syntax.d.ts +3 -0
  869. package/dist/frontend/ts7/syntax.js +4 -0
  870. package/dist/frontend/ts7/syntax.js.map +1 -0
  871. package/dist/frontend/tsc-codes.js +3 -0
  872. package/dist/frontend/tsc-codes.js.map +1 -1
  873. package/dist/frontend/type-mapper.d.ts +29 -19
  874. package/dist/frontend/type-mapper.js +713 -306
  875. package/dist/frontend/type-mapper.js.map +1 -1
  876. package/dist/frontend/type-mapper.test.d.ts +1 -0
  877. package/dist/frontend/type-mapper.test.js +207 -0
  878. package/dist/frontend/type-mapper.test.js.map +1 -0
  879. package/dist/frontend/union-discriminants.d.ts +16 -0
  880. package/dist/frontend/union-discriminants.js +98 -0
  881. package/dist/frontend/union-discriminants.js.map +1 -0
  882. package/dist/frontend/union-discriminants.test.d.ts +1 -0
  883. package/dist/frontend/union-discriminants.test.js +182 -0
  884. package/dist/frontend/union-discriminants.test.js.map +1 -0
  885. package/dist/index.d.ts +7 -197
  886. package/dist/index.js +369 -1567
  887. package/dist/index.js.map +1 -1
  888. package/dist/ir/analysis.d.ts +16 -4
  889. package/dist/ir/analysis.js +25 -6
  890. package/dist/ir/analysis.js.map +1 -1
  891. package/dist/ir/analysis.test.js +15 -2
  892. package/dist/ir/analysis.test.js.map +1 -1
  893. package/dist/ir/constant-tables.js +67 -49
  894. package/dist/ir/constant-tables.js.map +1 -1
  895. package/dist/ir/constant-tables.test.js +1 -1
  896. package/dist/ir/control-flow.d.ts +6 -0
  897. package/dist/ir/control-flow.js +142 -0
  898. package/dist/ir/control-flow.js.map +1 -0
  899. package/dist/ir/control-flow.test.d.ts +1 -0
  900. package/dist/ir/control-flow.test.js +113 -0
  901. package/dist/ir/control-flow.test.js.map +1 -0
  902. package/dist/ir/integer-loops.js +7 -18
  903. package/dist/ir/integer-loops.js.map +1 -1
  904. package/dist/ir/integer-ranges.js +53 -27
  905. package/dist/ir/integer-ranges.js.map +1 -1
  906. package/dist/ir/ir.d.ts +309 -164
  907. package/dist/ir/ir.js +588 -879
  908. package/dist/ir/ir.js.map +1 -1
  909. package/dist/ir/ir.test.js +127 -1
  910. package/dist/ir/ir.test.js.map +1 -1
  911. package/dist/ir/scalar-records.js +165 -134
  912. package/dist/ir/scalar-records.js.map +1 -1
  913. package/dist/ir/scalar-records.test.js +1 -1
  914. package/dist/ir/serialize.d.ts +4 -2
  915. package/dist/ir/serialize.js +19 -12
  916. package/dist/ir/serialize.js.map +1 -1
  917. package/dist/ir/serialize.test.d.ts +1 -0
  918. package/dist/ir/serialize.test.js +53 -0
  919. package/dist/ir/serialize.test.js.map +1 -0
  920. package/dist/ir/traverse.d.ts +41 -0
  921. package/dist/ir/traverse.js +660 -0
  922. package/dist/ir/traverse.js.map +1 -0
  923. package/dist/ir/traverse.test.d.ts +1 -0
  924. package/dist/ir/traverse.test.js +242 -0
  925. package/dist/ir/traverse.test.js.map +1 -0
  926. package/dist/ir/validate.js +1956 -1496
  927. package/dist/ir/validate.js.map +1 -1
  928. package/dist/ir/validate.test.js +476 -2
  929. package/dist/ir/validate.test.js.map +1 -1
  930. package/dist/library/cache-primitives.d.ts +2 -3
  931. package/dist/library/cache-primitives.js +4 -6
  932. package/dist/library/cache-primitives.js.map +1 -1
  933. package/dist/library/compiler-self-identity.d.ts +1 -1
  934. package/dist/library/compiler-self-identity.js +31 -15
  935. package/dist/library/compiler-self-identity.js.map +1 -1
  936. package/dist/library/compiler-self-identity.test.d.ts +1 -0
  937. package/dist/library/compiler-self-identity.test.js +93 -0
  938. package/dist/library/compiler-self-identity.test.js.map +1 -0
  939. package/dist/library/fence-eval.js +2 -2
  940. package/dist/library/fence-eval.js.map +1 -1
  941. package/dist/library/int-infer.js +7 -6
  942. package/dist/library/int-infer.js.map +1 -1
  943. package/dist/library/int-infer.test.js +4 -4
  944. package/dist/library/library-cache.d.ts +3 -2
  945. package/dist/library/library-cache.js +5 -17
  946. package/dist/library/library-cache.js.map +1 -1
  947. package/dist/library/library-cache.test.js +54 -41
  948. package/dist/library/library-cache.test.js.map +1 -1
  949. package/dist/library/library-profile.d.ts +3 -1
  950. package/dist/library/library-profile.js +15 -6
  951. package/dist/library/library-profile.js.map +1 -1
  952. package/dist/library/prepare.d.ts +15 -0
  953. package/dist/library/prepare.js +584 -0
  954. package/dist/library/prepare.js.map +1 -0
  955. package/dist/library/semantic-source.d.ts +1 -1
  956. package/dist/library/semantic-source.js +8 -6
  957. package/dist/library/semantic-source.js.map +1 -1
  958. package/dist/library/sidecar-validate.js +4 -4
  959. package/dist/library/sidecar-validate.js.map +1 -1
  960. package/dist/library/sidecar.d.ts +2 -0
  961. package/dist/library/sidecar.js +10 -3
  962. package/dist/library/sidecar.js.map +1 -1
  963. package/dist/native/cache.d.ts +11 -0
  964. package/dist/native/cache.js +113 -0
  965. package/dist/native/cache.js.map +1 -0
  966. package/dist/native/cache.test.d.ts +1 -0
  967. package/dist/native/cache.test.js +66 -0
  968. package/dist/native/cache.test.js.map +1 -0
  969. package/dist/native/cli.d.ts +1 -0
  970. package/dist/native/cli.js +112 -0
  971. package/dist/native/cli.js.map +1 -0
  972. package/dist/native/compiler.d.ts +15 -0
  973. package/dist/native/compiler.js +336 -0
  974. package/dist/native/compiler.js.map +1 -0
  975. package/dist/native/compiler.test.d.ts +1 -0
  976. package/dist/native/compiler.test.js +174 -0
  977. package/dist/native/compiler.test.js.map +1 -0
  978. package/dist/native/comptime.d.ts +5 -0
  979. package/dist/native/comptime.js +73 -0
  980. package/dist/native/comptime.js.map +1 -0
  981. package/dist/native/comptime.test.d.ts +1 -0
  982. package/dist/native/comptime.test.js +65 -0
  983. package/dist/native/comptime.test.js.map +1 -0
  984. package/dist/native/executable-cache.d.ts +26 -0
  985. package/dist/native/executable-cache.js +228 -0
  986. package/dist/native/executable-cache.js.map +1 -0
  987. package/dist/native/executable-cache.test.d.ts +1 -0
  988. package/dist/native/executable-cache.test.js +151 -0
  989. package/dist/native/executable-cache.test.js.map +1 -0
  990. package/dist/native/file-identity.d.ts +4 -0
  991. package/dist/native/file-identity.js +14 -0
  992. package/dist/native/file-identity.js.map +1 -0
  993. package/dist/native/file-identity.test.d.ts +1 -0
  994. package/dist/native/file-identity.test.js +43 -0
  995. package/dist/native/file-identity.test.js.map +1 -0
  996. package/dist/native/library.d.ts +22 -0
  997. package/dist/native/library.js +83 -0
  998. package/dist/native/library.js.map +1 -0
  999. package/dist/native/prepare.d.ts +21 -0
  1000. package/dist/native/prepare.js +174 -0
  1001. package/dist/native/prepare.js.map +1 -0
  1002. package/dist/native/prepare.test.d.ts +1 -0
  1003. package/dist/native/prepare.test.js +70 -0
  1004. package/dist/native/prepare.test.js.map +1 -0
  1005. package/dist/native/sanitizer.d.ts +11 -0
  1006. package/dist/native/sanitizer.js +135 -0
  1007. package/dist/native/sanitizer.js.map +1 -0
  1008. package/dist/native/sanitizer.test.d.ts +1 -0
  1009. package/dist/native/sanitizer.test.js +58 -0
  1010. package/dist/native/sanitizer.test.js.map +1 -0
  1011. package/dist/native/task.d.ts +4 -0
  1012. package/dist/native/task.js +16 -0
  1013. package/dist/native/task.js.map +1 -0
  1014. package/dist/native/task.test.d.ts +1 -0
  1015. package/dist/native/task.test.js +17 -0
  1016. package/dist/native/task.test.js.map +1 -0
  1017. package/dist/native/toolchain.d.ts +45 -0
  1018. package/dist/native/toolchain.js +74 -0
  1019. package/dist/native/toolchain.js.map +1 -0
  1020. package/dist/native/toolchain.test.d.ts +1 -0
  1021. package/dist/native/toolchain.test.js +33 -0
  1022. package/dist/native/toolchain.test.js.map +1 -0
  1023. package/dist/startup-cache.d.ts +1 -1
  1024. package/dist/startup-cache.js +2 -5
  1025. package/dist/startup-cache.js.map +1 -1
  1026. package/dist/timing.d.ts +4 -0
  1027. package/dist/timing.js +19 -0
  1028. package/dist/timing.js.map +1 -0
  1029. package/dist/wasi-paths.js +10 -7
  1030. package/dist/wasi-paths.js.map +1 -1
  1031. package/package.json +28 -19
  1032. package/surface-manifest.json +171 -18
  1033. package/dist/backend/c/async.d.ts +0 -171
  1034. package/dist/backend/c/async.js +0 -1317
  1035. package/dist/backend/c/async.js.map +0 -1
  1036. package/dist/backend/c/c-emitter.d.ts +0 -531
  1037. package/dist/backend/c/c-emitter.js +0 -1917
  1038. package/dist/backend/c/c-emitter.js.map +0 -1
  1039. package/dist/backend/c/exprs.d.ts +0 -15
  1040. package/dist/backend/c/exprs.js +0 -8803
  1041. package/dist/backend/c/exprs.js.map +0 -1
  1042. package/dist/backend/c/island.d.ts +0 -45
  1043. package/dist/backend/c/island.js +0 -281
  1044. package/dist/backend/c/island.js.map +0 -1
  1045. package/dist/backend/c/may-throw.js.map +0 -1
  1046. package/dist/backend/c/shapes.d.ts +0 -142
  1047. package/dist/backend/c/shapes.js +0 -603
  1048. package/dist/backend/c/shapes.js.map +0 -1
  1049. package/dist/backend/c/stmts.d.ts +0 -76
  1050. package/dist/backend/c/stmts.js +0 -1084
  1051. package/dist/backend/c/stmts.js.map +0 -1
  1052. package/dist/backend/c/types.d.ts +0 -71
  1053. package/dist/backend/c/types.js +0 -459
  1054. package/dist/backend/c/types.js.map +0 -1
  1055. package/dist/backend/c/types.test.js +0 -32
  1056. package/dist/backend/c/types.test.js.map +0 -1
  1057. package/dist/backend/c/walkers.d.ts +0 -134
  1058. package/dist/backend/c/walkers.js +0 -1773
  1059. package/dist/backend/c/walkers.js.map +0 -1
  1060. /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
@@ -1,1317 +0,0 @@
1
- import { InternalCompilerError } from "../../errors.js";
2
- import { mangleArgPack, mangleAsyncSpawn, mangleChildDataThunk, mangleChildExitThunk, mangleCloseBindThunk, mangleCloseOverrideWrap, mangleConnectResThunk, mangleConnectSockThunk, mangleDgramMsgThunk, mangleDnsLookupThunk, mangleField, mangleFsRenameThunk, mangleFunction, mangleGenDrop, mangleGenResThunk, mangleGenSpawn, mangleGlobal, mangleLocal, mangleRaceThunk, mangleRawParam, mangleNetLookupAnswerThunk, mangleEmitterInvokeThunk, mangleStreamCbThunk, mangleStreamDoneFn, mangleRecordNew, mangleRecordRelease, mangleRecordStruct, mangleResolveThunk, mangleSniAnswerThunk, mangleTrampoline } from "../mangle.js";
3
- import { cDecl, cType, releaseCallC, retainCallC, vAdapters } from "./types.js";
4
- import { isRefCounted, isUnitType, typeEquals, typeKey } from "../../ir/ir.js";
5
- /** The argument-pack ABI and trampoline prefix shared by async functions
6
- * and generators. Their promise/generator completion and spawn tails stay
7
- * with the callers below. */
8
- function emitArgPackAndTrampolinePrologue(fn) {
9
- const pack = mangleArgPack(fn.name);
10
- const lifted = fn.captures !== undefined;
11
- const fields = [];
12
- if (lifted)
13
- fields.push("ScrClosure *sc_env;");
14
- const boxedIds = new Set(fn.locals.filter((l) => l.boxed).map((l) => l.id));
15
- const pname = (p) => boxedIds.has(p.localId) ? mangleRawParam(p.localId) : mangleLocal(p.localId);
16
- for (const p of fn.params)
17
- fields.push(`${cDecl(p.type, pname(p))};`);
18
- const definitions = [``, `typedef struct { ${fields.join(" ") || "char sc_unused;"} } ${pack};`];
19
- const callArgs = [
20
- ...(lifted ? ["sc_a.sc_env"] : []),
21
- ...fn.params.map((p) => `sc_a.${pname(p)}`),
22
- ].join(", ");
23
- const ret = fn.returnType;
24
- const bodyCall = `${mangleFunction(fn.name)}(${callArgs})`;
25
- const lines = [
26
- `static void ${mangleTrampoline(fn.name)}(ScrFiber *sc_self, void *sc_ap0) {`,
27
- ` ${pack} sc_a = *(${pack} *)sc_ap0;`,
28
- ` free(sc_ap0);`,
29
- ];
30
- if (ret.kind === "void") {
31
- lines.push(` ${bodyCall};`);
32
- }
33
- else {
34
- lines.push(` ${cDecl(ret, "sc_r")} = ${bodyCall};`);
35
- }
36
- if (lifted)
37
- lines.push(` scr_closure_release(sc_a.sc_env);`);
38
- const spawnParams = [
39
- ...(lifted ? ["ScrClosure *sc_env"] : []),
40
- ...fn.params.map((p) => cDecl(p.type, pname(p))),
41
- ];
42
- const argPackLines = [
43
- ` ${pack} *sc_ap = malloc(sizeof *sc_ap);`,
44
- ` if (!sc_ap) { scr_trap("scriptc: out of memory\\n"); }`,
45
- ...(lifted ? [` sc_ap->sc_env = scr_closure_retain(sc_env);`] : []),
46
- ...fn.params.map((p) => ` sc_ap->${pname(p)} = ${pname(p)};`),
47
- ];
48
- return { definitions, pack, lifted, pname, ret, lines, spawnParams, argPackLines };
49
- }
50
- /** Per-async-function machinery: an argument pack, a fiber trampoline
51
- * (unpacks, runs the ordinary compiled body, settles the promise), and a
52
- * spawn wrapper call sites use. Lifted async lambdas additionally thread
53
- * their closure env through the pack (+1, released after the body). */
54
- export function emitAsyncScaffolding(emitter, out) {
55
- for (const fn of emitter.mod.functions) {
56
- if (!fn.async || fn.generator !== undefined)
57
- continue;
58
- const { definitions, ret, lines, spawnParams, argPackLines } = emitArgPackAndTrampolinePrologue(fn);
59
- out.push(...definitions);
60
- lines.push(` if (!scr_exc_pending()) {`);
61
- switch (ret.kind) {
62
- case "void":
63
- lines.push(` scr_promise_fulfill_void(scr_fiber_promise(sc_self));`);
64
- break;
65
- case "f64":
66
- case "date":
67
- lines.push(` scr_promise_fulfill_f64(scr_fiber_promise(sc_self), sc_r);`);
68
- break;
69
- case "bool":
70
- lines.push(` scr_promise_fulfill_bool(scr_fiber_promise(sc_self), sc_r);`);
71
- break;
72
- case "string":
73
- lines.push(` scr_promise_fulfill_str(scr_fiber_promise(sc_self), sc_r);`);
74
- break;
75
- default: {
76
- const v = vAdapters(ret);
77
- lines.push(` scr_promise_fulfill_ref(scr_fiber_promise(sc_self), sc_r, ${v.retain}, ${v.release}, ${emitter.traceArgC(ret)});`);
78
- }
79
- }
80
- lines.push(` }`);
81
- if (ret.kind !== "void" && isRefCounted(ret)) {
82
- // An escaping throw means sc_r is the never-read dummy (NULL).
83
- lines.push(` else { ${releaseCallC(ret, "sc_r")}; }`);
84
- }
85
- lines.push(`}`);
86
- out.push(...lines);
87
- const cache = fn.asyncCacheGlobal !== undefined ? mangleGlobal(fn.asyncCacheGlobal) : null;
88
- const cycleCache = fn.asyncCycleCacheGlobal !== undefined ? mangleGlobal(fn.asyncCycleCacheGlobal) : null;
89
- out.push(`static ScrPromise *${mangleAsyncSpawn(fn.name)}(${spawnParams.join(", ") || "void"}) {`, ...(cache !== null
90
- ? [` if (${cache}) return scr_promise_retain(${cache});`]
91
- : []), ...argPackLines, ` ScrPromise *sc_p = scr_async_spawn(&${mangleTrampoline(fn.name)}, sc_ap);`, ...(cache !== null
92
- ? [
93
- // Module evaluation promises are loader-owned from the
94
- // moment evaluation starts. Mark even a pending promise
95
- // handled before a later sibling initializer can throw and
96
- // unwind past the dependency wait.
97
- ` scr_promise_mark_handled(sc_p);`,
98
- ]
99
- : []), ...(cache !== null
100
- ? [
101
- // scr_async_spawn runs eagerly. An admitted async import
102
- // cycle can therefore re-enter this initializer after its
103
- // guard sets but before this outer spawn returns; that
104
- // guarded inner spawn temporarily fills the cache. Replace
105
- // it ownership-safely when the real evaluation promise
106
- // arrives.
107
- ` ScrPromise *sc_cache_owned = scr_promise_retain(sc_p);`,
108
- ` scr_promise_release(${cache});`,
109
- ` ${cache} = sc_cache_owned;`,
110
- ]
111
- : []), ...(cycleCache !== null
112
- ? [
113
- // Every member of an async SCC publishes while eager spawn
114
- // recursion unwinds. The outermost wrapper writes last, so
115
- // this records the member that actually rooted evaluation.
116
- ` ScrPromise *sc_cycle_cache_owned = scr_promise_retain(sc_p);`,
117
- ` scr_promise_release(${cycleCache});`,
118
- ` ${cycleCache} = sc_cycle_cache_owned;`,
119
- ]
120
- : []), ` return sc_p;`, `}`);
121
- }
122
- emitGenScaffolding(emitter, out);
123
- }
124
- /** Per-generator-function machinery — the async scaffolding's lazy
125
- * sibling: the same argument pack, a fiber trampoline whose epilogue
126
- * stores the COMPLETION value (or consumes the GENRET sentinel,
127
- * promoting the parked .return value), a spawn wrapper that only
128
- * ALLOCATES the suspended fiber (nothing runs until the first .next()),
129
- * and the never-started teardown that drops the packed (+1) arguments. */
130
- function emitGenScaffolding(emitter, out) {
131
- for (const fn of emitter.mod.functions) {
132
- if (!fn.generator)
133
- continue;
134
- const { definitions, pack, lifted, pname, ret, lines, spawnParams, argPackLines } = emitArgPackAndTrampolinePrologue(fn);
135
- out.push(...definitions);
136
- lines.push(` ScrGen *sc_g = scr_gen_of_fiber(sc_self);`);
137
- // Normal completion stores the (typed) return value; void completes
138
- // with the NONE slot — JS's undefined done-value. A GENRET unwind
139
- // consumes the sentinel and promotes the parked .return value; a
140
- // real exception stays pending (the consumer-side resume moves it).
141
- const store = (() => {
142
- switch (ret.kind) {
143
- case "void":
144
- return null;
145
- case "f64":
146
- case "date":
147
- return `scr_gen_out_f64(sc_g, sc_r);`;
148
- case "bool":
149
- return `scr_gen_out_bool(sc_g, sc_r);`;
150
- default: {
151
- const v = vAdapters(ret);
152
- return `scr_gen_out_ref(sc_g, sc_r, ${v.release});`;
153
- }
154
- }
155
- })();
156
- lines.push(` if (!scr_exc_pending()) {`, ...(store ? [` ${store}`] : [` /* void body: the done value is undefined (NONE) */`]), ` } else {`, ` if (scr_exc_genret_pending()) { scr_exc_clear(); scr_gen_ret_to_out(sc_g); }`, ...(ret.kind !== "void" && isRefCounted(ret)
157
- ? [` ${releaseCallC(ret, "sc_r")}; /* unwound: the never-read dummy */`]
158
- : []), ` }`, `}`);
159
- out.push(...lines);
160
- let settleAsync = null;
161
- if (fn.async) {
162
- const genT = {
163
- kind: "generator",
164
- async: true,
165
- yieldT: fn.generator.yieldT,
166
- retT: ret,
167
- nextT: fn.generator.nextT,
168
- };
169
- const resultT = fn.generator.resultType;
170
- const build = genResultThunkFor(emitter, genT, resultT);
171
- settleAsync = `${build}_async`;
172
- const settleKey = `async:${typeKey(genT)}`;
173
- if (!emitter.genResThunks.has(settleKey)) {
174
- emitter.genResThunks.set(settleKey, settleAsync);
175
- const adapters = vAdapters(resultT);
176
- out.push(`static void ${settleAsync}(ScrGen *sc_g, ScrPromise *sc_p);`);
177
- emitter.walkerDefs.push(`static void ${settleAsync}(ScrGen *sc_g, ScrPromise *sc_p) {`, ` ${mangleRecordStruct(resultT.shapeId)} *sc_r = ${build}(sc_g);`, ` scr_promise_fulfill_ref(sc_p, sc_r, ${adapters.retain}, ${adapters.release}, ${emitter.traceArgC(resultT)});`, `}`, ``);
178
- }
179
- }
180
- out.push(`static void ${mangleGenDrop(fn.name)}(void *sc_ap0) {`, ` ${pack} sc_a = *(${pack} *)sc_ap0;`, ` free(sc_ap0);`, ...(lifted ? [` scr_closure_release(sc_a.sc_env);`] : []), ...fn.params
181
- .filter((p) => isRefCounted(p.type))
182
- .map((p) => ` ${releaseCallC(p.type, `sc_a.${pname(p)}`)};`), ...(!lifted && !fn.params.some((p) => isRefCounted(p.type)) ? [` (void)sc_a;`] : []), `}`, `static ScrGen *${mangleGenSpawn(fn.name)}(${spawnParams.join(", ") || "void"}) {`, ...argPackLines, settleAsync === null
183
- ? ` return scr_gen_new(&${mangleTrampoline(fn.name)}, sc_ap, &${mangleGenDrop(fn.name)});`
184
- : ` return scr_async_gen_new(&${mangleTrampoline(fn.name)}, sc_ap, &${mangleGenDrop(fn.name)}, &${settleAsync});`, `}`);
185
- }
186
- }
187
- /** Interned per-union child exit adapter: the runtime invokes
188
- * adapter(cb, has_code, code, signal_name); the adapter builds the
189
- * `number | null` union value (tags are program data — the frontend
190
- * guaranteed the param IS that union) and calls the listener, which
191
- * owns the union param per the universal convention (unit-arm
192
- * instances are immortal; their release is a no-op). The one-param
193
- * shape ignores the signal. */
194
- export function childExitThunkFor(emitter, param) {
195
- if (param.kind !== "union")
196
- throw new InternalCompilerError("emitter bug: exit listener param not a union");
197
- const key = param.unionId;
198
- let sym = emitter.childExitThunks.get(key);
199
- if (!sym) {
200
- sym = mangleChildExitThunk(emitter.childExitThunks.size);
201
- emitter.childExitThunks.set(key, sym);
202
- const def = emitter.unionsById.get(param.unionId);
203
- const f64Tag = def ? def.arms.findIndex((a) => a.kind === "f64") : -1;
204
- const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
205
- if (f64Tag < 0 || nullTag < 0) {
206
- throw new InternalCompilerError("emitter bug: exit listener union lacks its arms");
207
- }
208
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig);`);
209
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig) {`, ` (void)sc_sig;`, ` ScrUnion *sc_u = sc_has ? scr_union_new_f64(${f64Tag}, sc_code)`, ` : ${emitter.unitInstanceRef(param.unionId, nullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u);`, `}`);
210
- }
211
- return sym;
212
- }
213
- /** The TWO-parameter exit adapter — Node's `(code, signal)` listener:
214
- * the code union as above plus the signal as its own `string | null`
215
- * union (a fresh string from the runtime's static signal name when a
216
- * signal killed the child, the null arm otherwise). */
217
- export function childExitSignalThunkFor(emitter, codeParam, sigParam) {
218
- if (codeParam.kind !== "union" || sigParam.kind !== "union") {
219
- throw new InternalCompilerError("emitter bug: exit listener params not unions");
220
- }
221
- const key = `${codeParam.unionId}+${sigParam.unionId}`;
222
- let sym = emitter.childExitThunks.get(key);
223
- if (!sym) {
224
- sym = mangleChildExitThunk(emitter.childExitThunks.size);
225
- emitter.childExitThunks.set(key, sym);
226
- const codeDef = emitter.unionsById.get(codeParam.unionId);
227
- const f64Tag = codeDef ? codeDef.arms.findIndex((a) => a.kind === "f64") : -1;
228
- const codeNullTag = codeDef ? codeDef.arms.findIndex((a) => a.kind === "nullT") : -1;
229
- const sigDef = emitter.unionsById.get(sigParam.unionId);
230
- const strTag = sigDef ? sigDef.arms.findIndex((a) => a.kind === "string") : -1;
231
- const sigNullTag = sigDef ? sigDef.arms.findIndex((a) => a.kind === "nullT") : -1;
232
- if (f64Tag < 0 || codeNullTag < 0 || strTag < 0 || sigNullTag < 0) {
233
- throw new InternalCompilerError("emitter bug: exit listener unions lack their arms");
234
- }
235
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig);`);
236
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, bool sc_has, double sc_code, const char *sc_sig) {`, ` ScrUnion *sc_u = sc_has ? scr_union_new_f64(${f64Tag}, sc_code)`, ` : ${emitter.unitInstanceRef(codeParam.unionId, codeNullTag)};`, ` ScrUnion *sc_s = sc_sig`, ` ? scr_union_new_ref(${strTag}, scr_str_new(sc_sig, strlen(sc_sig)), &scr_str_retain_v, &scr_str_release_v, NULL)`, ` : ${emitter.unitInstanceRef(sigParam.unionId, sigNullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u, sc_s);`, `}`);
237
- }
238
- return sym;
239
- }
240
- /** Interned per-union child-stream data adapter: the runtime invokes
241
- * adapter(cb, chunk) with the chunk BORROWED; the adapter wraps a
242
- * retained chunk at the union's Buffer arm (the frontend guaranteed
243
- * the arm exists — the ngrok `Buffer | string` listener; strings never
244
- * fire from a pipe) and calls the listener, which owns the union param
245
- * per the universal convention. */
246
- export function childDataThunkFor(emitter, param) {
247
- if (param.kind !== "union")
248
- throw new InternalCompilerError("emitter bug: stream data listener param not a union");
249
- const key = param.unionId;
250
- let sym = emitter.childDataThunks.get(key);
251
- if (!sym) {
252
- sym = mangleChildDataThunk(emitter.childDataThunks.size);
253
- emitter.childDataThunks.set(key, sym);
254
- const def = emitter.unionsById.get(param.unionId);
255
- const bytesTag = def ? def.arms.findIndex((a) => a.kind === "bytes" && a.elem === "u8") : -1;
256
- if (bytesTag < 0) {
257
- throw new InternalCompilerError("emitter bug: stream data listener union lacks its Buffer arm");
258
- }
259
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_chunk);`);
260
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_chunk) {`, ` ScrUnion *sc_u = scr_union_new_ref(${bytesTag}, scr_bytes_retain(sc_chunk), &scr_bytes_retain_v, &scr_bytes_release_v, NULL);`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u);`, `}`);
261
- }
262
- return sym;
263
- }
264
- /** Interned per-union bound-close adapter (`server.close.bind(server)`
265
- * as a value): invoked through the closure ABI with the callback-union
266
- * argument, it closes the server DIRECTLY (never through the override —
267
- * the proxy-through idiom cannot recurse), registering a present
268
- * callback as a once-'close' listener — a ONE-param callback (Node's
269
- * `(err?: Error) => void`) behind an emitted zero-arg trampoline that
270
- * fires it with the undefined arm (a clean close carries no error) —
271
- * and answers the +1 server (Node's chaining return). */
272
- export function closeBindThunkFor(emitter, cbUnion, retServer) {
273
- if (cbUnion.kind !== "union")
274
- throw new InternalCompilerError("emitter bug: bound-close callback param not a union");
275
- const key = `${cbUnion.unionId}:${retServer ? "srv" : "void"}`;
276
- let sym = emitter.closeBindThunks.get(key);
277
- if (sym)
278
- return sym;
279
- sym = mangleCloseBindThunk(emitter.closeBindThunks.size);
280
- emitter.closeBindThunks.set(key, sym);
281
- const def = emitter.unionsById.get(cbUnion.unionId);
282
- const funcTag = def ? def.arms.findIndex((a) => a.kind === "func") : -1;
283
- const funcArm = funcTag >= 0 ? def.arms[funcTag] : null;
284
- if (!funcArm)
285
- throw new InternalCompilerError("emitter bug: bound-close callback union lacks its func arm");
286
- const oneParam = funcArm.params.length === 1;
287
- let trampoline = null;
288
- if (oneParam) {
289
- const errParam = funcArm.params[0];
290
- if (errParam.kind !== "union") {
291
- throw new InternalCompilerError("emitter bug: bound-close callback's err param is not a union");
292
- }
293
- const errDef = emitter.unionsById.get(errParam.unionId);
294
- const undefTag = errDef ? errDef.arms.findIndex((a) => a.kind === "undefinedT") : -1;
295
- if (undefTag < 0)
296
- throw new InternalCompilerError("emitter bug: bound-close err union lacks its undefined arm");
297
- trampoline = `${sym}_cb`;
298
- emitter.walkerProtos.push(`static void ${trampoline}(ScrClosure *sc_self);`);
299
- emitter.walkerDefs.push(`static void ${trampoline}(ScrClosure *sc_self) { /* close cb: fire with no error */`, ` ScrClosure *sc_inner = (ScrClosure *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_inner->fn)(sc_inner, ${emitter.unitInstanceRef(errParam.unionId, undefTag)});`, ` scr_closure_release(sc_inner);`, `}`);
300
- }
301
- const retC = retServer ? "ScrNetServer *" : "void";
302
- emitter.walkerProtos.push(`static ${retC}${retServer ? "" : " "}${sym}(ScrClosure *sc_self, ScrUnion *sc_cb);`);
303
- emitter.walkerDefs.push(`static ${retC}${retServer ? "" : " "}${sym}(ScrClosure *sc_self, ScrUnion *sc_cb) { /* bound server.close */`, ` ScrNetServer *sc_srv = (ScrNetServer *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`, ` ScrClosure *sc_reg = NULL;`, ` if (sc_cb->tag == ${funcTag}) {`, ...(oneParam
304
- ? [
305
- ` sc_reg = scr_closure_new((void *)&${trampoline}, 1);`,
306
- ` sc_reg->caps[0] = scr_box_new(SCR_BOX_FUNC);`,
307
- ` scr_box_set_ref(sc_reg->caps[0], scr_closure_retain((ScrClosure *)scr_union_peek(sc_cb)));`,
308
- ]
309
- : [` sc_reg = scr_closure_retain((ScrClosure *)scr_union_peek(sc_cb));`]), ` }`, ` scr_union_release(sc_cb); /* the callee owns its +1 param */`, ` scr_net_server_close_direct(sc_srv, sc_reg); /* sc_reg moves */`, ...(retServer
310
- ? [` return sc_srv; /* +1 from the env read */`]
311
- : [` scr_net_server_release(sc_srv);`]), `}`);
312
- return sym;
313
- }
314
- /** Interned close-override zero-arg wrapper (`server.close = fn`): the
315
- * stored override must be invocable by the runtime WITHOUT program
316
- * types, so this wrapper carries the user function and fires it with
317
- * the undefined-arm callback argument (tags are program data),
318
- * releasing the chaining-return server when the signature answers one. */
319
- export function closeOverrideWrapFor(emitter, cbUnion, retServer) {
320
- if (cbUnion.kind !== "union")
321
- throw new InternalCompilerError("emitter bug: close-override callback param not a union");
322
- const key = `${cbUnion.unionId}:${retServer ? "srv" : "void"}`;
323
- let sym = emitter.closeOverrideWraps.get(key);
324
- if (sym)
325
- return sym;
326
- sym = mangleCloseOverrideWrap(emitter.closeOverrideWraps.size);
327
- emitter.closeOverrideWraps.set(key, sym);
328
- const def = emitter.unionsById.get(cbUnion.unionId);
329
- const undefTag = def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
330
- if (undefTag < 0)
331
- throw new InternalCompilerError("emitter bug: close-override callback union lacks its undefined arm");
332
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_self);`);
333
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_self) { /* close override wrapper */`, ` ScrClosure *sc_inner = (ScrClosure *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`, ...(retServer
334
- ? [
335
- ` ScrNetServer *sc_r = ((ScrNetServer *(*)(ScrClosure *, ScrUnion *))sc_inner->fn)(sc_inner, ${emitter.unitInstanceRef(cbUnion.unionId, undefTag)});`,
336
- ` scr_net_server_release(sc_r); /* the chaining return is unobserved here */`,
337
- ]
338
- : [
339
- ` ((void (*)(ScrClosure *, ScrUnion *))sc_inner->fn)(sc_inner, ${emitter.unitInstanceRef(cbUnion.unionId, undefTag)});`,
340
- ]), ` scr_closure_release(sc_inner);`, `}`);
341
- return sym;
342
- }
343
- /** Interned per-shape dgram message adapter for the TWO-parameter
344
- * (msg: Buffer, rinfo) listener: the rinfo RECORD is program data, so
345
- * the adapter builds it from the runtime's parts (address/family
346
- * borrowed and retained in; port/size by value) and calls the listener,
347
- * which owns both params per the universal convention (msg retains like
348
- * the net data thunk). Zero/one-param listeners take the runtime's own
349
- * scr_dgram_msg_thunk0/1. */
350
- export function dgramMsgThunkFor(emitter, param) {
351
- if (param.kind !== "record")
352
- throw new InternalCompilerError("emitter bug: message listener rinfo not a record");
353
- const key = param.shapeId;
354
- let sym = emitter.dgramMsgThunks.get(key);
355
- if (!sym) {
356
- sym = mangleDgramMsgThunk(emitter.dgramMsgThunks.size);
357
- emitter.dgramMsgThunks.set(key, sym);
358
- const struct = mangleRecordStruct(param.shapeId);
359
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_msg, ScrStr *sc_addr, ScrStr *sc_family, double sc_port, double sc_size);`);
360
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_msg, ScrStr *sc_addr, ScrStr *sc_family, double sc_port, double sc_size) {`, ` ${struct} *sc_ri = ${mangleRecordNew(param.shapeId)}();`, ` sc_ri->${mangleField("address")} = scr_str_retain(sc_addr);`, ` sc_ri->${mangleField("family")} = scr_str_retain(sc_family);`, ` sc_ri->${mangleField("port")} = sc_port;`, ` sc_ri->${mangleField("size")} = sc_size;`, ` ((void (*)(ScrClosure *, ScrBytes *, ${struct} *))sc_cb->fn)(sc_cb, scr_bytes_retain(sc_msg), sc_ri);`, `}`);
361
- }
362
- return sym;
363
- }
364
- /** Interned dns.lookup callback adapter, per (union id, param count):
365
- * the runtime invokes adapter(cb, errmsg-or-NULL, address, family) with
366
- * everything borrowed; the adapter builds the `Error | null` first
367
- * argument (tags are program data — the frontend pinned the union) and
368
- * calls the listener with as many arguments as it declared, each owned
369
- * per the universal convention. */
370
- export function dnsLookupThunkFor(emitter, cbT) {
371
- if (cbT.kind !== "func")
372
- throw new InternalCompilerError("emitter bug: dns.lookup callback not a func");
373
- const nparams = cbT.params.length;
374
- if (nparams === 0)
375
- return "scr_dns_thunk0";
376
- const errT = cbT.params[0];
377
- if (errT.kind !== "union")
378
- throw new InternalCompilerError("emitter bug: dns.lookup err param not a union");
379
- const key = `${errT.unionId}/${nparams}`;
380
- let sym = emitter.dnsLookupThunks.get(key);
381
- if (!sym) {
382
- sym = mangleDnsLookupThunk(emitter.dnsLookupThunks.size);
383
- emitter.dnsLookupThunks.set(key, sym);
384
- const def = emitter.unionsById.get(errT.unionId);
385
- const errTag = def ? def.arms.findIndex((a) => a.kind === "object") : -1;
386
- const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
387
- if (errTag < 0 || nullTag < 0) {
388
- throw new InternalCompilerError("emitter bug: dns.lookup err union lacks its arms");
389
- }
390
- const callSig = ["ScrClosure *", "ScrUnion *", ...(nparams >= 2 ? ["ScrStr *"] : []), ...(nparams >= 3 ? ["double"] : [])].join(", ");
391
- const callArgs = ["sc_cb", "sc_u", ...(nparams >= 2 ? ["scr_str_retain(sc_addr)"] : []), ...(nparams >= 3 ? ["sc_family"] : [])].join(", ");
392
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrStr *sc_err, ScrStr *sc_addr, double sc_family);`);
393
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrStr *sc_err, ScrStr *sc_addr, double sc_family) {`, ` (void)sc_addr; (void)sc_family;`, ` ScrUnion *sc_u = sc_err`, ` ? scr_union_new_ref(${errTag}, scr_error_new(0, sc_err), &scr_error_retain_v, &scr_error_release_v, NULL)`, ` : ${emitter.unitInstanceRef(errT.unionId, nullTag)};`, ` ((void (*)(${callSig}))sc_cb->fn)(${callArgs});`, `}`);
394
- }
395
- return sym;
396
- }
397
- /** Interned fs.rename callback adapter. The runtime supplies a borrowed
398
- * ScrError (or NULL); the adapter builds the callback's program-specific
399
- * Error | null union, or a dyn error/null for checkJs callbacks. */
400
- export function fsRenameThunkFor(emitter, cbT) {
401
- if (cbT.kind !== "func")
402
- throw new InternalCompilerError("emitter bug: fs.rename callback not a func");
403
- if (cbT.params.length === 0)
404
- return "scr_fs_rename_thunk0";
405
- const param = cbT.params[0];
406
- const key = typeKey(cbT);
407
- let sym = emitter.fsRenameThunks.get(key);
408
- if (sym)
409
- return sym;
410
- sym = mangleFsRenameThunk(emitter.fsRenameThunks.size);
411
- emitter.fsRenameThunks.set(key, sym);
412
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err);`);
413
- if (param.kind === "dyn") {
414
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err) {`, ` ScrDyn *sc_arg = sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_new_null();`, ` ((void (*)(ScrClosure *, ScrDyn *))sc_cb->fn)(sc_cb, sc_arg);`, `}`);
415
- return sym;
416
- }
417
- if (param.kind !== "union")
418
- throw new InternalCompilerError("emitter bug: fs.rename error param not a union");
419
- const def = emitter.unionsById.get(param.unionId);
420
- const errTag = def ? def.arms.findIndex((a) => a.kind === "object" && a.className === "%Error") : -1;
421
- const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
422
- if (errTag < 0 || nullTag < 0)
423
- throw new InternalCompilerError("emitter bug: fs.rename error union lacks its arms");
424
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err) {`, ` ScrUnion *sc_u = sc_err`, ` ? scr_union_new_ref(${errTag}, scr_error_retain(sc_err), &scr_error_retain_v, &scr_error_release_v, NULL)`, ` : ${emitter.unitInstanceRef(param.unionId, nullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_u);`, `}`);
425
- return sym;
426
- }
427
- /** Callback adapter for randomBytes/pbkdf2. The runtime transfers one
428
- * owned Buffer; the adapter materializes the callback's Error | null (or
429
- * checked-dynamic null) first argument and either transfers or boxes the
430
- * Buffer according to the program-specific callback signature. */
431
- export function cryptoBytesThunkFor(emitter, cbT) {
432
- if (cbT.kind !== "func" || cbT.params.length > 2) {
433
- throw new InternalCompilerError("emitter bug: crypto bytes callback shape");
434
- }
435
- const key = `crypto:${typeKey(cbT)}`;
436
- let sym = emitter.fsRenameThunks.get(key);
437
- if (sym)
438
- return sym;
439
- sym = `sc_cryptobytes_${emitter.fsRenameThunks.size}`;
440
- emitter.fsRenameThunks.set(key, sym);
441
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_value);`);
442
- const lines = [`static void ${sym}(ScrClosure *sc_cb, ScrBytes *sc_value) {`];
443
- const callTypes = ["ScrClosure *"];
444
- const callArgs = ["sc_cb"];
445
- const error = cbT.params[0];
446
- if (error !== undefined) {
447
- if (error.kind === "dyn") {
448
- lines.push(` ScrDyn *sc_error = scr_dyn_new_null();`);
449
- callTypes.push("ScrDyn *");
450
- }
451
- else if (error.kind === "union") {
452
- const def = emitter.unionsById.get(error.unionId);
453
- const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
454
- if (nullTag < 0)
455
- throw new InternalCompilerError("emitter bug: crypto callback error union lacks null");
456
- lines.push(` ScrUnion *sc_error = ${emitter.unitInstanceRef(error.unionId, nullTag)};`);
457
- callTypes.push("ScrUnion *");
458
- }
459
- else {
460
- throw new InternalCompilerError("emitter bug: crypto callback error param");
461
- }
462
- callArgs.push("sc_error");
463
- }
464
- const value = cbT.params[1];
465
- if (value === undefined) {
466
- lines.push(` scr_bytes_release(sc_value);`);
467
- }
468
- else if (value.kind === "dyn") {
469
- lines.push(` ScrDyn *sc_result = scr_dyn_new_bytes_copy(sc_value);`, ` scr_bytes_release(sc_value);`);
470
- callTypes.push("ScrDyn *");
471
- callArgs.push("sc_result");
472
- }
473
- else if (value.kind === "bytes" && value.elem === "u8") {
474
- callTypes.push("ScrBytes *");
475
- callArgs.push("sc_value");
476
- }
477
- else {
478
- throw new InternalCompilerError("emitter bug: crypto callback value param");
479
- }
480
- lines.push(` ((void (*)(${callTypes.join(", ")}))sc_cb->fn)(${callArgs.join(", ")});`, `}`);
481
- emitter.walkerDefs.push(...lines);
482
- return sym;
483
- }
484
- /** Error-first Buffer callback adapter for worker-backed zlib operations.
485
- * The runtime transfers the success Buffer and borrows the failure Error;
486
- * exactly one is non-NULL. */
487
- export function zlibBytesThunkFor(emitter, cbT) {
488
- if (cbT.kind !== "func" || cbT.params.length > 2) {
489
- throw new InternalCompilerError("emitter bug: zlib bytes callback shape");
490
- }
491
- const key = `zlib:${typeKey(cbT)}`;
492
- let sym = emitter.fsRenameThunks.get(key);
493
- if (sym)
494
- return sym;
495
- sym = `sc_zlibbytes_${emitter.fsRenameThunks.size}`;
496
- emitter.fsRenameThunks.set(key, sym);
497
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrBytes *sc_value);`);
498
- const lines = [`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrBytes *sc_value) {`];
499
- const callTypes = ["ScrClosure *"];
500
- const callArgs = ["sc_cb"];
501
- const error = cbT.params[0];
502
- if (error !== undefined) {
503
- if (error.kind === "dyn") {
504
- lines.push(` ScrDyn *sc_error = sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_new_null();`);
505
- callTypes.push("ScrDyn *");
506
- }
507
- else if (error.kind === "union") {
508
- const def = emitter.unionsById.get(error.unionId);
509
- const errTag = def ? def.arms.findIndex((arm) => arm.kind === "object" && arm.className === "%Error") : -1;
510
- const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
511
- if (errTag < 0 || nullTag < 0)
512
- throw new InternalCompilerError("emitter bug: zlib callback error union lacks arms");
513
- lines.push(` ScrUnion *sc_error = sc_err`, ` ? scr_union_new_ref(${errTag}, scr_error_retain(sc_err), &scr_error_retain_v, &scr_error_release_v, NULL)`, ` : ${emitter.unitInstanceRef(error.unionId, nullTag)};`);
514
- callTypes.push("ScrUnion *");
515
- }
516
- else {
517
- throw new InternalCompilerError("emitter bug: zlib callback error param");
518
- }
519
- callArgs.push("sc_error");
520
- }
521
- const value = cbT.params[1];
522
- if (value === undefined) {
523
- lines.push(` scr_bytes_release(sc_value);`);
524
- }
525
- else if (value.kind === "dyn") {
526
- lines.push(` ScrDyn *sc_result = sc_value ? scr_dyn_new_bytes_copy(sc_value) : scr_dyn_undefined();`, ` scr_bytes_release(sc_value);`);
527
- callTypes.push("ScrDyn *");
528
- callArgs.push("sc_result");
529
- }
530
- else if (value.kind === "bytes" && value.elem === "u8") {
531
- callTypes.push("ScrBytes *");
532
- callArgs.push("sc_value");
533
- }
534
- else {
535
- throw new InternalCompilerError("emitter bug: zlib callback value param");
536
- }
537
- lines.push(` ((void (*)(${callTypes.join(", ")}))sc_cb->fn)(${callArgs.join(", ")});`, `}`);
538
- emitter.walkerDefs.push(...lines);
539
- return sym;
540
- }
541
- /** Interned CONNECT-listener adapter for a UNION socket slot — the h2
542
- * compat listener (`(req, resOrSocket: Http2ServerResponse | net.Socket)
543
- * => void`): the runtime fires (cb, req, sock, head) like an upgrade;
544
- * the adapter wraps the socket at the union's netSocket arm (its tag is
545
- * program data) and drops `head` when the listener declares two params.
546
- * All three runtime args arrive +1; the union takes the socket's. */
547
- export function connectSockThunkFor(emitter, cbT) {
548
- if (cbT.kind !== "func" || cbT.params[1]?.kind !== "union") {
549
- throw new InternalCompilerError("emitter bug: connect listener union shape (frontend must fence)");
550
- }
551
- const key = typeKey(cbT);
552
- let sym = emitter.connectSockThunks.get(key);
553
- if (sym)
554
- return sym;
555
- sym = mangleConnectSockThunk(emitter.connectSockThunks.size);
556
- emitter.connectSockThunks.set(key, sym);
557
- const sockT = cbT.params[1];
558
- const def = emitter.unionsById.get(sockT.unionId);
559
- const tag = def ? def.arms.findIndex((a) => a.kind === "netSocket") : -1;
560
- if (tag < 0)
561
- throw new InternalCompilerError("emitter bug: connect listener union lacks its socket arm");
562
- const three = cbT.params.length === 3;
563
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrNetSocket *sc_sock, ScrBytes *sc_head);`);
564
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrNetSocket *sc_sock, ScrBytes *sc_head) {`, ...(three ? [] : [` scr_bytes_release(sc_head);`]), ` ScrUnion *sc_u = scr_union_new_ref(${tag}, sc_sock, &scr_net_sock_retain_v, &scr_net_sock_release_v, NULL);`, three
565
- ? ` ((void (*)(ScrClosure *, ScrHttpReq *, ScrUnion *, ScrBytes *))sc_cb->fn)(sc_cb, sc_req, sc_u, sc_head);`
566
- : ` ((void (*)(ScrClosure *, ScrHttpReq *, ScrUnion *))sc_cb->fn)(sc_cb, sc_req, sc_u);`, `}`);
567
- return sym;
568
- }
569
- export function connectResThunkFor(emitter, cbT) {
570
- if (cbT.kind !== "func")
571
- throw new InternalCompilerError("emitter bug: connect listener shape");
572
- const key = `res:${typeKey(cbT)}`;
573
- let sym = emitter.connectSockThunks.get(key);
574
- if (sym)
575
- return sym;
576
- sym = mangleConnectResThunk(emitter.connectSockThunks.size);
577
- emitter.connectSockThunks.set(key, sym);
578
- const p1 = cbT.params[1];
579
- const def = p1?.kind === "union" ? emitter.unionsById.get(p1.unionId) : undefined;
580
- const tag = def ? def.arms.findIndex((a) => a.kind === "httpRes") : -1;
581
- if (p1?.kind === "union" && tag < 0)
582
- throw new InternalCompilerError("emitter bug: connect listener union lacks its response arm");
583
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrHttpRes *sc_res);`);
584
- const second = p1?.kind === "union"
585
- ? `ScrUnion *sc_u = scr_union_new_ref(${tag}, sc_res, &scr_http_res_retain_v, &scr_http_res_release_v, NULL);`
586
- : "";
587
- const arg = p1?.kind === "union" ? "sc_u" : "sc_res";
588
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrHttpReq *sc_req, ScrHttpRes *sc_res) {`, ...(second ? [` ${second}`] : []), ...(cbT.params.length === 0
589
- ? [" scr_http_req_release(sc_req);", " scr_http_res_release(sc_res);", " ((void (*)(ScrClosure *))sc_cb->fn)(sc_cb);"]
590
- : cbT.params.length === 1
591
- ? [" scr_http_res_release(sc_res);", " ((void (*)(ScrClosure *, ScrHttpReq *))sc_cb->fn)(sc_cb, sc_req);"]
592
- : [` ((void (*)(ScrClosure *, ScrHttpReq *, ${p1?.kind === "union" ? "ScrUnion" : "ScrHttpRes"} *))sc_cb->fn)(sc_cb, sc_req, ${arg});`]), `}`);
593
- return sym;
594
- }
595
- /** Interned net.connect-lookup answer thunk: the fn of the runtime-minted
596
- * callback the caller's `lookup` option receives (the SNI-answer
597
- * pattern). COMPILED code calls it per its static type — `(err:
598
- * ErrnoException | null, addresses: { address: string, ... }[]) =>
599
- * void` — so the thunk decodes the program-interned err union (null
600
- * tag) and the addresses record's field layout down to the runtime's
601
- * (has_err, message, ip-list) answer. Params arrive +1 and release
602
- * here; the extracted message/ips hand over +1. */
603
- export function netLookupAnswerThunkFor(emitter, cbT) {
604
- if (cbT.kind !== "func" || cbT.params.length !== 2) {
605
- throw new InternalCompilerError("emitter bug: lookup answer cb shape (frontend must fence)");
606
- }
607
- const key = typeKey(cbT);
608
- let sym = emitter.netLookupAnswerThunks.get(key);
609
- if (sym)
610
- return sym;
611
- sym = mangleNetLookupAnswerThunk(emitter.netLookupAnswerThunks.size);
612
- emitter.netLookupAnswerThunks.set(key, sym);
613
- const errT = cbT.params[0];
614
- if (errT.kind !== "union")
615
- throw new InternalCompilerError("emitter bug: lookup answer err param not a union");
616
- const errDef = emitter.unionsById.get(errT.unionId);
617
- const nullTag = errDef ? errDef.arms.findIndex((a) => a.kind === "nullT") : -1;
618
- if (nullTag < 0)
619
- throw new InternalCompilerError("emitter bug: lookup answer err union lacks its null arm");
620
- const addrsT = cbT.params[1];
621
- if (addrsT.kind !== "array" || addrsT.elem.kind !== "record") {
622
- throw new InternalCompilerError("emitter bug: lookup answer addresses param not a record array");
623
- }
624
- const recStruct = mangleRecordStruct(addrsT.elem.shapeId);
625
- const recRelease = mangleRecordRelease(addrsT.elem.shapeId);
626
- const addrField = mangleField("address");
627
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_self, ScrUnion *sc_err, ScrArr *sc_addrs);`);
628
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_self, ScrUnion *sc_err, ScrArr *sc_addrs) {`, ` bool sc_has_err = sc_err->tag != ${nullTag};`, ` ScrStr *sc_msg = NULL;`, ` if (sc_has_err) sc_msg = scr_str_retain(((ScrError *)scr_union_peek(sc_err))->message);`, ` ScrArr *sc_ips = NULL;`, ` if (!sc_has_err) {`, ` double sc_n = scr_arr_len(sc_addrs);`, ` sc_ips = scr_arr_new(SCR_ELEM_STR, (size_t)sc_n);`, ` for (double sc_i = 0; sc_i < sc_n; sc_i++) {`, ` ${recStruct} *sc_r = (${recStruct} *)scr_arr_get_ref(sc_addrs, sc_i);`, ` scr_arr_push_ref(sc_ips, scr_str_retain(sc_r->${addrField}));`, ` ${recRelease}(sc_r);`, ` }`, ` }`, ` scr_net_lookup_answer(sc_self, sc_has_err, sc_msg, sc_ips);`, ` scr_str_release(sc_msg);`, ` scr_arr_release(sc_ips);`, ` scr_union_release(sc_err);`, ` scr_arr_release(sc_addrs);`, `}`);
629
- return sym;
630
- }
631
- /** Interned SNI answer-closure thunk: the fn of the runtime-minted `cb`
632
- * a TLS server's SNICallback receives. COMPILED code calls cb per its
633
- * static type — `(err: Error | null, ctx?: SecureContext) => void`, or
634
- * a shorter declared shape — so the thunk's signature is that ABI, and
635
- * it decodes the program-interned unions (tags are program data) down
636
- * to the runtime's (has_err, ctx-or-NULL) answer. The thunk owns its
637
- * union params per the universal convention (the ctx payload retains
638
- * +1 before its union releases; ownership moves to the runtime). */
639
- export function sniAnswerThunkFor(emitter, cbT) {
640
- if (cbT.kind !== "func")
641
- throw new InternalCompilerError("emitter bug: SNI answer cb not a func");
642
- const key = typeKey(cbT);
643
- let sym = emitter.sniAnswerThunks.get(key);
644
- if (sym)
645
- return sym;
646
- sym = mangleSniAnswerThunk(emitter.sniAnswerThunks.size);
647
- emitter.sniAnswerThunks.set(key, sym);
648
- const nparams = cbT.params.length;
649
- const params = ["ScrClosure *sc_self"];
650
- const body = [];
651
- let hasErr = "false";
652
- if (nparams >= 1) {
653
- const errT = cbT.params[0];
654
- if (errT.kind !== "union")
655
- throw new InternalCompilerError("emitter bug: SNI answer err param not a union");
656
- const def = emitter.unionsById.get(errT.unionId);
657
- const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
658
- if (nullTag < 0)
659
- throw new InternalCompilerError("emitter bug: SNI answer err union lacks its null arm");
660
- params.push("ScrUnion *sc_err");
661
- hasErr = `sc_err->tag != ${nullTag}`;
662
- }
663
- let ctx = "NULL";
664
- if (nparams >= 2) {
665
- const ctxT = cbT.params[1];
666
- if (ctxT.kind !== "union")
667
- throw new InternalCompilerError("emitter bug: SNI answer ctx param not a union");
668
- const def = emitter.unionsById.get(ctxT.unionId);
669
- const ctxTag = def ? def.arms.findIndex((a) => a.kind === "secureCtx") : -1;
670
- if (ctxTag < 0)
671
- throw new InternalCompilerError("emitter bug: SNI answer ctx union lacks its SecureContext arm");
672
- params.push("ScrUnion *sc_ctx");
673
- body.push(` ScrSecureCtx *sc_c = sc_ctx->tag == ${ctxTag} ? scr_secure_ctx_retain((ScrSecureCtx *)scr_union_peek(sc_ctx)) : NULL;`, ` scr_union_release(sc_ctx);`);
674
- ctx = "sc_c";
675
- }
676
- body.push(` bool sc_has_err = ${hasErr};`);
677
- if (nparams >= 1)
678
- body.push(` scr_union_release(sc_err);`);
679
- body.push(` scr_tls_sni_answer(sc_self, sc_has_err, ${ctx});`);
680
- emitter.walkerProtos.push(`static void ${sym}(${params.join(", ")});`);
681
- emitter.walkerDefs.push(`static void ${sym}(${params.join(", ")}) {`, ...body, `}`);
682
- return sym;
683
- }
684
- /** Interned Promise.race fulfillment adapter: converts a settled entry's
685
- * payload (inner type `from`) into the result promise's inner type `to`
686
- * and fulfills the destination. Three shapes, mirroring the frontend's
687
- * compatibility fence: identical types share the runtime's raw copy;
688
- * a plain entry under a union result wraps into its arm; a sub-union
689
- * entry re-tags arm-wise (canonical arm order makes the mapping a
690
- * typeKey lookup). Rejections never reach adapters — the runtime copies
691
- * them raw. */
692
- export function raceAdapterFor(emitter, from, to) {
693
- if (typeEquals(from, to))
694
- return "scr_promise_adapt_copy";
695
- const key = `${typeKey(from)}=>${typeKey(to)}`;
696
- let sym = emitter.raceThunks.get(key);
697
- if (sym)
698
- return sym;
699
- sym = mangleRaceThunk(emitter.raceThunks.size);
700
- emitter.raceThunks.set(key, sym);
701
- if (to.kind !== "union")
702
- throw new InternalCompilerError("emitter bug: race adapter to a non-union");
703
- const toDef = emitter.unionsById.get(to.unionId);
704
- if (!toDef)
705
- throw new InternalCompilerError("emitter bug: race adapter to an unknown union");
706
- const tagOf = (t) => {
707
- const tag = toDef.arms.findIndex((a) => typeEquals(a, t));
708
- if (tag < 0)
709
- throw new InternalCompilerError("emitter bug: race adapter arm missing (frontend must fence)");
710
- return tag;
711
- };
712
- const rv = vAdapters(to);
713
- const fulfill = (value) => `scr_promise_fulfill_ref(sc_dst, ${value}, ${rv.retain}, ${rv.release}, ${emitter.traceArgC(to)});`;
714
- emitter.walkerProtos.push(`static void ${sym}(ScrPromise *sc_dst, ScrPromise *sc_src);`);
715
- if (from.kind !== "union") {
716
- // One arm wrap, straight off the payload accessors.
717
- const tag = tagOf(from);
718
- let value;
719
- switch (from.kind) {
720
- case "f64":
721
- value = `scr_union_new_f64(${tag}, scr_promise_payload_f64(sc_src))`;
722
- break;
723
- case "bool":
724
- value = `scr_union_new_bool(${tag}, scr_promise_payload_bool(sc_src))`;
725
- break;
726
- case "string":
727
- value = `scr_union_new_ref(${tag}, scr_promise_payload_str(sc_src), scr_str_retain_v, scr_str_release_v, NULL)`;
728
- break;
729
- default: {
730
- const fv = vAdapters(from);
731
- value = `scr_union_new_ref(${tag}, scr_promise_payload_ref(sc_src), ${fv.retain}, ${fv.release}, ${emitter.traceArgC(from)})`;
732
- }
733
- }
734
- emitter.walkerDefs.push(`static void ${sym}(ScrPromise *sc_dst, ScrPromise *sc_src) {`, ` ${fulfill(value)}`, `}`);
735
- return sym;
736
- }
737
- // Sub-union re-tag: switch over the entry's arms, rebuild under the
738
- // result's tags (payloads retained through each arm's own adapters).
739
- const fromDef = emitter.unionsById.get(from.unionId);
740
- if (!fromDef)
741
- throw new InternalCompilerError("emitter bug: race adapter from an unknown union");
742
- const cases = fromDef.arms.map((arm, i) => {
743
- const tag = tagOf(arm);
744
- let build;
745
- if (isUnitType(arm)) {
746
- build = emitter.unitInstanceRef(to.unionId, tag);
747
- }
748
- else if (arm.kind === "f64") {
749
- build = `scr_union_new_f64(${tag}, scr_union_get_f64(sc_u))`;
750
- }
751
- else if (arm.kind === "bool") {
752
- build = `scr_union_new_bool(${tag}, scr_union_get_bool(sc_u))`;
753
- }
754
- else {
755
- const av = vAdapters(arm);
756
- build = `scr_union_new_ref(${tag}, ${av.retain}(scr_union_peek(sc_u)), ${av.retain}, ${av.release}, ${emitter.traceArgC(arm)})`;
757
- }
758
- return ` case ${i}: sc_v = ${build}; break;`;
759
- });
760
- emitter.walkerDefs.push(`static void ${sym}(ScrPromise *sc_dst, ScrPromise *sc_src) {`, ` ScrUnion *sc_u = (ScrUnion *)scr_promise_payload_ref(sc_src);`, ` ScrUnion *sc_v = NULL;`, ` switch (sc_u->tag) {`, ...cases, ` default: break;`, ` }`, ` scr_union_release(sc_u);`, ` ${fulfill("sc_v")}`, `}`);
761
- return sym;
762
- }
763
- /** Interned generator-resume result builder: reads the post-resume state
764
- * of a generator into a fresh IteratorResult record `{ done, value }`.
765
- * One helper per generator type (every next/return/throw on it shares
766
- * the record shape). The value slot: while suspended, the yielded value
767
- * moves out of the OUT slot into its arm of V (the yield type retags
768
- * arm-wise into a superset V, the raceAdapterFor technique); once done,
769
- * a present completion value wraps the same way and an empty OUT is
770
- * JS's undefined (the interned undefined arm — or the dyn undefined
771
- * when V is dyn, the any/unknown channel). */
772
- export function genResultThunkFor(emitter, genT, recT) {
773
- const key = typeKey(genT);
774
- let sym = emitter.genResThunks.get(key);
775
- if (sym)
776
- return sym;
777
- sym = mangleGenResThunk(emitter.genResThunks.size);
778
- emitter.genResThunks.set(key, sym);
779
- const struct = mangleRecordStruct(recT.shapeId);
780
- const shape = emitter.mod.records?.find((r) => r.id === recT.shapeId);
781
- const valueT = shape?.fields.find((f) => f.name === "value")?.type;
782
- if (!valueT)
783
- throw new InternalCompilerError("emitter bug: genResume record lacks its value field");
784
- const lines = [
785
- `static ${struct} *${sym}(ScrGen *sc_g) {`,
786
- ` ${struct} *sc_r = ${mangleRecordNew(recT.shapeId)}();`,
787
- ` bool sc_d = scr_gen_done(sc_g);`,
788
- ` sc_r->${mangleField("done")} = sc_d;`,
789
- ];
790
- if (valueT.kind === "dyn") {
791
- // The any/unknown channel: OUT holds a dyn (or nothing — undefined).
792
- lines.push(` sc_r->${mangleField("value")} = scr_gen_out_has(sc_g)`, ` ? (ScrDyn *)scr_gen_take_out_ref(sc_g)`, ` : scr_dyn_retain(scr_dyn_undefined());`);
793
- }
794
- else {
795
- if (valueT.kind !== "union") {
796
- throw new InternalCompilerError("emitter bug: genResume value slot is neither dyn nor a union");
797
- }
798
- const def = emitter.unionsById.get(valueT.unionId);
799
- if (!def)
800
- throw new InternalCompilerError("emitter bug: genResume value union unknown");
801
- const tagOf = (t) => {
802
- const tag = def.arms.findIndex((a) => typeEquals(a, t));
803
- if (tag < 0)
804
- throw new InternalCompilerError("emitter bug: genResume value union lacks an arm");
805
- return tag;
806
- };
807
- const undefTag = def.arms.findIndex((a) => a.kind === "undefinedT");
808
- if (undefTag < 0)
809
- throw new InternalCompilerError("emitter bug: genResume value union lacks undefined");
810
- // Lines that leave the wrapped value in `sc_v`, taking OUT's payload.
811
- const wrapFrom = (srcT) => {
812
- if (srcT.kind === "f64") {
813
- return [` sc_v = scr_union_new_f64(${tagOf(srcT)}, scr_gen_take_out_f64(sc_g));`];
814
- }
815
- if (srcT.kind === "bool") {
816
- return [` sc_v = scr_union_new_bool(${tagOf(srcT)}, scr_gen_take_out_bool(sc_g));`];
817
- }
818
- if (srcT.kind !== "union") {
819
- const v = vAdapters(srcT);
820
- return [
821
- ` sc_v = scr_union_new_ref(${tagOf(srcT)}, scr_gen_take_out_ref(sc_g), ${v.retain}, ${v.release}, ${emitter.traceArgC(srcT)});`,
822
- ];
823
- }
824
- // A union channel: OUT holds the union box itself. Identical V
825
- // passes through; a superset V retags arm-wise (payloads retained
826
- // through each arm's own adapters, then the source box drops).
827
- if (typeEquals(srcT, valueT)) {
828
- return [` sc_v = (ScrUnion *)scr_gen_take_out_ref(sc_g);`];
829
- }
830
- const srcDef = emitter.unionsById.get(srcT.unionId);
831
- if (!srcDef)
832
- throw new InternalCompilerError("emitter bug: genResume channel union unknown");
833
- const cases = srcDef.arms.map((arm, i) => {
834
- const tag = tagOf(arm);
835
- let build;
836
- if (isUnitType(arm)) {
837
- build = emitter.unitInstanceRef(valueT.unionId, tag);
838
- }
839
- else if (arm.kind === "f64") {
840
- build = `scr_union_new_f64(${tag}, scr_union_get_f64(sc_u))`;
841
- }
842
- else if (arm.kind === "bool") {
843
- build = `scr_union_new_bool(${tag}, scr_union_get_bool(sc_u))`;
844
- }
845
- else {
846
- const av = vAdapters(arm);
847
- build = `scr_union_new_ref(${tag}, ${av.retain}(scr_union_peek(sc_u)), ${av.retain}, ${av.release}, ${emitter.traceArgC(arm)})`;
848
- }
849
- return ` case ${i}: sc_v = ${build}; break;`;
850
- });
851
- return [
852
- ` { ScrUnion *sc_u = (ScrUnion *)scr_gen_take_out_ref(sc_g);`,
853
- ` switch (sc_u->tag) {`,
854
- ...cases,
855
- ` default: sc_v = ${emitter.unitInstanceRef(valueT.unionId, undefTag)}; break;`,
856
- ` }`,
857
- ` scr_union_release(sc_u); }`,
858
- ];
859
- };
860
- const undefLine = ` sc_v = ${emitter.unitInstanceRef(valueT.unionId, undefTag)};`;
861
- lines.push(` ScrUnion *sc_v;`);
862
- lines.push(` if (!sc_d) {`);
863
- // yieldT VOID marks a generator that can never yield (TS's `never`):
864
- // the suspended branch is unreachable — the undefined arm keeps the
865
- // C total.
866
- lines.push(...(genT.yieldT.kind === "void" ? [undefLine] : wrapFrom(genT.yieldT)));
867
- lines.push(` } else if (scr_gen_out_has(sc_g)) {`);
868
- lines.push(...(genT.retT.kind === "void" ? [undefLine] : wrapFrom(genT.retT)));
869
- lines.push(` } else {`, undefLine, ` }`);
870
- lines.push(` sc_r->${mangleField("value")} = sc_v;`);
871
- }
872
- lines.push(` return sc_r;`, `}`);
873
- emitter.walkerProtos.push(`static ${struct} *${sym}(ScrGen *sc_g);`);
874
- emitter.walkerDefs.push(...lines, ``);
875
- return sym;
876
- }
877
- /** Interned per inner-type resolve thunk for ref-kind new Promise. */
878
- export function resolveThunkFor(emitter, inner) {
879
- const key = typeKey(inner);
880
- let sym = emitter.resolveThunks.get(key);
881
- if (!sym) {
882
- sym = mangleResolveThunk(emitter.resolveThunks.size);
883
- emitter.resolveThunks.set(key, sym);
884
- const v = vAdapters(inner);
885
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_self, ${cDecl(inner, "sc_v")});`);
886
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_self, ${cDecl(inner, "sc_v")}) {`, ` scr_resolve_ref_impl(sc_self, sc_v, ${v.retain}, ${v.release}, ${emitter.traceArgC(inner)});`, `}`);
887
- }
888
- return sym;
889
- }
890
- /** The EventEmitter listener invoke adapter for one listener signature:
891
- * `void (ScrClosure *, va_list)` — va_args exactly the listener's own
892
- * parameter prefix of the emit site's typed tail (the frontend unified
893
- * the tuple, so reads agree with writes), retains each refcounted value
894
- * (the callee owns +1 per the universal convention; f64/bool copy), and
895
- * calls cb->fn behind its exact C signature. Interned per func-type key. */
896
- export function emitterInvokeThunkFor(emitter, cbT) {
897
- if (cbT.kind !== "func") {
898
- throw new InternalCompilerError("emitter bug: emitter.on listener not a func (frontend must fence)");
899
- }
900
- const key = typeKey(cbT);
901
- let sym = emitter.emitterInvokeThunks.get(key);
902
- if (sym)
903
- return sym;
904
- sym = mangleEmitterInvokeThunk(emitter.emitterInvokeThunks.size);
905
- emitter.emitterInvokeThunks.set(key, sym);
906
- const reads = [];
907
- const passed = [];
908
- cbT.params.forEach((p, i) => {
909
- const name = `sc_a${i}`;
910
- if (p.kind === "f64" || p.kind === "date") {
911
- reads.push(` double ${name} = va_arg(sc_ap, double);`);
912
- passed.push(name);
913
- }
914
- else if (p.kind === "bool") {
915
- // bool promotes to int through a variadic call.
916
- reads.push(` bool ${name} = (bool)va_arg(sc_ap, int);`);
917
- passed.push(name);
918
- }
919
- else {
920
- reads.push(` ${cDecl(p, name)} = va_arg(sc_ap, ${cType(p).trim()});`);
921
- passed.push(retainCallC(p, name));
922
- }
923
- });
924
- const sigParams = ["ScrClosure *", ...cbT.params.map((p) => cType(p).trim())].join(", ");
925
- // The call goes through the listener's TRUE signature; a non-void
926
- // result is discarded (refcounted ones released) — Node ignores
927
- // listener return values.
928
- const retC = cbT.ret.kind === "void" ? "void" : cType(cbT.ret).trim();
929
- const invoke = `((${retC} (*)(${sigParams}))sc_cb->fn)(${["sc_cb", ...passed].join(", ")})`;
930
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap);`);
931
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap) {`, ...(cbT.params.length === 0 ? [` (void)sc_ap;`] : reads), ...(cbT.ret.kind === "void"
932
- ? [` ${invoke};`]
933
- : isRefCounted(cbT.ret)
934
- ? [` ${retC} sc_r = ${invoke};`, ` if (sc_r) ${releaseCallC(cbT.ret, "sc_r")};`]
935
- : [` (void)${invoke};`]), `}`, ``);
936
- return sym;
937
- }
938
- /** child_process.execFile's error-first callback adapter. The runtime owns
939
- * one +1 callback plus +1 error/output values at settlement; the adapter
940
- * wraps the nullable error with this program's union tags, transfers every
941
- * declared argument into the compiled closure, and releases ignored suffix
942
- * values for callbacks that declare fewer than three parameters. */
943
- export function execFileThunkFor(emitter, cbT) {
944
- const key = `exec:${typeKey(cbT)}`;
945
- let sym = emitter.childExitThunks.get(key);
946
- if (sym)
947
- return sym;
948
- sym = mangleChildExitThunk(emitter.childExitThunks.size);
949
- emitter.childExitThunks.set(key, sym);
950
- const errorParam = cbT.params[0];
951
- let errorExpr = null;
952
- if (errorParam !== undefined) {
953
- if (errorParam.kind !== "union")
954
- throw new InternalCompilerError("emitter bug: execFile error param not a union");
955
- const def = emitter.unionsById.get(errorParam.unionId);
956
- const errorTag = def ? def.arms.findIndex((arm) => arm.kind === "object" && arm.className === "%Error") : -1;
957
- const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
958
- const errorArm = errorTag >= 0 ? def?.arms[errorTag] : undefined;
959
- if (nullTag < 0 || !errorArm)
960
- throw new InternalCompilerError("emitter bug: execFile error union lacks its arms");
961
- errorExpr = `sc_err ? scr_union_new_ref(${errorTag}, sc_err, &scr_error_retain_v, &scr_error_release_v, ${emitter.traceArgC(errorArm)}) : ${emitter.unitInstanceRef(errorParam.unionId, nullTag)}`;
962
- }
963
- const callbackArgs = [
964
- "sc_cb",
965
- ...(errorExpr === null ? [] : ["sc_e"]),
966
- ...(cbT.params.length >= 2 ? ["sc_out"] : []),
967
- ...(cbT.params.length >= 3 ? ["sc_stderr"] : []),
968
- ];
969
- const callbackTypes = [
970
- "ScrClosure *",
971
- ...(errorExpr === null ? [] : ["ScrUnion *"]),
972
- ...(cbT.params.length >= 2 ? ["ScrStr *"] : []),
973
- ...(cbT.params.length >= 3 ? ["ScrStr *"] : []),
974
- ];
975
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrStr *sc_out, ScrStr *sc_stderr);`);
976
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_err, ScrStr *sc_out, ScrStr *sc_stderr) {`, ...(errorExpr === null ? [` scr_error_release(sc_err);`] : [` ScrUnion *sc_e = ${errorExpr};`]), ...(cbT.params.length < 2 ? [` scr_str_release(sc_out);`] : []), ...(cbT.params.length < 3 ? [` scr_str_release(sc_stderr);`] : []), ` ((void (*)(${callbackTypes.join(", ")}))sc_cb->fn)(${callbackArgs.join(", ")});`, `}`);
977
- return sym;
978
- }
979
- /** Fork IPC message adapter: parse results arrive as a borrowed dyn tree,
980
- * then validate into the listener's static JSON shape. Async listener
981
- * promises are deliberately released without attaching a handler, matching
982
- * EventEmitter's ignored return value. */
983
- export function ipcMessageThunkFor(emitter, cbT) {
984
- const key = `ipcmsg:${typeKey(cbT)}`;
985
- let sym = emitter.childExitThunks.get(key);
986
- if (sym)
987
- return sym;
988
- sym = mangleChildExitThunk(emitter.childExitThunks.size);
989
- emitter.childExitThunks.set(key, sym);
990
- const param = cbT.params[0];
991
- const body = [];
992
- const callbackTypes = ["ScrClosure *"];
993
- const callbackArgs = ["sc_cb"];
994
- if (param !== undefined) {
995
- const value = param.kind === "dyn"
996
- ? "scr_dyn_retain(sc_message)"
997
- : `${emitter.dynCheckHelper(param)}(sc_message, NULL)`;
998
- body.push(` ${cDecl(param, "sc_value")} = ${value};`);
999
- if (param.kind !== "dyn") {
1000
- body.push(` if (scr_exc_pending()) {`, ...(isRefCounted(param) ? [` ${releaseCallC(param, "sc_value")};`] : []), ` return;`, ` }`);
1001
- }
1002
- callbackTypes.push(cType(param).trim());
1003
- callbackArgs.push("sc_value");
1004
- }
1005
- else {
1006
- body.push(` (void)sc_message;`);
1007
- }
1008
- const invoke = `((` + cType(cbT.ret).trim() + ` (*)(${callbackTypes.join(", ")}))sc_cb->fn)(${callbackArgs.join(", ")})`;
1009
- if (cbT.ret.kind === "void")
1010
- body.push(` ${invoke};`);
1011
- else
1012
- body.push(` ${cDecl(cbT.ret, "sc_result")} = ${invoke};`, ` ${releaseCallC(cbT.ret, "sc_result")};`);
1013
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrDyn *sc_message);`);
1014
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrDyn *sc_message) {`, ...body, `}`);
1015
- return sym;
1016
- }
1017
- /** Fork IPC send completion adapter. The nullable +1 runtime Error moves
1018
- * into the callback's Error|null union, or is released for a zero-argument
1019
- * callback. */
1020
- export function ipcSendThunkFor(emitter, cbT) {
1021
- const key = `ipcsend:${typeKey(cbT)}`;
1022
- let sym = emitter.childExitThunks.get(key);
1023
- if (sym)
1024
- return sym;
1025
- sym = mangleChildExitThunk(emitter.childExitThunks.size);
1026
- emitter.childExitThunks.set(key, sym);
1027
- const param = cbT.params[0];
1028
- const body = [];
1029
- if (param === undefined) {
1030
- body.push(` scr_error_release(sc_error);`, ` ((void (*)(ScrClosure *))sc_cb->fn)(sc_cb);`);
1031
- }
1032
- else {
1033
- if (param.kind !== "union")
1034
- throw new InternalCompilerError("emitter bug: IPC send callback param not a union");
1035
- const def = emitter.unionsById.get(param.unionId);
1036
- const errorTag = def ? def.arms.findIndex((arm) => arm.kind === "object" && arm.className === "%Error") : -1;
1037
- const nullTag = def ? def.arms.findIndex((arm) => arm.kind === "nullT") : -1;
1038
- const errorArm = errorTag >= 0 ? def?.arms[errorTag] : undefined;
1039
- if (errorTag < 0 || nullTag < 0 || !errorArm) {
1040
- throw new InternalCompilerError("emitter bug: IPC send callback union lacks Error|null");
1041
- }
1042
- body.push(` ScrUnion *sc_value = sc_error`, ` ? scr_union_new_ref(${errorTag}, sc_error, &scr_error_retain_v, &scr_error_release_v, ${emitter.traceArgC(errorArm)})`, ` : ${emitter.unitInstanceRef(param.unionId, nullTag)};`, ` ((void (*)(ScrClosure *, ScrUnion *))sc_cb->fn)(sc_cb, sc_value);`);
1043
- }
1044
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_error);`);
1045
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ScrError *sc_error) {`, ...body, `}`);
1046
- return sym;
1047
- }
1048
- /** The stream completion-callback closure fn for one done func type: the
1049
- * `callback` a user's write/final/destroy/transform/flush receives. The
1050
- * closure's one capture box holds the stream (+1); calling it unwraps the
1051
- * (optional) error/data union arguments and reports completion to the
1052
- * runtime. Kind names the runtime entry: "w" scr_stream_write_done, "f"
1053
- * scr_stream_final_done, "d" scr_stream_destroy_done, "t"
1054
- * scr_stream_transform_done, "l" scr_stream_flush_done. Args arrive
1055
- * callee-owned (+1) per the universal convention and are released here. */
1056
- function streamDoneFnFor(emitter, kind, doneT) {
1057
- if (doneT.kind !== "func") {
1058
- throw new InternalCompilerError("emitter bug: stream done callback not a func (frontend must fence)");
1059
- }
1060
- const key = `${kind}:${typeKey(doneT)}`;
1061
- let sym = emitter.streamDoneFns.get(key);
1062
- if (sym)
1063
- return sym;
1064
- sym = mangleStreamDoneFn(emitter.streamDoneFns.size);
1065
- emitter.streamDoneFns.set(key, sym);
1066
- const params = ["ScrClosure *sc_self"];
1067
- const body = [
1068
- ` ScrStream *sc_s = (ScrStream *)scr_box_get_ref(sc_self->caps[0]); /* +1 */`,
1069
- ` ScrError *sc_err = NULL;`,
1070
- ];
1071
- const errT = doneT.params[0];
1072
- if (errT !== undefined) {
1073
- if (errT.kind !== "union")
1074
- throw new InternalCompilerError("emitter bug: stream done err param not a union");
1075
- const def = emitter.unionsById.get(errT.unionId);
1076
- const errTag = def ? def.arms.findIndex((a) => a.kind === "object") : -1;
1077
- if (errTag < 0)
1078
- throw new InternalCompilerError("emitter bug: stream done err union lacks its Error arm");
1079
- params.push("ScrUnion *sc_e");
1080
- body.push(` if (sc_e && sc_e->tag == ${errTag}) sc_err = scr_error_retain((ScrError *)scr_union_peek(sc_e));`);
1081
- }
1082
- const dataLines = [` ScrBytes *sc_data = NULL;`, ` ScrStr *sc_dataStr = NULL;`];
1083
- const dataT = doneT.params[1];
1084
- if (kind === "t" || kind === "l") {
1085
- body.push(...dataLines);
1086
- if (dataT !== undefined) {
1087
- if (dataT.kind !== "union")
1088
- throw new InternalCompilerError("emitter bug: stream done data param not a union");
1089
- const def = emitter.unionsById.get(dataT.unionId);
1090
- const bytesTag = def ? def.arms.findIndex((a) => a.kind === "bytes") : -1;
1091
- const strTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
1092
- params.push("ScrUnion *sc_d");
1093
- body.push(...(bytesTag >= 0
1094
- ? [` if (sc_d && sc_d->tag == ${bytesTag}) sc_data = scr_bytes_retain((ScrBytes *)scr_union_peek(sc_d));`]
1095
- : []), ...(strTag >= 0
1096
- ? [` if (sc_d && sc_d->tag == ${strTag}) sc_dataStr = scr_str_retain((ScrStr *)scr_union_peek(sc_d));`]
1097
- : []));
1098
- }
1099
- }
1100
- const entry = kind === "w" ? "scr_stream_write_done" :
1101
- kind === "f" ? "scr_stream_final_done" :
1102
- kind === "d" ? "scr_stream_destroy_done" :
1103
- kind === "t" ? "scr_stream_transform_done" : "scr_stream_flush_done";
1104
- const tail = kind === "t" || kind === "l"
1105
- ? `${entry}(sc_s, sc_err, sc_data, sc_dataStr);`
1106
- : `${entry}(sc_s, sc_err);`;
1107
- emitter.walkerProtos.push(`static void ${sym}(${params.join(", ")});`);
1108
- emitter.walkerDefs.push(`static void ${sym}(${params.join(", ")}) {`, ...body, ` ${tail} /* moves sc_err/sc_data; borrows sc_s */`, ` scr_stream_release(sc_s);`, ...(errT !== undefined ? [` if (sc_e) scr_union_release(sc_e);`] : []), ...((kind === "t" || kind === "l") && dataT !== undefined ? [` if (sc_d) scr_union_release(sc_d);`] : []), `}`, ``);
1109
- return sym;
1110
- }
1111
- /** The stream-'data' listener invoke adapter for one listener func type:
1112
- * the runtime's 'data' emission carries BOTH payload slots (ScrBytes *b,
1113
- * ScrStr *s — exactly one non-NULL; encoded streams deliver strings),
1114
- * and this thunk unwraps the listener's declared side. A listener
1115
- * declaring the WRONG side for the stream's runtime mode gets a clear
1116
- * TypeError instead of a type-confused payload (Node, untyped, would
1117
- * just hand the value over — SEMANTICS.md). Zero-parameter listeners
1118
- * ignore both slots; DYN-parameter listeners (the JS lane's adapter,
1119
- * emitter.onDataDyn) box by tag, which is always right. */
1120
- export function streamDataThunkFor(emitter, cbT) {
1121
- if (cbT.kind !== "func") {
1122
- throw new InternalCompilerError("emitter bug: stream data listener not a func (frontend must fence)");
1123
- }
1124
- const key = `data:${typeKey(cbT)}`;
1125
- let sym = emitter.emitterInvokeThunks.get(key);
1126
- if (sym)
1127
- return sym;
1128
- sym = mangleEmitterInvokeThunk(emitter.emitterInvokeThunks.size);
1129
- emitter.emitterInvokeThunks.set(key, sym);
1130
- const p = cbT.params[0];
1131
- if (cbT.params.length > 1 || (p && p.kind !== "bytes" && p.kind !== "string" && p.kind !== "dyn")) {
1132
- throw new InternalCompilerError("emitter bug: stream data listener param shape (frontend must fence)");
1133
- }
1134
- const body = [
1135
- ` ScrBytes *sc_b = va_arg(sc_ap, ScrBytes *);`,
1136
- ` ScrStr *sc_s = va_arg(sc_ap, ScrStr *);`,
1137
- ];
1138
- const passed = ["sc_cb"];
1139
- if (p === undefined) {
1140
- body.push(` (void)sc_b;`, ` (void)sc_s;`);
1141
- }
1142
- else if (p.kind === "bytes") {
1143
- body.push(` if (!sc_b) {`, ` static const char sc_m[] = "a 'data' listener declaring a Buffer chunk received a string (the stream has an encoding set)";`, ` scr_throw_error_msg(SCR_ERR_TYPE, sc_m, sizeof sc_m - 1);`, ` return;`, ` }`);
1144
- passed.push("scr_bytes_retain(sc_b)");
1145
- }
1146
- else if (p.kind === "string") {
1147
- body.push(` if (!sc_s) {`, ` static const char sc_m[] = "a 'data' listener declaring a string chunk received a Buffer (call setEncoding, or declare the chunk as a Buffer)";`, ` scr_throw_error_msg(SCR_ERR_TYPE, sc_m, sizeof sc_m - 1);`, ` return;`, ` }`);
1148
- passed.push("scr_str_retain(sc_s)");
1149
- }
1150
- else {
1151
- // dyn: box by runtime tag — the JS lane's adapter parameter.
1152
- body.push(` ScrDyn *sc_d = sc_b ? scr_dyn_new_buffer_copy(sc_b) : scr_dyn_new_str(sc_s);`);
1153
- passed.push("sc_d");
1154
- }
1155
- const sigParams = ["ScrClosure *", ...cbT.params.map((q) => cType(q).trim())].join(", ");
1156
- const retC = cbT.ret.kind === "void" ? "void" : cType(cbT.ret).trim();
1157
- const invoke = `((${retC} (*)(${sigParams}))sc_cb->fn)(${passed.join(", ")})`;
1158
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap);`);
1159
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, va_list sc_ap) {`, ...body, ...(cbT.ret.kind === "void"
1160
- ? [` ${invoke};`]
1161
- : isRefCounted(cbT.ret)
1162
- ? [` ${retC} sc_r = ${invoke};`, ` if (sc_r) ${releaseCallC(cbT.ret, "sc_r")};`]
1163
- : [` (void)${invoke};`]), `}`, ``);
1164
- return sym;
1165
- }
1166
- /** The stream option-callback invoke adapter for one (kind, callback
1167
- * type): the runtime calls the user's read/write/final/destroy/transform/
1168
- * flush closure through it. The stream rides first (the leading `this`
1169
- * param every option callback's lifted fn takes); the user may have
1170
- * declared any PREFIX of the Node signature, so the adapter passes
1171
- * exactly the declared prefix (retaining each ref per the callee-owns
1172
- * convention) and materializes the completion-callback closure only when
1173
- * declared — an undeclared completion callback means the operation can
1174
- * never complete, exactly Node. Kinds: "r" read(size), "w" write(chunk,
1175
- * enc, cb), "f" final(cb), "d" destroy(err, cb), "t" transform(chunk,
1176
- * enc, cb), "l" flush(cb). */
1177
- export function streamCbThunkFor(emitter, kind, cbT) {
1178
- if (cbT.kind !== "func") {
1179
- throw new InternalCompilerError("emitter bug: stream option callback not a func (frontend must fence)");
1180
- }
1181
- const key = `${kind}:${typeKey(cbT)}`;
1182
- let sym = emitter.streamCbThunks.get(key);
1183
- if (sym)
1184
- return sym;
1185
- sym = mangleStreamCbThunk(emitter.streamCbThunks.size);
1186
- emitter.streamCbThunks.set(key, sym);
1187
- // The runtime-facing C signatures, per kind.
1188
- const runtimeParams = kind === "r" ? ["ScrStream *sc_s", "double sc_size"] :
1189
- kind === "w" || kind === "t" ? ["ScrStream *sc_s", "ScrBytes *sc_chunk"] :
1190
- kind === "d" || kind === "e" ? ["ScrStream *sc_s", "ScrError *sc_err"] :
1191
- ["ScrStream *sc_s"];
1192
- // The user callback's declared prefix: params[0] is the stream (`this`)
1193
- // for the inline forms; a THISLESS callback (the checked-dynamic VALUE
1194
- // adapter — its first param is dyn, never an object) takes the Node
1195
- // positions from param 0 and never receives the stream (the dyn call
1196
- // ABI carries no receiver; SEMANTICS.md).
1197
- const declared = cbT.params;
1198
- const hasThis = declared[0] !== undefined && declared[0].kind === "object";
1199
- if (declared.length === 0) {
1200
- throw new InternalCompilerError("emitter bug: stream option callback with no params (frontend must fence)");
1201
- }
1202
- const passed = hasThis
1203
- ? ["sc_cb", `(${cType(declared[0]).trim()})scr_stream_retain(sc_s)`]
1204
- : ["sc_cb"];
1205
- const body = [];
1206
- const off = hasThis ? 1 : 0;
1207
- const full = (kind === "r" ? 1 : kind === "w" || kind === "t" ? 3 : kind === "d" ? 2 : 1) + off;
1208
- // "e" (the finished/pipeline callback): ONE Node position — the error.
1209
- if (declared.length > full) {
1210
- throw new InternalCompilerError(`emitter bug: stream '${kind}' callback declares ${declared.length} params (frontend must fence)`);
1211
- }
1212
- for (let i = off; i < declared.length; i++) {
1213
- const p = declared[i];
1214
- const pos = i - off; // 0-based Node signature position
1215
- if (kind === "r") {
1216
- // read(size) — a dyn-declared size (the JS lane) boxes the number.
1217
- passed.push(p.kind === "dyn" ? "scr_dyn_new_num(sc_size)" : "sc_size");
1218
- continue;
1219
- }
1220
- const isChunkPos = (kind === "w" || kind === "t") && pos === 0;
1221
- const isEncPos = (kind === "w" || kind === "t") && pos === 1;
1222
- const isErrPos = (kind === "d" || kind === "e") && pos === 0;
1223
- const isDonePos = kind === "e" ? false
1224
- : (kind === "w" || kind === "t") ? pos === 2 : (kind === "f" || kind === "l") ? pos === 0 : pos === 1;
1225
- // The JS lane's implicitly-any parameters: each position boxes into
1226
- // dyn by kind — the chunk as dyn bytes, the encoding as a string,
1227
- // the error as the boundary's {name, message} shape (null when
1228
- // none), and the completion callback as a CALLABLE dyn whose glue
1229
- // dispatches to the runtime's *_done entry (the closure's one cap
1230
- // boxes the retained stream).
1231
- if (p.kind === "dyn") {
1232
- if (isChunkPos) {
1233
- passed.push(`scr_dyn_new_buffer_copy(sc_chunk)`);
1234
- }
1235
- else if (isEncPos) {
1236
- body.push(` ScrStr *sc_encs = scr_str_new("buffer", 6);`, ` ScrDyn *sc_encd = scr_dyn_new_str(sc_encs);`, ` scr_str_release(sc_encs);`);
1237
- passed.push(`sc_encd`);
1238
- }
1239
- else if (isErrPos) {
1240
- // finished/pipeline succeed with UNDEFINED (Node calls the eos
1241
- // callback with no arguments); destroy passes null.
1242
- passed.push(kind === "e"
1243
- ? `sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_retain(scr_dyn_undefined())`
1244
- : `sc_err ? scr_dyn_from_error(sc_err) : scr_dyn_new_null()`);
1245
- }
1246
- else if (isDonePos) {
1247
- const glue = `scr_stream_done_dyn_${kind}`;
1248
- body.push(` ScrClosure *sc_dclo = scr_closure_new((void *)&${glue}, 1);`, ` sc_dclo->caps[0] = scr_box_new_obj(&scr_stream_retain_v, &scr_stream_release_v, &scr_stream_trace);`, ` scr_box_set_ref(sc_dclo->caps[0], scr_stream_retain(sc_s));`, ` ScrDyn *sc_done = scr_dyn_new_func(sc_dclo, &${glue}, ${kind === "t" || kind === "l" ? 2 : 1}, ${JSON.stringify(kind === "t" || kind === "l" ? "(error,data)" : "(error)")}, "callback");`);
1249
- passed.push(`sc_done`);
1250
- }
1251
- else {
1252
- throw new InternalCompilerError(`emitter bug: stream '${kind}' dyn callback param ${i} has no adapter`);
1253
- }
1254
- continue;
1255
- }
1256
- if (isChunkPos) {
1257
- passed.push(`scr_bytes_retain(sc_chunk)`);
1258
- }
1259
- else if (isEncPos) {
1260
- // Node's encoding for decoded (Buffer) chunks is 'buffer'.
1261
- body.push(` ScrStr *sc_enc = scr_str_new("buffer", 6);`);
1262
- passed.push(`sc_enc`);
1263
- }
1264
- else if (isErrPos) {
1265
- // destroy's error argument: `Error | null` — wrap type-directedly.
1266
- // The finished/pipeline callback ("e") may declare `Error | null |
1267
- // undefined` (the @types signature); success prefers the undefined
1268
- // arm there (Node calls the eos callback with NO arguments).
1269
- if (p.kind !== "union")
1270
- throw new InternalCompilerError("emitter bug: stream destroy err param not a union");
1271
- const def = emitter.unionsById.get(p.unionId);
1272
- const errTag = def ? def.arms.findIndex((a) => a.kind === "object") : -1;
1273
- const undefTag = kind === "e" && def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
1274
- const nullTag = def
1275
- ? (undefTag >= 0 ? undefTag : def.arms.findIndex((a) => a.kind === "nullT"))
1276
- : -1;
1277
- if (errTag < 0 || nullTag < 0)
1278
- throw new InternalCompilerError("emitter bug: stream destroy err union lacks its arms");
1279
- body.push(` ScrUnion *sc_eu = sc_err ? scr_union_new_ref(${errTag}, scr_error_retain(sc_err), &scr_error_retain_v, &scr_error_release_v, scr_error_trace_arg()) : scr_union_retain(${emitter.unitInstanceRef(p.unionId, nullTag)});`);
1280
- passed.push(`sc_eu`);
1281
- }
1282
- else if (isDonePos) {
1283
- const doneKind = kind; // "e" has no done position
1284
- const doneFn = streamDoneFnFor(emitter, doneKind, p);
1285
- body.push(` ScrClosure *sc_done = scr_closure_new((void *)&${doneFn}, 1);`, ` sc_done->caps[0] = scr_box_new_obj(&scr_stream_retain_v, &scr_stream_release_v, &scr_stream_trace);`, ` scr_box_set_ref(sc_done->caps[0], scr_stream_retain(sc_s));`);
1286
- passed.push(`sc_done`);
1287
- }
1288
- else {
1289
- throw new InternalCompilerError(`emitter bug: stream '${kind}' callback param ${i} has no adapter`);
1290
- }
1291
- }
1292
- const sigParams = ["ScrClosure *", ...declared.map((p) => cType(p).trim())].join(", ");
1293
- const unused = [];
1294
- if (declared.length < off + 1) {
1295
- if (kind === "r")
1296
- unused.push(` (void)sc_size;`);
1297
- if (kind === "w" || kind === "t")
1298
- unused.push(` (void)sc_chunk;`);
1299
- if (kind === "d" || kind === "e")
1300
- unused.push(` (void)sc_err;`);
1301
- }
1302
- if (!hasThis)
1303
- unused.push(` (void)sc_s;`); /* the done/err adapters may still read it */
1304
- // The call goes through the callback's TRUE signature; a non-void
1305
- // result is discarded (refcounted ones released) — Node ignores option
1306
- // callback results (`read: () => this.push(null)`).
1307
- const retC = cbT.ret.kind === "void" ? "void" : cType(cbT.ret).trim();
1308
- const invoke = `((${retC} (*)(${sigParams}))sc_cb->fn)(${passed.join(", ")})`;
1309
- emitter.walkerProtos.push(`static void ${sym}(ScrClosure *sc_cb, ${runtimeParams.join(", ")});`);
1310
- emitter.walkerDefs.push(`static void ${sym}(ScrClosure *sc_cb, ${runtimeParams.join(", ")}) {`, ...unused, ...body, ...(cbT.ret.kind === "void"
1311
- ? [` ${invoke};`]
1312
- : isRefCounted(cbT.ret)
1313
- ? [` ${retC} sc_r = ${invoke};`, ` if (sc_r) ${releaseCallC(cbT.ret, "sc_r")};`]
1314
- : [` (void)${invoke};`]), `}`, ``);
1315
- return sym;
1316
- }
1317
- //# sourceMappingURL=async.js.map