@scriptc/compiler 0.1.6 → 0.2.0

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