@scriptc/compiler 0.1.7 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1043) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +98 -39
  2. package/ambient/scriptc-overrides.d.ts +10 -6
  3. package/ambient/scriptc.d.ts +15 -0
  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 +108 -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/executable-features.d.ts +4 -0
  16. package/dist/backend/executable-features.js +42 -0
  17. package/dist/backend/executable-features.js.map +1 -0
  18. package/dist/backend/external-c.d.ts +5 -27
  19. package/dist/backend/external-c.js +5 -40
  20. package/dist/backend/external-c.js.map +1 -1
  21. package/dist/backend/ffi-callbacks.d.ts +2 -3
  22. package/dist/backend/ffi-callbacks.js +2 -3
  23. package/dist/backend/ffi-callbacks.js.map +1 -1
  24. package/dist/backend/library-identity-markers.d.ts +4 -9
  25. package/dist/backend/library-identity-markers.js +11 -49
  26. package/dist/backend/library-identity-markers.js.map +1 -1
  27. package/dist/backend/library-pack.d.ts +5 -0
  28. package/dist/backend/library-pack.js +123 -0
  29. package/dist/backend/library-pack.js.map +1 -0
  30. package/dist/backend/link-plan-core.d.ts +20 -0
  31. package/dist/backend/link-plan-core.js +18 -0
  32. package/dist/backend/link-plan-core.js.map +1 -0
  33. package/dist/backend/link-plan.d.ts +1 -1
  34. package/dist/backend/link-plan.js +16 -17
  35. package/dist/backend/link-plan.js.map +1 -1
  36. package/dist/backend/link-trace.d.ts +2 -0
  37. package/dist/backend/link-trace.js +24 -0
  38. package/dist/backend/link-trace.js.map +1 -0
  39. package/dist/backend/linker.js +1 -1
  40. package/dist/backend/linker.js.map +1 -1
  41. package/dist/backend/literals.d.ts +9 -0
  42. package/dist/backend/literals.js +35 -0
  43. package/dist/backend/literals.js.map +1 -0
  44. package/dist/backend/literals.test.d.ts +1 -0
  45. package/dist/backend/literals.test.js +53 -0
  46. package/dist/backend/literals.test.js.map +1 -0
  47. package/dist/backend/llvm/blocks.d.ts +2 -0
  48. package/dist/backend/llvm/blocks.js +9 -4
  49. package/dist/backend/llvm/blocks.js.map +1 -1
  50. package/dist/backend/llvm/blocks.test.d.ts +1 -0
  51. package/dist/backend/llvm/blocks.test.js +91 -0
  52. package/dist/backend/llvm/blocks.test.js.map +1 -0
  53. package/dist/backend/llvm/classes.d.ts +14 -8
  54. package/dist/backend/llvm/classes.js +88 -30
  55. package/dist/backend/llvm/classes.js.map +1 -1
  56. package/dist/backend/llvm/common.d.ts +5 -1
  57. package/dist/backend/llvm/common.js +45 -4
  58. package/dist/backend/llvm/common.js.map +1 -1
  59. package/dist/backend/llvm/debug-info.js +2 -7
  60. package/dist/backend/llvm/debug-info.js.map +1 -1
  61. package/dist/backend/llvm/debug-info.test.d.ts +1 -0
  62. package/dist/backend/llvm/debug-info.test.js +110 -0
  63. package/dist/backend/llvm/debug-info.test.js.map +1 -0
  64. package/dist/backend/llvm/dyn.d.ts +21 -2
  65. package/dist/backend/llvm/dyn.js +647 -251
  66. package/dist/backend/llvm/dyn.js.map +1 -1
  67. package/dist/backend/llvm/emitter.d.ts +596 -1
  68. package/dist/backend/llvm/emitter.js +769 -425
  69. package/dist/backend/llvm/emitter.js.map +1 -1
  70. package/dist/backend/llvm/emitter.test.d.ts +1 -0
  71. package/dist/backend/llvm/emitter.test.js +179 -0
  72. package/dist/backend/llvm/emitter.test.js.map +1 -0
  73. package/dist/backend/llvm/expr-async.js +23 -14
  74. package/dist/backend/llvm/expr-async.js.map +1 -1
  75. package/dist/backend/llvm/expr-bytes.d.ts +2 -2
  76. package/dist/backend/llvm/expr-bytes.js +60 -31
  77. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  78. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  79. package/dist/backend/llvm/expr-callbacks.js +25 -22
  80. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  81. package/dist/backend/llvm/expr-calls.js +136 -35
  82. package/dist/backend/llvm/expr-calls.js.map +1 -1
  83. package/dist/backend/llvm/expr-containers.d.ts +1 -1
  84. package/dist/backend/llvm/expr-containers.js +43 -14
  85. package/dist/backend/llvm/expr-containers.js.map +1 -1
  86. package/dist/backend/llvm/expr-context.d.ts +5 -260
  87. package/dist/backend/llvm/expr-control.js +10 -6
  88. package/dist/backend/llvm/expr-control.js.map +1 -1
  89. package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
  90. package/dist/backend/llvm/expr-dispatch.js +2 -0
  91. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  92. package/dist/backend/llvm/expr-dynamic.js +78 -81
  93. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  94. package/dist/backend/llvm/expr-island.d.ts +1 -1
  95. package/dist/backend/llvm/expr-island.js +11 -7
  96. package/dist/backend/llvm/expr-island.js.map +1 -1
  97. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  98. package/dist/backend/llvm/expr-primitives.js +62 -31
  99. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  100. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  101. package/dist/backend/llvm/expr-records.d.ts +5 -1
  102. package/dist/backend/llvm/expr-records.js +54 -7
  103. package/dist/backend/llvm/expr-records.js.map +1 -1
  104. package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
  105. package/dist/backend/llvm/expr-stream-bridges.js +220 -131
  106. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  107. package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
  108. package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
  109. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
  110. package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
  111. package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
  112. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  113. package/dist/backend/llvm/layouts.d.ts +19 -0
  114. package/dist/backend/llvm/layouts.js +12 -0
  115. package/dist/backend/llvm/layouts.js.map +1 -0
  116. package/dist/backend/llvm/lib-abi.d.ts +19 -0
  117. package/dist/backend/llvm/lib-abi.js +82 -0
  118. package/dist/backend/llvm/lib-abi.js.map +1 -0
  119. package/dist/backend/llvm/lib-connect.d.ts +2 -0
  120. package/dist/backend/llvm/lib-connect.js +51 -0
  121. package/dist/backend/llvm/lib-connect.js.map +1 -0
  122. package/dist/backend/llvm/lib-datagram.d.ts +2 -0
  123. package/dist/backend/llvm/lib-datagram.js +135 -0
  124. package/dist/backend/llvm/lib-datagram.js.map +1 -0
  125. package/dist/backend/llvm/lib-dispatch.js +50 -6
  126. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  127. package/dist/backend/llvm/lib-filesystem.js +30 -18
  128. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  129. package/dist/backend/llvm/lib-http2.d.ts +2 -0
  130. package/dist/backend/llvm/lib-http2.js +215 -0
  131. package/dist/backend/llvm/lib-http2.js.map +1 -0
  132. package/dist/backend/llvm/lib-lookup.d.ts +2 -0
  133. package/dist/backend/llvm/lib-lookup.js +39 -0
  134. package/dist/backend/llvm/lib-lookup.js.map +1 -0
  135. package/dist/backend/llvm/lib-network.js +25 -2
  136. package/dist/backend/llvm/lib-network.js.map +1 -1
  137. package/dist/backend/llvm/lib-process.js +44 -19
  138. package/dist/backend/llvm/lib-process.js.map +1 -1
  139. package/dist/backend/llvm/lib-shared.js +162 -3
  140. package/dist/backend/llvm/lib-shared.js.map +1 -1
  141. package/dist/backend/llvm/lib-stream.js +3 -2
  142. package/dist/backend/llvm/lib-stream.js.map +1 -1
  143. package/dist/backend/llvm/lib-test.d.ts +2 -0
  144. package/dist/backend/llvm/lib-test.js +34 -0
  145. package/dist/backend/llvm/lib-test.js.map +1 -0
  146. package/dist/backend/llvm/lib-tls.d.ts +2 -0
  147. package/dist/backend/llvm/lib-tls.js +82 -0
  148. package/dist/backend/llvm/lib-tls.js.map +1 -0
  149. package/dist/backend/llvm/shapes.d.ts +10 -9
  150. package/dist/backend/llvm/shapes.js +42 -131
  151. package/dist/backend/llvm/shapes.js.map +1 -1
  152. package/dist/backend/llvm/unsupported.d.ts +1 -0
  153. package/dist/backend/llvm/unsupported.js +1 -2
  154. package/dist/backend/llvm/unsupported.js.map +1 -1
  155. package/dist/backend/llvm/walkers.js +1 -7
  156. package/dist/backend/llvm/walkers.js.map +1 -1
  157. package/dist/backend/mangle.d.ts +2 -2
  158. package/dist/backend/mangle.js +16 -5
  159. package/dist/backend/mangle.js.map +1 -1
  160. package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
  161. package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
  162. package/dist/backend/may-throw.js.map +1 -0
  163. package/dist/backend/may-throw.test.d.ts +1 -0
  164. package/dist/backend/may-throw.test.js +58 -0
  165. package/dist/backend/may-throw.test.js.map +1 -0
  166. package/dist/backend/native-codegen-core.d.ts +22 -0
  167. package/dist/backend/native-codegen-core.js +44 -0
  168. package/dist/backend/native-codegen-core.js.map +1 -0
  169. package/dist/backend/native-codegen.d.ts +3 -19
  170. package/dist/backend/native-codegen.js +5 -44
  171. package/dist/backend/native-codegen.js.map +1 -1
  172. package/dist/backend/native-codegen.test.js +2 -2
  173. package/dist/backend/native-codegen.test.js.map +1 -1
  174. package/dist/backend/native-link-info-core.d.ts +94 -0
  175. package/dist/backend/native-link-info-core.js +62 -0
  176. package/dist/backend/native-link-info-core.js.map +1 -0
  177. package/dist/backend/native-link-info.d.ts +3 -88
  178. package/dist/backend/native-link-info.js +12 -243
  179. package/dist/backend/native-link-info.js.map +1 -1
  180. package/dist/backend/native-link-info.test.js +41 -146
  181. package/dist/backend/native-link-info.test.js.map +1 -1
  182. package/dist/backend/native-toolchain.d.ts +12 -30
  183. package/dist/backend/native-toolchain.js +83 -233
  184. package/dist/backend/native-toolchain.js.map +1 -1
  185. package/dist/backend/native-toolchain.test.js +77 -5
  186. package/dist/backend/native-toolchain.test.js.map +1 -1
  187. package/dist/backend/native-tools.d.ts +24 -0
  188. package/dist/backend/native-tools.js +33 -0
  189. package/dist/backend/native-tools.js.map +1 -0
  190. package/dist/backend/object-localize.js +19 -8
  191. package/dist/backend/object-localize.js.map +1 -1
  192. package/dist/backend/object-localize.test.js +22 -0
  193. package/dist/backend/object-localize.test.js.map +1 -1
  194. package/dist/backend/runtime-abi.d.ts +2 -2
  195. package/dist/backend/runtime-abi.js +2 -2
  196. package/dist/backend/runtime-pack-core.d.ts +101 -0
  197. package/dist/backend/runtime-pack-core.js +172 -0
  198. package/dist/backend/runtime-pack-core.js.map +1 -0
  199. package/dist/backend/runtime-pack-native.d.ts +21 -0
  200. package/dist/backend/runtime-pack-native.js +73 -0
  201. package/dist/backend/runtime-pack-native.js.map +1 -0
  202. package/dist/backend/runtime-pack-targets.test.js +1 -1
  203. package/dist/backend/runtime-pack.d.ts +3 -83
  204. package/dist/backend/runtime-pack.js +8 -151
  205. package/dist/backend/runtime-pack.js.map +1 -1
  206. package/dist/backend/runtime-pack.test.js +24 -1
  207. package/dist/backend/runtime-pack.test.js.map +1 -1
  208. package/dist/backend/target-diagnostics.d.ts +22 -0
  209. package/dist/backend/target-diagnostics.js +108 -0
  210. package/dist/backend/target-diagnostics.js.map +1 -0
  211. package/dist/backend/target-platform.d.ts +15 -0
  212. package/dist/backend/target-platform.js +72 -0
  213. package/dist/backend/target-platform.js.map +1 -0
  214. package/dist/backend/targets.d.ts +13 -4
  215. package/dist/backend/targets.js +103 -34
  216. package/dist/backend/targets.js.map +1 -1
  217. package/dist/backend/targets.test.js +72 -4
  218. package/dist/backend/targets.test.js.map +1 -1
  219. package/dist/backend/toolchain-environment.d.ts +6 -0
  220. package/dist/backend/toolchain-environment.js +99 -0
  221. package/dist/backend/toolchain-environment.js.map +1 -0
  222. package/dist/backend/vendor-archives.d.ts +1 -9
  223. package/dist/backend/vendor-archives.js +2 -9
  224. package/dist/backend/vendor-archives.js.map +1 -1
  225. package/dist/backend/vendor-inputs.d.ts +9 -0
  226. package/dist/backend/vendor-inputs.js +10 -0
  227. package/dist/backend/vendor-inputs.js.map +1 -0
  228. package/dist/backend/warm-cache.d.ts +3 -0
  229. package/dist/backend/warm-cache.js +41 -0
  230. package/dist/backend/warm-cache.js.map +1 -0
  231. package/dist/cli/command.d.ts +3 -0
  232. package/dist/cli/command.js +328 -0
  233. package/dist/cli/command.js.map +1 -0
  234. package/dist/cli/host.d.ts +24 -0
  235. package/dist/cli/host.js +2 -0
  236. package/dist/cli/host.js.map +1 -0
  237. package/dist/cli/output-options.d.ts +26 -0
  238. package/dist/cli/output-options.js +60 -0
  239. package/dist/cli/output-options.js.map +1 -0
  240. package/dist/cli/paths.d.ts +12 -0
  241. package/dist/cli/paths.js +42 -0
  242. package/dist/cli/paths.js.map +1 -0
  243. package/dist/cli/usage.d.ts +74 -0
  244. package/dist/cli/usage.js +86 -0
  245. package/dist/cli/usage.js.map +1 -0
  246. package/dist/cli/wasi-paths.d.ts +8 -0
  247. package/dist/cli/wasi-paths.js +41 -0
  248. package/dist/cli/wasi-paths.js.map +1 -0
  249. package/dist/cli/wasi-runner.d.ts +2 -0
  250. package/dist/cli/wasi-runner.js +28 -0
  251. package/dist/cli/wasi-runner.js.map +1 -0
  252. package/dist/compat/fetch-profile.js +37 -7
  253. package/dist/compat/fetch-profile.js.map +1 -1
  254. package/dist/compile-types.d.ts +162 -0
  255. package/dist/compile-types.js +2 -0
  256. package/dist/compile-types.js.map +1 -0
  257. package/dist/coverage/report.js +11 -5
  258. package/dist/coverage/report.js.map +1 -1
  259. package/dist/coverage/surface-manifest.js +5 -2
  260. package/dist/coverage/surface-manifest.js.map +1 -1
  261. package/dist/diagnostics/diagnostic.js +5 -10
  262. package/dist/diagnostics/diagnostic.js.map +1 -1
  263. package/dist/executable/executable-cache.d.ts +3 -4
  264. package/dist/executable/executable-cache.js +5 -6
  265. package/dist/executable/executable-cache.js.map +1 -1
  266. package/dist/executable/executable-cache.test.js +16 -17
  267. package/dist/executable/executable-cache.test.js.map +1 -1
  268. package/dist/executable/prepare.d.ts +14 -0
  269. package/dist/executable/prepare.js +66 -0
  270. package/dist/executable/prepare.js.map +1 -0
  271. package/dist/ffi/ffi-manifest.d.ts +11 -4
  272. package/dist/ffi/ffi-manifest.js +170 -58
  273. package/dist/ffi/ffi-manifest.js.map +1 -1
  274. package/dist/ffi/ffi-manifest.test.d.ts +1 -0
  275. package/dist/ffi/ffi-manifest.test.js +111 -0
  276. package/dist/ffi/ffi-manifest.test.js.map +1 -0
  277. package/dist/format-integer.d.ts +3 -0
  278. package/dist/format-integer.js +14 -0
  279. package/dist/format-integer.js.map +1 -0
  280. package/dist/frontend/analysis.d.ts +5 -0
  281. package/dist/frontend/analysis.js +88 -0
  282. package/dist/frontend/analysis.js.map +1 -0
  283. package/dist/frontend/arguments-usage.d.ts +1 -3
  284. package/dist/frontend/arguments-usage.js.map +1 -1
  285. package/dist/frontend/builtin-modules.d.ts +1 -1
  286. package/dist/frontend/builtin-modules.js +1 -1
  287. package/dist/frontend/builtin-modules.js.map +1 -1
  288. package/dist/frontend/cjs-lexer.d.ts +4 -25
  289. package/dist/frontend/cjs-lexer.js +6 -806
  290. package/dist/frontend/cjs-lexer.js.map +1 -1
  291. package/dist/frontend/cjs-resolve.d.ts +5 -0
  292. package/dist/frontend/cjs-resolve.js +429 -0
  293. package/dist/frontend/cjs-resolve.js.map +1 -0
  294. package/dist/frontend/cjs-syntax.d.ts +26 -0
  295. package/dist/frontend/cjs-syntax.js +806 -0
  296. package/dist/frontend/cjs-syntax.js.map +1 -0
  297. package/dist/frontend/comptime-node.d.ts +4 -0
  298. package/dist/frontend/comptime-node.js +16 -0
  299. package/dist/frontend/comptime-node.js.map +1 -0
  300. package/dist/frontend/comptime-node.test.d.ts +1 -0
  301. package/dist/frontend/comptime-node.test.js +37 -0
  302. package/dist/frontend/comptime-node.test.js.map +1 -0
  303. package/dist/frontend/dts-paths.d.ts +3 -4
  304. package/dist/frontend/dts-paths.js +15 -8
  305. package/dist/frontend/dts-paths.js.map +1 -1
  306. package/dist/frontend/fork-target.js +2 -2
  307. package/dist/frontend/fork-target.js.map +1 -1
  308. package/dist/frontend/helper-tokens.d.ts +1 -0
  309. package/dist/frontend/helper-tokens.js +147 -0
  310. package/dist/frontend/helper-tokens.js.map +1 -0
  311. package/dist/frontend/helper-tokens.test.d.ts +1 -0
  312. package/dist/frontend/helper-tokens.test.js +35 -0
  313. package/dist/frontend/helper-tokens.test.js.map +1 -0
  314. package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
  315. package/dist/frontend/inferred-js-diagnostics.js +69 -0
  316. package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
  317. package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
  318. package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
  319. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
  320. package/dist/frontend/input-tracker.d.ts +5 -2
  321. package/dist/frontend/input-tracker.js +24 -3
  322. package/dist/frontend/input-tracker.js.map +1 -1
  323. package/dist/frontend/input-tracker.test.js +23 -0
  324. package/dist/frontend/input-tracker.test.js.map +1 -1
  325. package/dist/frontend/lib-contract.js +32 -24
  326. package/dist/frontend/lib-contract.js.map +1 -1
  327. package/dist/frontend/literal-values.d.ts +4 -0
  328. package/dist/frontend/literal-values.js +21 -0
  329. package/dist/frontend/literal-values.js.map +1 -0
  330. package/dist/frontend/literal-values.test.d.ts +1 -0
  331. package/dist/frontend/literal-values.test.js +91 -0
  332. package/dist/frontend/literal-values.test.js.map +1 -0
  333. package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
  334. package/dist/frontend/lowering/abstract-equality.js +3 -0
  335. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  336. package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
  337. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  338. package/dist/frontend/lowering/array-values.d.ts +4 -1
  339. package/dist/frontend/lowering/array-values.js +43 -1
  340. package/dist/frontend/lowering/array-values.js.map +1 -1
  341. package/dist/frontend/lowering/callback-arg.js +1 -0
  342. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  343. package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
  344. package/dist/frontend/lowering/class-callbacks.js +74 -0
  345. package/dist/frontend/lowering/class-callbacks.js.map +1 -0
  346. package/dist/frontend/lowering/class-construction.d.ts +12 -0
  347. package/dist/frontend/lowering/class-construction.js +156 -0
  348. package/dist/frontend/lowering/class-construction.js.map +1 -0
  349. package/dist/frontend/lowering/class-descriptors.d.ts +10 -0
  350. package/dist/frontend/lowering/class-descriptors.js +114 -0
  351. package/dist/frontend/lowering/class-descriptors.js.map +1 -0
  352. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +51 -0
  353. package/dist/frontend/lowering/class-dynamic-dispatch.js +1158 -0
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
  355. package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +93 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
  358. package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
  359. package/dist/frontend/lowering/class-instance-constructor.js +67 -0
  360. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
  361. package/dist/frontend/lowering/class-method-values.d.ts +13 -0
  362. package/dist/frontend/lowering/class-method-values.js +235 -0
  363. package/dist/frontend/lowering/class-method-values.js.map +1 -0
  364. package/dist/frontend/lowering/class-prototypes.d.ts +19 -0
  365. package/dist/frontend/lowering/class-prototypes.js +242 -0
  366. package/dist/frontend/lowering/class-prototypes.js.map +1 -0
  367. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  368. package/dist/frontend/lowering/class-runtime-statics.js +66 -0
  369. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
  370. package/dist/frontend/lowering/class-static-data.d.ts +6 -0
  371. package/dist/frontend/lowering/class-static-data.js +56 -0
  372. package/dist/frontend/lowering/class-static-data.js.map +1 -0
  373. package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
  374. package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
  375. package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
  376. package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
  377. package/dist/frontend/lowering/containers/bytes.js +208 -163
  378. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  379. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
  380. package/dist/frontend/lowering/containers/string-and-regexp.js +58 -63
  381. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  382. package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
  383. package/dist/frontend/lowering/containers/string-replacement.js +217 -0
  384. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
  385. package/dist/frontend/lowering/error-methods.d.ts +14 -0
  386. package/dist/frontend/lowering/error-methods.js +177 -0
  387. package/dist/frontend/lowering/error-methods.js.map +1 -0
  388. package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
  389. package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
  390. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
  391. package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
  392. package/dist/frontend/lowering/expressions/native-proxy.js +51 -0
  393. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
  394. package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
  395. package/dist/frontend/lowering/expressions/nullish-assignment.js +132 -0
  396. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
  397. package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
  398. package/dist/frontend/lowering/expressions/object-literals.js +509 -183
  399. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  400. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
  401. package/dist/frontend/lowering/expressions/optional-chains.js +88 -24
  402. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  403. package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
  404. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
  405. package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
  406. package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
  407. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
  408. package/dist/frontend/lowering/function-context.d.ts +101 -0
  409. package/dist/frontend/lowering/function-context.js +109 -0
  410. package/dist/frontend/lowering/function-context.js.map +1 -0
  411. package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
  412. package/dist/frontend/lowering/generator-delegation.js +85 -0
  413. package/dist/frontend/lowering/generator-delegation.js.map +1 -0
  414. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +11 -0
  415. package/dist/frontend/lowering/generator-dynamic-dispatch.js +143 -0
  416. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
  417. package/dist/frontend/lowering/lib-boundary.d.ts +4 -1
  418. package/dist/frontend/lowering/lib-boundary.js +112 -20
  419. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  420. package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
  421. package/dist/frontend/lowering/lib-boundary.test.js +45 -0
  422. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
  423. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  424. package/dist/frontend/lowering/lower-assert.d.ts +1 -1
  425. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  426. package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
  427. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  428. package/dist/frontend/lowering/lower-builtin-values.d.ts +18 -0
  429. package/dist/frontend/lowering/lower-builtin-values.js +249 -0
  430. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
  431. package/dist/frontend/lowering/lower-builtins.d.ts +33 -46
  432. package/dist/frontend/lowering/lower-builtins.js +676 -365
  433. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  434. package/dist/frontend/lowering/lower-calls.d.ts +28 -22
  435. package/dist/frontend/lowering/lower-calls.js +1660 -412
  436. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  437. package/dist/frontend/lowering/lower-classes.d.ts +95 -57
  438. package/dist/frontend/lowering/lower-classes.js +1491 -404
  439. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  440. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  441. package/dist/frontend/lowering/lower-comptime.js +23 -32
  442. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  443. package/dist/frontend/lowering/lower-containers.d.ts +36 -32
  444. package/dist/frontend/lowering/lower-containers.js +925 -181
  445. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  446. package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
  447. package/dist/frontend/lowering/lower-dgram.js +3 -2
  448. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  449. package/dist/frontend/lowering/lower-enums.d.ts +1 -1
  450. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  451. package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
  452. package/dist/frontend/lowering/lower-event-emitter.js +58 -26
  453. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  454. package/dist/frontend/lowering/lower-expando.d.ts +7 -1
  455. package/dist/frontend/lowering/lower-expando.js +14 -6
  456. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  457. package/dist/frontend/lowering/lower-exprs.d.ts +37 -13
  458. package/dist/frontend/lowering/lower-exprs.js +2163 -863
  459. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  460. package/dist/frontend/lowering/lower-generators.d.ts +2 -5
  461. package/dist/frontend/lowering/lower-generators.js +88 -46
  462. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  463. package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
  464. package/dist/frontend/lowering/lower-global-value.js +17 -0
  465. package/dist/frontend/lowering/lower-global-value.js.map +1 -0
  466. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  467. package/dist/frontend/lowering/lower-inspect.js +17 -8
  468. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  469. package/dist/frontend/lowering/lower-island.d.ts +7 -8
  470. package/dist/frontend/lowering/lower-island.js +66 -33
  471. package/dist/frontend/lowering/lower-island.js.map +1 -1
  472. package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
  473. package/dist/frontend/lowering/lower-mixins.js +5 -3
  474. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  475. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  476. package/dist/frontend/lowering/lower-modules.js +445 -39
  477. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  478. package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
  479. package/dist/frontend/lowering/lower-modules.test.js +39 -0
  480. package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
  481. package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
  482. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  483. package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
  484. package/dist/frontend/lowering/lower-node-module.js +13 -10
  485. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  486. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  487. package/dist/frontend/lowering/lower-server.js +6 -10
  488. package/dist/frontend/lowering/lower-server.js.map +1 -1
  489. package/dist/frontend/lowering/lower-stmts.d.ts +17 -17
  490. package/dist/frontend/lowering/lower-stmts.js +855 -514
  491. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  492. package/dist/frontend/lowering/lower-stream.d.ts +1 -1
  493. package/dist/frontend/lowering/lower-stream.js +20 -11
  494. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  495. package/dist/frontend/lowering/lower-test.d.ts +1 -1
  496. package/dist/frontend/lowering/lower-test.js.map +1 -1
  497. package/dist/frontend/lowering/lower-url.d.ts +6 -0
  498. package/dist/frontend/lowering/lower-url.js +77 -0
  499. package/dist/frontend/lowering/lower-url.js.map +1 -0
  500. package/dist/frontend/lowering/lowerer.d.ts +140 -190
  501. package/dist/frontend/lowering/lowerer.js +1193 -712
  502. package/dist/frontend/lowering/lowerer.js.map +1 -1
  503. package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
  504. package/dist/frontend/lowering/lowerer.test.js +172 -0
  505. package/dist/frontend/lowering/lowerer.test.js.map +1 -0
  506. package/dist/frontend/lowering/native-ffi.d.ts +5 -0
  507. package/dist/frontend/lowering/native-ffi.js +40 -0
  508. package/dist/frontend/lowering/native-ffi.js.map +1 -0
  509. package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
  510. package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
  511. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
  512. package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
  513. package/dist/frontend/lowering/object-factory-new.js +68 -0
  514. package/dist/frontend/lowering/object-factory-new.js.map +1 -0
  515. package/dist/frontend/lowering/optional-arguments.js +6 -1
  516. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  517. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  518. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  519. package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
  520. package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
  521. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
  522. package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
  523. package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
  524. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
  525. package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
  526. package/dist/frontend/lowering/sanitize-class-types.js +79 -0
  527. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
  528. package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
  529. package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
  530. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
  531. package/dist/frontend/lowering/static-this.d.ts +5 -1
  532. package/dist/frontend/lowering/static-this.js +28 -2
  533. package/dist/frontend/lowering/static-this.js.map +1 -1
  534. package/dist/frontend/lowering/string-index.d.ts +7 -0
  535. package/dist/frontend/lowering/string-index.js +39 -0
  536. package/dist/frontend/lowering/string-index.js.map +1 -0
  537. package/dist/frontend/lowering/surfaces.d.ts +10 -3
  538. package/dist/frontend/lowering/surfaces.js +86 -37
  539. package/dist/frontend/lowering/surfaces.js.map +1 -1
  540. package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
  541. package/dist/frontend/lowering/symbol-fields.js +183 -0
  542. package/dist/frontend/lowering/symbol-fields.js.map +1 -0
  543. package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
  544. package/dist/frontend/lowering/symbol-methods.js +30 -0
  545. package/dist/frontend/lowering/symbol-methods.js.map +1 -0
  546. package/dist/frontend/lowering/text-decoder-encoding.d.ts +12 -0
  547. package/dist/frontend/lowering/text-decoder-encoding.js +82 -0
  548. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
  549. package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
  550. package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
  551. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
  552. package/dist/frontend/lowering/union-narrow.d.ts +9 -0
  553. package/dist/frontend/lowering/union-narrow.js +59 -0
  554. package/dist/frontend/lowering/union-narrow.js.map +1 -0
  555. package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
  556. package/dist/frontend/lowering/union-narrow.test.js +72 -0
  557. package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
  558. package/dist/frontend/lowering/union-retag.d.ts +43 -0
  559. package/dist/frontend/lowering/union-retag.js +259 -0
  560. package/dist/frontend/lowering/union-retag.js.map +1 -0
  561. package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
  562. package/dist/frontend/lowering/union-retag.test.js +405 -0
  563. package/dist/frontend/lowering/union-retag.test.js.map +1 -0
  564. package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
  565. package/dist/frontend/lowering/unregistered-class-types.js +94 -0
  566. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
  567. package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
  568. package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
  569. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
  570. package/dist/frontend/lowering/width-lift.d.ts +40 -0
  571. package/dist/frontend/lowering/width-lift.js +2 -0
  572. package/dist/frontend/lowering/width-lift.js.map +1 -0
  573. package/dist/frontend/module-syntax.d.ts +58 -0
  574. package/dist/frontend/module-syntax.js +123 -0
  575. package/dist/frontend/module-syntax.js.map +1 -0
  576. package/dist/frontend/module-syntax.test.d.ts +1 -0
  577. package/dist/frontend/module-syntax.test.js +78 -0
  578. package/dist/frontend/module-syntax.test.js.map +1 -0
  579. package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
  580. package/dist/frontend/npm-fetch-analysis.js +100 -0
  581. package/dist/frontend/npm-fetch-analysis.js.map +1 -0
  582. package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
  583. package/dist/frontend/npm-fetch-analysis.test.js +107 -0
  584. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
  585. package/dist/frontend/npm-fetch-node.d.ts +2 -0
  586. package/dist/frontend/npm-fetch-node.js +12 -0
  587. package/dist/frontend/npm-fetch-node.js.map +1 -0
  588. package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
  589. package/dist/frontend/npm-fetch-syntax.js +207 -0
  590. package/dist/frontend/npm-fetch-syntax.js.map +1 -0
  591. package/dist/frontend/npm-node.d.ts +10 -0
  592. package/dist/frontend/npm-node.js +14 -0
  593. package/dist/frontend/npm-node.js.map +1 -0
  594. package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
  595. package/dist/frontend/npm-static-bundled-cjs.js +236 -0
  596. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
  597. package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
  598. package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
  599. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
  600. package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
  601. package/dist/frontend/npm-static-declaration-syntax.js +944 -0
  602. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
  603. package/dist/frontend/npm-static-declarations.d.ts +11 -39
  604. package/dist/frontend/npm-static-declarations.js +22 -561
  605. package/dist/frontend/npm-static-declarations.js.map +1 -1
  606. package/dist/frontend/npm-static-declarations.test.js +245 -6
  607. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  608. package/dist/frontend/npm-static-prune.d.ts +1 -1
  609. package/dist/frontend/npm-static-prune.js +121 -38
  610. package/dist/frontend/npm-static-prune.js.map +1 -1
  611. package/dist/frontend/npm-static-prune.test.js +9 -1
  612. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  613. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
  614. package/dist/frontend/npm-static-rewrite-host.js +179 -0
  615. package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
  616. package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
  617. package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
  618. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
  619. package/dist/frontend/npm-static-rewrite.d.ts +0 -5
  620. package/dist/frontend/npm-static-rewrite.js +2 -1079
  621. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  622. package/dist/frontend/npm-static-subtyping.d.ts +5 -0
  623. package/dist/frontend/npm-static-subtyping.js +55 -0
  624. package/dist/frontend/npm-static-subtyping.js.map +1 -0
  625. package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
  626. package/dist/frontend/npm-static-subtyping.test.js +58 -0
  627. package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
  628. package/dist/frontend/npm-static.d.ts +7 -15
  629. package/dist/frontend/npm-static.js +19 -28
  630. package/dist/frontend/npm-static.js.map +1 -1
  631. package/dist/frontend/npm.d.ts +8 -69
  632. package/dist/frontend/npm.js +21 -361
  633. package/dist/frontend/npm.js.map +1 -1
  634. package/dist/frontend/npm.test.js +2 -2
  635. package/dist/frontend/npm.test.js.map +1 -1
  636. package/dist/frontend/pipeline-native.d.ts +6 -0
  637. package/dist/frontend/pipeline-native.js +32 -0
  638. package/dist/frontend/pipeline-native.js.map +1 -0
  639. package/dist/frontend/pipeline.d.ts +54 -0
  640. package/dist/frontend/pipeline.js +382 -0
  641. package/dist/frontend/pipeline.js.map +1 -0
  642. package/dist/frontend/pipeline.test.d.ts +1 -0
  643. package/dist/frontend/pipeline.test.js +77 -0
  644. package/dist/frontend/pipeline.test.js.map +1 -0
  645. package/dist/frontend/program-analysis.d.ts +10 -0
  646. package/dist/frontend/program-analysis.js +14 -0
  647. package/dist/frontend/program-analysis.js.map +1 -0
  648. package/dist/frontend/program-node.d.ts +9 -0
  649. package/dist/frontend/program-node.js +48 -0
  650. package/dist/frontend/program-node.js.map +1 -0
  651. package/dist/frontend/program.d.ts +39 -20
  652. package/dist/frontend/program.js +393 -189
  653. package/dist/frontend/program.js.map +1 -1
  654. package/dist/frontend/program.test.js +105 -2
  655. package/dist/frontend/program.test.js.map +1 -1
  656. package/dist/frontend/provenance-core.d.ts +9 -0
  657. package/dist/frontend/provenance-core.js +435 -0
  658. package/dist/frontend/provenance-core.js.map +1 -0
  659. package/dist/frontend/provenance.d.ts +0 -4
  660. package/dist/frontend/provenance.js +4 -459
  661. package/dist/frontend/provenance.js.map +1 -1
  662. package/dist/frontend/resolve.d.ts +3 -1
  663. package/dist/frontend/resolve.js +6 -3
  664. package/dist/frontend/resolve.js.map +1 -1
  665. package/dist/frontend/runtime-resolve.d.ts +4 -3
  666. package/dist/frontend/runtime-resolve.js +22 -18
  667. package/dist/frontend/runtime-resolve.js.map +1 -1
  668. package/dist/frontend/runtime-resolve.test.js +53 -0
  669. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  670. package/dist/frontend/services-node.d.ts +5 -0
  671. package/dist/frontend/services-node.js +19 -0
  672. package/dist/frontend/services-node.js.map +1 -0
  673. package/dist/frontend/services-node.test.d.ts +1 -0
  674. package/dist/frontend/services-node.test.js +70 -0
  675. package/dist/frontend/services-node.test.js.map +1 -0
  676. package/dist/frontend/services.d.ts +44 -0
  677. package/dist/frontend/services.js +90 -0
  678. package/dist/frontend/services.js.map +1 -0
  679. package/dist/frontend/services.test.d.ts +1 -0
  680. package/dist/frontend/services.test.js +174 -0
  681. package/dist/frontend/services.test.js.map +1 -0
  682. package/dist/frontend/ts7/adapter.d.ts +3 -3
  683. package/dist/frontend/ts7/adapter.js +14 -31
  684. package/dist/frontend/ts7/adapter.js.map +1 -1
  685. package/dist/frontend/ts7/api.d.ts +16 -0
  686. package/dist/frontend/ts7/api.js +24 -0
  687. package/dist/frontend/ts7/api.js.map +1 -0
  688. package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
  689. package/dist/frontend/ts7/ast-bytes.js +137 -0
  690. package/dist/frontend/ts7/ast-bytes.js.map +1 -0
  691. package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
  692. package/dist/frontend/ts7/ast-bytes.test.js +73 -0
  693. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
  694. package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
  695. package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
  696. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
  697. package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
  698. package/dist/frontend/ts7/ast-guards.test.js +43 -0
  699. package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
  700. package/dist/frontend/ts7/ast-node.d.ts +194 -0
  701. package/dist/frontend/ts7/ast-node.js +448 -0
  702. package/dist/frontend/ts7/ast-node.js.map +1 -0
  703. package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
  704. package/dist/frontend/ts7/ast-node.test.js +266 -0
  705. package/dist/frontend/ts7/ast-node.test.js.map +1 -0
  706. package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
  707. package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
  708. package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
  709. package/dist/frontend/ts7/ast-text.d.ts +6 -0
  710. package/dist/frontend/ts7/ast-text.js +124 -0
  711. package/dist/frontend/ts7/ast-text.js.map +1 -0
  712. package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
  713. package/dist/frontend/ts7/ast-text.test.js +38 -0
  714. package/dist/frontend/ts7/ast-text.test.js.map +1 -0
  715. package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
  716. package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
  717. package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
  718. package/dist/frontend/ts7/ast-types.d.ts +42 -0
  719. package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
  720. package/dist/frontend/ts7/ast-types.generated.js +5 -0
  721. package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
  722. package/dist/frontend/ts7/ast-types.js +3 -0
  723. package/dist/frontend/ts7/ast-types.js.map +1 -0
  724. package/dist/frontend/ts7/ast-wire.d.ts +58 -0
  725. package/dist/frontend/ts7/ast-wire.js +267 -0
  726. package/dist/frontend/ts7/ast-wire.js.map +1 -0
  727. package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
  728. package/dist/frontend/ts7/ast-wire.test.js +151 -0
  729. package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
  730. package/dist/frontend/ts7/ast.d.ts +14 -14
  731. package/dist/frontend/ts7/ast.js +25 -18
  732. package/dist/frontend/ts7/ast.js.map +1 -1
  733. package/dist/frontend/ts7/census-check.js +1 -0
  734. package/dist/frontend/ts7/census-check.js.map +1 -1
  735. package/dist/frontend/ts7/checker-cache.d.ts +48 -0
  736. package/dist/frontend/ts7/checker-cache.js +92 -0
  737. package/dist/frontend/ts7/checker-cache.js.map +1 -0
  738. package/dist/frontend/ts7/checker.d.ts +19 -46
  739. package/dist/frontend/ts7/checker.js +231 -161
  740. package/dist/frontend/ts7/checker.js.map +1 -1
  741. package/dist/frontend/ts7/checker.test.d.ts +1 -0
  742. package/dist/frontend/ts7/checker.test.js +335 -0
  743. package/dist/frontend/ts7/checker.test.js.map +1 -0
  744. package/dist/frontend/ts7/enums.d.ts +4 -27
  745. package/dist/frontend/ts7/enums.generated.d.ts +878 -0
  746. package/dist/frontend/ts7/enums.generated.js +1313 -0
  747. package/dist/frontend/ts7/enums.generated.js.map +1 -0
  748. package/dist/frontend/ts7/enums.js +4 -45
  749. package/dist/frontend/ts7/enums.js.map +1 -1
  750. package/dist/frontend/ts7/enums.test.d.ts +1 -0
  751. package/dist/frontend/ts7/enums.test.js +48 -0
  752. package/dist/frontend/ts7/enums.test.js.map +1 -0
  753. package/dist/frontend/ts7/native-api.d.ts +10 -0
  754. package/dist/frontend/ts7/native-api.js +10 -0
  755. package/dist/frontend/ts7/native-api.js.map +1 -0
  756. package/dist/frontend/ts7/native-host.d.ts +2 -0
  757. package/dist/frontend/ts7/native-host.js +11 -0
  758. package/dist/frontend/ts7/native-host.js.map +1 -0
  759. package/dist/frontend/ts7/native-process.d.ts +14 -0
  760. package/dist/frontend/ts7/native-process.js +62 -0
  761. package/dist/frontend/ts7/native-process.js.map +1 -0
  762. package/dist/frontend/ts7/program-adapter.d.ts +10 -98
  763. package/dist/frontend/ts7/program-adapter.js +16 -310
  764. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  765. package/dist/frontend/ts7/program-host.d.ts +115 -0
  766. package/dist/frontend/ts7/program-host.js +347 -0
  767. package/dist/frontend/ts7/program-host.js.map +1 -0
  768. package/dist/frontend/ts7/program-host.test.d.ts +1 -0
  769. package/dist/frontend/ts7/program-host.test.js +207 -0
  770. package/dist/frontend/ts7/program-host.test.js.map +1 -0
  771. package/dist/frontend/ts7/rpc-api.d.ts +12 -0
  772. package/dist/frontend/ts7/rpc-api.js +23 -0
  773. package/dist/frontend/ts7/rpc-api.js.map +1 -0
  774. package/dist/frontend/ts7/rpc-client.d.ts +27 -0
  775. package/dist/frontend/ts7/rpc-client.js +102 -0
  776. package/dist/frontend/ts7/rpc-client.js.map +1 -0
  777. package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
  778. package/dist/frontend/ts7/rpc-client.test.js +133 -0
  779. package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
  780. package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
  781. package/dist/frontend/ts7/rpc-filesystem.js +42 -0
  782. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
  783. package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
  784. package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
  785. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
  786. package/dist/frontend/ts7/rpc-process.d.ts +2 -0
  787. package/dist/frontend/ts7/rpc-process.js +148 -0
  788. package/dist/frontend/ts7/rpc-process.js.map +1 -0
  789. package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
  790. package/dist/frontend/ts7/rpc-process.test.js +29 -0
  791. package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
  792. package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
  793. package/dist/frontend/ts7/rpc-wire.js +195 -0
  794. package/dist/frontend/ts7/rpc-wire.js.map +1 -0
  795. package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
  796. package/dist/frontend/ts7/rpc-wire.test.js +168 -0
  797. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
  798. package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
  799. package/dist/frontend/ts7/semantic-checker.js +221 -0
  800. package/dist/frontend/ts7/semantic-checker.js.map +1 -0
  801. package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
  802. package/dist/frontend/ts7/semantic-checker.test.js +119 -0
  803. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
  804. package/dist/frontend/ts7/semantic-json.d.ts +5 -0
  805. package/dist/frontend/ts7/semantic-json.js +47 -0
  806. package/dist/frontend/ts7/semantic-json.js.map +1 -0
  807. package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
  808. package/dist/frontend/ts7/semantic-json.test.js +42 -0
  809. package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
  810. package/dist/frontend/ts7/semantic-model.d.ts +222 -0
  811. package/dist/frontend/ts7/semantic-model.js +423 -0
  812. package/dist/frontend/ts7/semantic-model.js.map +1 -0
  813. package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
  814. package/dist/frontend/ts7/semantic-model.test.js +322 -0
  815. package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
  816. package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
  817. package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
  818. package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
  819. package/dist/frontend/ts7/semantic-types.d.ts +5 -0
  820. package/dist/frontend/ts7/semantic-types.js +2 -0
  821. package/dist/frontend/ts7/semantic-types.js.map +1 -0
  822. package/dist/frontend/ts7/session-cache.d.ts +17 -0
  823. package/dist/frontend/ts7/session-cache.js +97 -0
  824. package/dist/frontend/ts7/session-cache.js.map +1 -0
  825. package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
  826. package/dist/frontend/ts7/session-cache.test.js +87 -0
  827. package/dist/frontend/ts7/session-cache.test.js.map +1 -0
  828. package/dist/frontend/ts7/session-path.d.ts +18 -0
  829. package/dist/frontend/ts7/session-path.js +203 -0
  830. package/dist/frontend/ts7/session-path.js.map +1 -0
  831. package/dist/frontend/ts7/session-path.test.d.ts +1 -0
  832. package/dist/frontend/ts7/session-path.test.js +34 -0
  833. package/dist/frontend/ts7/session-path.test.js.map +1 -0
  834. package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
  835. package/dist/frontend/ts7/session-schema.generated.js +5 -0
  836. package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
  837. package/dist/frontend/ts7/session-timing.d.ts +50 -0
  838. package/dist/frontend/ts7/session-timing.js +61 -0
  839. package/dist/frontend/ts7/session-timing.js.map +1 -0
  840. package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
  841. package/dist/frontend/ts7/session-timing.test.js +52 -0
  842. package/dist/frontend/ts7/session-timing.test.js.map +1 -0
  843. package/dist/frontend/ts7/session.d.ts +105 -0
  844. package/dist/frontend/ts7/session.js +233 -0
  845. package/dist/frontend/ts7/session.js.map +1 -0
  846. package/dist/frontend/ts7/session.test.d.ts +1 -0
  847. package/dist/frontend/ts7/session.test.js +215 -0
  848. package/dist/frontend/ts7/session.test.js.map +1 -0
  849. package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
  850. package/dist/frontend/ts7/source-parser-node.js +15 -0
  851. package/dist/frontend/ts7/source-parser-node.js.map +1 -0
  852. package/dist/frontend/ts7/source-parser.d.ts +25 -0
  853. package/dist/frontend/ts7/source-parser.js +96 -0
  854. package/dist/frontend/ts7/source-parser.js.map +1 -0
  855. package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
  856. package/dist/frontend/ts7/source-parser.test.js +151 -0
  857. package/dist/frontend/ts7/source-parser.test.js.map +1 -0
  858. package/dist/frontend/ts7/syntax.d.ts +3 -0
  859. package/dist/frontend/ts7/syntax.js +4 -0
  860. package/dist/frontend/ts7/syntax.js.map +1 -0
  861. package/dist/frontend/tsc-codes.js +3 -0
  862. package/dist/frontend/tsc-codes.js.map +1 -1
  863. package/dist/frontend/type-mapper.d.ts +34 -18
  864. package/dist/frontend/type-mapper.js +552 -131
  865. package/dist/frontend/type-mapper.js.map +1 -1
  866. package/dist/frontend/type-mapper.test.js +146 -2
  867. package/dist/frontend/type-mapper.test.js.map +1 -1
  868. package/dist/frontend/union-discriminants.d.ts +16 -0
  869. package/dist/frontend/union-discriminants.js +98 -0
  870. package/dist/frontend/union-discriminants.js.map +1 -0
  871. package/dist/frontend/union-discriminants.test.d.ts +1 -0
  872. package/dist/frontend/union-discriminants.test.js +182 -0
  873. package/dist/frontend/union-discriminants.test.js.map +1 -0
  874. package/dist/index.d.ts +7 -198
  875. package/dist/index.js +369 -1572
  876. package/dist/index.js.map +1 -1
  877. package/dist/ir/analysis.d.ts +16 -4
  878. package/dist/ir/analysis.js +23 -4
  879. package/dist/ir/analysis.js.map +1 -1
  880. package/dist/ir/analysis.test.js +15 -2
  881. package/dist/ir/analysis.test.js.map +1 -1
  882. package/dist/ir/constant-tables.js +67 -49
  883. package/dist/ir/constant-tables.js.map +1 -1
  884. package/dist/ir/constant-tables.test.js +1 -1
  885. package/dist/ir/control-flow.d.ts +6 -0
  886. package/dist/ir/control-flow.js +142 -0
  887. package/dist/ir/control-flow.js.map +1 -0
  888. package/dist/ir/control-flow.test.d.ts +1 -0
  889. package/dist/ir/control-flow.test.js +113 -0
  890. package/dist/ir/control-flow.test.js.map +1 -0
  891. package/dist/ir/integer-loops.js +7 -18
  892. package/dist/ir/integer-loops.js.map +1 -1
  893. package/dist/ir/integer-ranges.js +53 -27
  894. package/dist/ir/integer-ranges.js.map +1 -1
  895. package/dist/ir/ir.d.ts +334 -176
  896. package/dist/ir/ir.js +710 -903
  897. package/dist/ir/ir.js.map +1 -1
  898. package/dist/ir/ir.test.js +162 -1
  899. package/dist/ir/ir.test.js.map +1 -1
  900. package/dist/ir/scalar-records.js +165 -134
  901. package/dist/ir/scalar-records.js.map +1 -1
  902. package/dist/ir/scalar-records.test.js +1 -1
  903. package/dist/ir/serialize.d.ts +4 -2
  904. package/dist/ir/serialize.js +33 -14
  905. package/dist/ir/serialize.js.map +1 -1
  906. package/dist/ir/serialize.test.d.ts +1 -0
  907. package/dist/ir/serialize.test.js +57 -0
  908. package/dist/ir/serialize.test.js.map +1 -0
  909. package/dist/ir/traverse.d.ts +41 -0
  910. package/dist/ir/traverse.js +660 -0
  911. package/dist/ir/traverse.js.map +1 -0
  912. package/dist/ir/traverse.test.d.ts +1 -0
  913. package/dist/ir/traverse.test.js +242 -0
  914. package/dist/ir/traverse.test.js.map +1 -0
  915. package/dist/ir/validate.js +2018 -1498
  916. package/dist/ir/validate.js.map +1 -1
  917. package/dist/ir/validate.test.js +536 -2
  918. package/dist/ir/validate.test.js.map +1 -1
  919. package/dist/library/cache-primitives.d.ts +2 -3
  920. package/dist/library/cache-primitives.js +4 -6
  921. package/dist/library/cache-primitives.js.map +1 -1
  922. package/dist/library/fence-eval.js +2 -2
  923. package/dist/library/fence-eval.js.map +1 -1
  924. package/dist/library/int-infer.js +7 -6
  925. package/dist/library/int-infer.js.map +1 -1
  926. package/dist/library/int-infer.test.js +4 -4
  927. package/dist/library/library-cache.d.ts +3 -2
  928. package/dist/library/library-cache.js +5 -17
  929. package/dist/library/library-cache.js.map +1 -1
  930. package/dist/library/library-cache.test.js +54 -41
  931. package/dist/library/library-cache.test.js.map +1 -1
  932. package/dist/library/library-profile.d.ts +3 -1
  933. package/dist/library/library-profile.js +15 -6
  934. package/dist/library/library-profile.js.map +1 -1
  935. package/dist/library/prepare.d.ts +15 -0
  936. package/dist/library/prepare.js +584 -0
  937. package/dist/library/prepare.js.map +1 -0
  938. package/dist/library/semantic-source.d.ts +1 -1
  939. package/dist/library/semantic-source.js +8 -6
  940. package/dist/library/semantic-source.js.map +1 -1
  941. package/dist/library/sidecar-validate.js +4 -4
  942. package/dist/library/sidecar-validate.js.map +1 -1
  943. package/dist/library/sidecar.d.ts +2 -0
  944. package/dist/library/sidecar.js +10 -3
  945. package/dist/library/sidecar.js.map +1 -1
  946. package/dist/native/cache.d.ts +11 -0
  947. package/dist/native/cache.js +113 -0
  948. package/dist/native/cache.js.map +1 -0
  949. package/dist/native/cache.test.d.ts +1 -0
  950. package/dist/native/cache.test.js +66 -0
  951. package/dist/native/cache.test.js.map +1 -0
  952. package/dist/native/cli.d.ts +1 -0
  953. package/dist/native/cli.js +112 -0
  954. package/dist/native/cli.js.map +1 -0
  955. package/dist/native/compiler.d.ts +15 -0
  956. package/dist/native/compiler.js +336 -0
  957. package/dist/native/compiler.js.map +1 -0
  958. package/dist/native/compiler.test.d.ts +1 -0
  959. package/dist/native/compiler.test.js +174 -0
  960. package/dist/native/compiler.test.js.map +1 -0
  961. package/dist/native/comptime.d.ts +5 -0
  962. package/dist/native/comptime.js +73 -0
  963. package/dist/native/comptime.js.map +1 -0
  964. package/dist/native/comptime.test.d.ts +1 -0
  965. package/dist/native/comptime.test.js +65 -0
  966. package/dist/native/comptime.test.js.map +1 -0
  967. package/dist/native/executable-cache.d.ts +26 -0
  968. package/dist/native/executable-cache.js +228 -0
  969. package/dist/native/executable-cache.js.map +1 -0
  970. package/dist/native/executable-cache.test.d.ts +1 -0
  971. package/dist/native/executable-cache.test.js +151 -0
  972. package/dist/native/executable-cache.test.js.map +1 -0
  973. package/dist/native/file-identity.d.ts +4 -0
  974. package/dist/native/file-identity.js +14 -0
  975. package/dist/native/file-identity.js.map +1 -0
  976. package/dist/native/file-identity.test.d.ts +1 -0
  977. package/dist/native/file-identity.test.js +43 -0
  978. package/dist/native/file-identity.test.js.map +1 -0
  979. package/dist/native/library.d.ts +22 -0
  980. package/dist/native/library.js +83 -0
  981. package/dist/native/library.js.map +1 -0
  982. package/dist/native/prepare.d.ts +21 -0
  983. package/dist/native/prepare.js +174 -0
  984. package/dist/native/prepare.js.map +1 -0
  985. package/dist/native/prepare.test.d.ts +1 -0
  986. package/dist/native/prepare.test.js +70 -0
  987. package/dist/native/prepare.test.js.map +1 -0
  988. package/dist/native/sanitizer.d.ts +11 -0
  989. package/dist/native/sanitizer.js +137 -0
  990. package/dist/native/sanitizer.js.map +1 -0
  991. package/dist/native/sanitizer.test.d.ts +1 -0
  992. package/dist/native/sanitizer.test.js +58 -0
  993. package/dist/native/sanitizer.test.js.map +1 -0
  994. package/dist/native/task.d.ts +4 -0
  995. package/dist/native/task.js +16 -0
  996. package/dist/native/task.js.map +1 -0
  997. package/dist/native/task.test.d.ts +1 -0
  998. package/dist/native/task.test.js +17 -0
  999. package/dist/native/task.test.js.map +1 -0
  1000. package/dist/native/toolchain.d.ts +45 -0
  1001. package/dist/native/toolchain.js +94 -0
  1002. package/dist/native/toolchain.js.map +1 -0
  1003. package/dist/native/toolchain.test.d.ts +1 -0
  1004. package/dist/native/toolchain.test.js +85 -0
  1005. package/dist/native/toolchain.test.js.map +1 -0
  1006. package/dist/startup-cache.d.ts +1 -1
  1007. package/dist/startup-cache.js +2 -5
  1008. package/dist/startup-cache.js.map +1 -1
  1009. package/dist/timing.d.ts +4 -0
  1010. package/dist/timing.js +19 -0
  1011. package/dist/timing.js.map +1 -0
  1012. package/dist/wasi-paths.js +10 -7
  1013. package/dist/wasi-paths.js.map +1 -1
  1014. package/package.json +28 -19
  1015. package/surface-manifest.json +107 -98
  1016. package/dist/backend/c/async.d.ts +0 -171
  1017. package/dist/backend/c/async.js +0 -1317
  1018. package/dist/backend/c/async.js.map +0 -1
  1019. package/dist/backend/c/c-emitter.d.ts +0 -536
  1020. package/dist/backend/c/c-emitter.js +0 -1932
  1021. package/dist/backend/c/c-emitter.js.map +0 -1
  1022. package/dist/backend/c/exprs.d.ts +0 -15
  1023. package/dist/backend/c/exprs.js +0 -8847
  1024. package/dist/backend/c/exprs.js.map +0 -1
  1025. package/dist/backend/c/island.d.ts +0 -45
  1026. package/dist/backend/c/island.js +0 -281
  1027. package/dist/backend/c/island.js.map +0 -1
  1028. package/dist/backend/c/may-throw.js.map +0 -1
  1029. package/dist/backend/c/shapes.d.ts +0 -142
  1030. package/dist/backend/c/shapes.js +0 -603
  1031. package/dist/backend/c/shapes.js.map +0 -1
  1032. package/dist/backend/c/stmts.d.ts +0 -76
  1033. package/dist/backend/c/stmts.js +0 -1108
  1034. package/dist/backend/c/stmts.js.map +0 -1
  1035. package/dist/backend/c/types.d.ts +0 -71
  1036. package/dist/backend/c/types.js +0 -459
  1037. package/dist/backend/c/types.js.map +0 -1
  1038. package/dist/backend/c/types.test.js +0 -32
  1039. package/dist/backend/c/types.test.js.map +0 -1
  1040. package/dist/backend/c/walkers.d.ts +0 -134
  1041. package/dist/backend/c/walkers.js +0 -1772
  1042. package/dist/backend/c/walkers.js.map +0 -1
  1043. /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
@@ -1,1108 +0,0 @@
1
- import { InternalCompilerError } from "../../errors.js";
2
- import { mangleField, mangleGlobal, mangleLocal, mangleRawParam } from "../mangle.js";
3
- import { BOOL, CAUGHT, RUNTIME_ERROR_CLASSES, isRefCounted } from "../../ir/ir.js";
4
- import { boxAccess, cDecl, cStringLiteral, elemAccess, vAdapters } from "./types.js";
5
- import { OVERFLOW_MEMBER } from "./shapes.js";
6
- import { emitStableReceiver } from "./exprs.js";
7
- import { matchIntegerBytesForLoop } from "../../ir/integer-loops.js";
8
- import { analyzeIntegerRanges } from "../../ir/integer-ranges.js";
9
- import { endsWithJump, matchStringSelfConcat } from "../../ir/analysis.js";
10
- export function emitFunction(emitter, fn) {
11
- emitter.sourceLoc = fn.loc;
12
- emitter.tempCounter = 0;
13
- emitter.frames = [];
14
- emitter.scopes = [];
15
- emitter.jumpTargets = [];
16
- emitter.tryStack = [];
17
- emitter.finallyStack = [];
18
- emitter.pendingReturnScopeIndex = null;
19
- emitter.currentReturnType = fn.returnType;
20
- emitter.currentGenerator = fn.generator ?? null;
21
- emitter.labelCounter = 0;
22
- emitter.currentLocals = new Map(fn.locals.map((l) => [l.id, l]));
23
- emitter.captureIds = new Set((fn.captures ?? []).map((c) => c.localId));
24
- emitter.integerLoopBindings.clear();
25
- emitter.integerRanges = analyzeIntegerRanges(fn);
26
- emitter.line(`${emitter.signature(fn)} {${emitter.srcComment(fn.loc)}`);
27
- emitter.indent++;
28
- // The pending-return slot: a `return` crossing a finally computes its
29
- // value FIRST (before the finally runs — snapshotting it here is what
30
- // makes finally mutations of returned locals invisible, Node-exact),
31
- // then jumps through every crossed finally; the last dispatch returns
32
- // the slot. Declared only when some return actually crosses a finally.
33
- if (fn.returnType.kind !== "void" && returnCrossesFinally(fn.body)) {
34
- const init = isRefCounted(fn.returnType) ? "NULL" : "0";
35
- emitter.line(`${cDecl(fn.returnType, "sc_pret")} = ${init}; /* pending return (through finally) */`);
36
- }
37
- // Captured bindings come in through the environment — borrowed for the
38
- // whole call (the closure owns them): bound here, never released here.
39
- (fn.captures ?? []).forEach((c, i) => {
40
- emitter.line(`ScrBox *${mangleLocal(c.localId)} = sc_env->caps[${i}]; /* captured ${c.name} */`);
41
- });
42
- const paramIds = new Set(fn.params.map((p) => p.localId));
43
- for (const local of fn.locals) {
44
- if (paramIds.has(local.id) || emitter.captureIds.has(local.id))
45
- continue;
46
- if (local.boxed) {
47
- emitter.line(`ScrBox *${mangleLocal(local.id)} = NULL; /* ${local.name} (boxed) */`);
48
- }
49
- else {
50
- const init = isRefCounted(local.type) ? " = NULL" : "";
51
- emitter.line(`${cDecl(local.type, mangleLocal(local.id))}${init}; /* ${local.name} */`);
52
- }
53
- }
54
- // Function scope owns refcounted params (callees own their params).
55
- // Boxed params: allocate the shared binding and move the raw value in.
56
- const fnScope = [];
57
- for (const p of fn.params) {
58
- const local = emitter.currentLocals.get(p.localId);
59
- if (local.boxed) {
60
- const box = mangleLocal(p.localId);
61
- emitter.line(`ScrBox *${box} = ${emitter.boxNewC(p.type)}; /* ${p.name} (boxed param) */`);
62
- emitter.line(`scr_box_set_${boxAccess(p.type)}(${box}, ${mangleRawParam(p.localId)});`);
63
- fnScope.push({ name: box, type: p.type, boxed: true });
64
- }
65
- else if (isRefCounted(p.type)) {
66
- fnScope.push({ name: mangleLocal(p.localId), type: p.type });
67
- }
68
- }
69
- emitter.scopes.push(fnScope);
70
- emitter.emitStmts(fn.body);
71
- // Implicit exit of a void function: release function-scope refcounted
72
- // locals (unless the body already ended in an explicit return or a
73
- // throw, whose unwind released everything down to depth 0).
74
- const last = fn.body[fn.body.length - 1]?.kind;
75
- const endedWithReturn = last === "return" || last === "throw" || last === "rethrow" || last === "runtimeFence";
76
- if (fn.returnType.kind === "void" && !endedWithReturn) {
77
- emitter.releaseFrame(emitter.scopes[0]);
78
- }
79
- emitter.scopes.pop();
80
- emitter.indent--;
81
- emitter.line(`}`);
82
- // Keep generated runtime scaffolding out of the user's source file.
83
- emitter.endSourceFunction();
84
- emitter.line(``);
85
- }
86
- /** The statement bodies nested directly under a statement — the shared
87
- * walk for returnCrossesFinally. */
88
- function childBodies(s) {
89
- switch (s.kind) {
90
- case "if":
91
- return s.else_ ? [s.then, s.else_] : [s.then];
92
- case "while":
93
- case "doWhile":
94
- case "forOf":
95
- case "block":
96
- return [s.body];
97
- case "for":
98
- return [s.body];
99
- case "switch":
100
- return s.cases.map((c) => c.body);
101
- case "tryCatch":
102
- return [
103
- s.tryBody,
104
- ...(s.catchBody ? [s.catchBody] : []),
105
- ...(s.finallyBody ? [s.finallyBody] : []),
106
- ];
107
- default:
108
- return [];
109
- }
110
- }
111
- /** True when some `return` sits inside the tryBody/catchBody of a
112
- * try-with-finally, at any nesting depth — exactly the returns the
113
- * pending-return path routes, and so exactly when emitFunction must
114
- * declare the sc_pret slot. */
115
- function returnCrossesFinally(stmts) {
116
- const hasReturn = (body) => body.some((s) => s.kind === "return" || childBodies(s).some(hasReturn));
117
- const walk = (body) => body.some((s) => {
118
- if (s.kind === "tryCatch" &&
119
- s.finallyBody !== null &&
120
- (hasReturn(s.tryBody) || (s.catchBody !== null && hasReturn(s.catchBody)))) {
121
- return true;
122
- }
123
- return childBodies(s).some(walk);
124
- });
125
- return walk(stmts);
126
- }
127
- /** Emits a block in its own lexical scope (refcounted locals released at
128
- * end). `setup` runs after the scope opens, before the statements — the
129
- * catch-binding hook: it may emit prelude lines and register entries the
130
- * scope owns (released on every exit, jumps and unwinds included). */
131
- export function emitBlock(emitter, stmts, setup) {
132
- emitter.line(`{`);
133
- emitter.indent++;
134
- const scope = [];
135
- emitter.scopes.push(scope);
136
- setup?.(scope);
137
- emitter.emitStmts(stmts);
138
- const endedWithJump = endsWithJump(stmts);
139
- emitter.scopes.pop();
140
- if (!endedWithJump)
141
- emitter.releaseFrame(scope);
142
- emitter.indent--;
143
- emitter.line(`}`);
144
- }
145
- export function emitStmts(emitter, stmts) {
146
- for (const s of stmts)
147
- emitter.emitStmt(s);
148
- }
149
- export function emitStmt(emitter, s) {
150
- const previous = emitter.sourceLoc;
151
- emitter.sourceLoc = s.loc;
152
- try {
153
- emitStmtBody(emitter, s);
154
- }
155
- finally {
156
- emitter.sourceLoc = previous;
157
- }
158
- }
159
- function emitStmtBody(emitter, s) {
160
- emitter.frames.push([]);
161
- switch (s.kind) {
162
- case "varDecl": {
163
- const local = emitter.currentLocals.get(s.localId);
164
- const target = mangleLocal(s.localId);
165
- if (s.init === null) {
166
- // Declared, uninitialized (`let x: number;`). tsc's TS2454 rejects
167
- // any read before assignment, so no runtime check is needed — but
168
- // the declaration must still RESET the C local: inside a loop the
169
- // previous iteration's scope exit released the old value and left
170
- // a stale pointer, and the scope-exit release below runs whether
171
- // or not an `assign` ever did (runtime releases are NULL-tolerant).
172
- if (local.boxed) {
173
- // The box must exist immediately: closures created before the
174
- // first assignment capture it. (tsc's TS2454 can't see through
175
- // closures — a call before the first assignment reads 0/false
176
- // for scalars and traps for refcounted kinds, where JS has
177
- // `undefined`.)
178
- // A SCALAR TDZ box rides an ARR-kind box: the value lives in a
179
- // one-element array cell, so the empty (NULL) slot stays the
180
- // not-yet-initialized sentinel — a raw scalar slot has no spare
181
- // bit pattern to spend on it.
182
- const boxNew = local.tdz && boxAccess(local.type) !== "ref"
183
- ? "scr_box_new(SCR_BOX_ARR)"
184
- : emitter.boxNewC(local.type);
185
- emitter.line(`${target} = ${boxNew};${emitter.srcComment(s.loc)} /* let ${local.name}; */`);
186
- emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: local.type, boxed: true });
187
- }
188
- else if (isRefCounted(local.type)) {
189
- emitter.line(`${target} = NULL;${emitter.srcComment(s.loc)} /* let ${local.name}; */`);
190
- emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: local.type });
191
- }
192
- // Scalars need nothing: the C local exists from the prologue and
193
- // no read happens before an assign writes it.
194
- break;
195
- }
196
- if (local.boxed) {
197
- // Box FIRST, then evaluate the initializer: a named function
198
- // expression's closure captures this box during init evaluation.
199
- emitter.line(`${target} = ${emitter.boxNewC(local.type)};${emitter.srcComment(s.loc)}`);
200
- emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: local.type, boxed: true });
201
- const v = emitter.emitExpr(s.init);
202
- if (isRefCounted(v.type))
203
- emitter.moveTemp(v); // the box takes ownership
204
- emitter.line(`scr_box_set_${boxAccess(local.type)}(${target}, ${v.name});`);
205
- break;
206
- }
207
- const v = emitter.emitExpr(s.init);
208
- emitter.moveTemp(v);
209
- emitter.line(`${target} = ${v.name};${emitter.srcComment(s.loc)}`);
210
- if (isRefCounted(v.type)) {
211
- emitter.scopes[emitter.scopes.length - 1].push({ name: target, type: v.type });
212
- }
213
- break;
214
- }
215
- case "assign": {
216
- const local = emitter.currentLocals.get(s.localId);
217
- const concat = s.value;
218
- const suffix = matchStringSelfConcat(s.localId, concat);
219
- if (suffix && concat.kind === "strConcat") {
220
- // Snapshot the old left value before evaluating the suffix. The
221
- // snapshot is a normal frame-owned +1: the suffix may reassign the
222
- // destination or throw, in which case unwinding must still release
223
- // it while leaving the original binding intact.
224
- const snapshot = emitter.emitExpr(concat.left);
225
- const right = emitter.emitExpr(suffix);
226
- const target = local ? mangleLocal(s.localId) : mangleGlobal(s.localId);
227
- if (local?.boxed) {
228
- // set_ref unlinks then releases the binding's CURRENT value. It
229
- // may differ from snapshot when the suffix itself assigned target.
230
- emitter.line(`scr_box_set_ref(${target}, NULL);`);
231
- }
232
- else {
233
- const old = `sc_t${emitter.tempCounter++}`;
234
- emitter.line(`ScrStr *${old} = ${target};`);
235
- emitter.line(`${target} = NULL;`);
236
- emitter.releaseValue(old, snapshot.type);
237
- }
238
- const result = emitter.newTemp(s.value.type, `scr_str_concat(${snapshot.name}, ${right.name})`);
239
- if (local?.boxed) {
240
- emitter.moveTemp(result); // the box takes the concat result's +1
241
- emitter.line(`scr_box_set_ref(${target}, ${result.name});${emitter.srcComment(s.loc)}`);
242
- }
243
- else {
244
- emitter.moveTemp(result); // binding takes the concat result's +1
245
- emitter.line(`${target} = ${result.name};${emitter.srcComment(s.loc)}`);
246
- }
247
- break;
248
- }
249
- if (!local) {
250
- // Module global: plain static storage, never boxed. Old-value
251
- // release is NULL-tolerant (statics start NULL).
252
- const g = emitter.globalsById.get(s.localId);
253
- if (!g)
254
- throw new InternalCompilerError(`emitter bug: assign to unknown binding ${s.localId}`);
255
- const target = mangleGlobal(g.id);
256
- const v = emitter.emitExpr(s.value);
257
- emitter.moveTemp(v);
258
- if (isRefCounted(v.type))
259
- emitter.releaseValue(target, v.type);
260
- emitter.line(`${target} = ${v.name};${emitter.srcComment(s.loc)}`);
261
- break;
262
- }
263
- const target = mangleLocal(s.localId);
264
- const v = emitter.emitExpr(s.value);
265
- if (local.boxed) {
266
- // A scalar TDZ box (forward-captured const): the initializing
267
- // write mints the one-element array cell — set_ref moves it in
268
- // (and the empty-slot sentinel ends here).
269
- if (local.tdz && boxAccess(local.type) !== "ref") {
270
- const acc = boxAccess(local.type);
271
- const cell = `sc_t${emitter.tempCounter++}`;
272
- emitter.line(`ScrArr *${cell} = ${emitter.arrNewC(local.type, 1)};${emitter.srcComment(s.loc)}`);
273
- emitter.line(`scr_arr_push_${acc}(${cell}, ${v.name});`);
274
- emitter.line(`scr_box_set_ref(${target}, ${cell});`);
275
- break;
276
- }
277
- if (isRefCounted(v.type))
278
- emitter.moveTemp(v); // set_ref releases the old value
279
- emitter.line(`scr_box_set_${boxAccess(local.type)}(${target}, ${v.name});${emitter.srcComment(s.loc)}`);
280
- break;
281
- }
282
- emitter.moveTemp(v);
283
- if (isRefCounted(v.type))
284
- emitter.releaseValue(target, v.type);
285
- emitter.line(`${target} = ${v.name};${emitter.srcComment(s.loc)}`);
286
- break;
287
- }
288
- case "exprStmt":
289
- emitter.emitExpr(s.expr);
290
- break;
291
- case "if": {
292
- const cond = emitter.emitCondition(s.cond);
293
- emitter.line(`if (${cond}) `);
294
- emitter.mergeBrace(() => emitter.emitBlock(s.then));
295
- if (s.else_) {
296
- emitter.line(`else `);
297
- emitter.mergeBrace(() => emitter.emitBlock(s.else_));
298
- }
299
- break;
300
- }
301
- case "while": {
302
- emitter.line(`for (;;) {${emitter.srcComment(s.loc)}`);
303
- emitter.indent++;
304
- const cond = emitter.emitCondition(s.cond);
305
- emitter.line(`if (!(${cond})) break;`);
306
- // C continue re-evaluates the condition at the top: exactly right
307
- // for the unlabeled loop. A LABELED while allocates a continue
308
- // label placed at the END of the body (falling off it re-enters
309
- // the condition — the same point) so a labeled continue from a
310
- // NESTED loop can goto it, and a lazy end label for labeled break.
311
- const loop = emitter.loopTarget(null, s.labels);
312
- emitter.jumpTargets.push(loop);
313
- emitter.emitBlock(s.body);
314
- emitter.jumpTargets.pop();
315
- if (loop.usedContinue && loop.continueLabel)
316
- emitter.line(`${loop.continueLabel}:;`);
317
- emitter.indent--;
318
- emitter.line(`}`);
319
- if (loop.usedEnd)
320
- emitter.line(`${loop.endLabel}:;`);
321
- break;
322
- }
323
- case "doWhile": {
324
- // `for (;;) { body; cont: cond; if (!cond) break; }` — the body runs
325
- // before the first condition check (at least once), and `continue`
326
- // routes through the label so the condition still evaluates.
327
- emitter.line(`for (;;) {${emitter.srcComment(s.loc)}`);
328
- emitter.indent++;
329
- const loop = emitter.loopTarget(`sc_cont_${emitter.labelCounter++}`, s.labels);
330
- emitter.jumpTargets.push(loop);
331
- emitter.emitBlock(s.body);
332
- emitter.jumpTargets.pop();
333
- if (loop.usedContinue)
334
- emitter.line(`${loop.continueLabel}:;`);
335
- const cond = emitter.emitCondition(s.cond);
336
- emitter.line(`if (!(${cond})) break;`);
337
- emitter.indent--;
338
- emitter.line(`}`);
339
- if (loop.usedEnd)
340
- emitter.line(`${loop.endLabel}:;`);
341
- break;
342
- }
343
- case "switch":
344
- emitter.emitSwitch(s);
345
- break;
346
- case "for": {
347
- // Desugared in place; the init's scope wraps the whole loop, so
348
- // break/continue must NOT release it (scopeDepth captured after).
349
- const integerLoop = matchIntegerBytesForLoop(s, emitter.currentLocals);
350
- emitter.line(`{${emitter.srcComment(s.loc)}`);
351
- emitter.indent++;
352
- emitter.scopes.push([]);
353
- let integerShadow = null;
354
- if (integerLoop) {
355
- integerShadow = `sc_i${emitter.tempCounter++}`;
356
- emitter.line(`uint64_t ${integerShadow} = 0; /* integer induction ${emitter.currentLocals.get(integerLoop.localId).name} */`);
357
- emitter.integerLoopBindings.set(integerLoop.localId, integerShadow);
358
- }
359
- else if (s.init) {
360
- emitter.emitStmt(s.init);
361
- }
362
- emitter.line(`for (;;) {`);
363
- emitter.indent++;
364
- if (integerLoop && integerShadow) {
365
- const receiver = emitStableReceiver(emitter, integerLoop.limitReceiver, []);
366
- emitter.line(`if (!(${integerShadow} < ${receiver.name}->len)) break;`);
367
- }
368
- else if (s.cond) {
369
- const cond = emitter.emitCondition(s.cond);
370
- emitter.line(`if (!(${cond})) break;`);
371
- }
372
- // C continue would skip the update; route it through a label instead.
373
- const loop = emitter.loopTarget(`sc_cont_${emitter.labelCounter++}`, s.labels);
374
- emitter.jumpTargets.push(loop);
375
- emitter.emitBlock(s.body);
376
- emitter.jumpTargets.pop();
377
- if (loop.usedContinue)
378
- emitter.line(`${loop.continueLabel}:;`);
379
- // JS `for (let i ...)`: each iteration gets a FRESH binding holding a
380
- // copy of the previous one, and the update mutates the fresh binding
381
- // — that's why closures made in iteration k keep seeing iteration
382
- // k's value. Only observable (and only emitted) when captured.
383
- if (s.init?.kind === "varDecl") {
384
- const initLocal = emitter.currentLocals.get(s.init.localId);
385
- if (initLocal?.boxed) {
386
- const box = mangleLocal(initLocal.id);
387
- const fresh = `sc_t${emitter.tempCounter++}`;
388
- const acc = boxAccess(initLocal.type);
389
- emitter.line(`ScrBox *${fresh} = ${emitter.boxNewC(initLocal.type)}; /* per-iteration ${initLocal.name} */`);
390
- emitter.line(`scr_box_set_${acc}(${fresh}, scr_box_get_${acc}(${box}));`);
391
- emitter.line(`scr_box_release(${box});`);
392
- emitter.line(`${box} = ${fresh};`);
393
- // The wrapper scope's entry releases whatever `box` points to at
394
- // loop exit — which is now the freshest binding. Nothing to fix.
395
- }
396
- }
397
- if (integerLoop && integerShadow)
398
- emitter.line(`${integerShadow}++;`);
399
- else if (s.update)
400
- emitter.emitStmt(s.update);
401
- emitter.indent--;
402
- emitter.line(`}`);
403
- // A labeled break lands exactly where C break does: BEFORE the
404
- // init scope's release (the goto path must run the same releases
405
- // as the fall-through path).
406
- if (loop.usedEnd)
407
- emitter.line(`${loop.endLabel}:;`);
408
- emitter.releaseFrame(emitter.scopes.pop());
409
- if (integerLoop)
410
- emitter.integerLoopBindings.delete(integerLoop.localId);
411
- emitter.indent--;
412
- emitter.line(`}`);
413
- break;
414
- }
415
- case "arraySet": {
416
- // Evaluation order matches JS: array, index, then value. Ownership
417
- // of a refcounted value moves into the array (the runtime releases
418
- // the replaced element itself).
419
- const arr = emitter.emitExpr(s.arr);
420
- const idx = emitter.emitExpr(s.index);
421
- const v = emitter.emitExpr(s.value);
422
- if (s.arr.type.kind !== "array")
423
- throw new InternalCompilerError("emitter bug: arraySet on non-array");
424
- const acc = elemAccess(s.arr.type.elem);
425
- if (acc === "ref")
426
- emitter.moveTemp(v);
427
- emitter.line(`scr_arr_set_${acc}(${arr.name}, ${idx.name}, ${v.name});${emitter.srcComment(s.loc)}`);
428
- break;
429
- }
430
- case "arraySetLength": {
431
- const arr = emitter.emitExpr(s.arr);
432
- const length = emitter.emitExpr(s.length);
433
- if (s.arr.type.kind !== "array")
434
- throw new InternalCompilerError("emitter bug: arraySetLength on non-array");
435
- emitter.line(`scr_arr_set_len(${arr.name}, ${length.name});${emitter.srcComment(s.loc)}`);
436
- emitter.emitPendingCheck();
437
- break;
438
- }
439
- case "arraySetUndefined":
440
- case "arrayDelete": {
441
- const arr = emitter.emitExpr(s.arr);
442
- const idx = emitter.emitExpr(s.index);
443
- if (s.arr.type.kind !== "array")
444
- throw new InternalCompilerError(`emitter bug: ${s.kind} on non-array`);
445
- emitter.line(`${s.kind === "arraySetUndefined" ? "scr_arr_set_undefined" : "scr_arr_delete"}(${arr.name}, ${idx.name});${emitter.srcComment(s.loc)}`);
446
- break;
447
- }
448
- case "bytesSet": {
449
- // Typed-array element write: same evaluation order as arraySet;
450
- // the value is a scalar (the inline kind-specific accessor coerces
451
- // JS-exactly), so no ownership moves. Any invalid index traps — no
452
- // append. The IR carries the element kind; do not rediscover it in
453
- // the generic runtime accessor on every loop iteration.
454
- const arr = emitStableReceiver(emitter, s.arr, [s.index, s.value]);
455
- const integerIndex = emitter.integerLoopIndex(s.index);
456
- const idx = integerIndex === null ? emitter.emitExpr(s.index).name : integerIndex;
457
- const v = emitter.emitExpr(s.value);
458
- if (s.arr.type.kind !== "bytes")
459
- throw new InternalCompilerError("emitter bug: bytesSet on non-bytes");
460
- emitter.line(`${emitter.bytesElementHelper("set", s.arr.type.elem, integerIndex !== null)}(${arr.name}, ${idx}, ${v.name});${emitter.srcComment(s.loc)}`);
461
- break;
462
- }
463
- case "fieldSet":
464
- case "recordSet": {
465
- // Evaluation order: obj, then value. New value moved in; the old
466
- // value is released AFTER the field is overwritten (releases are
467
- // NULL-tolerant — fields start NULL from the zeroed allocation).
468
- // Unlink-then-release is load-bearing: a release can trigger a
469
- // cycle collection, which must never see a heap edge whose count
470
- // was already given up (scr_cycle.c). Classes and records share
471
- // the struct layout, so one emission.
472
- const obj = emitter.emitExpr(s.obj);
473
- const v = emitter.emitExpr(s.value);
474
- // Runtime error classes use ScrError's own member names.
475
- const member = s.kind === "fieldSet" && RUNTIME_ERROR_CLASSES.has(s.className)
476
- ? s.field
477
- : mangleField(s.field);
478
- const field = `${obj.name}->${member}`;
479
- if (isRefCounted(v.type)) {
480
- emitter.moveTemp(v);
481
- const old = `sc_t${emitter.tempCounter++}`;
482
- emitter.line(`${cDecl(v.type, old)} = ${field};`);
483
- emitter.line(`${field} = ${v.name};${emitter.srcComment(s.loc)}`);
484
- emitter.releaseValue(old, v.type);
485
- }
486
- else {
487
- emitter.line(`${field} = ${v.name};${emitter.srcComment(s.loc)}`);
488
- }
489
- break;
490
- }
491
- case "recordKeyDelete": {
492
- // `delete obj[k]` on a pure index-signature shape: a Map delete on
493
- // the overflow (key and value released; absent keys no-op).
494
- const obj = emitter.emitExpr(s.obj);
495
- const key = emitter.emitExpr(s.key);
496
- emitter.line(`scr_map_delete_str(${obj.name}->${OVERFLOW_MEMBER}, ${key.name});${emitter.srcComment(s.loc)}`);
497
- break;
498
- }
499
- case "recordKeySet": {
500
- // Dynamic-keyed record write through the per-shape helper (declared
501
- // keys write through with validation, undeclared keys land in the
502
- // overflow map). Evaluation order: obj, key, value. The helper OWNS
503
- // the value (+1 moves in). MAY THROW when a dyn value must validate
504
- // against a declared field's type — the pending check runs then.
505
- const obj = emitter.emitExpr(s.obj);
506
- const key = emitter.emitExpr(s.key);
507
- const v = emitter.emitExpr(s.value);
508
- if (isRefCounted(v.type))
509
- emitter.moveTemp(v);
510
- // A LITERAL key naming no declared field is a plain overflow map
511
- // insert — no helper, no validation, no throw.
512
- if (s.overflowOnly) {
513
- const acc = v.type.kind === "f64" ? "f64" : v.type.kind === "bool" ? "bool" : "ref";
514
- emitter.line(`scr_map_set_str_${acc}(${obj.name}->${OVERFLOW_MEMBER}, ${key.name}, ${v.name});${emitter.srcComment(s.loc)}`);
515
- break;
516
- }
517
- const helper = emitter.recordKeySetHelper(s.shapeId);
518
- emitter.line(`${helper}(${obj.name}, ${key.name}, ${v.name});${emitter.srcComment(s.loc)}`);
519
- const shape = emitter.recordsById.get(s.shapeId);
520
- // MAY THROW: a dyn value validating against a declared field, or a
521
- // signature-free shape's key MISS (scr_record_key_miss).
522
- if (shape && (!shape.indexValue || (shape.indexValue.kind === "dyn" && shape.fields.length > 0))) {
523
- emitter.emitPendingCheck();
524
- }
525
- break;
526
- }
527
- case "forOf": {
528
- // Ascending index loop; the length is re-read every iteration
529
- // (JS-exact — pushes inside the body extend the iteration). The
530
- // iterable temp lives in this statement's frame, so it is released
531
- // when the whole loop ends (and by `return`'s frame sweep). A real
532
- // C for-loop makes plain `continue` correct: the update still runs.
533
- if (s.iterable.type.kind !== "array")
534
- throw new InternalCompilerError("emitter bug: forOf over non-array");
535
- const elem = s.iterable.type.elem;
536
- const arr = emitter.emitExpr(s.iterable);
537
- const idx = `sc_t${emitter.tempCounter++}`;
538
- emitter.line(`for (double ${idx} = 0; ${idx} < scr_arr_len(${arr.name}); ${idx} += 1) {${emitter.srcComment(s.loc)}`);
539
- emitter.indent++;
540
- // A real C for-loop makes plain `continue` correct (the update
541
- // still runs); a LABELED forOf allocates a continue label placed at
542
- // the END of the iteration (after the per-iteration scope release —
543
- // the goto path released it itself) so nested loops can goto it.
544
- const loop = emitter.loopTarget(null, s.labels);
545
- emitter.jumpTargets.push(loop);
546
- // The loop variable is a fresh const per iteration: its scope opens
547
- // here, holds the (for ref elements: owned +1) current element, and
548
- // releases it at the end of each iteration.
549
- emitter.scopes.push([]);
550
- const local = mangleLocal(s.localId);
551
- const localInfo = emitter.currentLocals.get(s.localId);
552
- if (localInfo?.boxed) {
553
- // Captured loop variable: a fresh box per iteration, matching the
554
- // fresh const binding (closures made in iteration k keep seeing
555
- // iteration k's element). The box takes ownership of a ref
556
- // element's +1 and is released with the iteration's scope.
557
- emitter.line(`${local} = ${emitter.boxNewC(elem)}; /* per-iteration ${localInfo.name} */`);
558
- emitter.line(`scr_box_set_${boxAccess(elem)}(${local}, scr_arr_get_${elemAccess(elem)}(${arr.name}, ${idx}));`);
559
- emitter.scopes[emitter.scopes.length - 1].push({ name: local, type: elem, boxed: true });
560
- }
561
- else {
562
- emitter.line(`${local} = scr_arr_get_${elemAccess(elem)}(${arr.name}, ${idx});`);
563
- if (isRefCounted(elem))
564
- emitter.scopes[emitter.scopes.length - 1].push({ name: local, type: elem });
565
- }
566
- emitter.emitStmts(s.body);
567
- const endedWithJump = endsWithJump(s.body);
568
- const scope = emitter.scopes.pop();
569
- if (!endedWithJump)
570
- emitter.releaseFrame(scope);
571
- emitter.jumpTargets.pop();
572
- if (loop.usedContinue && loop.continueLabel)
573
- emitter.line(`${loop.continueLabel}:;`);
574
- emitter.indent--;
575
- emitter.line(`}`);
576
- if (loop.usedEnd)
577
- emitter.line(`${loop.endLabel}:;`);
578
- break;
579
- }
580
- case "block": {
581
- if (s.labels === undefined) {
582
- emitter.emitBlock(s.body);
583
- break;
584
- }
585
- // A labeled block: `break lbl` inside jumps to the end label
586
- // (releasing the block's scope itself); nothing else can target it.
587
- const target = {
588
- kind: "block",
589
- endLabel: `sc_end_${emitter.labelCounter++}`,
590
- usedEnd: false,
591
- labels: s.labels,
592
- scopeDepth: emitter.scopes.length,
593
- frameDepth: emitter.frames.length,
594
- finallyDepth: emitter.finallyStack.length,
595
- };
596
- emitter.jumpTargets.push(target);
597
- emitter.emitBlock(s.body);
598
- emitter.jumpTargets.pop();
599
- if (target.usedEnd)
600
- emitter.line(`${target.endLabel}:;`);
601
- break;
602
- }
603
- case "break": {
604
- // Unlabeled: binds to the innermost loop OR switch (labeled block
605
- // targets are skipped). Labeled: binds to the entry carrying the
606
- // label. Release every scope entered since that target started
607
- // (the body scope and anything nested); their natural end-of-block
608
- // releases are on the fall-through path this jump bypasses. Same
609
- // for pending frame temps of statements the jump exits (a nested
610
- // switch's discriminant) — but NOT the target's own frame: a
611
- // loop's releases after the loop and a switch's after its end
612
- // label are still on this jump's path.
613
- let target;
614
- for (let i = emitter.jumpTargets.length - 1; i >= 0; i--) {
615
- const t = emitter.jumpTargets[i];
616
- if (s.label !== undefined ? t.labels?.includes(s.label) : t.kind !== "block") {
617
- target = t;
618
- break;
619
- }
620
- }
621
- if (!target)
622
- throw new InternalCompilerError("emitter bug: break target not found");
623
- emitter.emitFinallysForJump(target.finallyDepth, target.frameDepth, target.scopeDepth);
624
- if (target.kind !== "loop" || s.label !== undefined) {
625
- // Switches are emitted as goto chains and blocks aren't C loops
626
- // at all, so a C `break` cannot target either; and a LABELED
627
- // break may target an outer loop a C break would never reach.
628
- // All three jump to the target's end label (labeled loops always
629
- // allocate one — loopTarget).
630
- target.usedEnd = true;
631
- emitter.line(`goto ${target.endLabel};${emitter.srcComment(s.loc)}`);
632
- }
633
- else {
634
- emitter.line(`break;${emitter.srcComment(s.loc)}`);
635
- }
636
- break;
637
- }
638
- case "continue": {
639
- // Unlabeled: binds to the innermost LOOP, skipping any switches and
640
- // labeled blocks in between (their scopes are still released — the
641
- // jump exits them). Labeled: binds to the loop carrying the label.
642
- let loop;
643
- for (let i = emitter.jumpTargets.length - 1; i >= 0; i--) {
644
- const t = emitter.jumpTargets[i];
645
- if (t.kind === "loop" && (s.label === undefined || t.labels?.includes(s.label))) {
646
- loop = t;
647
- break;
648
- }
649
- }
650
- if (!loop)
651
- throw new InternalCompilerError("emitter bug: continue target not found");
652
- emitter.emitFinallysForJump(loop.finallyDepth, loop.frameDepth, loop.scopeDepth);
653
- if (loop.continueLabel) {
654
- // Labeled loops always allocate one (a labeled continue may
655
- // target an outer loop a C continue could never reach); for/
656
- // do-while allocate one for their update/condition point.
657
- loop.usedContinue = true;
658
- emitter.line(`goto ${loop.continueLabel};${emitter.srcComment(s.loc)}`);
659
- }
660
- else {
661
- emitter.line(`continue;${emitter.srcComment(s.loc)}`);
662
- }
663
- break;
664
- }
665
- case "return": {
666
- // A return inside the pending-return copy of a finally REPLACES the
667
- // old return. Keep the old slot protected while the new expression
668
- // evaluates (a throw there still discards it), then release the old
669
- // value and remove the slot from this return's own unwind path.
670
- let pendingEntry = null;
671
- let value = null;
672
- if (s.value)
673
- value = emitter.emitExpr(s.value);
674
- const pendingIndex = emitter.pendingReturnScopeIndex;
675
- if (pendingIndex !== null && isRefCounted(emitter.currentReturnType)) {
676
- const scope = emitter.scopes[pendingIndex];
677
- const entryIndex = scope.findIndex((entry) => entry.name === "sc_pret");
678
- if (entryIndex < 0)
679
- throw new InternalCompilerError("emitter bug: pending return scope has no sc_pret");
680
- pendingEntry = { index: pendingIndex, entry: scope.splice(entryIndex, 1)[0] };
681
- emitter.releaseValue("sc_pret", emitter.currentReturnType);
682
- }
683
- const fin = emitter.finallyStack[emitter.finallyStack.length - 1];
684
- if (fin) {
685
- // Crossing ≥1 finally: the value is computed and snapshotted
686
- // FIRST (a finally mutating the returned local cannot change
687
- // it — Node's semantics), then everything down to the innermost
688
- // region releases and control runs that region's pending-return
689
- // finally copy; its tail dispatches further out or returns.
690
- if (value) {
691
- emitter.moveTemp(value); // ownership parks in the slot until the dispatch returns it
692
- emitter.line(`sc_pret = ${value.name};${emitter.srcComment(s.loc)}`);
693
- }
694
- fin.used = true;
695
- emitter.releaseForJump(fin.frameDepth, fin.scopeDepth);
696
- emitter.line(`goto ${fin.label};${s.value ? "" : emitter.srcComment(s.loc)}`);
697
- }
698
- else if (value) {
699
- emitter.moveTemp(value);
700
- // Everything down to function depth releases; the moved result is
701
- // exempt (already struck from its frame).
702
- emitter.releaseForJump(0, 0);
703
- emitter.line(`return ${value.name};${emitter.srcComment(s.loc)}`);
704
- }
705
- else {
706
- emitter.releaseForJump(0, 0);
707
- emitter.line(`return;${emitter.srcComment(s.loc)}`);
708
- }
709
- if (pendingEntry !== null) {
710
- emitter.scopes[pendingEntry.index].push(pendingEntry.entry);
711
- }
712
- break;
713
- }
714
- case "throw": {
715
- // Evaluate, move ownership into the runtime's exception cell, then
716
- // unwind unconditionally (the innermost try handler, or out of the
717
- // function) — the same release path as return/break/continue.
718
- const v = emitter.emitExpr(s.value);
719
- const t = s.value.type;
720
- if (isRefCounted(t))
721
- emitter.moveTemp(v); // the cell takes ownership
722
- if (t.kind === "date") {
723
- throw new InternalCompilerError("emitter bug: Date throw reached backend");
724
- }
725
- else if (t.kind === "f64") {
726
- emitter.line(`scr_throw_f64(${v.name});${emitter.srcComment(s.loc)}`);
727
- }
728
- else if (t.kind === "bool") {
729
- emitter.line(`scr_throw_bool(${v.name});${emitter.srcComment(s.loc)}`);
730
- }
731
- else if (t.kind === "string") {
732
- emitter.line(`scr_throw_str(${v.name});${emitter.srcComment(s.loc)}`);
733
- }
734
- else if (t.kind === "object" && emitter.classMeta.get(t.className)?.hierarchy) {
735
- // Hierarchy instances carry a vtable word: the OBJ kind keeps the
736
- // dynamic class inspectable (catch-binding instanceof, and the
737
- // uncaught printer's "name: message" for Error instances).
738
- const rc = vAdapters(t);
739
- emitter.line(`scr_throw_obj(${v.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(t)});${emitter.srcComment(s.loc)}`);
740
- }
741
- else if (t.kind === "symbol" || t.kind === "bigint" || t.kind === "func" || t.kind === "classval") {
742
- const rc = vAdapters(t);
743
- emitter.line(`scr_throw_primitive_ref(${v.name}, &${rc.retain}, &${rc.release}, NULL);${emitter.srcComment(s.loc)}`);
744
- }
745
- else if (t.kind === "dyn" || t.kind === "jsval") {
746
- const rc = vAdapters(t);
747
- const test = t.kind === "dyn" ? "scr_dyn_is_object" : "scr_jsval_is_object";
748
- emitter.line(`scr_throw_ref_classified(${v.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(t)}, ${test}(${v.name}));${emitter.srcComment(s.loc)}`);
749
- }
750
- else {
751
- const rc = vAdapters(t);
752
- emitter.line(`scr_throw_ref(${v.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(t)});${emitter.srcComment(s.loc)}`);
753
- }
754
- emitter.emitUnwind();
755
- break;
756
- }
757
- case "runtimeFence": {
758
- // The deferred JS compile fence: throw a catchable Error naming
759
- // the construct (message) with the SC code stamped on `code`,
760
- // then unwind exactly like `throw`.
761
- const bytes = Buffer.from(s.message, "utf8");
762
- emitter.line(`scr_throw_error_msg_code(SCR_ERR_ERROR, ${cStringLiteral(bytes)}, ${bytes.length}, "${s.code}");${emitter.srcComment(s.loc)}`);
763
- emitter.emitUnwind();
764
- break;
765
- }
766
- case "rethrow":
767
- // Re-raise the saved snapshot (payload retained — the binding local
768
- // releases with its scope) and unwind like `throw`.
769
- emitter.line(`scr_rethrow(${mangleLocal(s.localId)});${emitter.srcComment(s.loc)}`);
770
- emitter.emitUnwind();
771
- break;
772
- case "tryCatch":
773
- emitter.emitTryCatch(s);
774
- break;
775
- default: {
776
- const _exhaustive = s;
777
- void _exhaustive;
778
- }
779
- }
780
- const frame = emitter.frames.pop();
781
- // return/throw already released their frames on the jump path; emitting
782
- // the fall-through releases after them would be dead double-release code.
783
- if (s.kind !== "return" && s.kind !== "throw" && s.kind !== "rethrow" && s.kind !== "runtimeFence")
784
- emitter.releaseFrame(frame);
785
- }
786
- /** try/catch/finally via pending-flag unwinding. Entering a try emits NO
787
- * code: the try context is compile-time state (tryStack) that redirects
788
- * unwinds inside the region to a label here instead of out of the
789
- * function. Shape:
790
- *
791
- * { try body } unwinds inside release frames/scopes down to
792
- * this statement's depths, then goto the handler
793
- * goto after; (normal completion skips the handler)
794
- * sc_catch_N:; (emitted only when some unwind targets it)
795
- * scr_exc_clear(); catch TAKES the exception (payload discarded —
796
- * { catch body } the supported catch form is bindingless)
797
- * after/sc_fin_N:;
798
- * { finally body } normal path
799
- * goto sc_tryend_N;
800
- * sc_finexc_N:; exception path: pending flag still set
801
- * { finally body } (emitted twice — fresh temps/labels each time;
802
- * <unwind> duplication is safe, and the pending flag is
803
- * sc_tryend_N:; the dispatch)
804
- *
805
- * Without a catch, unwinds in the try body target sc_finexc_N directly.
806
- * A catch body's own exceptions target sc_finexc_N (when a finally
807
- * exists) or the ENCLOSING context — never its own handler. After the
808
- * exception-path finally, propagation continues (emitUnwind: enclosing
809
- * handler or dummy return). A `return` inside the try/catch body rides a
810
- * THIRD finally copy (sc_finret_N — the pending-return path: value
811
- * snapshotted into sc_pret at the return site, dispatch outward after
812
- * the copy runs). Break/continue inline the crossed finally bodies via
813
- * emitFinallysForJump before branching to their resolved targets; jumps
814
- * out of plain try/catch need nothing beyond release-on-jump. */
815
- export function emitTryCatch(emitter, s) {
816
- const id = emitter.labelCounter++;
817
- const hasCatch = s.catchBody !== null;
818
- const hasFinally = s.finallyBody !== null;
819
- const catchLabel = `sc_catch_${id}`;
820
- const finExcLabel = `sc_finexc_${id}`;
821
- const endLabel = `sc_tryend_${id}`;
822
- // Where the try body's normal completion continues.
823
- const afterTryLabel = hasFinally ? `sc_fin_${id}` : endLabel;
824
- let afterTryLabelUsed = false;
825
- const handler = {
826
- label: hasCatch ? catchLabel : finExcLabel,
827
- used: false,
828
- frameDepth: emitter.frames.length,
829
- scopeDepth: emitter.scopes.length,
830
- };
831
- // The pending-return region: returns inside tryBody/catchBody snapshot
832
- // their value and jump here-ish (the pending-return finally copy below)
833
- // instead of returning directly. Same depths as the unwind handler.
834
- const retEntry = hasFinally
835
- ? {
836
- label: `sc_finret_${id}`,
837
- used: false,
838
- frameDepth: emitter.frames.length,
839
- scopeDepth: emitter.scopes.length,
840
- tryDepth: emitter.tryStack.length,
841
- body: s.finallyBody,
842
- }
843
- : null;
844
- emitter.line(`/* try */${emitter.srcComment(s.loc)}`);
845
- if (retEntry)
846
- emitter.finallyStack.push(retEntry);
847
- emitter.tryStack.push(handler);
848
- emitter.emitBlock(s.tryBody);
849
- emitter.tryStack.pop();
850
- // Exceptions raised in the CATCH body unwind to the exception-path
851
- // finally (pending stays set through it) when one exists.
852
- const excHandler = {
853
- label: finExcLabel,
854
- used: !hasCatch && handler.used,
855
- frameDepth: emitter.frames.length,
856
- scopeDepth: emitter.scopes.length,
857
- };
858
- if (hasCatch && handler.used) {
859
- if (!endsWithJump(s.tryBody)) {
860
- emitter.line(`goto ${afterTryLabel};`);
861
- afterTryLabelUsed = true;
862
- }
863
- if (hasFinally)
864
- emitter.tryStack.push(excHandler);
865
- // Generator bodies: a pending GENRET sentinel (.return(v) injected at
866
- // a yield) is a RETURN completion, not a throw — catch must not take
867
- // it. Re-unwind past this handler (finally still runs — the unwind
868
- // targets the exception-path finally or the enclosing context; the
869
- // runtime depths here equal the handler's, so no double release).
870
- const genretPrologue = () => {
871
- if (emitter.currentGenerator === null)
872
- return;
873
- emitter.line(`if (scr_exc_genret_pending()) { /* .return(): not catchable */`);
874
- emitter.indent++;
875
- emitter.emitUnwind();
876
- emitter.indent--;
877
- emitter.line(`}`);
878
- };
879
- if (s.catchLocalId !== null) {
880
- // catch (e): the exception MOVES into the binding's snapshot box,
881
- // owned by the catch body's scope (released on every exit — normal
882
- // fall-through, jumps out, and unwinds from the body).
883
- const binding = mangleLocal(s.catchLocalId);
884
- emitter.line(`${catchLabel}:; /* catch (${emitter.currentLocals.get(s.catchLocalId)?.name ?? "e"}) — takes the exception */`);
885
- genretPrologue();
886
- emitter.emitBlock(s.catchBody, (scope) => {
887
- emitter.line(`${binding} = scr_exc_take();`);
888
- scope.push({ name: binding, type: CAUGHT });
889
- });
890
- }
891
- else {
892
- emitter.line(`${catchLabel}:; /* catch — takes the exception */`);
893
- genretPrologue();
894
- emitter.line(`scr_exc_clear();`);
895
- emitter.emitBlock(s.catchBody);
896
- }
897
- if (hasFinally)
898
- emitter.tryStack.pop();
899
- // Normal completion of the catch falls through to afterTryLabel.
900
- }
901
- if (retEntry)
902
- emitter.finallyStack.pop();
903
- if (hasFinally) {
904
- if (afterTryLabelUsed)
905
- emitter.line(`${afterTryLabel}:;`);
906
- emitter.line(`/* finally (normal path) */`);
907
- emitter.emitBlock(s.finallyBody);
908
- const needEnd = excHandler.used || retEntry.used;
909
- if (needEnd)
910
- emitter.line(`goto ${endLabel};`);
911
- if (excHandler.used) {
912
- // The pending exception is STASHED across the finally body (a
913
- // ScrCaught snapshot, re-raised after) so the body runs with a
914
- // CLEAN cell: its own may-throw calls' pending checks answer for
915
- // themselves — not for the in-flight exception — and a generator
916
- // suspending here (a yield inside a finally on the .return()/
917
- // .throw() unwind) resumes into the REST of the finally, exactly
918
- // Node. A throw inside the body REPLACES the stash (it unwinds
919
- // past the release through the synthetic scope entry below —
920
- // JS's replace semantics); normal completion re-raises the stash
921
- // and keeps propagating.
922
- const stash = `sc_fexc_${id}`;
923
- emitter.line(`${finExcLabel}:; /* finally (exception path — stashed) */`);
924
- emitter.line(`ScrCaught *${stash} = scr_exc_take();`);
925
- emitter.scopes.push([{ name: stash, type: CAUGHT }]);
926
- const suppressHandler = s.suppressFinallyErrors
927
- ? {
928
- label: `sc_fsup_${id}`,
929
- used: false,
930
- frameDepth: emitter.frames.length,
931
- scopeDepth: emitter.scopes.length,
932
- }
933
- : null;
934
- if (suppressHandler)
935
- emitter.tryStack.push(suppressHandler);
936
- emitter.emitBlock(s.finallyBody);
937
- if (suppressHandler)
938
- emitter.tryStack.pop();
939
- emitter.scopes.pop(); // normal completion keeps the stash for the re-raise
940
- emitter.line(`scr_rethrow(${stash});`);
941
- emitter.line(`scr_caught_release(${stash});`);
942
- emitter.emitUnwind();
943
- if (suppressHandler?.used) {
944
- emitter.line(`${suppressHandler.label}:; /* disposal error suppresses body error */`);
945
- emitter.line(`scr_exc_suppress(${stash}); /* consumes stash */`);
946
- emitter.emitUnwind();
947
- }
948
- }
949
- if (retEntry.used) {
950
- // Pending-return path: a return in the try/catch body parked its
951
- // value in sc_pret and jumped here after releasing down to this
952
- // region. The finally body runs (third copy — fresh temps/labels,
953
- // like the exception copy), then the dispatch continues outward:
954
- // the next enclosing finally region of this function, or the
955
- // actual return. A THROW inside this copy replaces the pending
956
- // return (JS): the slot's owned value rides a synthetic scope
957
- // entry so the unwind releases it.
958
- emitter.line(`${retEntry.label}:; /* finally (pending-return path) */`);
959
- const retT = emitter.currentReturnType;
960
- const own = isRefCounted(retT);
961
- const previousPendingScope = emitter.pendingReturnScopeIndex;
962
- if (own) {
963
- emitter.scopes.push([{ name: "sc_pret", type: retT }]);
964
- emitter.pendingReturnScopeIndex = emitter.scopes.length - 1;
965
- }
966
- emitter.emitBlock(s.finallyBody);
967
- if (own)
968
- emitter.scopes.pop();
969
- emitter.pendingReturnScopeIndex = previousPendingScope;
970
- const outer = emitter.finallyStack[emitter.finallyStack.length - 1];
971
- if (outer) {
972
- outer.used = true;
973
- emitter.releaseForJump(outer.frameDepth, outer.scopeDepth);
974
- emitter.line(`goto ${outer.label};`);
975
- }
976
- else {
977
- emitter.releaseForJump(0, 0);
978
- emitter.line(retT.kind === "void" ? `return;` : `return sc_pret;`);
979
- }
980
- }
981
- if (needEnd)
982
- emitter.line(`${endLabel}:;`);
983
- }
984
- else if (afterTryLabelUsed) {
985
- emitter.line(`${endLabel}:;`);
986
- }
987
- }
988
- /** JS-exact switch as a goto chain — C `switch` cannot express lazily
989
- * evaluated, arbitrary-expression case tests. Shape:
990
- *
991
- * disc temp
992
- * NULL-reset of refcounted case-body locals (see below)
993
- * per test, in source order: eval test; if (== disc) goto case_i;
994
- * goto default (or end when there is none)
995
- * case_0:; body_0 ─┐ bodies in source order fall through
996
- * case_1:; body_1 ─┘ naturally, JS-exact
997
- * scope releases (natural fall-off path)
998
- * end:; (break jumps here, after releasing scopes itself)
999
- *
1000
- * All case bodies share ONE scope (JS: one lexical scope per switch body).
1001
- * Because dispatch can jump PAST a varDecl into a later case, a refcounted
1002
- * local of a skipped body is never written — and inside an enclosing loop
1003
- * it still holds the pointer a previous iteration's scope exit already
1004
- * released. The declarations are therefore NULL-reset up front; the
1005
- * scope-exit releases rely on the runtime's NULL-tolerant release calls. */
1006
- export function emitSwitch(emitter, s) {
1007
- if (s.disc.type.kind !== "f64" && s.disc.type.kind !== "string" && s.disc.type.kind !== "bool") {
1008
- throw new InternalCompilerError(`emitter bug: switch on ${s.disc.type.kind}`);
1009
- }
1010
- const id = emitter.labelCounter++;
1011
- const endLabel = `sc_swend_${id}`;
1012
- const caseLabel = (i) => `sc_swcase_${id}_${i}`;
1013
- // The disc temp lives in the whole statement's frame: for a string
1014
- // discriminant it stays alive across every test and body, released when
1015
- // the switch statement ends (break lands before that release; return
1016
- // sweeps frames itself).
1017
- const disc = emitter.emitExpr(s.disc);
1018
- // NULL-reset refcounted/boxed locals declared at the top level of case
1019
- // bodies (nested blocks manage their own scopes on normal control flow).
1020
- for (const c of s.cases) {
1021
- for (const stmt of c.body) {
1022
- if (stmt.kind !== "varDecl")
1023
- continue;
1024
- const local = emitter.currentLocals.get(stmt.localId);
1025
- if (local.boxed || isRefCounted(local.type)) {
1026
- emitter.line(`${mangleLocal(local.id)} = NULL; /* case-scoped ${local.name} */`);
1027
- }
1028
- }
1029
- }
1030
- // Dispatch: lazy source-order test evaluation (a test after the match
1031
- // never runs). Each test's temps release right after its comparison.
1032
- let defaultIdx = -1;
1033
- s.cases.forEach((c, i) => {
1034
- if (c.test === null) {
1035
- defaultIdx = i;
1036
- return;
1037
- }
1038
- emitter.frames.push([]);
1039
- const t = emitter.emitExpr(c.test);
1040
- const cmp = c.test.type.kind === "string"
1041
- ? `scr_str_eq(${disc.name}, ${t.name})`
1042
- : `${disc.name} == ${t.name}`;
1043
- const hit = emitter.newTemp(BOOL, cmp);
1044
- emitter.releaseFrame(emitter.frames.pop());
1045
- emitter.line(`if (${hit.name}) goto ${caseLabel(i)};`);
1046
- });
1047
- emitter.line(`goto ${defaultIdx >= 0 ? caseLabel(defaultIdx) : endLabel};`);
1048
- // Bodies in source order: entering one falls through the rest (JS-exact)
1049
- // until a break jumps to the end label.
1050
- const target = {
1051
- kind: "switch",
1052
- endLabel,
1053
- usedEnd: defaultIdx < 0,
1054
- ...(s.labels !== undefined && { labels: s.labels }),
1055
- scopeDepth: emitter.scopes.length,
1056
- frameDepth: emitter.frames.length,
1057
- finallyDepth: emitter.finallyStack.length,
1058
- };
1059
- emitter.jumpTargets.push(target);
1060
- emitter.scopes.push([]);
1061
- s.cases.forEach((c, i) => {
1062
- emitter.line(`${caseLabel(i)}:;`);
1063
- emitter.indent++;
1064
- emitter.emitStmts(c.body);
1065
- emitter.indent--;
1066
- });
1067
- emitter.jumpTargets.pop();
1068
- const scope = emitter.scopes.pop();
1069
- // Natural fall-off of the last body releases the shared scope here; a
1070
- // jump (break/return/continue/throw) already released it before jumping.
1071
- const lastBody = s.cases[s.cases.length - 1]?.body;
1072
- if (!lastBody || !endsWithJump(lastBody))
1073
- emitter.releaseFrame(scope);
1074
- if (target.usedEnd)
1075
- emitter.line(`${endLabel}:;`);
1076
- }
1077
- /** Emits `if (cond) ` followed by a block on the same line for readability. */
1078
- export function mergeBrace(emitter, emitBlockFn) {
1079
- const head = emitter.lines.pop();
1080
- let before = emitter.lines.length;
1081
- emitBlockFn();
1082
- while (emitter.lines[before]?.startsWith("#line "))
1083
- before++;
1084
- emitter.lines[before] = head + emitter.lines[before].trimStart();
1085
- }
1086
- /** Evaluates `expr` in its own statement frame inside an already-open
1087
- * branch and moves the result into the C lvalue `target`: the chosen
1088
- * value's ownership transfers, every other temp the evaluation allocated
1089
- * releases inside the branch. The shared core of the lazily-branched
1090
- * expressions (`logical`, `ternary`); the caller owns the surrounding
1091
- * braces/indentation and registers `target` in ITS frame. */
1092
- export function emitBranchInto(emitter, target, expr) {
1093
- emitter.frames.push([]);
1094
- const v = emitter.emitExpr(expr);
1095
- emitter.moveTemp(v);
1096
- emitter.line(`${target} = ${v.name};`);
1097
- emitter.releaseFrame(emitter.frames.pop());
1098
- }
1099
- /** Evaluates a condition; its string temps are released before the branch,
1100
- * which is safe because the result is a scalar bool. */
1101
- export function emitCondition(emitter, cond) {
1102
- const t = emitter.emitExpr(cond);
1103
- const frame = emitter.currentFrame();
1104
- emitter.releaseFrame(frame);
1105
- frame.length = 0;
1106
- return t.name;
1107
- }
1108
- //# sourceMappingURL=stmts.js.map