@scriptc/compiler 0.1.7 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1043) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +98 -39
  2. package/ambient/scriptc-overrides.d.ts +10 -6
  3. package/ambient/scriptc.d.ts +15 -0
  4. package/dist/backend/build-cache.d.ts +1 -3
  5. package/dist/backend/build-cache.js +3 -22
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cache-root.d.ts +3 -0
  8. package/dist/backend/cache-root.js +23 -0
  9. package/dist/backend/cache-root.js.map +1 -0
  10. package/dist/backend/cycle-analysis.d.ts +15 -0
  11. package/dist/backend/cycle-analysis.js +108 -0
  12. package/dist/backend/cycle-analysis.js.map +1 -0
  13. package/dist/backend/cycle-analysis.test.js +124 -0
  14. package/dist/backend/cycle-analysis.test.js.map +1 -0
  15. package/dist/backend/executable-features.d.ts +4 -0
  16. package/dist/backend/executable-features.js +42 -0
  17. package/dist/backend/executable-features.js.map +1 -0
  18. package/dist/backend/external-c.d.ts +5 -27
  19. package/dist/backend/external-c.js +5 -40
  20. package/dist/backend/external-c.js.map +1 -1
  21. package/dist/backend/ffi-callbacks.d.ts +2 -3
  22. package/dist/backend/ffi-callbacks.js +2 -3
  23. package/dist/backend/ffi-callbacks.js.map +1 -1
  24. package/dist/backend/library-identity-markers.d.ts +4 -9
  25. package/dist/backend/library-identity-markers.js +11 -49
  26. package/dist/backend/library-identity-markers.js.map +1 -1
  27. package/dist/backend/library-pack.d.ts +5 -0
  28. package/dist/backend/library-pack.js +123 -0
  29. package/dist/backend/library-pack.js.map +1 -0
  30. package/dist/backend/link-plan-core.d.ts +20 -0
  31. package/dist/backend/link-plan-core.js +18 -0
  32. package/dist/backend/link-plan-core.js.map +1 -0
  33. package/dist/backend/link-plan.d.ts +1 -1
  34. package/dist/backend/link-plan.js +16 -17
  35. package/dist/backend/link-plan.js.map +1 -1
  36. package/dist/backend/link-trace.d.ts +2 -0
  37. package/dist/backend/link-trace.js +24 -0
  38. package/dist/backend/link-trace.js.map +1 -0
  39. package/dist/backend/linker.js +1 -1
  40. package/dist/backend/linker.js.map +1 -1
  41. package/dist/backend/literals.d.ts +9 -0
  42. package/dist/backend/literals.js +35 -0
  43. package/dist/backend/literals.js.map +1 -0
  44. package/dist/backend/literals.test.d.ts +1 -0
  45. package/dist/backend/literals.test.js +53 -0
  46. package/dist/backend/literals.test.js.map +1 -0
  47. package/dist/backend/llvm/blocks.d.ts +2 -0
  48. package/dist/backend/llvm/blocks.js +9 -4
  49. package/dist/backend/llvm/blocks.js.map +1 -1
  50. package/dist/backend/llvm/blocks.test.d.ts +1 -0
  51. package/dist/backend/llvm/blocks.test.js +91 -0
  52. package/dist/backend/llvm/blocks.test.js.map +1 -0
  53. package/dist/backend/llvm/classes.d.ts +14 -8
  54. package/dist/backend/llvm/classes.js +88 -30
  55. package/dist/backend/llvm/classes.js.map +1 -1
  56. package/dist/backend/llvm/common.d.ts +5 -1
  57. package/dist/backend/llvm/common.js +45 -4
  58. package/dist/backend/llvm/common.js.map +1 -1
  59. package/dist/backend/llvm/debug-info.js +2 -7
  60. package/dist/backend/llvm/debug-info.js.map +1 -1
  61. package/dist/backend/llvm/debug-info.test.d.ts +1 -0
  62. package/dist/backend/llvm/debug-info.test.js +110 -0
  63. package/dist/backend/llvm/debug-info.test.js.map +1 -0
  64. package/dist/backend/llvm/dyn.d.ts +21 -2
  65. package/dist/backend/llvm/dyn.js +647 -251
  66. package/dist/backend/llvm/dyn.js.map +1 -1
  67. package/dist/backend/llvm/emitter.d.ts +596 -1
  68. package/dist/backend/llvm/emitter.js +769 -425
  69. package/dist/backend/llvm/emitter.js.map +1 -1
  70. package/dist/backend/llvm/emitter.test.d.ts +1 -0
  71. package/dist/backend/llvm/emitter.test.js +179 -0
  72. package/dist/backend/llvm/emitter.test.js.map +1 -0
  73. package/dist/backend/llvm/expr-async.js +23 -14
  74. package/dist/backend/llvm/expr-async.js.map +1 -1
  75. package/dist/backend/llvm/expr-bytes.d.ts +2 -2
  76. package/dist/backend/llvm/expr-bytes.js +60 -31
  77. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  78. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  79. package/dist/backend/llvm/expr-callbacks.js +25 -22
  80. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  81. package/dist/backend/llvm/expr-calls.js +136 -35
  82. package/dist/backend/llvm/expr-calls.js.map +1 -1
  83. package/dist/backend/llvm/expr-containers.d.ts +1 -1
  84. package/dist/backend/llvm/expr-containers.js +43 -14
  85. package/dist/backend/llvm/expr-containers.js.map +1 -1
  86. package/dist/backend/llvm/expr-context.d.ts +5 -260
  87. package/dist/backend/llvm/expr-control.js +10 -6
  88. package/dist/backend/llvm/expr-control.js.map +1 -1
  89. package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
  90. package/dist/backend/llvm/expr-dispatch.js +2 -0
  91. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  92. package/dist/backend/llvm/expr-dynamic.js +78 -81
  93. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  94. package/dist/backend/llvm/expr-island.d.ts +1 -1
  95. package/dist/backend/llvm/expr-island.js +11 -7
  96. package/dist/backend/llvm/expr-island.js.map +1 -1
  97. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  98. package/dist/backend/llvm/expr-primitives.js +62 -31
  99. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  100. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  101. package/dist/backend/llvm/expr-records.d.ts +5 -1
  102. package/dist/backend/llvm/expr-records.js +54 -7
  103. package/dist/backend/llvm/expr-records.js.map +1 -1
  104. package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
  105. package/dist/backend/llvm/expr-stream-bridges.js +220 -131
  106. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  107. package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
  108. package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
  109. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
  110. package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
  111. package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
  112. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  113. package/dist/backend/llvm/layouts.d.ts +19 -0
  114. package/dist/backend/llvm/layouts.js +12 -0
  115. package/dist/backend/llvm/layouts.js.map +1 -0
  116. package/dist/backend/llvm/lib-abi.d.ts +19 -0
  117. package/dist/backend/llvm/lib-abi.js +82 -0
  118. package/dist/backend/llvm/lib-abi.js.map +1 -0
  119. package/dist/backend/llvm/lib-connect.d.ts +2 -0
  120. package/dist/backend/llvm/lib-connect.js +51 -0
  121. package/dist/backend/llvm/lib-connect.js.map +1 -0
  122. package/dist/backend/llvm/lib-datagram.d.ts +2 -0
  123. package/dist/backend/llvm/lib-datagram.js +135 -0
  124. package/dist/backend/llvm/lib-datagram.js.map +1 -0
  125. package/dist/backend/llvm/lib-dispatch.js +50 -6
  126. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  127. package/dist/backend/llvm/lib-filesystem.js +30 -18
  128. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  129. package/dist/backend/llvm/lib-http2.d.ts +2 -0
  130. package/dist/backend/llvm/lib-http2.js +215 -0
  131. package/dist/backend/llvm/lib-http2.js.map +1 -0
  132. package/dist/backend/llvm/lib-lookup.d.ts +2 -0
  133. package/dist/backend/llvm/lib-lookup.js +39 -0
  134. package/dist/backend/llvm/lib-lookup.js.map +1 -0
  135. package/dist/backend/llvm/lib-network.js +25 -2
  136. package/dist/backend/llvm/lib-network.js.map +1 -1
  137. package/dist/backend/llvm/lib-process.js +44 -19
  138. package/dist/backend/llvm/lib-process.js.map +1 -1
  139. package/dist/backend/llvm/lib-shared.js +162 -3
  140. package/dist/backend/llvm/lib-shared.js.map +1 -1
  141. package/dist/backend/llvm/lib-stream.js +3 -2
  142. package/dist/backend/llvm/lib-stream.js.map +1 -1
  143. package/dist/backend/llvm/lib-test.d.ts +2 -0
  144. package/dist/backend/llvm/lib-test.js +34 -0
  145. package/dist/backend/llvm/lib-test.js.map +1 -0
  146. package/dist/backend/llvm/lib-tls.d.ts +2 -0
  147. package/dist/backend/llvm/lib-tls.js +82 -0
  148. package/dist/backend/llvm/lib-tls.js.map +1 -0
  149. package/dist/backend/llvm/shapes.d.ts +10 -9
  150. package/dist/backend/llvm/shapes.js +42 -131
  151. package/dist/backend/llvm/shapes.js.map +1 -1
  152. package/dist/backend/llvm/unsupported.d.ts +1 -0
  153. package/dist/backend/llvm/unsupported.js +1 -2
  154. package/dist/backend/llvm/unsupported.js.map +1 -1
  155. package/dist/backend/llvm/walkers.js +1 -7
  156. package/dist/backend/llvm/walkers.js.map +1 -1
  157. package/dist/backend/mangle.d.ts +2 -2
  158. package/dist/backend/mangle.js +16 -5
  159. package/dist/backend/mangle.js.map +1 -1
  160. package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
  161. package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
  162. package/dist/backend/may-throw.js.map +1 -0
  163. package/dist/backend/may-throw.test.d.ts +1 -0
  164. package/dist/backend/may-throw.test.js +58 -0
  165. package/dist/backend/may-throw.test.js.map +1 -0
  166. package/dist/backend/native-codegen-core.d.ts +22 -0
  167. package/dist/backend/native-codegen-core.js +44 -0
  168. package/dist/backend/native-codegen-core.js.map +1 -0
  169. package/dist/backend/native-codegen.d.ts +3 -19
  170. package/dist/backend/native-codegen.js +5 -44
  171. package/dist/backend/native-codegen.js.map +1 -1
  172. package/dist/backend/native-codegen.test.js +2 -2
  173. package/dist/backend/native-codegen.test.js.map +1 -1
  174. package/dist/backend/native-link-info-core.d.ts +94 -0
  175. package/dist/backend/native-link-info-core.js +62 -0
  176. package/dist/backend/native-link-info-core.js.map +1 -0
  177. package/dist/backend/native-link-info.d.ts +3 -88
  178. package/dist/backend/native-link-info.js +12 -243
  179. package/dist/backend/native-link-info.js.map +1 -1
  180. package/dist/backend/native-link-info.test.js +41 -146
  181. package/dist/backend/native-link-info.test.js.map +1 -1
  182. package/dist/backend/native-toolchain.d.ts +12 -30
  183. package/dist/backend/native-toolchain.js +83 -233
  184. package/dist/backend/native-toolchain.js.map +1 -1
  185. package/dist/backend/native-toolchain.test.js +77 -5
  186. package/dist/backend/native-toolchain.test.js.map +1 -1
  187. package/dist/backend/native-tools.d.ts +24 -0
  188. package/dist/backend/native-tools.js +33 -0
  189. package/dist/backend/native-tools.js.map +1 -0
  190. package/dist/backend/object-localize.js +19 -8
  191. package/dist/backend/object-localize.js.map +1 -1
  192. package/dist/backend/object-localize.test.js +22 -0
  193. package/dist/backend/object-localize.test.js.map +1 -1
  194. package/dist/backend/runtime-abi.d.ts +2 -2
  195. package/dist/backend/runtime-abi.js +2 -2
  196. package/dist/backend/runtime-pack-core.d.ts +101 -0
  197. package/dist/backend/runtime-pack-core.js +172 -0
  198. package/dist/backend/runtime-pack-core.js.map +1 -0
  199. package/dist/backend/runtime-pack-native.d.ts +21 -0
  200. package/dist/backend/runtime-pack-native.js +73 -0
  201. package/dist/backend/runtime-pack-native.js.map +1 -0
  202. package/dist/backend/runtime-pack-targets.test.js +1 -1
  203. package/dist/backend/runtime-pack.d.ts +3 -83
  204. package/dist/backend/runtime-pack.js +8 -151
  205. package/dist/backend/runtime-pack.js.map +1 -1
  206. package/dist/backend/runtime-pack.test.js +24 -1
  207. package/dist/backend/runtime-pack.test.js.map +1 -1
  208. package/dist/backend/target-diagnostics.d.ts +22 -0
  209. package/dist/backend/target-diagnostics.js +108 -0
  210. package/dist/backend/target-diagnostics.js.map +1 -0
  211. package/dist/backend/target-platform.d.ts +15 -0
  212. package/dist/backend/target-platform.js +72 -0
  213. package/dist/backend/target-platform.js.map +1 -0
  214. package/dist/backend/targets.d.ts +13 -4
  215. package/dist/backend/targets.js +103 -34
  216. package/dist/backend/targets.js.map +1 -1
  217. package/dist/backend/targets.test.js +72 -4
  218. package/dist/backend/targets.test.js.map +1 -1
  219. package/dist/backend/toolchain-environment.d.ts +6 -0
  220. package/dist/backend/toolchain-environment.js +99 -0
  221. package/dist/backend/toolchain-environment.js.map +1 -0
  222. package/dist/backend/vendor-archives.d.ts +1 -9
  223. package/dist/backend/vendor-archives.js +2 -9
  224. package/dist/backend/vendor-archives.js.map +1 -1
  225. package/dist/backend/vendor-inputs.d.ts +9 -0
  226. package/dist/backend/vendor-inputs.js +10 -0
  227. package/dist/backend/vendor-inputs.js.map +1 -0
  228. package/dist/backend/warm-cache.d.ts +3 -0
  229. package/dist/backend/warm-cache.js +41 -0
  230. package/dist/backend/warm-cache.js.map +1 -0
  231. package/dist/cli/command.d.ts +3 -0
  232. package/dist/cli/command.js +328 -0
  233. package/dist/cli/command.js.map +1 -0
  234. package/dist/cli/host.d.ts +24 -0
  235. package/dist/cli/host.js +2 -0
  236. package/dist/cli/host.js.map +1 -0
  237. package/dist/cli/output-options.d.ts +26 -0
  238. package/dist/cli/output-options.js +60 -0
  239. package/dist/cli/output-options.js.map +1 -0
  240. package/dist/cli/paths.d.ts +12 -0
  241. package/dist/cli/paths.js +42 -0
  242. package/dist/cli/paths.js.map +1 -0
  243. package/dist/cli/usage.d.ts +74 -0
  244. package/dist/cli/usage.js +86 -0
  245. package/dist/cli/usage.js.map +1 -0
  246. package/dist/cli/wasi-paths.d.ts +8 -0
  247. package/dist/cli/wasi-paths.js +41 -0
  248. package/dist/cli/wasi-paths.js.map +1 -0
  249. package/dist/cli/wasi-runner.d.ts +2 -0
  250. package/dist/cli/wasi-runner.js +28 -0
  251. package/dist/cli/wasi-runner.js.map +1 -0
  252. package/dist/compat/fetch-profile.js +37 -7
  253. package/dist/compat/fetch-profile.js.map +1 -1
  254. package/dist/compile-types.d.ts +162 -0
  255. package/dist/compile-types.js +2 -0
  256. package/dist/compile-types.js.map +1 -0
  257. package/dist/coverage/report.js +11 -5
  258. package/dist/coverage/report.js.map +1 -1
  259. package/dist/coverage/surface-manifest.js +5 -2
  260. package/dist/coverage/surface-manifest.js.map +1 -1
  261. package/dist/diagnostics/diagnostic.js +5 -10
  262. package/dist/diagnostics/diagnostic.js.map +1 -1
  263. package/dist/executable/executable-cache.d.ts +3 -4
  264. package/dist/executable/executable-cache.js +5 -6
  265. package/dist/executable/executable-cache.js.map +1 -1
  266. package/dist/executable/executable-cache.test.js +16 -17
  267. package/dist/executable/executable-cache.test.js.map +1 -1
  268. package/dist/executable/prepare.d.ts +14 -0
  269. package/dist/executable/prepare.js +66 -0
  270. package/dist/executable/prepare.js.map +1 -0
  271. package/dist/ffi/ffi-manifest.d.ts +11 -4
  272. package/dist/ffi/ffi-manifest.js +170 -58
  273. package/dist/ffi/ffi-manifest.js.map +1 -1
  274. package/dist/ffi/ffi-manifest.test.d.ts +1 -0
  275. package/dist/ffi/ffi-manifest.test.js +111 -0
  276. package/dist/ffi/ffi-manifest.test.js.map +1 -0
  277. package/dist/format-integer.d.ts +3 -0
  278. package/dist/format-integer.js +14 -0
  279. package/dist/format-integer.js.map +1 -0
  280. package/dist/frontend/analysis.d.ts +5 -0
  281. package/dist/frontend/analysis.js +88 -0
  282. package/dist/frontend/analysis.js.map +1 -0
  283. package/dist/frontend/arguments-usage.d.ts +1 -3
  284. package/dist/frontend/arguments-usage.js.map +1 -1
  285. package/dist/frontend/builtin-modules.d.ts +1 -1
  286. package/dist/frontend/builtin-modules.js +1 -1
  287. package/dist/frontend/builtin-modules.js.map +1 -1
  288. package/dist/frontend/cjs-lexer.d.ts +4 -25
  289. package/dist/frontend/cjs-lexer.js +6 -806
  290. package/dist/frontend/cjs-lexer.js.map +1 -1
  291. package/dist/frontend/cjs-resolve.d.ts +5 -0
  292. package/dist/frontend/cjs-resolve.js +429 -0
  293. package/dist/frontend/cjs-resolve.js.map +1 -0
  294. package/dist/frontend/cjs-syntax.d.ts +26 -0
  295. package/dist/frontend/cjs-syntax.js +806 -0
  296. package/dist/frontend/cjs-syntax.js.map +1 -0
  297. package/dist/frontend/comptime-node.d.ts +4 -0
  298. package/dist/frontend/comptime-node.js +16 -0
  299. package/dist/frontend/comptime-node.js.map +1 -0
  300. package/dist/frontend/comptime-node.test.d.ts +1 -0
  301. package/dist/frontend/comptime-node.test.js +37 -0
  302. package/dist/frontend/comptime-node.test.js.map +1 -0
  303. package/dist/frontend/dts-paths.d.ts +3 -4
  304. package/dist/frontend/dts-paths.js +15 -8
  305. package/dist/frontend/dts-paths.js.map +1 -1
  306. package/dist/frontend/fork-target.js +2 -2
  307. package/dist/frontend/fork-target.js.map +1 -1
  308. package/dist/frontend/helper-tokens.d.ts +1 -0
  309. package/dist/frontend/helper-tokens.js +147 -0
  310. package/dist/frontend/helper-tokens.js.map +1 -0
  311. package/dist/frontend/helper-tokens.test.d.ts +1 -0
  312. package/dist/frontend/helper-tokens.test.js +35 -0
  313. package/dist/frontend/helper-tokens.test.js.map +1 -0
  314. package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
  315. package/dist/frontend/inferred-js-diagnostics.js +69 -0
  316. package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
  317. package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
  318. package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
  319. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
  320. package/dist/frontend/input-tracker.d.ts +5 -2
  321. package/dist/frontend/input-tracker.js +24 -3
  322. package/dist/frontend/input-tracker.js.map +1 -1
  323. package/dist/frontend/input-tracker.test.js +23 -0
  324. package/dist/frontend/input-tracker.test.js.map +1 -1
  325. package/dist/frontend/lib-contract.js +32 -24
  326. package/dist/frontend/lib-contract.js.map +1 -1
  327. package/dist/frontend/literal-values.d.ts +4 -0
  328. package/dist/frontend/literal-values.js +21 -0
  329. package/dist/frontend/literal-values.js.map +1 -0
  330. package/dist/frontend/literal-values.test.d.ts +1 -0
  331. package/dist/frontend/literal-values.test.js +91 -0
  332. package/dist/frontend/literal-values.test.js.map +1 -0
  333. package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
  334. package/dist/frontend/lowering/abstract-equality.js +3 -0
  335. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  336. package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
  337. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  338. package/dist/frontend/lowering/array-values.d.ts +4 -1
  339. package/dist/frontend/lowering/array-values.js +43 -1
  340. package/dist/frontend/lowering/array-values.js.map +1 -1
  341. package/dist/frontend/lowering/callback-arg.js +1 -0
  342. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  343. package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
  344. package/dist/frontend/lowering/class-callbacks.js +74 -0
  345. package/dist/frontend/lowering/class-callbacks.js.map +1 -0
  346. package/dist/frontend/lowering/class-construction.d.ts +12 -0
  347. package/dist/frontend/lowering/class-construction.js +156 -0
  348. package/dist/frontend/lowering/class-construction.js.map +1 -0
  349. package/dist/frontend/lowering/class-descriptors.d.ts +10 -0
  350. package/dist/frontend/lowering/class-descriptors.js +114 -0
  351. package/dist/frontend/lowering/class-descriptors.js.map +1 -0
  352. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +51 -0
  353. package/dist/frontend/lowering/class-dynamic-dispatch.js +1158 -0
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
  355. package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +93 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
  358. package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
  359. package/dist/frontend/lowering/class-instance-constructor.js +67 -0
  360. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
  361. package/dist/frontend/lowering/class-method-values.d.ts +13 -0
  362. package/dist/frontend/lowering/class-method-values.js +235 -0
  363. package/dist/frontend/lowering/class-method-values.js.map +1 -0
  364. package/dist/frontend/lowering/class-prototypes.d.ts +19 -0
  365. package/dist/frontend/lowering/class-prototypes.js +242 -0
  366. package/dist/frontend/lowering/class-prototypes.js.map +1 -0
  367. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  368. package/dist/frontend/lowering/class-runtime-statics.js +66 -0
  369. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
  370. package/dist/frontend/lowering/class-static-data.d.ts +6 -0
  371. package/dist/frontend/lowering/class-static-data.js +56 -0
  372. package/dist/frontend/lowering/class-static-data.js.map +1 -0
  373. package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
  374. package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
  375. package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
  376. package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
  377. package/dist/frontend/lowering/containers/bytes.js +208 -163
  378. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  379. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
  380. package/dist/frontend/lowering/containers/string-and-regexp.js +58 -63
  381. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  382. package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
  383. package/dist/frontend/lowering/containers/string-replacement.js +217 -0
  384. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
  385. package/dist/frontend/lowering/error-methods.d.ts +14 -0
  386. package/dist/frontend/lowering/error-methods.js +177 -0
  387. package/dist/frontend/lowering/error-methods.js.map +1 -0
  388. package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
  389. package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
  390. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
  391. package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
  392. package/dist/frontend/lowering/expressions/native-proxy.js +51 -0
  393. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
  394. package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
  395. package/dist/frontend/lowering/expressions/nullish-assignment.js +132 -0
  396. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
  397. package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
  398. package/dist/frontend/lowering/expressions/object-literals.js +509 -183
  399. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  400. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
  401. package/dist/frontend/lowering/expressions/optional-chains.js +88 -24
  402. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  403. package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
  404. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
  405. package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
  406. package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
  407. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
  408. package/dist/frontend/lowering/function-context.d.ts +101 -0
  409. package/dist/frontend/lowering/function-context.js +109 -0
  410. package/dist/frontend/lowering/function-context.js.map +1 -0
  411. package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
  412. package/dist/frontend/lowering/generator-delegation.js +85 -0
  413. package/dist/frontend/lowering/generator-delegation.js.map +1 -0
  414. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +11 -0
  415. package/dist/frontend/lowering/generator-dynamic-dispatch.js +143 -0
  416. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
  417. package/dist/frontend/lowering/lib-boundary.d.ts +4 -1
  418. package/dist/frontend/lowering/lib-boundary.js +112 -20
  419. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  420. package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
  421. package/dist/frontend/lowering/lib-boundary.test.js +45 -0
  422. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
  423. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  424. package/dist/frontend/lowering/lower-assert.d.ts +1 -1
  425. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  426. package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
  427. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  428. package/dist/frontend/lowering/lower-builtin-values.d.ts +18 -0
  429. package/dist/frontend/lowering/lower-builtin-values.js +249 -0
  430. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
  431. package/dist/frontend/lowering/lower-builtins.d.ts +33 -46
  432. package/dist/frontend/lowering/lower-builtins.js +676 -365
  433. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  434. package/dist/frontend/lowering/lower-calls.d.ts +28 -22
  435. package/dist/frontend/lowering/lower-calls.js +1660 -412
  436. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  437. package/dist/frontend/lowering/lower-classes.d.ts +95 -57
  438. package/dist/frontend/lowering/lower-classes.js +1491 -404
  439. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  440. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  441. package/dist/frontend/lowering/lower-comptime.js +23 -32
  442. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  443. package/dist/frontend/lowering/lower-containers.d.ts +36 -32
  444. package/dist/frontend/lowering/lower-containers.js +925 -181
  445. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  446. package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
  447. package/dist/frontend/lowering/lower-dgram.js +3 -2
  448. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  449. package/dist/frontend/lowering/lower-enums.d.ts +1 -1
  450. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  451. package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
  452. package/dist/frontend/lowering/lower-event-emitter.js +58 -26
  453. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  454. package/dist/frontend/lowering/lower-expando.d.ts +7 -1
  455. package/dist/frontend/lowering/lower-expando.js +14 -6
  456. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  457. package/dist/frontend/lowering/lower-exprs.d.ts +37 -13
  458. package/dist/frontend/lowering/lower-exprs.js +2163 -863
  459. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  460. package/dist/frontend/lowering/lower-generators.d.ts +2 -5
  461. package/dist/frontend/lowering/lower-generators.js +88 -46
  462. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  463. package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
  464. package/dist/frontend/lowering/lower-global-value.js +17 -0
  465. package/dist/frontend/lowering/lower-global-value.js.map +1 -0
  466. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  467. package/dist/frontend/lowering/lower-inspect.js +17 -8
  468. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  469. package/dist/frontend/lowering/lower-island.d.ts +7 -8
  470. package/dist/frontend/lowering/lower-island.js +66 -33
  471. package/dist/frontend/lowering/lower-island.js.map +1 -1
  472. package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
  473. package/dist/frontend/lowering/lower-mixins.js +5 -3
  474. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  475. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  476. package/dist/frontend/lowering/lower-modules.js +445 -39
  477. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  478. package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
  479. package/dist/frontend/lowering/lower-modules.test.js +39 -0
  480. package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
  481. package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
  482. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  483. package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
  484. package/dist/frontend/lowering/lower-node-module.js +13 -10
  485. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  486. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  487. package/dist/frontend/lowering/lower-server.js +6 -10
  488. package/dist/frontend/lowering/lower-server.js.map +1 -1
  489. package/dist/frontend/lowering/lower-stmts.d.ts +17 -17
  490. package/dist/frontend/lowering/lower-stmts.js +855 -514
  491. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  492. package/dist/frontend/lowering/lower-stream.d.ts +1 -1
  493. package/dist/frontend/lowering/lower-stream.js +20 -11
  494. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  495. package/dist/frontend/lowering/lower-test.d.ts +1 -1
  496. package/dist/frontend/lowering/lower-test.js.map +1 -1
  497. package/dist/frontend/lowering/lower-url.d.ts +6 -0
  498. package/dist/frontend/lowering/lower-url.js +77 -0
  499. package/dist/frontend/lowering/lower-url.js.map +1 -0
  500. package/dist/frontend/lowering/lowerer.d.ts +140 -190
  501. package/dist/frontend/lowering/lowerer.js +1193 -712
  502. package/dist/frontend/lowering/lowerer.js.map +1 -1
  503. package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
  504. package/dist/frontend/lowering/lowerer.test.js +172 -0
  505. package/dist/frontend/lowering/lowerer.test.js.map +1 -0
  506. package/dist/frontend/lowering/native-ffi.d.ts +5 -0
  507. package/dist/frontend/lowering/native-ffi.js +40 -0
  508. package/dist/frontend/lowering/native-ffi.js.map +1 -0
  509. package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
  510. package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
  511. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
  512. package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
  513. package/dist/frontend/lowering/object-factory-new.js +68 -0
  514. package/dist/frontend/lowering/object-factory-new.js.map +1 -0
  515. package/dist/frontend/lowering/optional-arguments.js +6 -1
  516. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  517. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  518. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  519. package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
  520. package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
  521. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
  522. package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
  523. package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
  524. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
  525. package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
  526. package/dist/frontend/lowering/sanitize-class-types.js +79 -0
  527. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
  528. package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
  529. package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
  530. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
  531. package/dist/frontend/lowering/static-this.d.ts +5 -1
  532. package/dist/frontend/lowering/static-this.js +28 -2
  533. package/dist/frontend/lowering/static-this.js.map +1 -1
  534. package/dist/frontend/lowering/string-index.d.ts +7 -0
  535. package/dist/frontend/lowering/string-index.js +39 -0
  536. package/dist/frontend/lowering/string-index.js.map +1 -0
  537. package/dist/frontend/lowering/surfaces.d.ts +10 -3
  538. package/dist/frontend/lowering/surfaces.js +86 -37
  539. package/dist/frontend/lowering/surfaces.js.map +1 -1
  540. package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
  541. package/dist/frontend/lowering/symbol-fields.js +183 -0
  542. package/dist/frontend/lowering/symbol-fields.js.map +1 -0
  543. package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
  544. package/dist/frontend/lowering/symbol-methods.js +30 -0
  545. package/dist/frontend/lowering/symbol-methods.js.map +1 -0
  546. package/dist/frontend/lowering/text-decoder-encoding.d.ts +12 -0
  547. package/dist/frontend/lowering/text-decoder-encoding.js +82 -0
  548. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
  549. package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
  550. package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
  551. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
  552. package/dist/frontend/lowering/union-narrow.d.ts +9 -0
  553. package/dist/frontend/lowering/union-narrow.js +59 -0
  554. package/dist/frontend/lowering/union-narrow.js.map +1 -0
  555. package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
  556. package/dist/frontend/lowering/union-narrow.test.js +72 -0
  557. package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
  558. package/dist/frontend/lowering/union-retag.d.ts +43 -0
  559. package/dist/frontend/lowering/union-retag.js +259 -0
  560. package/dist/frontend/lowering/union-retag.js.map +1 -0
  561. package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
  562. package/dist/frontend/lowering/union-retag.test.js +405 -0
  563. package/dist/frontend/lowering/union-retag.test.js.map +1 -0
  564. package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
  565. package/dist/frontend/lowering/unregistered-class-types.js +94 -0
  566. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
  567. package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
  568. package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
  569. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
  570. package/dist/frontend/lowering/width-lift.d.ts +40 -0
  571. package/dist/frontend/lowering/width-lift.js +2 -0
  572. package/dist/frontend/lowering/width-lift.js.map +1 -0
  573. package/dist/frontend/module-syntax.d.ts +58 -0
  574. package/dist/frontend/module-syntax.js +123 -0
  575. package/dist/frontend/module-syntax.js.map +1 -0
  576. package/dist/frontend/module-syntax.test.d.ts +1 -0
  577. package/dist/frontend/module-syntax.test.js +78 -0
  578. package/dist/frontend/module-syntax.test.js.map +1 -0
  579. package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
  580. package/dist/frontend/npm-fetch-analysis.js +100 -0
  581. package/dist/frontend/npm-fetch-analysis.js.map +1 -0
  582. package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
  583. package/dist/frontend/npm-fetch-analysis.test.js +107 -0
  584. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
  585. package/dist/frontend/npm-fetch-node.d.ts +2 -0
  586. package/dist/frontend/npm-fetch-node.js +12 -0
  587. package/dist/frontend/npm-fetch-node.js.map +1 -0
  588. package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
  589. package/dist/frontend/npm-fetch-syntax.js +207 -0
  590. package/dist/frontend/npm-fetch-syntax.js.map +1 -0
  591. package/dist/frontend/npm-node.d.ts +10 -0
  592. package/dist/frontend/npm-node.js +14 -0
  593. package/dist/frontend/npm-node.js.map +1 -0
  594. package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
  595. package/dist/frontend/npm-static-bundled-cjs.js +236 -0
  596. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
  597. package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
  598. package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
  599. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
  600. package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
  601. package/dist/frontend/npm-static-declaration-syntax.js +944 -0
  602. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
  603. package/dist/frontend/npm-static-declarations.d.ts +11 -39
  604. package/dist/frontend/npm-static-declarations.js +22 -561
  605. package/dist/frontend/npm-static-declarations.js.map +1 -1
  606. package/dist/frontend/npm-static-declarations.test.js +245 -6
  607. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  608. package/dist/frontend/npm-static-prune.d.ts +1 -1
  609. package/dist/frontend/npm-static-prune.js +121 -38
  610. package/dist/frontend/npm-static-prune.js.map +1 -1
  611. package/dist/frontend/npm-static-prune.test.js +9 -1
  612. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  613. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
  614. package/dist/frontend/npm-static-rewrite-host.js +179 -0
  615. package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
  616. package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
  617. package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
  618. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
  619. package/dist/frontend/npm-static-rewrite.d.ts +0 -5
  620. package/dist/frontend/npm-static-rewrite.js +2 -1079
  621. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  622. package/dist/frontend/npm-static-subtyping.d.ts +5 -0
  623. package/dist/frontend/npm-static-subtyping.js +55 -0
  624. package/dist/frontend/npm-static-subtyping.js.map +1 -0
  625. package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
  626. package/dist/frontend/npm-static-subtyping.test.js +58 -0
  627. package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
  628. package/dist/frontend/npm-static.d.ts +7 -15
  629. package/dist/frontend/npm-static.js +19 -28
  630. package/dist/frontend/npm-static.js.map +1 -1
  631. package/dist/frontend/npm.d.ts +8 -69
  632. package/dist/frontend/npm.js +21 -361
  633. package/dist/frontend/npm.js.map +1 -1
  634. package/dist/frontend/npm.test.js +2 -2
  635. package/dist/frontend/npm.test.js.map +1 -1
  636. package/dist/frontend/pipeline-native.d.ts +6 -0
  637. package/dist/frontend/pipeline-native.js +32 -0
  638. package/dist/frontend/pipeline-native.js.map +1 -0
  639. package/dist/frontend/pipeline.d.ts +54 -0
  640. package/dist/frontend/pipeline.js +382 -0
  641. package/dist/frontend/pipeline.js.map +1 -0
  642. package/dist/frontend/pipeline.test.d.ts +1 -0
  643. package/dist/frontend/pipeline.test.js +77 -0
  644. package/dist/frontend/pipeline.test.js.map +1 -0
  645. package/dist/frontend/program-analysis.d.ts +10 -0
  646. package/dist/frontend/program-analysis.js +14 -0
  647. package/dist/frontend/program-analysis.js.map +1 -0
  648. package/dist/frontend/program-node.d.ts +9 -0
  649. package/dist/frontend/program-node.js +48 -0
  650. package/dist/frontend/program-node.js.map +1 -0
  651. package/dist/frontend/program.d.ts +39 -20
  652. package/dist/frontend/program.js +393 -189
  653. package/dist/frontend/program.js.map +1 -1
  654. package/dist/frontend/program.test.js +105 -2
  655. package/dist/frontend/program.test.js.map +1 -1
  656. package/dist/frontend/provenance-core.d.ts +9 -0
  657. package/dist/frontend/provenance-core.js +435 -0
  658. package/dist/frontend/provenance-core.js.map +1 -0
  659. package/dist/frontend/provenance.d.ts +0 -4
  660. package/dist/frontend/provenance.js +4 -459
  661. package/dist/frontend/provenance.js.map +1 -1
  662. package/dist/frontend/resolve.d.ts +3 -1
  663. package/dist/frontend/resolve.js +6 -3
  664. package/dist/frontend/resolve.js.map +1 -1
  665. package/dist/frontend/runtime-resolve.d.ts +4 -3
  666. package/dist/frontend/runtime-resolve.js +22 -18
  667. package/dist/frontend/runtime-resolve.js.map +1 -1
  668. package/dist/frontend/runtime-resolve.test.js +53 -0
  669. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  670. package/dist/frontend/services-node.d.ts +5 -0
  671. package/dist/frontend/services-node.js +19 -0
  672. package/dist/frontend/services-node.js.map +1 -0
  673. package/dist/frontend/services-node.test.d.ts +1 -0
  674. package/dist/frontend/services-node.test.js +70 -0
  675. package/dist/frontend/services-node.test.js.map +1 -0
  676. package/dist/frontend/services.d.ts +44 -0
  677. package/dist/frontend/services.js +90 -0
  678. package/dist/frontend/services.js.map +1 -0
  679. package/dist/frontend/services.test.d.ts +1 -0
  680. package/dist/frontend/services.test.js +174 -0
  681. package/dist/frontend/services.test.js.map +1 -0
  682. package/dist/frontend/ts7/adapter.d.ts +3 -3
  683. package/dist/frontend/ts7/adapter.js +14 -31
  684. package/dist/frontend/ts7/adapter.js.map +1 -1
  685. package/dist/frontend/ts7/api.d.ts +16 -0
  686. package/dist/frontend/ts7/api.js +24 -0
  687. package/dist/frontend/ts7/api.js.map +1 -0
  688. package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
  689. package/dist/frontend/ts7/ast-bytes.js +137 -0
  690. package/dist/frontend/ts7/ast-bytes.js.map +1 -0
  691. package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
  692. package/dist/frontend/ts7/ast-bytes.test.js +73 -0
  693. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
  694. package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
  695. package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
  696. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
  697. package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
  698. package/dist/frontend/ts7/ast-guards.test.js +43 -0
  699. package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
  700. package/dist/frontend/ts7/ast-node.d.ts +194 -0
  701. package/dist/frontend/ts7/ast-node.js +448 -0
  702. package/dist/frontend/ts7/ast-node.js.map +1 -0
  703. package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
  704. package/dist/frontend/ts7/ast-node.test.js +266 -0
  705. package/dist/frontend/ts7/ast-node.test.js.map +1 -0
  706. package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
  707. package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
  708. package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
  709. package/dist/frontend/ts7/ast-text.d.ts +6 -0
  710. package/dist/frontend/ts7/ast-text.js +124 -0
  711. package/dist/frontend/ts7/ast-text.js.map +1 -0
  712. package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
  713. package/dist/frontend/ts7/ast-text.test.js +38 -0
  714. package/dist/frontend/ts7/ast-text.test.js.map +1 -0
  715. package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
  716. package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
  717. package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
  718. package/dist/frontend/ts7/ast-types.d.ts +42 -0
  719. package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
  720. package/dist/frontend/ts7/ast-types.generated.js +5 -0
  721. package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
  722. package/dist/frontend/ts7/ast-types.js +3 -0
  723. package/dist/frontend/ts7/ast-types.js.map +1 -0
  724. package/dist/frontend/ts7/ast-wire.d.ts +58 -0
  725. package/dist/frontend/ts7/ast-wire.js +267 -0
  726. package/dist/frontend/ts7/ast-wire.js.map +1 -0
  727. package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
  728. package/dist/frontend/ts7/ast-wire.test.js +151 -0
  729. package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
  730. package/dist/frontend/ts7/ast.d.ts +14 -14
  731. package/dist/frontend/ts7/ast.js +25 -18
  732. package/dist/frontend/ts7/ast.js.map +1 -1
  733. package/dist/frontend/ts7/census-check.js +1 -0
  734. package/dist/frontend/ts7/census-check.js.map +1 -1
  735. package/dist/frontend/ts7/checker-cache.d.ts +48 -0
  736. package/dist/frontend/ts7/checker-cache.js +92 -0
  737. package/dist/frontend/ts7/checker-cache.js.map +1 -0
  738. package/dist/frontend/ts7/checker.d.ts +19 -46
  739. package/dist/frontend/ts7/checker.js +231 -161
  740. package/dist/frontend/ts7/checker.js.map +1 -1
  741. package/dist/frontend/ts7/checker.test.d.ts +1 -0
  742. package/dist/frontend/ts7/checker.test.js +335 -0
  743. package/dist/frontend/ts7/checker.test.js.map +1 -0
  744. package/dist/frontend/ts7/enums.d.ts +4 -27
  745. package/dist/frontend/ts7/enums.generated.d.ts +878 -0
  746. package/dist/frontend/ts7/enums.generated.js +1313 -0
  747. package/dist/frontend/ts7/enums.generated.js.map +1 -0
  748. package/dist/frontend/ts7/enums.js +4 -45
  749. package/dist/frontend/ts7/enums.js.map +1 -1
  750. package/dist/frontend/ts7/enums.test.d.ts +1 -0
  751. package/dist/frontend/ts7/enums.test.js +48 -0
  752. package/dist/frontend/ts7/enums.test.js.map +1 -0
  753. package/dist/frontend/ts7/native-api.d.ts +10 -0
  754. package/dist/frontend/ts7/native-api.js +10 -0
  755. package/dist/frontend/ts7/native-api.js.map +1 -0
  756. package/dist/frontend/ts7/native-host.d.ts +2 -0
  757. package/dist/frontend/ts7/native-host.js +11 -0
  758. package/dist/frontend/ts7/native-host.js.map +1 -0
  759. package/dist/frontend/ts7/native-process.d.ts +14 -0
  760. package/dist/frontend/ts7/native-process.js +62 -0
  761. package/dist/frontend/ts7/native-process.js.map +1 -0
  762. package/dist/frontend/ts7/program-adapter.d.ts +10 -98
  763. package/dist/frontend/ts7/program-adapter.js +16 -310
  764. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  765. package/dist/frontend/ts7/program-host.d.ts +115 -0
  766. package/dist/frontend/ts7/program-host.js +347 -0
  767. package/dist/frontend/ts7/program-host.js.map +1 -0
  768. package/dist/frontend/ts7/program-host.test.d.ts +1 -0
  769. package/dist/frontend/ts7/program-host.test.js +207 -0
  770. package/dist/frontend/ts7/program-host.test.js.map +1 -0
  771. package/dist/frontend/ts7/rpc-api.d.ts +12 -0
  772. package/dist/frontend/ts7/rpc-api.js +23 -0
  773. package/dist/frontend/ts7/rpc-api.js.map +1 -0
  774. package/dist/frontend/ts7/rpc-client.d.ts +27 -0
  775. package/dist/frontend/ts7/rpc-client.js +102 -0
  776. package/dist/frontend/ts7/rpc-client.js.map +1 -0
  777. package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
  778. package/dist/frontend/ts7/rpc-client.test.js +133 -0
  779. package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
  780. package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
  781. package/dist/frontend/ts7/rpc-filesystem.js +42 -0
  782. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
  783. package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
  784. package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
  785. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
  786. package/dist/frontend/ts7/rpc-process.d.ts +2 -0
  787. package/dist/frontend/ts7/rpc-process.js +148 -0
  788. package/dist/frontend/ts7/rpc-process.js.map +1 -0
  789. package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
  790. package/dist/frontend/ts7/rpc-process.test.js +29 -0
  791. package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
  792. package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
  793. package/dist/frontend/ts7/rpc-wire.js +195 -0
  794. package/dist/frontend/ts7/rpc-wire.js.map +1 -0
  795. package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
  796. package/dist/frontend/ts7/rpc-wire.test.js +168 -0
  797. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
  798. package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
  799. package/dist/frontend/ts7/semantic-checker.js +221 -0
  800. package/dist/frontend/ts7/semantic-checker.js.map +1 -0
  801. package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
  802. package/dist/frontend/ts7/semantic-checker.test.js +119 -0
  803. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
  804. package/dist/frontend/ts7/semantic-json.d.ts +5 -0
  805. package/dist/frontend/ts7/semantic-json.js +47 -0
  806. package/dist/frontend/ts7/semantic-json.js.map +1 -0
  807. package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
  808. package/dist/frontend/ts7/semantic-json.test.js +42 -0
  809. package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
  810. package/dist/frontend/ts7/semantic-model.d.ts +222 -0
  811. package/dist/frontend/ts7/semantic-model.js +423 -0
  812. package/dist/frontend/ts7/semantic-model.js.map +1 -0
  813. package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
  814. package/dist/frontend/ts7/semantic-model.test.js +322 -0
  815. package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
  816. package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
  817. package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
  818. package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
  819. package/dist/frontend/ts7/semantic-types.d.ts +5 -0
  820. package/dist/frontend/ts7/semantic-types.js +2 -0
  821. package/dist/frontend/ts7/semantic-types.js.map +1 -0
  822. package/dist/frontend/ts7/session-cache.d.ts +17 -0
  823. package/dist/frontend/ts7/session-cache.js +97 -0
  824. package/dist/frontend/ts7/session-cache.js.map +1 -0
  825. package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
  826. package/dist/frontend/ts7/session-cache.test.js +87 -0
  827. package/dist/frontend/ts7/session-cache.test.js.map +1 -0
  828. package/dist/frontend/ts7/session-path.d.ts +18 -0
  829. package/dist/frontend/ts7/session-path.js +203 -0
  830. package/dist/frontend/ts7/session-path.js.map +1 -0
  831. package/dist/frontend/ts7/session-path.test.d.ts +1 -0
  832. package/dist/frontend/ts7/session-path.test.js +34 -0
  833. package/dist/frontend/ts7/session-path.test.js.map +1 -0
  834. package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
  835. package/dist/frontend/ts7/session-schema.generated.js +5 -0
  836. package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
  837. package/dist/frontend/ts7/session-timing.d.ts +50 -0
  838. package/dist/frontend/ts7/session-timing.js +61 -0
  839. package/dist/frontend/ts7/session-timing.js.map +1 -0
  840. package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
  841. package/dist/frontend/ts7/session-timing.test.js +52 -0
  842. package/dist/frontend/ts7/session-timing.test.js.map +1 -0
  843. package/dist/frontend/ts7/session.d.ts +105 -0
  844. package/dist/frontend/ts7/session.js +233 -0
  845. package/dist/frontend/ts7/session.js.map +1 -0
  846. package/dist/frontend/ts7/session.test.d.ts +1 -0
  847. package/dist/frontend/ts7/session.test.js +215 -0
  848. package/dist/frontend/ts7/session.test.js.map +1 -0
  849. package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
  850. package/dist/frontend/ts7/source-parser-node.js +15 -0
  851. package/dist/frontend/ts7/source-parser-node.js.map +1 -0
  852. package/dist/frontend/ts7/source-parser.d.ts +25 -0
  853. package/dist/frontend/ts7/source-parser.js +96 -0
  854. package/dist/frontend/ts7/source-parser.js.map +1 -0
  855. package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
  856. package/dist/frontend/ts7/source-parser.test.js +151 -0
  857. package/dist/frontend/ts7/source-parser.test.js.map +1 -0
  858. package/dist/frontend/ts7/syntax.d.ts +3 -0
  859. package/dist/frontend/ts7/syntax.js +4 -0
  860. package/dist/frontend/ts7/syntax.js.map +1 -0
  861. package/dist/frontend/tsc-codes.js +3 -0
  862. package/dist/frontend/tsc-codes.js.map +1 -1
  863. package/dist/frontend/type-mapper.d.ts +34 -18
  864. package/dist/frontend/type-mapper.js +552 -131
  865. package/dist/frontend/type-mapper.js.map +1 -1
  866. package/dist/frontend/type-mapper.test.js +146 -2
  867. package/dist/frontend/type-mapper.test.js.map +1 -1
  868. package/dist/frontend/union-discriminants.d.ts +16 -0
  869. package/dist/frontend/union-discriminants.js +98 -0
  870. package/dist/frontend/union-discriminants.js.map +1 -0
  871. package/dist/frontend/union-discriminants.test.d.ts +1 -0
  872. package/dist/frontend/union-discriminants.test.js +182 -0
  873. package/dist/frontend/union-discriminants.test.js.map +1 -0
  874. package/dist/index.d.ts +7 -198
  875. package/dist/index.js +369 -1572
  876. package/dist/index.js.map +1 -1
  877. package/dist/ir/analysis.d.ts +16 -4
  878. package/dist/ir/analysis.js +23 -4
  879. package/dist/ir/analysis.js.map +1 -1
  880. package/dist/ir/analysis.test.js +15 -2
  881. package/dist/ir/analysis.test.js.map +1 -1
  882. package/dist/ir/constant-tables.js +67 -49
  883. package/dist/ir/constant-tables.js.map +1 -1
  884. package/dist/ir/constant-tables.test.js +1 -1
  885. package/dist/ir/control-flow.d.ts +6 -0
  886. package/dist/ir/control-flow.js +142 -0
  887. package/dist/ir/control-flow.js.map +1 -0
  888. package/dist/ir/control-flow.test.d.ts +1 -0
  889. package/dist/ir/control-flow.test.js +113 -0
  890. package/dist/ir/control-flow.test.js.map +1 -0
  891. package/dist/ir/integer-loops.js +7 -18
  892. package/dist/ir/integer-loops.js.map +1 -1
  893. package/dist/ir/integer-ranges.js +53 -27
  894. package/dist/ir/integer-ranges.js.map +1 -1
  895. package/dist/ir/ir.d.ts +334 -176
  896. package/dist/ir/ir.js +710 -903
  897. package/dist/ir/ir.js.map +1 -1
  898. package/dist/ir/ir.test.js +162 -1
  899. package/dist/ir/ir.test.js.map +1 -1
  900. package/dist/ir/scalar-records.js +165 -134
  901. package/dist/ir/scalar-records.js.map +1 -1
  902. package/dist/ir/scalar-records.test.js +1 -1
  903. package/dist/ir/serialize.d.ts +4 -2
  904. package/dist/ir/serialize.js +33 -14
  905. package/dist/ir/serialize.js.map +1 -1
  906. package/dist/ir/serialize.test.d.ts +1 -0
  907. package/dist/ir/serialize.test.js +57 -0
  908. package/dist/ir/serialize.test.js.map +1 -0
  909. package/dist/ir/traverse.d.ts +41 -0
  910. package/dist/ir/traverse.js +660 -0
  911. package/dist/ir/traverse.js.map +1 -0
  912. package/dist/ir/traverse.test.d.ts +1 -0
  913. package/dist/ir/traverse.test.js +242 -0
  914. package/dist/ir/traverse.test.js.map +1 -0
  915. package/dist/ir/validate.js +2018 -1498
  916. package/dist/ir/validate.js.map +1 -1
  917. package/dist/ir/validate.test.js +536 -2
  918. package/dist/ir/validate.test.js.map +1 -1
  919. package/dist/library/cache-primitives.d.ts +2 -3
  920. package/dist/library/cache-primitives.js +4 -6
  921. package/dist/library/cache-primitives.js.map +1 -1
  922. package/dist/library/fence-eval.js +2 -2
  923. package/dist/library/fence-eval.js.map +1 -1
  924. package/dist/library/int-infer.js +7 -6
  925. package/dist/library/int-infer.js.map +1 -1
  926. package/dist/library/int-infer.test.js +4 -4
  927. package/dist/library/library-cache.d.ts +3 -2
  928. package/dist/library/library-cache.js +5 -17
  929. package/dist/library/library-cache.js.map +1 -1
  930. package/dist/library/library-cache.test.js +54 -41
  931. package/dist/library/library-cache.test.js.map +1 -1
  932. package/dist/library/library-profile.d.ts +3 -1
  933. package/dist/library/library-profile.js +15 -6
  934. package/dist/library/library-profile.js.map +1 -1
  935. package/dist/library/prepare.d.ts +15 -0
  936. package/dist/library/prepare.js +584 -0
  937. package/dist/library/prepare.js.map +1 -0
  938. package/dist/library/semantic-source.d.ts +1 -1
  939. package/dist/library/semantic-source.js +8 -6
  940. package/dist/library/semantic-source.js.map +1 -1
  941. package/dist/library/sidecar-validate.js +4 -4
  942. package/dist/library/sidecar-validate.js.map +1 -1
  943. package/dist/library/sidecar.d.ts +2 -0
  944. package/dist/library/sidecar.js +10 -3
  945. package/dist/library/sidecar.js.map +1 -1
  946. package/dist/native/cache.d.ts +11 -0
  947. package/dist/native/cache.js +113 -0
  948. package/dist/native/cache.js.map +1 -0
  949. package/dist/native/cache.test.d.ts +1 -0
  950. package/dist/native/cache.test.js +66 -0
  951. package/dist/native/cache.test.js.map +1 -0
  952. package/dist/native/cli.d.ts +1 -0
  953. package/dist/native/cli.js +112 -0
  954. package/dist/native/cli.js.map +1 -0
  955. package/dist/native/compiler.d.ts +15 -0
  956. package/dist/native/compiler.js +336 -0
  957. package/dist/native/compiler.js.map +1 -0
  958. package/dist/native/compiler.test.d.ts +1 -0
  959. package/dist/native/compiler.test.js +174 -0
  960. package/dist/native/compiler.test.js.map +1 -0
  961. package/dist/native/comptime.d.ts +5 -0
  962. package/dist/native/comptime.js +73 -0
  963. package/dist/native/comptime.js.map +1 -0
  964. package/dist/native/comptime.test.d.ts +1 -0
  965. package/dist/native/comptime.test.js +65 -0
  966. package/dist/native/comptime.test.js.map +1 -0
  967. package/dist/native/executable-cache.d.ts +26 -0
  968. package/dist/native/executable-cache.js +228 -0
  969. package/dist/native/executable-cache.js.map +1 -0
  970. package/dist/native/executable-cache.test.d.ts +1 -0
  971. package/dist/native/executable-cache.test.js +151 -0
  972. package/dist/native/executable-cache.test.js.map +1 -0
  973. package/dist/native/file-identity.d.ts +4 -0
  974. package/dist/native/file-identity.js +14 -0
  975. package/dist/native/file-identity.js.map +1 -0
  976. package/dist/native/file-identity.test.d.ts +1 -0
  977. package/dist/native/file-identity.test.js +43 -0
  978. package/dist/native/file-identity.test.js.map +1 -0
  979. package/dist/native/library.d.ts +22 -0
  980. package/dist/native/library.js +83 -0
  981. package/dist/native/library.js.map +1 -0
  982. package/dist/native/prepare.d.ts +21 -0
  983. package/dist/native/prepare.js +174 -0
  984. package/dist/native/prepare.js.map +1 -0
  985. package/dist/native/prepare.test.d.ts +1 -0
  986. package/dist/native/prepare.test.js +70 -0
  987. package/dist/native/prepare.test.js.map +1 -0
  988. package/dist/native/sanitizer.d.ts +11 -0
  989. package/dist/native/sanitizer.js +137 -0
  990. package/dist/native/sanitizer.js.map +1 -0
  991. package/dist/native/sanitizer.test.d.ts +1 -0
  992. package/dist/native/sanitizer.test.js +58 -0
  993. package/dist/native/sanitizer.test.js.map +1 -0
  994. package/dist/native/task.d.ts +4 -0
  995. package/dist/native/task.js +16 -0
  996. package/dist/native/task.js.map +1 -0
  997. package/dist/native/task.test.d.ts +1 -0
  998. package/dist/native/task.test.js +17 -0
  999. package/dist/native/task.test.js.map +1 -0
  1000. package/dist/native/toolchain.d.ts +45 -0
  1001. package/dist/native/toolchain.js +94 -0
  1002. package/dist/native/toolchain.js.map +1 -0
  1003. package/dist/native/toolchain.test.d.ts +1 -0
  1004. package/dist/native/toolchain.test.js +85 -0
  1005. package/dist/native/toolchain.test.js.map +1 -0
  1006. package/dist/startup-cache.d.ts +1 -1
  1007. package/dist/startup-cache.js +2 -5
  1008. package/dist/startup-cache.js.map +1 -1
  1009. package/dist/timing.d.ts +4 -0
  1010. package/dist/timing.js +19 -0
  1011. package/dist/timing.js.map +1 -0
  1012. package/dist/wasi-paths.js +10 -7
  1013. package/dist/wasi-paths.js.map +1 -1
  1014. package/package.json +28 -19
  1015. package/surface-manifest.json +107 -98
  1016. package/dist/backend/c/async.d.ts +0 -171
  1017. package/dist/backend/c/async.js +0 -1317
  1018. package/dist/backend/c/async.js.map +0 -1
  1019. package/dist/backend/c/c-emitter.d.ts +0 -536
  1020. package/dist/backend/c/c-emitter.js +0 -1932
  1021. package/dist/backend/c/c-emitter.js.map +0 -1
  1022. package/dist/backend/c/exprs.d.ts +0 -15
  1023. package/dist/backend/c/exprs.js +0 -8847
  1024. package/dist/backend/c/exprs.js.map +0 -1
  1025. package/dist/backend/c/island.d.ts +0 -45
  1026. package/dist/backend/c/island.js +0 -281
  1027. package/dist/backend/c/island.js.map +0 -1
  1028. package/dist/backend/c/may-throw.js.map +0 -1
  1029. package/dist/backend/c/shapes.d.ts +0 -142
  1030. package/dist/backend/c/shapes.js +0 -603
  1031. package/dist/backend/c/shapes.js.map +0 -1
  1032. package/dist/backend/c/stmts.d.ts +0 -76
  1033. package/dist/backend/c/stmts.js +0 -1108
  1034. package/dist/backend/c/stmts.js.map +0 -1
  1035. package/dist/backend/c/types.d.ts +0 -71
  1036. package/dist/backend/c/types.js +0 -459
  1037. package/dist/backend/c/types.js.map +0 -1
  1038. package/dist/backend/c/types.test.js +0 -32
  1039. package/dist/backend/c/types.test.js.map +0 -1
  1040. package/dist/backend/c/walkers.d.ts +0 -134
  1041. package/dist/backend/c/walkers.js +0 -1772
  1042. package/dist/backend/c/walkers.js.map +0 -1
  1043. /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
@@ -1,6 +1,8 @@
1
+ import { typedRefConstructor } from "./shapes.js";
2
+ import { BYTES_ELEM_NUM, f64Lit } from "./common.js";
1
3
  import { InternalCompilerError } from "../../errors.js";
2
4
  import { DYN_HANDLE_KINDS, isDynTypedRefType, isRefCounted, typeKey } from "../../ir/ir.js";
3
- import { dynDesc, undefinedArmTag } from "../../ir/analysis.js";
5
+ import { dynDesc } from "../../ir/analysis.js";
4
6
  import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
5
7
  import { BlockBuilder } from "./blocks.js";
6
8
  import { llvmCommentText } from "./common.js";
@@ -17,6 +19,7 @@ const DYN_HANDLE_TAG_NUM = {
17
19
  http2Stream: 5,
18
20
  httpClientReq: 6,
19
21
  child: 16,
22
+ fileHandle: 17,
20
23
  };
21
24
  export const DYN_KIND = {
22
25
  NULL: 0,
@@ -32,13 +35,10 @@ export const DYN_KIND = {
32
35
  PROMISE: 10,
33
36
  JSVAL: 11, /* SCR_DYN_JSVAL — island values held by reference */
34
37
  TYPED_REF: 12, /* SCR_DYN_TYPED_REF — static Web-stream transit capsule */
38
+ PROXY: 13,
39
+ BIGINT: 14,
40
+ SYMBOL: 15,
35
41
  };
36
- /** Exact double literal (the emitter's f64Lit — the walkers' copy). */
37
- function f64Lit(n) {
38
- const buf = new ArrayBuffer(8);
39
- new DataView(buf).setFloat64(0, n);
40
- return `0x${[...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, "0")).join("").toUpperCase()}`;
41
- }
42
42
  const FN_ATTRS = "#0";
43
43
  export class LlDyn {
44
44
  host;
@@ -49,13 +49,41 @@ export class LlDyn {
49
49
  dynFuncBoxes = new Map();
50
50
  dynFuncAdapters = new Map();
51
51
  promiseDynAdapters = new Map();
52
+ mapDynOps = new Map();
52
53
  dynToStrFn = null;
53
54
  caughtToDynFn = null;
55
+ helperMemo = new Map();
54
56
  /** Emitted function definitions, in interning order. */
55
57
  defs = [];
56
58
  constructor(host) {
57
59
  this.host = host;
58
60
  }
61
+ /** Branch to a variant only after its literal discriminator and complete
62
+ * structure match. Use the same path for predicates and builders. */
63
+ unionArmMatch(B, def, tag, yes, no) {
64
+ const guard = def.discriminant?.cases.find((candidate) => candidate.tag === tag);
65
+ if (guard && def.discriminant) {
66
+ const structure = B.newLabel("du.shape");
67
+ const field = this.host.internLiteral(def.discriminant.field);
68
+ guard.values.forEach((value, index) => {
69
+ const suffix = typeof value === "string" ? "str" : typeof value === "boolean" ? "bool" : "num";
70
+ const ty = typeof value === "string" ? "ptr" : typeof value === "boolean" ? "i1" : "double";
71
+ const operand = typeof value === "string" ? this.host.internLiteral(value)
72
+ : typeof value === "boolean" ? String(value) : f64Lit(value);
73
+ this.host.declare(`declare zeroext i1 @scr_dyn_field_eq_${suffix}(ptr, ptr, ${ty}${ty === "i1" ? " zeroext" : ""})`);
74
+ const matches = B.tmp();
75
+ B.line(`${matches} = call zeroext i1 @scr_dyn_field_eq_${suffix}(ptr %d, ptr ${field}, ${ty} ${operand})`);
76
+ const next = index === guard.values.length - 1 ? no : B.newLabel("du.literal");
77
+ B.condBr(matches, structure, next);
78
+ if (index !== guard.values.length - 1)
79
+ B.startBlock(next);
80
+ });
81
+ B.startBlock(structure);
82
+ }
83
+ const matches = B.tmp();
84
+ B.line(`${matches} = call zeroext i1 @${this.dynMatchHelper(def.arms[tag])}(ptr %d)`);
85
+ B.condBr(matches, yes, no);
86
+ }
59
87
  get S() { return this.host.sizeType; }
60
88
  abiOffset(native64, wasm32) {
61
89
  return this.S === "i32" ? wasm32 : native64;
@@ -65,7 +93,29 @@ export class LlDyn {
65
93
  }
66
94
  /** The value LLVM type of a dynCheck result / toDyn operand for `t`. */
67
95
  valTy(t) {
68
- return t.kind === "f64" ? "double" : t.kind === "bool" ? "i1" : "ptr";
96
+ return t.kind === "f64" || t.kind === "date" ? "double" : t.kind === "bool" ? "i1" : "ptr";
97
+ }
98
+ collectionDynOps(t) {
99
+ const key = typeKey(t);
100
+ const prior = this.mapDynOps.get(key);
101
+ if (prior)
102
+ return prior;
103
+ const name = `sc_map_dyn_${this.mapDynOps.size}`;
104
+ this.mapDynOps.set(key, name);
105
+ const keyType = t.kind === "map" ? t.key : t.elem;
106
+ const valueType = t.kind === "map" ? t.value : { kind: "f64" };
107
+ const emitSlot = (type, role) => {
108
+ const ty = this.valTy(type);
109
+ const unpack = ty === "double" ? "bitcast i64 %slot to double" : ty === "i1" ? "trunc i64 %slot to i1" : "inttoptr i64 %slot to ptr";
110
+ const pack = ty === "double" ? "bitcast double %value to i64" : ty === "i1" ? "zext i1 %value to i64" : "ptrtoint ptr %value to i64";
111
+ const box = this.toDynHelper(type);
112
+ const unbox = this.dynCheckHelper(type);
113
+ this.defs.push(`define internal ptr @${name}_${role}_box(i64 %slot) ${FN_ATTRS} {`, ` %value = ${unpack}`, ` %result = call ptr @${box}(${ty} %value)`, ` ret ptr %result`, `}`, "", `define internal i64 @${name}_${role}_unbox(ptr %d) ${FN_ATTRS} {`, ` %value = call ${ty === "i1" ? "zeroext i1" : ty} @${unbox}(ptr %d, ptr null)`, ` %result = ${pack}`, ` ret i64 %result`, `}`, "");
114
+ };
115
+ emitSlot(keyType, "key");
116
+ emitSlot(valueType, "value");
117
+ this.defs.push(`@${name} = internal constant { ptr, ptr, ptr, ptr, ptr, ptr } { ptr ${this.host.cstr(key)}, ptr @${name}_key_box, ptr @${name}_key_unbox, ptr @${this.dynMatchHelper(keyType)}, ptr @${name}_value_box, ptr @${name}_value_unbox }`, "");
118
+ return name;
69
119
  }
70
120
  /* ── dyn node plumbing ─────────────────────────────────────────────── */
71
121
  /** Loads a dyn node's kind tag (after the size_t rc word). */
@@ -118,12 +168,12 @@ export class LlDyn {
118
168
  B.line(`${e} = load ptr, ptr ${p}`);
119
169
  return e;
120
170
  }
121
- /** Object entry field addresses: entries + i*24 (+0 key, +8 key_len,
122
- * +16 value). */
171
+ /** Object entry field addresses: entries + i*sizeof(ScrDynEntry), with
172
+ * key, key_len, and value at offsets 0, 8, and 16 on 64-bit targets. */
123
173
  entryAt(B, entries, i) {
124
174
  const off = B.tmp();
125
175
  const base = B.tmp();
126
- B.line(`${off} = mul ${this.S} ${i}, ${this.abiOffset(24, 12)} ; sizeof(ScrDynEntry)`);
176
+ B.line(`${off} = mul ${this.S} ${i}, ${this.abiOffset(48, 24)} ; sizeof(ScrDynEntry)`);
127
177
  B.line(`${base} = getelementptr inbounds i8, ptr ${entries}, ${this.S} ${off}`);
128
178
  const key = B.tmp();
129
179
  B.line(`${key} = load ptr, ptr ${base}`);
@@ -170,6 +220,13 @@ export class LlDyn {
170
220
  B.line(`${t} = call ptr @scr_dyn_obj_get(ptr ${d}, ptr ${this.host.cstr(key)}, ${this.S} ${len}) ; .${llvmCommentText(key)}`);
171
221
  return t;
172
222
  }
223
+ /** Ordinary property lookup, including inherited data and accessors (+1). */
224
+ objReadLit(B, d, key) {
225
+ this.host.declare(`declare ptr @scr_dyn_obj_read(ptr, ptr, ${this.S})`);
226
+ const value = B.tmp();
227
+ B.line(`${value} = call ptr @scr_dyn_obj_read(ptr ${d}, ptr ${this.host.cstr(key)}, ${this.S} ${Buffer.byteLength(key, "utf8")})`);
228
+ return value;
229
+ }
173
230
  /** Appends an ScrStr's bytes into a ScrJsonBuf (walkers' putScrStr). */
174
231
  putScrStr(B, buf, s) {
175
232
  this.host.declare(`declare void @scr_jb_putc(ptr, i8)`);
@@ -245,6 +302,29 @@ export class LlDyn {
245
302
  B.startBlock(lk);
246
303
  }
247
304
  /* ── dynMatchHelper (walkers.ts, ported) ──────────────────────── */
305
+ /** Native subclass capsules also satisfy a checked base-class slot.
306
+ * Class layouts share their base prefix, so unboxing retains the same
307
+ * pointer and virtual dispatch still uses the object's original vtable. */
308
+ typedRefMatches(B, t) {
309
+ this.host.declare(`declare zeroext i1 @scr_dyn_typed_ref_is(ptr, ptr, ${this.S})`);
310
+ const types = isDynTypedRefType(t)
311
+ ? this.host.classSubtypes(t.className).map((className) => ({ kind: "object", className }))
312
+ : [t];
313
+ let matched = "false";
314
+ for (const type of types) {
315
+ const key = typeKey(type);
316
+ const next = B.tmp();
317
+ B.line(`${next} = call zeroext i1 @scr_dyn_typed_ref_is(ptr %d, ptr ${this.host.cstr(key)}, ${this.S} ${Buffer.byteLength(key, "utf8")})`);
318
+ if (matched === "false")
319
+ matched = next;
320
+ else {
321
+ const either = B.tmp();
322
+ B.line(`${either} = or i1 ${matched}, ${next}`);
323
+ matched = either;
324
+ }
325
+ }
326
+ return matched;
327
+ }
248
328
  /** `sc_dm_<n>(ptr d) -> i1` — does this dyn fit T? Never throws. */
249
329
  dynMatchHelper(t) {
250
330
  const key = typeKey(t);
@@ -255,9 +335,7 @@ export class LlDyn {
255
335
  this.dynMatchers.set(key, name);
256
336
  const B = new BlockBuilder();
257
337
  if (isRefCounted(t) && t.kind !== "dyn") {
258
- this.host.declare(`declare zeroext i1 @scr_dyn_typed_ref_is(ptr, ptr, ${this.S})`);
259
- const matched = B.tmp();
260
- B.line(`${matched} = call zeroext i1 @scr_dyn_typed_ref_is(ptr %d, ptr ${this.host.cstr(key)}, ${this.S} ${Buffer.byteLength(key, "utf8")})`);
338
+ const matched = this.typedRefMatches(B, t);
261
339
  const lRef = B.newLabel("dm.tr");
262
340
  const lNext = B.newLabel("dm.nt");
263
341
  B.condBr(matched, lRef, lNext);
@@ -290,6 +368,47 @@ export class LlDyn {
290
368
  B.terminate(`ret i1 ${r}`);
291
369
  };
292
370
  switch (t.kind) {
371
+ case "date": {
372
+ this.host.declare(`declare zeroext i1 @scr_dyn_native_date_is(ptr)`);
373
+ const r = B.tmp();
374
+ B.line(`${r} = call zeroext i1 @scr_dyn_native_date_is(ptr %d)`);
375
+ B.terminate(`ret i1 ${r}`);
376
+ break;
377
+ }
378
+ case "url":
379
+ case "searchParams": {
380
+ const native = t.kind === "url" ? "url" : "search_params";
381
+ this.host.declare(`declare zeroext i1 @scr_dyn_native_${native}_is(ptr)`);
382
+ const r = B.tmp();
383
+ B.line(`${r} = call zeroext i1 @scr_dyn_native_${native}_is(ptr %d)`);
384
+ B.terminate(`ret i1 ${r}`);
385
+ break;
386
+ }
387
+ case "regex": {
388
+ this.host.declare(`declare zeroext i1 @scr_dyn_native_regex_is(ptr)`);
389
+ const r = B.tmp();
390
+ B.line(`${r} = call zeroext i1 @scr_dyn_native_regex_is(ptr %d)`);
391
+ B.terminate(`ret i1 ${r}`);
392
+ break;
393
+ }
394
+ case "map":
395
+ case "set": {
396
+ this.host.declare(`declare zeroext i1 @scr_dyn_native_collection_is(ptr, i32, ptr)`);
397
+ const r = B.tmp();
398
+ const typed = t.kind === "map" ? t.key.kind !== "dyn" || t.value.kind !== "dyn" : t.elem.kind !== "dyn";
399
+ B.line(`${r} = call zeroext i1 @scr_dyn_native_collection_is(ptr %d, i32 ${t.kind === "map" ? 1 : 0}, ptr ${typed ? this.host.cstr(typeKey(t)) : "null"})`);
400
+ B.terminate(`ret i1 ${r}`);
401
+ break;
402
+ }
403
+ case "bigint":
404
+ kindIs(DYN_KIND.BIGINT);
405
+ break;
406
+ case "promise":
407
+ kindIs(DYN_KIND.PROMISE);
408
+ break;
409
+ case "symbol":
410
+ kindIs(DYN_KIND.SYMBOL);
411
+ break;
293
412
  case "f64":
294
413
  kindIs(DYN_KIND.NUM);
295
414
  break;
@@ -309,14 +428,27 @@ export class LlDyn {
309
428
  // An `unknown` target: every dyn value fits, undefined included.
310
429
  B.terminate(`ret i1 true`);
311
430
  break;
312
- case "bytes":
313
- if (t.elem !== "u8")
314
- throw new InternalCompilerError(`llvm emitter bug: dynMatch of bytes<${t.elem}>`);
315
- kindIs(DYN_KIND.BYTES);
431
+ case "bytes": {
432
+ this.host.declare(`declare zeroext i1 @scr_dyn_bytes_is(ptr, i32)`);
433
+ const matched = B.tmp();
434
+ B.line(`${matched} = call zeroext i1 @scr_dyn_bytes_is(ptr %d, i32 ${BYTES_ELEM_NUM[t.elem]})`);
435
+ B.terminate(`ret i1 ${matched}`);
316
436
  break;
437
+ }
317
438
  case "func":
318
439
  kindIs(DYN_KIND.FUNC);
319
440
  break;
441
+ case "classval": {
442
+ this.host.declare(`declare zeroext i1 @scr_dyn_class_is(ptr, ptr)`);
443
+ const matched = B.tmp();
444
+ B.line(`${matched} = call zeroext i1 @scr_dyn_class_is(ptr %d, ptr ${this.host.cstr(key)})`);
445
+ B.terminate(`ret i1 ${matched}`);
446
+ break;
447
+ }
448
+ case "generator":
449
+ // Only an exact native capsule carries these channel types.
450
+ B.terminate(`ret i1 false`);
451
+ break;
320
452
  case "object": {
321
453
  if (t.className !== "%Error") {
322
454
  // Exact class capsules returned true before materialization.
@@ -376,28 +508,26 @@ export class LlDyn {
376
508
  const isObj = B.tmp();
377
509
  B.line(`${isObj} = icmp eq i32 ${kd}, ${DYN_KIND.OBJ}`);
378
510
  const l0 = B.newLabel("dm.o");
379
- B.condBr(isObj, l0, fail);
511
+ let readable = isObj;
512
+ if (!shape.indexValue) {
513
+ const proxy = B.tmp();
514
+ readable = B.tmp();
515
+ B.line(`${proxy} = icmp eq i32 ${kd}, ${DYN_KIND.PROXY}`);
516
+ B.line(`${readable} = or i1 ${isObj}, ${proxy}`);
517
+ }
518
+ B.condBr(readable, l0, fail);
380
519
  B.startBlock(l0);
381
520
  // dyn ('unknown') fields match ANY value, present or missing.
382
521
  for (const f of shape.fields) {
383
522
  if (f.type.kind === "dyn")
384
523
  continue;
385
- const m = this.objGetLit(B, "%d", f.name);
386
- const has = B.tmp();
387
- B.line(`${has} = icmp ne ptr ${m}, null`);
388
- const lTest = B.newLabel("dm.t");
524
+ const m = this.objReadLit(B, "%d", f.name);
389
525
  const lNext = B.newLabel("dm.n");
390
- if (undefinedArmTag(f.type, this.host.unionsById) >= 0) {
391
- // Optional-flavored field: a MISSING key is the undefined arm
392
- // (a match); a PRESENT key must fit the union as usual.
393
- B.condBr(has, lTest, lNext);
394
- }
395
- else {
396
- B.condBr(has, lTest, fail);
397
- }
398
- B.startBlock(lTest);
526
+ this.host.declare(`declare void @scr_dyn_release(ptr)`);
527
+ this.pendingBail(B, "dm.read", () => B.line(`call void @scr_dyn_release(ptr ${m})`), "i1 false");
399
528
  const ok = B.tmp();
400
529
  B.line(`${ok} = call zeroext i1 @${this.dynMatchHelper(f.type)}(ptr ${m})`);
530
+ B.line(`call void @scr_dyn_release(ptr ${m})`);
401
531
  B.condBr(ok, lNext, fail);
402
532
  B.startBlock(lNext);
403
533
  }
@@ -473,11 +603,9 @@ export class LlDyn {
473
603
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
474
604
  // Arms in canonical order; any full match answers true.
475
605
  const yes = B.newLabel("dm.y");
476
- for (const arm of def.arms) {
477
- const ok = B.tmp();
478
- B.line(`${ok} = call zeroext i1 @${this.dynMatchHelper(arm)}(ptr %d)`);
606
+ for (let tag = 0; tag < def.arms.length; tag++) {
479
607
  const ln = B.newLabel("dm.n");
480
- B.condBr(ok, yes, ln);
608
+ this.unionArmMatch(B, def, tag, yes, ln);
481
609
  B.startBlock(ln);
482
610
  }
483
611
  B.terminate(`ret i1 false`);
@@ -528,11 +656,28 @@ export class LlDyn {
528
656
  host.declare(`declare void @scr_dyn_check_fail(ptr, ptr, ptr)`);
529
657
  const want = host.cstr(dynDesc(t, this.host.recordsById, this.host.unionsById));
530
658
  const B = new BlockBuilder();
659
+ if (t.kind === "classval") {
660
+ host.declare(`declare ptr @scr_dyn_class_check(ptr, ptr, ptr)`);
661
+ const checked = B.tmp();
662
+ B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
663
+ B.terminate(`ret ptr ${checked}`);
664
+ this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
665
+ return name;
666
+ }
531
667
  if (isRefCounted(t) && t.kind !== "dyn") {
532
- host.declare(`declare zeroext i1 @scr_dyn_typed_ref_is(ptr, ptr, ${host.sizeType})`);
533
668
  host.declare(`declare ptr @scr_dyn_typed_ref_unbox(ptr)`);
534
- const matched = B.tmp();
535
- B.line(`${matched} = call zeroext i1 @scr_dyn_typed_ref_is(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")})`);
669
+ if (t.kind === "object" && t.className === "%Error") {
670
+ host.declare(`declare ptr @scr_errdyn_err_of(ptr)`);
671
+ const error = B.tmp(), found = B.tmp();
672
+ B.line(`${error} = call ptr @scr_errdyn_err_of(ptr %d)`);
673
+ B.line(`${found} = icmp ne ptr ${error}, null`);
674
+ const yes = B.newLabel("dc.error"), next = B.newLabel("dc.noterror");
675
+ B.condBr(found, yes, next);
676
+ B.startBlock(yes);
677
+ B.terminate(`ret ptr ${error}`);
678
+ B.startBlock(next);
679
+ }
680
+ const matched = this.typedRefMatches(B, t);
536
681
  const lRef = B.newLabel("dc.tr");
537
682
  const lNext = B.newLabel("dc.nt");
538
683
  B.condBr(matched, lRef, lNext);
@@ -544,7 +689,7 @@ export class LlDyn {
544
689
  if (t.kind !== "union") {
545
690
  host.declare(`declare ptr @scr_dyn_typed_ref_materialize(ptr)`);
546
691
  host.declare(`declare ptr @scr_dyn_typed_ref_cached_cast(ptr, ptr, ${host.sizeType})`);
547
- host.declare(`declare void @scr_dyn_typed_ref_cache_cast(ptr, ptr, ${host.sizeType}, ptr, ptr, ptr)`);
692
+ host.declare(`declare void @scr_dyn_typed_ref_cache_cast(ptr, ptr, ${host.sizeType}, ptr, ptr, ptr, i1)`);
548
693
  host.declare(`declare void @scr_dyn_release_v(ptr)`);
549
694
  const rc = vAdapters(host, t);
550
695
  const kind = this.kindOf(B, "%d");
@@ -642,7 +787,7 @@ export class LlDyn {
642
787
  B.line(`call void ${releaseSym(host, t)}(ptr ${checked})`);
643
788
  B.terminate(`ret ptr ${cached}`);
644
789
  B.startBlock(lCache);
645
- B.line(`call void @scr_dyn_typed_ref_cache_cast(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr ${checked}, ptr ${rc.retain}, ptr ${rc.release})`);
790
+ B.line(`call void @scr_dyn_typed_ref_cache_cast(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr ${checked}, ptr ${rc.retain}, ptr ${rc.release}, i1 ${traceAdapter(host, t) !== null ? "true" : "false"})`);
646
791
  B.terminate(`ret ptr ${checked}`);
647
792
  }
648
793
  else {
@@ -650,7 +795,7 @@ export class LlDyn {
650
795
  const lReturn = B.newLabel("dc.tr.ret");
651
796
  B.condBr(ok, lCache, lReturn);
652
797
  B.startBlock(lCache);
653
- B.line(`call void @scr_dyn_typed_ref_cache_cast(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr ${checked}, ptr ${rc.retain}, ptr ${rc.release})`);
798
+ B.line(`call void @scr_dyn_typed_ref_cache_cast(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr ${checked}, ptr ${rc.retain}, ptr ${rc.release}, i1 ${traceAdapter(host, t) !== null ? "true" : "false"})`);
654
799
  B.br(lReturn);
655
800
  B.startBlock(lReturn);
656
801
  B.terminate(`ret ptr ${checked}`);
@@ -672,6 +817,56 @@ export class LlDyn {
672
817
  B.startBlock(lo);
673
818
  };
674
819
  switch (t.kind) {
820
+ case "date": {
821
+ host.declare(`declare double @scr_dyn_native_date_value(ptr)`);
822
+ const r = B.tmp();
823
+ B.line(`${r} = call double @scr_dyn_native_date_value(ptr %d)`);
824
+ B.terminate(`ret double ${r}`);
825
+ break;
826
+ }
827
+ case "url":
828
+ case "searchParams": {
829
+ const native = t.kind === "url" ? "url" : "search_params";
830
+ host.declare(`declare ptr @scr_dyn_native_${native}_check(ptr, ptr)`);
831
+ const r = B.tmp();
832
+ B.line(`${r} = call ptr @scr_dyn_native_${native}_check(ptr %d, ptr %path)`);
833
+ B.terminate(`ret ptr ${r}`);
834
+ break;
835
+ }
836
+ case "regex": {
837
+ host.declare(`declare ptr @scr_dyn_native_regex_check(ptr, ptr)`);
838
+ const r = B.tmp();
839
+ B.line(`${r} = call ptr @scr_dyn_native_regex_check(ptr %d, ptr %path)`);
840
+ B.terminate(`ret ptr ${r}`);
841
+ break;
842
+ }
843
+ case "map":
844
+ case "set": {
845
+ host.declare(`declare ptr @scr_dyn_native_collection_check(ptr, i32, ptr, ptr)`);
846
+ const r = B.tmp();
847
+ const typed = t.kind === "map" ? t.key.kind !== "dyn" || t.value.kind !== "dyn" : t.elem.kind !== "dyn";
848
+ B.line(`${r} = call ptr @scr_dyn_native_collection_check(ptr %d, i32 ${t.kind === "map" ? 1 : 0}, ptr ${typed ? host.cstr(typeKey(t)) : "null"}, ptr %path)`);
849
+ B.terminate(`ret ptr ${r}`);
850
+ break;
851
+ }
852
+ case "bigint": {
853
+ requireKind(DYN_KIND.BIGINT, "dc");
854
+ host.declare(`declare ptr @scr_bigint_retain(ptr)`);
855
+ const v = this.payloadOf(B, "%d", "ptr");
856
+ const r = B.tmp();
857
+ B.line(`${r} = call ptr @scr_bigint_retain(ptr ${v})`);
858
+ B.terminate(`ret ptr ${r}`);
859
+ break;
860
+ }
861
+ case "symbol": {
862
+ requireKind(DYN_KIND.SYMBOL, "dc");
863
+ host.declare(`declare ptr @scr_sym_retain(ptr)`);
864
+ const v = this.payloadOf(B, "%d", "ptr");
865
+ const r = B.tmp();
866
+ B.line(`${r} = call ptr @scr_sym_retain(ptr ${v})`);
867
+ B.terminate(`ret ptr ${r}`);
868
+ break;
869
+ }
675
870
  case "f64": {
676
871
  requireKind(DYN_KIND.NUM, "dc");
677
872
  const v = this.payloadOf(B, "%d", "double");
@@ -702,16 +897,44 @@ export class LlDyn {
702
897
  break;
703
898
  }
704
899
  case "bytes": {
705
- // `u as Uint8Array`: kind check, then a fresh COPY out.
706
- if (t.elem !== "u8")
707
- throw new InternalCompilerError(`llvm emitter bug: dynCheck of bytes<${t.elem}>`);
708
- requireKind(DYN_KIND.BYTES, "dc");
709
- host.declare(`declare ptr @scr_dyn_bytes_copy_out(ptr)`);
900
+ host.declare(`declare zeroext i1 @scr_dyn_bytes_is(ptr, i32)`);
901
+ const matched = B.tmp();
902
+ B.line(`${matched} = call zeroext i1 @scr_dyn_bytes_is(ptr %d, i32 ${BYTES_ELEM_NUM[t.elem]})`);
903
+ const yes = B.newLabel("dc.bytes");
904
+ const no = B.newLabel("dc.bytes.fail");
905
+ B.condBr(matched, yes, no);
906
+ B.startBlock(no);
907
+ B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${want}, ptr %d)`);
908
+ B.terminate(`ret ptr null`);
909
+ B.startBlock(yes);
910
+ host.declare(`declare ptr @scr_dyn_bytes_unbox(ptr)`);
710
911
  const r = B.tmp();
711
- B.line(`${r} = call ptr @scr_dyn_bytes_copy_out(ptr %d)`);
912
+ B.line(`${r} = call ptr @scr_dyn_bytes_unbox(ptr %d)`);
712
913
  B.terminate(`ret ptr ${r}`);
713
914
  break;
714
915
  }
916
+ case "generator":
917
+ B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${want}, ptr %d)`);
918
+ B.terminate(`ret ptr null`);
919
+ break;
920
+ case "promise": {
921
+ requireKind(DYN_KIND.PROMISE, "dc");
922
+ host.declare(`declare ptr @scr_promise_retain(ptr)`);
923
+ const promise = this.payloadOf(B, "%d", "ptr"), retained = B.tmp();
924
+ if (t.inner.kind !== "dyn") {
925
+ host.declare(`declare ptr @scr_promise_new()`);
926
+ host.declare(`declare void @scr_promise_race_add(ptr, ptr, ptr)`);
927
+ B.line(`${retained} = call ptr @scr_promise_new()`);
928
+ host.declare(`declare void @scr_promise_share_identity(ptr, ptr)`);
929
+ B.line(`call void @scr_promise_share_identity(ptr ${retained}, ptr ${promise})`);
930
+ B.line(`call void @scr_promise_race_add(ptr ${retained}, ptr ${promise}, ptr @${host.dynPromiseAdapter(t.inner)})`);
931
+ B.terminate(`ret ptr ${retained}`);
932
+ break;
933
+ }
934
+ B.line(`${retained} = call ptr @scr_promise_retain(ptr ${promise})`);
935
+ B.terminate(`ret ptr ${retained}`);
936
+ break;
937
+ }
715
938
  case "object": {
716
939
  // The %Error extraction (an instanceof-Error narrow on unknown):
717
940
  // validate the checked-dynamic tree's error encoding — the reserved "%error" marker
@@ -826,64 +1049,46 @@ export class LlDyn {
826
1049
  B.terminate(`ret ptr %r0`);
827
1050
  break;
828
1051
  }
829
- requireKind(DYN_KIND.OBJ, "dcr");
1052
+ if (shape.indexValue)
1053
+ requireKind(DYN_KIND.OBJ, "dcr");
1054
+ else {
1055
+ const kind = this.kindOf(B, "%d"), object = B.tmp(), proxy = B.tmp(), readable = B.tmp();
1056
+ B.line(`${object} = icmp eq i32 ${kind}, ${DYN_KIND.OBJ}`);
1057
+ B.line(`${proxy} = icmp eq i32 ${kind}, ${DYN_KIND.PROXY}`);
1058
+ B.line(`${readable} = or i1 ${object}, ${proxy}`);
1059
+ const ok = B.newLabel("dcr.object"), fail = B.newLabel("dcr.fail");
1060
+ B.condBr(readable, ok, fail);
1061
+ B.startBlock(fail);
1062
+ B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${want}, ptr %d)`);
1063
+ B.terminate(`ret ptr null`);
1064
+ B.startBlock(ok);
1065
+ }
1066
+ if (shape.fields.length === 0 && !shape.indexValue) {
1067
+ const sourceAccessor = `${this.toDynHelper(t)}_source_access`;
1068
+ const rc = vAdapters(host, t);
1069
+ host.declare(`declare ptr @scr_dyn_obj_source_cast(ptr, ptr, ptr)`);
1070
+ const source = B.tmp();
1071
+ const found = B.tmp();
1072
+ const lSource = B.newLabel("dcr.source");
1073
+ const lCopy = B.newLabel("dcr.copy");
1074
+ B.line(`${source} = call ptr @scr_dyn_obj_source_cast(ptr %d, ptr @${sourceAccessor}, ptr ${rc.retain})`);
1075
+ B.line(`${found} = icmp ne ptr ${source}, null`);
1076
+ B.condBr(found, lSource, lCopy);
1077
+ B.startBlock(lSource);
1078
+ B.terminate(`ret ptr ${source}`);
1079
+ B.startBlock(lCopy);
1080
+ }
830
1081
  B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
831
1082
  for (const f of shape.fields) {
832
- const fieldWant = host.cstr(dynDesc(f.type, this.host.recordsById, this.host.unionsById));
833
- const utag = f.type.kind === "union" ? undefinedArmTag(f.type, host.unionsById) : -1;
834
- const m = this.objGetLit(B, "%d", f.name);
835
- if (f.type.kind === "dyn") {
836
- // An `unknown` field: a present key passes through, a missing
837
- // one IS the undefined dyn value. Go through the dyn builder so
838
- // a Web-stream typed-ref capsule cannot escape inside a checked
839
- // record field.
840
- const has = B.tmp();
841
- B.line(`${has} = icmp ne ptr ${m}, null`);
842
- const sel = B.tmp();
843
- const u = this.undef(B);
844
- B.line(`${sel} = select i1 ${has}, ptr ${m}, ptr ${u}`);
845
- const value = B.tmp();
846
- B.line(`${value} = call ptr @${this.dynCheckHelper(f.type)}(ptr ${sel}, ptr ${pathSlot})`);
847
- storeInto(f.name, f.type, value);
848
- }
849
- else if (utag >= 0 && f.type.kind === "union") {
850
- const unit = host.unitInstanceRef(f.type.unionId, utag);
851
- const has = B.tmp();
852
- B.line(`${has} = icmp ne ptr ${m}, null`);
853
- const lp = B.newLabel("dcr.p");
854
- const la = B.newLabel("dcr.a");
855
- const lj = B.newLabel("dcr.j");
856
- B.condBr(has, lp, la);
857
- B.startBlock(la);
858
- storeInto(f.name, f.type, unit); // absent key -> the undefined arm
859
- B.br(lj);
860
- B.startBlock(lp);
861
- setPath(f.name, "0");
862
- const v = B.tmp();
863
- B.line(`${v} = call ptr @${this.dynCheckHelper(f.type)}(ptr ${m}, ptr ${pathSlot})`);
864
- storeInto(f.name, f.type, v);
865
- this.pendingBail(B, "dcr", releaseR, "ptr null");
866
- B.br(lj);
867
- B.startBlock(lj);
868
- }
869
- else {
870
- const has = B.tmp();
871
- B.line(`${has} = icmp ne ptr ${m}, null`);
872
- const lp = B.newLabel("dcr.p");
873
- const la = B.newLabel("dcr.a");
874
- B.condBr(has, lp, la);
875
- B.startBlock(la);
876
- setPath(f.name, "0");
877
- B.line(`call void @scr_dyn_check_fail(ptr ${pathSlot}, ptr ${fieldWant}, ptr null)`);
878
- releaseR();
879
- B.terminate(`ret ptr null`);
880
- B.startBlock(lp);
881
- setPath(f.name, "0");
882
- const v = B.tmp();
883
- B.line(`${v} = call ${this.valTy(f.type)} @${this.dynCheckHelper(f.type)}(ptr ${m}, ptr ${pathSlot})`);
884
- storeInto(f.name, f.type, v);
885
- this.pendingBail(B, "dcr", releaseR, "ptr null");
886
- }
1083
+ const m = this.objReadLit(B, "%d", f.name);
1084
+ host.declare(`declare void @scr_dyn_release(ptr)`);
1085
+ this.pendingBail(B, "dcr.read", () => { B.line(`call void @scr_dyn_release(ptr ${m})`); releaseR(); }, "ptr null");
1086
+ setPath(f.name, "0");
1087
+ const value = B.tmp();
1088
+ B.line(`${value} = call ${this.valTy(f.type)} @${this.dynCheckHelper(f.type)}(ptr ${m}, ptr ${pathSlot})`);
1089
+ B.line(`call void @scr_dyn_release(ptr ${m})`);
1090
+ storeInto(f.name, f.type, value);
1091
+ this.pendingBail(B, "dcr", releaseR, "ptr null");
887
1092
  }
888
1093
  // Index-signature shapes CAPTURE undeclared keys into the
889
1094
  // overflow map.
@@ -994,12 +1199,9 @@ export class LlDyn {
994
1199
  // Arms in CANONICAL order, first FULL match wins. The matched
995
1200
  // arm's builder can no longer fail.
996
1201
  def.arms.forEach((arm, i) => {
997
- const m = this.dynMatchHelper(arm);
998
- const hit = B.tmp();
999
- B.line(`${hit} = call zeroext i1 @${m}(ptr %d)`);
1000
1202
  const lHit = B.newLabel("dcu.h");
1001
1203
  const lNext = B.newLabel("dcu.n");
1002
- B.condBr(hit, lHit, lNext);
1204
+ this.unionArmMatch(B, def, i, lHit, lNext);
1003
1205
  B.startBlock(lHit);
1004
1206
  if (arm.kind === "undefinedT" || arm.kind === "nullT") {
1005
1207
  // A matched unit arm builds nothing: THE interned immortal
@@ -1039,7 +1241,7 @@ export class LlDyn {
1039
1241
  // live narrowed alias).
1040
1242
  host.declare(`declare ptr @scr_dyn_typed_ref_materialize(ptr)`);
1041
1243
  host.declare(`declare ptr @scr_dyn_typed_ref_cached_cast(ptr, ptr, ${host.sizeType})`);
1042
- host.declare(`declare void @scr_dyn_typed_ref_cache_cast(ptr, ptr, ${host.sizeType}, ptr, ptr, ptr)`);
1244
+ host.declare(`declare void @scr_dyn_typed_ref_cache_cast(ptr, ptr, ${host.sizeType}, ptr, ptr, ptr, i1)`);
1043
1245
  host.declare(`declare void @scr_dyn_release_v(ptr)`);
1044
1246
  host.declare(`declare void @scr_union_release(ptr)`);
1045
1247
  const rc = vAdapters(host, t);
@@ -1078,13 +1280,14 @@ export class LlDyn {
1078
1280
  const lCache = B.newLabel("dcu.put");
1079
1281
  B.condBr(hasCached, lRefresh, lCache);
1080
1282
  B.startBlock(lRefresh);
1081
- [
1283
+ const fields = [
1082
1284
  [1, "i32", "tag"],
1083
1285
  [2, "ptr", "retain"],
1084
1286
  [3, "ptr", "release"],
1085
1287
  [4, "ptr", "trace"],
1086
1288
  [5, "i64", "slot"],
1087
- ].forEach(([index, fieldType, fieldName]) => {
1289
+ ];
1290
+ fields.forEach(([index, fieldType, fieldName]) => {
1088
1291
  const cachedPtr = B.tmp();
1089
1292
  const checkedPtr = B.tmp();
1090
1293
  const oldValue = B.tmp();
@@ -1099,7 +1302,7 @@ export class LlDyn {
1099
1302
  B.line(`call void @scr_union_release(ptr ${checked})`);
1100
1303
  B.terminate(`ret ptr ${cached}`);
1101
1304
  B.startBlock(lCache);
1102
- B.line(`call void @scr_dyn_typed_ref_cache_cast(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr ${checked}, ptr ${rc.retain}, ptr ${rc.release})`);
1305
+ B.line(`call void @scr_dyn_typed_ref_cache_cast(ptr %d, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr ${checked}, ptr ${rc.retain}, ptr ${rc.release}, i1 ${traceAdapter(host, t) !== null ? "true" : "false"})`);
1103
1306
  B.terminate(`ret ptr ${checked}`);
1104
1307
  B.startBlock(lFail);
1105
1308
  B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${want}, ptr %d)`);
@@ -1140,11 +1343,20 @@ export class LlDyn {
1140
1343
  host.declare(`declare ptr @scr_box_new_obj(ptr, ptr, ptr)`);
1141
1344
  host.declare(`declare void @scr_box_set_ref(ptr, ptr)`);
1142
1345
  host.declare(`declare ptr @scr_dyn_retain_v(ptr)`);
1346
+ host.declare(`declare void @scr_dyn_trace_v(ptr, ptr, ptr)`);
1143
1347
  host.declare(`declare void @scr_dyn_release_v(ptr)`);
1144
1348
  const a = B.tmp();
1145
1349
  B.line(`${a} = call ptr @scr_closure_new(ptr @${adapter}, ${host.sizeType} 1)`);
1350
+ const sourceClosure = this.payloadOf(B, "%d", "ptr");
1351
+ const sourceKind = B.tmp();
1352
+ const functionKind = B.tmp();
1353
+ const targetKind = B.tmp();
1354
+ B.line(`${sourceKind} = getelementptr inbounds %ScrClosure, ptr ${sourceClosure}, i64 0, i32 4`);
1355
+ B.line(`${functionKind} = load i32, ptr ${sourceKind}`);
1356
+ B.line(`${targetKind} = getelementptr inbounds %ScrClosure, ptr ${a}, i64 0, i32 4`);
1357
+ B.line(`store i32 ${functionKind}, ptr ${targetKind}`);
1146
1358
  const box = B.tmp();
1147
- B.line(`${box} = call ptr @scr_box_new_obj(ptr @scr_dyn_retain_v, ptr @scr_dyn_release_v, ptr null)`);
1359
+ B.line(`${box} = call ptr @scr_box_new_obj(ptr @scr_dyn_retain_v, ptr @scr_dyn_release_v, ptr @scr_dyn_trace_v)`);
1148
1360
  const capp = B.tmp();
1149
1361
  B.line(`${capp} = getelementptr inbounds %ScrClosure, ptr ${a}, i64 1 ; caps[0]`);
1150
1362
  B.line(`store ptr ${box}, ptr ${capp}`);
@@ -1186,6 +1398,48 @@ export class LlDyn {
1186
1398
  const B = new BlockBuilder();
1187
1399
  let sourceAccessor = null;
1188
1400
  switch (t.kind) {
1401
+ case "url":
1402
+ case "searchParams": {
1403
+ const native = t.kind === "url" ? "url" : "search_params";
1404
+ host.declare(`declare ptr @scr_dyn_native_${native}(ptr)`);
1405
+ const r = B.tmp();
1406
+ B.line(`${r} = call ptr @scr_dyn_native_${native}(ptr %v)`);
1407
+ B.terminate(`ret ptr ${r}`);
1408
+ break;
1409
+ }
1410
+ case "regex": {
1411
+ host.declare(`declare ptr @scr_dyn_native_regex(ptr)`);
1412
+ const r = B.tmp();
1413
+ B.line(`${r} = call ptr @scr_dyn_native_regex(ptr %v)`);
1414
+ B.terminate(`ret ptr ${r}`);
1415
+ break;
1416
+ }
1417
+ case "map":
1418
+ case "set": {
1419
+ host.declare(`declare ptr @scr_dyn_native_${t.kind}(ptr)`);
1420
+ if (t.kind === "map" ? t.key.kind !== "dyn" || t.value.kind !== "dyn" : t.elem.kind !== "dyn") {
1421
+ host.declare(`declare void @scr_map_dyn_attach(ptr, ptr)`);
1422
+ B.line(`call void @scr_map_dyn_attach(ptr %v, ptr @${this.collectionDynOps(t)})`);
1423
+ }
1424
+ const r = B.tmp();
1425
+ B.line(`${r} = call ptr @scr_dyn_native_${t.kind}(ptr %v)`);
1426
+ B.terminate(`ret ptr ${r}`);
1427
+ break;
1428
+ }
1429
+ case "bigint": {
1430
+ host.declare(`declare ptr @scr_dyn_new_bigint(ptr)`);
1431
+ const r = B.tmp();
1432
+ B.line(`${r} = call ptr @scr_dyn_new_bigint(ptr %v)`);
1433
+ B.terminate(`ret ptr ${r}`);
1434
+ break;
1435
+ }
1436
+ case "symbol": {
1437
+ host.declare(`declare ptr @scr_dyn_new_symbol(ptr)`);
1438
+ const r = B.tmp();
1439
+ B.line(`${r} = call ptr @scr_dyn_new_symbol(ptr %v)`);
1440
+ B.terminate(`ret ptr ${r}`);
1441
+ break;
1442
+ }
1189
1443
  case "f64": {
1190
1444
  host.declare(`declare ptr @scr_dyn_new_num(double)`);
1191
1445
  const r = B.tmp();
@@ -1207,9 +1461,22 @@ export class LlDyn {
1207
1461
  B.terminate(`ret ptr ${r}`);
1208
1462
  break;
1209
1463
  }
1464
+ case "generator": {
1465
+ // Keep the suspended fiber and its channels by identity. Member
1466
+ // calls are generated from the exact capsule key by the frontend.
1467
+ const rc = vAdapters(host, t);
1468
+ const r = B.tmp();
1469
+ const snapshot = `${name}_snapshot`;
1470
+ const message = "property reflection on a native generator through an untyped value is not supported yet";
1471
+ host.declare(`declare void @scr_throw_error_msg_code(i32, ptr, ${host.sizeType}, ptr)`);
1472
+ this.defs.push(`define internal ptr @${snapshot}(ptr %v) ${FN_ATTRS} {`, `entry:`, ` call void @scr_throw_error_msg_code(i32 0, ptr ${host.cstr(message)}, ${host.sizeType} ${Buffer.byteLength(message, "utf8")}, ptr ${host.cstr("SC1071")})`, ` ret ptr null`, `}`, ``);
1473
+ B.line(`${r} = call ptr ${typedRefConstructor(host, t)}(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr @${snapshot}, ptr null)`);
1474
+ B.terminate(`ret ptr ${r}`);
1475
+ break;
1476
+ }
1210
1477
  case "object": {
1211
1478
  const className = t.className;
1212
- if (className === "%Error") {
1479
+ if (host.isErrorClass(className)) {
1213
1480
  host.declare(`declare ptr @scr_dyn_from_error(ptr)`);
1214
1481
  const r = B.tmp();
1215
1482
  B.line(`${r} = call ptr @scr_dyn_from_error(ptr %v)`);
@@ -1222,9 +1489,8 @@ export class LlDyn {
1222
1489
  const adapter = host.liveDynRefAdapter(t);
1223
1490
  const rc = vAdapters(host, t);
1224
1491
  const keyLit = host.cstr(typeKey(t));
1225
- host.declare(`declare ptr @scr_dyn_new_typed_ref(ptr, ptr, ptr, ptr, ${host.sizeType}, ptr, ptr)`);
1226
1492
  const r = B.tmp();
1227
- B.line(`${r} = call ptr @scr_dyn_new_typed_ref(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ptr ${keyLit}, ${host.sizeType} ${Buffer.byteLength(typeKey(t), "utf8")}, ptr @${adapter.snapshot}, ptr ${adapter.commit})`);
1493
+ B.line(`${r} = call ptr ${typedRefConstructor(host, t)}(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ptr ${keyLit}, ${host.sizeType} ${Buffer.byteLength(typeKey(t), "utf8")}, ptr @${adapter.snapshot}, ptr ${adapter.commit})`);
1228
1494
  B.terminate(`ret ptr ${r}`);
1229
1495
  break;
1230
1496
  }
@@ -1233,6 +1499,13 @@ export class LlDyn {
1233
1499
  B.terminate(`ret ptr ${r}`);
1234
1500
  break;
1235
1501
  }
1502
+ case "classval": {
1503
+ host.declare(`declare ptr @scr_dyn_new_class(ptr, ptr)`);
1504
+ const r = B.tmp();
1505
+ B.line(`${r} = call ptr @scr_dyn_new_class(ptr %v, ptr ${host.cstr(key)})`);
1506
+ B.terminate(`ret ptr ${r}`);
1507
+ break;
1508
+ }
1236
1509
  case "func": {
1237
1510
  const r = B.tmp();
1238
1511
  B.line(`${r} = call ptr @${this.dynFuncBoxHelper(t)}(ptr %v, ptr null)`);
@@ -1240,11 +1513,9 @@ export class LlDyn {
1240
1513
  break;
1241
1514
  }
1242
1515
  case "bytes": {
1243
- if (t.elem !== "u8")
1244
- throw new InternalCompilerError(`llvm emitter bug: to-dyn of bytes<${t.elem}>`);
1245
- host.declare(`declare ptr @scr_dyn_new_bytes_copy(ptr)`);
1516
+ host.declare(`declare ptr @scr_dyn_new_bytes(ptr)`);
1246
1517
  const r = B.tmp();
1247
- B.line(`${r} = call ptr @scr_dyn_new_bytes_copy(ptr %v)`);
1518
+ B.line(`${r} = call ptr @scr_dyn_new_bytes(ptr %v)`);
1248
1519
  B.terminate(`ret ptr ${r}`);
1249
1520
  break;
1250
1521
  }
@@ -1268,7 +1539,7 @@ export class LlDyn {
1268
1539
  host.declare(`declare void @scr_dyn_obj_set(ptr, ptr, ${host.sizeType}, ptr)`);
1269
1540
  // CYCLE-CAPABLE shapes guard the deep copy: enter TRAPS on a value
1270
1541
  // already being converted (a cyclic value has no finite dyn copy —
1271
- // SEMANTICS.md; the C emitter's contract exactly).
1542
+ // SEMANTICS.md).
1272
1543
  const cyclicRec = traceAdapter(host, t) !== null;
1273
1544
  if (cyclicRec) {
1274
1545
  host.declare(`declare void @scr_dyn_from_enter(ptr)`);
@@ -1290,12 +1561,14 @@ export class LlDyn {
1290
1561
  }
1291
1562
  if (cyclicRec)
1292
1563
  B.line(`call void @scr_dyn_from_leave()`);
1564
+ host.declare(`declare ptr @scr_dyn_mark_snapshot(ptr)`);
1565
+ B.line(`call ptr @scr_dyn_mark_snapshot(ptr ${d})`);
1293
1566
  B.terminate(`ret ptr ${d}`);
1294
1567
  break;
1295
1568
  }
1296
1569
  const d = B.tmp();
1297
1570
  const carriesListenerIdentity = shape.fields.some((f) => f.name === "handleEvent" && f.type.kind === "func");
1298
- if (carriesListenerIdentity) {
1571
+ if ((shape.fields.length === 0 && !shape.indexValue) || carriesListenerIdentity) {
1299
1572
  const rc = vAdapters(host, t);
1300
1573
  sourceAccessor = {
1301
1574
  name: `${name}_source_access`,
@@ -1391,6 +1664,8 @@ export class LlDyn {
1391
1664
  }
1392
1665
  if (cyclicRec)
1393
1666
  B.line(`call void @scr_dyn_from_leave()`);
1667
+ host.declare(`declare ptr @scr_dyn_mark_snapshot(ptr)`);
1668
+ B.line(`call ptr @scr_dyn_mark_snapshot(ptr ${d})`);
1394
1669
  B.terminate(`ret ptr ${d}`);
1395
1670
  break;
1396
1671
  }
@@ -1411,6 +1686,20 @@ export class LlDyn {
1411
1686
  const len = B.tmp();
1412
1687
  B.line(`${len} = call double @scr_arr_len(ptr %v)`);
1413
1688
  B.countedLoop(len, (i) => {
1689
+ host.declare(`declare double @scr_arr_state(ptr, double)`);
1690
+ const state = B.tmp();
1691
+ const undefinedState = B.tmp();
1692
+ const undefinedLabel = B.newLabel("tda.undefined");
1693
+ const valueLabel = B.newLabel("tda.value");
1694
+ const doneLabel = B.newLabel("tda.done");
1695
+ B.line(`${state} = call double @scr_arr_state(ptr %v, double ${i})`);
1696
+ B.line(`${undefinedState} = fcmp oeq double ${state}, 2.0`); // SCR_ARR_UNDEFINED
1697
+ B.terminate(`br i1 ${undefinedState}, label %${undefinedLabel}, label %${valueLabel}`);
1698
+ B.startBlock(undefinedLabel);
1699
+ const retained = this.retainDyn(B, this.undef(B));
1700
+ B.line(`call void @scr_dyn_arr_push(ptr ${d}, ptr ${retained})`);
1701
+ B.terminate(`br label %${doneLabel}`);
1702
+ B.startBlock(valueLabel);
1414
1703
  if (elem.kind === "f64" || elem.kind === "bool") {
1415
1704
  const acc = elem.kind;
1416
1705
  const accTy = elem.kind === "f64" ? "double" : "i1";
@@ -1437,9 +1726,15 @@ export class LlDyn {
1437
1726
  B.line(`call void @scr_dyn_arr_push(ptr ${d}, ptr ${conv})`);
1438
1727
  B.line(`call void ${releaseSym(host, elem)}(ptr ${e})`);
1439
1728
  }
1729
+ B.terminate(`br label %${doneLabel}`);
1730
+ B.startBlock(doneLabel);
1440
1731
  });
1732
+ host.declare(`declare void @scr_arr_copy_metadata(ptr, ptr)`);
1733
+ B.line(`call void @scr_arr_copy_metadata(ptr %v, ptr ${d})`);
1441
1734
  if (cyclicArr)
1442
1735
  B.line(`call void @scr_dyn_from_leave()`);
1736
+ host.declare(`declare ptr @scr_dyn_mark_snapshot(ptr)`);
1737
+ B.line(`call ptr @scr_dyn_mark_snapshot(ptr ${d})`);
1443
1738
  B.terminate(`ret ptr ${d}`);
1444
1739
  break;
1445
1740
  }
@@ -1549,7 +1844,7 @@ export class LlDyn {
1549
1844
  }
1550
1845
  this.defs.push(`define internal ptr @${name}(${this.valTy(t)} %v) ${FN_ATTRS} { ; to-dyn ${key}`, B.render(), `}`, ``);
1551
1846
  if (sourceAccessor) {
1552
- this.defs.push(`define internal ptr @${sourceAccessor.name}(ptr %v, i1 %materialize) ${FN_ATTRS} { ; live listener source ${key}`, `entry:`, ` br i1 %materialize, label %snapshot, label %release`, `snapshot:`, ` %d = call ptr @${name}(ptr %v)`, ` ret ptr %d`, `release:`, ` call void ${sourceAccessor.release}(ptr %v)`, ` ret ptr null`, `}`, ``);
1847
+ this.defs.push(`define internal ptr @${sourceAccessor.name}(ptr %v, i1 %materialize) ${FN_ATTRS} { ; record source ${key}`, `entry:`, ` br i1 %materialize, label %snapshot, label %release`, `snapshot:`, ` %d = call ptr @${name}(ptr %v)`, ` ret ptr %d`, `release:`, ` call void ${sourceAccessor.release}(ptr %v)`, ` ret ptr null`, `}`, ``);
1553
1848
  }
1554
1849
  return name;
1555
1850
  }
@@ -1571,9 +1866,10 @@ export class LlDyn {
1571
1866
  const B = new BlockBuilder();
1572
1867
  host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
1573
1868
  host.declare(`declare ptr @scr_dyn_retain_v(ptr)`);
1869
+ host.declare(`declare void @scr_dyn_trace_v(ptr, ptr, ptr)`);
1574
1870
  host.declare(`declare void @scr_dyn_release_v(ptr)`);
1575
1871
  const fulfill = (dv) => {
1576
- B.line(`call void @scr_promise_fulfill_ref(ptr %dst, ptr ${dv}, ptr @scr_dyn_retain_v, ptr @scr_dyn_release_v, ptr null)`);
1872
+ B.line(`call void @scr_promise_fulfill_ref(ptr %dst, ptr ${dv}, ptr @scr_dyn_retain_v, ptr @scr_dyn_release_v, ptr @scr_dyn_trace_v)`);
1577
1873
  };
1578
1874
  switch (inner.kind) {
1579
1875
  case "void":
@@ -1660,10 +1956,17 @@ export class LlDyn {
1660
1956
  const kd = this.kindOf(B, "%d");
1661
1957
  const done = B.newLabel("ds.d");
1662
1958
  const labels = new Map();
1663
- for (const k of [DYN_KIND.NULL, DYN_KIND.BOOL, DYN_KIND.NUM, DYN_KIND.STR, DYN_KIND.ARR, DYN_KIND.OBJ, DYN_KIND.UNDEF, DYN_KIND.BYTES, DYN_KIND.FUNC, DYN_KIND.HANDLE, DYN_KIND.PROMISE, DYN_KIND.JSVAL, DYN_KIND.TYPED_REF]) {
1959
+ for (const k of [DYN_KIND.NULL, DYN_KIND.BOOL, DYN_KIND.NUM, DYN_KIND.STR, DYN_KIND.ARR, DYN_KIND.OBJ, DYN_KIND.UNDEF, DYN_KIND.BYTES, DYN_KIND.FUNC, DYN_KIND.HANDLE, DYN_KIND.PROMISE, DYN_KIND.JSVAL, DYN_KIND.TYPED_REF, DYN_KIND.PROXY, DYN_KIND.BIGINT, DYN_KIND.SYMBOL]) {
1664
1960
  labels.set(k, B.newLabel(`ds.k${k}`));
1665
1961
  }
1666
- B.terminate(`switch i32 ${kd}, label %${done} [ ${[...labels].map(([k, l]) => `i32 ${k}, label %${l}`).join(" ")} ]`);
1962
+ const branches = [];
1963
+ for (const [kind, label] of labels)
1964
+ branches.push(`i32 ${kind}, label %${label}`);
1965
+ B.terminate(`switch i32 ${kd}, label %${done} [ ${branches.join(" ")} ]`);
1966
+ B.startBlock(labels.get(DYN_KIND.PROXY));
1967
+ host.declare(`declare void @scr_dyn_proxy_unsupported(ptr)`);
1968
+ B.line(`call void @scr_dyn_proxy_unsupported(ptr ${host.cstr("string conversion")})`);
1969
+ B.br(done);
1667
1970
  B.startBlock(labels.get(DYN_KIND.JSVAL));
1668
1971
  {
1669
1972
  // Island-held: the engine's own ToString (a bridged failure
@@ -1696,6 +1999,24 @@ export class LlDyn {
1696
1999
  B.line(`call void @scr_jb_puts(ptr %b, ptr ${s})`);
1697
2000
  B.br(done);
1698
2001
  }
2002
+ B.startBlock(labels.get(DYN_KIND.BIGINT));
2003
+ {
2004
+ host.declare(`declare ptr @scr_bigint_to_string(ptr, double)`);
2005
+ const v = this.payloadOf(B, "%d", "ptr");
2006
+ const s = B.tmp();
2007
+ B.line(`${s} = call ptr @scr_bigint_to_string(ptr ${v}, double ${f64Lit(10)})`);
2008
+ this.putScrStr(B, "%b", s);
2009
+ B.line(`call void @scr_str_release(ptr ${s})`);
2010
+ B.br(done);
2011
+ }
2012
+ B.startBlock(labels.get(DYN_KIND.SYMBOL));
2013
+ {
2014
+ host.declare(`declare ptr @scr_dyn_string_coerce(ptr)`);
2015
+ const s = B.tmp();
2016
+ B.line(`${s} = call ptr @scr_dyn_string_coerce(ptr %d)`);
2017
+ B.line(`call void @scr_str_release(ptr ${s})`);
2018
+ B.br(done);
2019
+ }
1699
2020
  B.startBlock(labels.get(DYN_KIND.NUM));
1700
2021
  {
1701
2022
  // String(n): NaN/Infinity spelled out, not the JSON null.
@@ -1862,35 +2183,11 @@ export class LlDyn {
1862
2183
  B.br(done);
1863
2184
  B.startBlock(lJoin);
1864
2185
  const bts = this.payloadOf(B, "%d", "ptr");
1865
- const blenp = B.tmp();
1866
- const blen = B.tmp();
1867
- const bdatap = B.tmp();
1868
- const bdata = B.tmp();
1869
- B.line(`${blenp} = getelementptr inbounds i8, ptr ${bts}, i64 ${this.abiOffset(8, 4)} ; ->len`);
1870
- B.line(`${blen} = load ${this.S}, ptr ${blenp}`);
1871
- B.line(`${bdatap} = getelementptr inbounds i8, ptr ${bts}, i64 ${this.abiOffset(24, 12)} ; ->data`);
1872
- B.line(`${bdata} = load ptr, ptr ${bdatap}`);
1873
- this.i64Loop(B, "ds.by", blen, (i) => {
1874
- const nz = B.tmp();
1875
- B.line(`${nz} = icmp ugt ${this.S} ${i}, 0`);
1876
- const lcm = B.newLabel("ds.bc");
1877
- const lv = B.newLabel("ds.bv");
1878
- B.condBr(nz, lcm, lv);
1879
- B.startBlock(lcm);
1880
- B.line(`call void @scr_jb_putc(ptr %b, i8 44)`);
1881
- B.br(lv);
1882
- B.startBlock(lv);
1883
- const cp = B.tmp();
1884
- const c = B.tmp();
1885
- const cd = B.tmp();
1886
- B.line(`${cp} = getelementptr inbounds i8, ptr ${bdata}, ${this.S} ${i}`);
1887
- B.line(`${c} = load i8, ptr ${cp}`);
1888
- B.line(`${cd} = uitofp i8 ${c} to double`);
1889
- const s = B.tmp();
1890
- B.line(`${s} = call ptr @scr_f64_to_scrstr(double ${cd})`);
1891
- this.putScrStr(B, "%b", s);
1892
- B.line(`call void @scr_str_release(ptr ${s})`);
1893
- });
2186
+ host.declare(`declare ptr @scr_bytes_join(ptr, ptr)`);
2187
+ const joined = B.tmp();
2188
+ B.line(`${joined} = call ptr @scr_bytes_join(ptr ${bts}, ptr ${host.internLiteral(",")})`);
2189
+ this.putScrStr(B, "%b", joined);
2190
+ B.line(`call void @scr_str_release(ptr ${joined})`);
1894
2191
  B.br(done);
1895
2192
  }
1896
2193
  B.startBlock(labels.get(DYN_KIND.FUNC));
@@ -1914,8 +2211,14 @@ export class LlDyn {
1914
2211
  B.br(done);
1915
2212
  }
1916
2213
  B.startBlock(labels.get(DYN_KIND.HANDLE));
1917
- this.puts(B, "%b", "[object Object]");
1918
- B.br(done);
2214
+ {
2215
+ host.declare(`declare ptr @scr_dyn_to_string(ptr, ptr)`);
2216
+ const s = B.tmp();
2217
+ B.line(`${s} = call ptr @scr_dyn_to_string(ptr %d, ptr null)`);
2218
+ this.putScrStr(B, "%b", s);
2219
+ B.line(`call void @scr_str_release(ptr ${s})`);
2220
+ B.br(done);
2221
+ }
1919
2222
  B.startBlock(labels.get(DYN_KIND.PROMISE));
1920
2223
  // Object.prototype.toString with the Promise @@toStringTag.
1921
2224
  this.puts(B, "%b", "[object Promise]");
@@ -2062,6 +2365,47 @@ export class LlDyn {
2062
2365
  /* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
2063
2366
  /** `sc_dyn_key_get(ptr d, ptr k, i1 opt) -> ptr` — d[k] on a dyn value.
2064
2367
  * Result +1; throws on non-optional nullish receivers. */
2368
+ dynComputedKeyGetHelper() {
2369
+ const name = "sc_dyn_computed_key_get";
2370
+ if (this.helperMemo.has(name))
2371
+ return name;
2372
+ this.helperMemo.set(name, name);
2373
+ const B = new BlockBuilder();
2374
+ const host = this.host;
2375
+ const stringHelper = this.dynKeyGetHelper();
2376
+ host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
2377
+ host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
2378
+ host.declare(`declare void @scr_dyn_release(ptr)`);
2379
+ const key = B.tmp();
2380
+ B.line(`${key} = call ptr @scr_dyn_property_key_value(ptr %key)`);
2381
+ const missing = B.tmp();
2382
+ B.line(`${missing} = icmp eq ptr ${key}, null`);
2383
+ const fail = B.newLabel("kg.fail");
2384
+ const dispatch = B.newLabel("kg.dispatch");
2385
+ B.condBr(missing, fail, dispatch);
2386
+ B.startBlock(fail);
2387
+ B.terminate("ret ptr null");
2388
+ B.startBlock(dispatch);
2389
+ const kind = this.kindOf(B, key);
2390
+ const symbol = B.tmp();
2391
+ B.line(`${symbol} = icmp eq i32 ${kind}, ${DYN_KIND.SYMBOL}`);
2392
+ const sym = B.newLabel("kg.symbol");
2393
+ const str = B.newLabel("kg.string");
2394
+ B.condBr(symbol, sym, str);
2395
+ B.startBlock(sym);
2396
+ const sv = B.tmp();
2397
+ B.line(`${sv} = call ptr @scr_dyn_symbol_key_get(ptr %d, ptr ${key}, i1 %opt)`);
2398
+ B.line(`call void @scr_dyn_release(ptr ${key})`);
2399
+ B.terminate(`ret ptr ${sv}`);
2400
+ B.startBlock(str);
2401
+ const text = this.payloadOf(B, key, "ptr");
2402
+ const value = B.tmp();
2403
+ B.line(`${value} = call ptr @${stringHelper}(ptr %d, ptr ${text}, i1 %opt)`);
2404
+ B.line(`call void @scr_dyn_release(ptr ${key})`);
2405
+ B.terminate(`ret ptr ${value}`);
2406
+ this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
2407
+ return name;
2408
+ }
2065
2409
  dynKeyGetHelper() {
2066
2410
  const memoKey = "%dynKeyGet";
2067
2411
  const existing = this.dynBuilders.get(memoKey);
@@ -2122,6 +2466,19 @@ export class LlDyn {
2122
2466
  B.terminate(`ret ptr null`);
2123
2467
  B.startBlock(lNext);
2124
2468
  }
2469
+ {
2470
+ const isSymbol = B.tmp();
2471
+ B.line(`${isSymbol} = icmp eq i32 ${kd}, ${DYN_KIND.SYMBOL}`);
2472
+ const lSymbol = B.newLabel("kg.sym");
2473
+ const lNext = B.newLabel("kg.n");
2474
+ B.condBr(isSymbol, lSymbol, lNext);
2475
+ B.startBlock(lSymbol);
2476
+ host.declare(`declare ptr @scr_dyn_symbol_get(ptr, ptr)`);
2477
+ const r = B.tmp();
2478
+ B.line(`${r} = call ptr @scr_dyn_symbol_get(ptr %d, ptr %k)`);
2479
+ B.terminate(`ret ptr ${r}`);
2480
+ B.startBlock(lNext);
2481
+ }
2125
2482
  // Typed stream capsules expose their one cached, refreshed dyn view to
2126
2483
  // ordinary property reads while the capsule itself keeps identity.
2127
2484
  {
@@ -2144,6 +2501,19 @@ export class LlDyn {
2144
2501
  // ISLAND-held receivers: o[k] reads the REAL engine property (getters
2145
2502
  // included, throws bridged catchably) and the result wraps back
2146
2503
  // scalar-normalized — the routed keyed read that retired the fence.
2504
+ {
2505
+ const isProxy = B.tmp();
2506
+ B.line(`${isProxy} = icmp eq i32 ${kd}, ${DYN_KIND.PROXY}`);
2507
+ const lProxy = B.newLabel("kg.proxy");
2508
+ const lNext = B.newLabel("kg.n");
2509
+ B.condBr(isProxy, lProxy, lNext);
2510
+ B.startBlock(lProxy);
2511
+ host.declare(`declare ptr @scr_dyn_proxy_get(ptr, ptr)`);
2512
+ const r = B.tmp();
2513
+ B.line(`${r} = call ptr @scr_dyn_proxy_get(ptr %d, ptr %k)`);
2514
+ B.terminate(`ret ptr ${r}`);
2515
+ B.startBlock(lNext);
2516
+ }
2147
2517
  {
2148
2518
  const isJv = B.tmp();
2149
2519
  B.line(`${isJv} = icmp eq i32 ${kd}, ${DYN_KIND.JSVAL}`);
@@ -2288,45 +2658,10 @@ export class LlDyn {
2288
2658
  const lNext = B.newLabel("kg.n");
2289
2659
  B.condBr(isB, lB, lNext);
2290
2660
  B.startBlock(lB);
2291
- host.declare(`declare ptr @scr_dyn_new_num(double)`);
2292
- const bts = this.payloadOf(B, "%d", "ptr");
2293
- const blenp = B.tmp();
2294
- const blen = B.tmp();
2295
- B.line(`${blenp} = getelementptr inbounds i8, ptr ${bts}, i64 ${this.abiOffset(8, 4)} ; ->len`);
2296
- B.line(`${blen} = load ${host.sizeType}, ptr ${blenp}`);
2297
- const lLen = B.newLabel("kg.bl");
2298
- const lIdx = B.newLabel("kg.bi");
2299
- B.condBr(lenHit, lLen, lIdx);
2300
- B.startBlock(lLen);
2301
- const lenD = B.tmp();
2302
- const r0 = B.tmp();
2303
- B.line(`${lenD} = uitofp ${host.sizeType} ${blen} to double`);
2304
- B.line(`${r0} = call ptr @scr_dyn_new_num(double ${lenD})`);
2305
- B.terminate(`ret ptr ${r0}`);
2306
- B.startBlock(lIdx);
2307
- const inRange = B.tmp();
2308
- const hit = B.tmp();
2309
- B.line(`${inRange} = icmp ult ${host.sizeType} ${idx}, ${blen}`);
2310
- B.line(`${hit} = and i1 ${digits}, ${inRange}`);
2311
- const lHit = B.newLabel("kg.bh");
2312
- const lMiss = B.newLabel("kg.bm");
2313
- B.condBr(hit, lHit, lMiss);
2314
- B.startBlock(lHit);
2315
- const bdatap = B.tmp();
2316
- const bdata = B.tmp();
2317
- B.line(`${bdatap} = getelementptr inbounds i8, ptr ${bts}, i64 ${this.abiOffset(24, 12)} ; ->data`);
2318
- B.line(`${bdata} = load ptr, ptr ${bdatap}`);
2319
- const bp = B.tmp();
2320
- const bv = B.tmp();
2321
- const bd = B.tmp();
2322
- const r1 = B.tmp();
2323
- B.line(`${bp} = getelementptr inbounds i8, ptr ${bdata}, ${host.sizeType} ${idx}`);
2324
- B.line(`${bv} = load i8, ptr ${bp}`);
2325
- B.line(`${bd} = uitofp i8 ${bv} to double`);
2326
- B.line(`${r1} = call ptr @scr_dyn_new_num(double ${bd})`);
2327
- B.terminate(`ret ptr ${r1}`);
2328
- B.startBlock(lMiss);
2329
- retainUndef();
2661
+ host.declare(`declare ptr @scr_dyn_bytes_key_get(ptr, ptr)`);
2662
+ const result = B.tmp();
2663
+ B.line(`${result} = call ptr @scr_dyn_bytes_key_get(ptr %d, ptr %k)`);
2664
+ B.terminate(`ret ptr ${result}`);
2330
2665
  B.startBlock(lNext);
2331
2666
  }
2332
2667
  // FUNC: own props (defineProperties writes), then name/length.
@@ -2429,6 +2764,15 @@ export class LlDyn {
2429
2764
  B.line(`call void @scr_str_release(ptr ${ch})`);
2430
2765
  B.terminate(`ret ptr ${r2}`);
2431
2766
  B.startBlock(lMiss);
2767
+ const lArrNamed = B.newLabel("kg.an");
2768
+ const lOther = B.newLabel("kg.ao");
2769
+ B.condBr(isA, lArrNamed, lOther);
2770
+ B.startBlock(lArrNamed);
2771
+ host.declare(`declare ptr @scr_dyn_arr_named_get(ptr, ptr)`);
2772
+ const named = B.tmp();
2773
+ B.line(`${named} = call ptr @scr_dyn_arr_named_get(ptr %d, ptr %k)`);
2774
+ B.terminate(`ret ptr ${named}`);
2775
+ B.startBlock(lOther);
2432
2776
  retainUndef();
2433
2777
  }
2434
2778
  B.startBlock(lNext);
@@ -2529,14 +2873,13 @@ export class LlDyn {
2529
2873
  const materialized = B.tmp();
2530
2874
  const out = B.tmp();
2531
2875
  B.line(`${materialized} = call ptr @scr_dyn_typed_ref_materialize(ptr %d)`);
2532
- B.line(`${out} = call ptr @${name}(ptr ${materialized}, ${host.sizeType} %n)`);
2876
+ B.line(`${out} = call ptr @${name}(ptr ${materialized}, ${host.sizeType} %n, ptr %spelling)`);
2533
2877
  B.line(`call void @scr_dyn_release_v(ptr ${materialized})`);
2534
2878
  B.terminate(`ret ptr ${out}`);
2535
2879
  B.startBlock(lNext);
2536
2880
  }
2537
- // ISLAND-held sources: an engine array IS iterable — the not-iterable
2538
- // TypeError below would be a wrong claim. Loud fence (lane
2539
- // dyn-routing-ops).
2881
+ // Island-held sources keep the engine's iterator and IteratorClose
2882
+ // behavior while returning checked values for the destructuring slots.
2540
2883
  {
2541
2884
  const isJv = B.tmp();
2542
2885
  B.line(`${isJv} = icmp eq i32 ${kd}, ${DYN_KIND.JSVAL}`);
@@ -2544,10 +2887,12 @@ export class LlDyn {
2544
2887
  const lNotJv = B.newLabel("din.njv");
2545
2888
  B.condBr(isJv, lJv, lNotJv);
2546
2889
  B.startBlock(lJv);
2547
- host.declare(`declare zeroext i1 @scr_dyn_isl_fence(ptr, ptr)`);
2548
- const f = B.tmp();
2549
- B.line(`${f} = call zeroext i1 @scr_dyn_isl_fence(ptr %d, ptr ${host.cstr("iteration")})`);
2550
- B.terminate(`ret ptr null`);
2890
+ host.declare(`declare ptr @scr_dyn_jsval_iter_n(ptr, double)`);
2891
+ const count = B.tmp();
2892
+ const out = B.tmp();
2893
+ B.line(`${count} = uitofp ${host.sizeType} %n to double`);
2894
+ B.line(`${out} = call ptr @scr_dyn_jsval_iter_n(ptr %d, double ${count})`);
2895
+ B.terminate(`ret ptr ${out}`);
2551
2896
  B.startBlock(lNotJv);
2552
2897
  }
2553
2898
  const okA = B.tmp();
@@ -2568,6 +2913,17 @@ export class LlDyn {
2568
2913
  const buf = "%dib";
2569
2914
  B.entryAllocas.push(`${buf} = alloca %ScrJsonBuf`);
2570
2915
  B.line(`call void @scr_jb_init(ptr ${buf})`);
2916
+ const hasSpelling = B.tmp();
2917
+ B.line(`${hasSpelling} = icmp ne ptr %spelling, null`);
2918
+ const named = B.newLabel("din.named"), unnamed = B.newLabel("din.unnamed");
2919
+ B.condBr(hasSpelling, named, unnamed);
2920
+ B.startBlock(named);
2921
+ B.line(`call void @scr_jb_puts(ptr ${buf}, ptr %spelling)`);
2922
+ const namedMessage = B.tmp();
2923
+ B.line(`${namedMessage} = call ptr @scr_jb_finish(ptr ${buf})`);
2924
+ B.line(`call void @scr_throw_error(i32 1, ptr ${namedMessage})`);
2925
+ B.terminate(`ret ptr null`);
2926
+ B.startBlock(unnamed);
2571
2927
  const lU = B.newLabel("din.u");
2572
2928
  const lN = B.newLabel("din.n");
2573
2929
  const lB2 = B.newLabel("din.b");
@@ -2647,7 +3003,7 @@ export class LlDyn {
2647
3003
  B.line(`store ptr ${r2}, ptr ${itemSlot}`);
2648
3004
  B.br(lPush);
2649
3005
  }
2650
- // BYTES: by byte.
3006
+ // BYTES: by numeric element.
2651
3007
  B.startBlock(lBy);
2652
3008
  {
2653
3009
  const bts = this.payloadOf(B, "%d", "ptr");
@@ -2661,17 +3017,12 @@ export class LlDyn {
2661
3017
  const lMiss = B.newLabel("din.bm");
2662
3018
  B.condBr(inR, lHit, lMiss);
2663
3019
  B.startBlock(lHit);
2664
- const bdatap = B.tmp();
2665
- const bdata = B.tmp();
2666
- B.line(`${bdatap} = getelementptr inbounds i8, ptr ${bts}, i64 ${this.abiOffset(24, 12)} ; ->data`);
2667
- B.line(`${bdata} = load ptr, ptr ${bdatap}`);
2668
- const bp = B.tmp();
2669
- const bv = B.tmp();
3020
+ host.declare(`declare double @scr_bytes_get(ptr, double)`);
3021
+ const index = B.tmp();
2670
3022
  const bd = B.tmp();
2671
3023
  const r = B.tmp();
2672
- B.line(`${bp} = getelementptr inbounds i8, ptr ${bdata}, ${host.sizeType} ${i}`);
2673
- B.line(`${bv} = load i8, ptr ${bp}`);
2674
- B.line(`${bd} = uitofp i8 ${bv} to double`);
3024
+ B.line(`${index} = uitofp ${host.sizeType} ${i} to double`);
3025
+ B.line(`${bd} = call double @scr_bytes_get(ptr ${bts}, double ${index})`);
2675
3026
  B.line(`${r} = call ptr @scr_dyn_new_num(double ${bd})`);
2676
3027
  B.line(`store ptr ${r}, ptr ${itemSlot}`);
2677
3028
  B.br(lPush);
@@ -2752,7 +3103,7 @@ export class LlDyn {
2752
3103
  B.line(`call void @scr_dyn_arr_push(ptr ${out}, ptr ${item}) ; push takes ownership`);
2753
3104
  });
2754
3105
  B.terminate(`ret ptr ${out}`);
2755
- this.defs.push(`define internal ptr @${name}(ptr %d, ${host.sizeType} %n) ${FN_ATTRS} { ; destructuring GetIterator + N steps`, B.render(), `}`, ``);
3106
+ this.defs.push(`define internal ptr @${name}(ptr %d, ${host.sizeType} %n, ptr %spelling) ${FN_ATTRS} { ; destructuring GetIterator + N steps`, B.render(), `}`, ``);
2756
3107
  return name;
2757
3108
  }
2758
3109
  /* ── the checked-dynamic function boundary (ported) ────────────────── */
@@ -2793,7 +3144,55 @@ export class LlDyn {
2793
3144
  const host = this.host;
2794
3145
  const B = new BlockBuilder();
2795
3146
  const argNames = [];
3147
+ const typedRest = t.rest === true && t.restAbi === "typed";
3148
+ const packTail = (start) => {
3149
+ host.declare(`declare ptr @scr_dyn_new_arr()`);
3150
+ host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
3151
+ const packed = B.tmp();
3152
+ B.line(`${packed} = call ptr @scr_dyn_new_arr()`);
3153
+ const riSlot = B.slot();
3154
+ B.entryAllocas.push(`${riSlot} = alloca ${host.sizeType}`);
3155
+ B.line(`store ${host.sizeType} ${start}, ptr ${riSlot}`);
3156
+ const lc = B.newLabel("dfk.rc");
3157
+ const lb = B.newLabel("dfk.rb");
3158
+ const le = B.newLabel("dfk.re");
3159
+ B.br(lc);
3160
+ B.startBlock(lc);
3161
+ const ri = B.tmp();
3162
+ const cont = B.tmp();
3163
+ B.line(`${ri} = load ${host.sizeType}, ptr ${riSlot}`);
3164
+ B.line(`${cont} = icmp ult ${host.sizeType} ${ri}, %argc`);
3165
+ B.condBr(cont, lb, le);
3166
+ B.startBlock(lb);
3167
+ const ap = B.tmp();
3168
+ const av = B.tmp();
3169
+ B.line(`${ap} = getelementptr inbounds ptr, ptr %args, ${host.sizeType} ${ri}`);
3170
+ B.line(`${av} = load ptr, ptr ${ap}`);
3171
+ const rv = this.retainDyn(B, av);
3172
+ B.line(`call void @scr_dyn_arr_push(ptr ${packed}, ptr ${rv})`);
3173
+ const ri2 = B.tmp();
3174
+ B.line(`${ri2} = add ${host.sizeType} ${ri}, 1`);
3175
+ B.line(`store ${host.sizeType} ${ri2}, ptr ${riSlot}`);
3176
+ B.br(lc);
3177
+ B.startBlock(le);
3178
+ return packed;
3179
+ };
2796
3180
  t.params.forEach((p, i) => {
3181
+ if (typedRest && i === t.params.length - 1) {
3182
+ const packed = packTail(i);
3183
+ const a = B.tmp();
3184
+ B.line(`${a} = call ${this.valTy(p)} @${this.dynCheckHelper(p)}(ptr ${packed}, ptr null)`);
3185
+ host.declare(`declare void @scr_dyn_release(ptr)`);
3186
+ B.line(`call void @scr_dyn_release(ptr ${packed})`);
3187
+ this.pendingBail(B, "dfk.rest", () => {
3188
+ t.params.slice(0, i).forEach((q, j) => {
3189
+ if (isRefCounted(q))
3190
+ B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
3191
+ });
3192
+ }, "ptr null");
3193
+ argNames.push(a);
3194
+ return;
3195
+ }
2797
3196
  // JS arity: a missing argument IS the undefined dyn value.
2798
3197
  const adSlot = B.slot();
2799
3198
  B.entryAllocas.push(`${adSlot} = alloca ptr`);
@@ -2867,38 +3266,7 @@ export class LlDyn {
2867
3266
  });
2868
3267
  // VARIADIC (rest-marked) signatures: one extra trailing dyn-array
2869
3268
  // param carries the call's arguments from index params.length on.
2870
- let rest = null;
2871
- if (t.rest) {
2872
- host.declare(`declare ptr @scr_dyn_new_arr()`);
2873
- host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
2874
- rest = B.tmp();
2875
- B.line(`${rest} = call ptr @scr_dyn_new_arr()`);
2876
- const riSlot = B.slot();
2877
- B.entryAllocas.push(`${riSlot} = alloca ${host.sizeType}`);
2878
- B.line(`store ${host.sizeType} ${t.argumentsAll ? 0 : t.params.length}, ptr ${riSlot}`);
2879
- const lc = B.newLabel("dfk.rc");
2880
- const lb = B.newLabel("dfk.rb");
2881
- const le = B.newLabel("dfk.re");
2882
- B.br(lc);
2883
- B.startBlock(lc);
2884
- const ri = B.tmp();
2885
- const cont = B.tmp();
2886
- B.line(`${ri} = load ${host.sizeType}, ptr ${riSlot}`);
2887
- B.line(`${cont} = icmp ult ${host.sizeType} ${ri}, %argc`);
2888
- B.condBr(cont, lb, le);
2889
- B.startBlock(lb);
2890
- const ap = B.tmp();
2891
- const av = B.tmp();
2892
- B.line(`${ap} = getelementptr inbounds ptr, ptr %args, ${host.sizeType} ${ri}`);
2893
- B.line(`${av} = load ptr, ptr ${ap}`);
2894
- const rv = this.retainDyn(B, av);
2895
- B.line(`call void @scr_dyn_arr_push(ptr ${rest}, ptr ${rv})`);
2896
- const ri2 = B.tmp();
2897
- B.line(`${ri2} = add ${host.sizeType} ${ri}, 1`);
2898
- B.line(`store ${host.sizeType} ${ri2}, ptr ${riSlot}`);
2899
- B.br(lc);
2900
- B.startBlock(le);
2901
- }
3269
+ const rest = t.rest && !typedRest ? packTail(t.argumentsAll ? 0 : t.params.length) : null;
2902
3270
  // The closure CONSUMES its params (+1 each moved in).
2903
3271
  const fnp = B.tmp();
2904
3272
  const fn = B.tmp();
@@ -2948,7 +3316,7 @@ export class LlDyn {
2948
3316
  host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
2949
3317
  host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
2950
3318
  const sigLit = host.cstr(key);
2951
- this.defs.push(`define internal ptr @${name}(ptr %v, ptr %fname) ${FN_ATTRS} { ; box ${key} into dyn`, `entry:`, ` %c = call ptr @scr_closure_retain_v(ptr %v)`, ` %r = call ptr @scr_dyn_new_func(ptr %c, ptr @${thunk}, i32 ${t.params.length}, ptr ${sigLit}, ptr %fname)`, ` ret ptr %r`, `}`, ``);
3319
+ this.defs.push(`define internal ptr @${name}(ptr %v, ptr %fname) ${FN_ATTRS} { ; box ${key} into dyn`, `entry:`, ` %c = call ptr @scr_closure_retain_v(ptr %v)`, ` %r = call ptr @scr_dyn_new_func(ptr %c, ptr @${thunk}, i32 ${t.params.length - (t.restAbi === "typed" ? 1 : 0)}, ptr ${sigLit}, ptr %fname)`, ` ret ptr %r`, `}`, ``);
2952
3320
  return name;
2953
3321
  }
2954
3322
  /** The adapter closure body for one TARGET signature: caps[0] is an
@@ -2977,7 +3345,30 @@ export class LlDyn {
2977
3345
  // argument (borrowed by the conversion) and releases.
2978
3346
  let argsPtr = "null";
2979
3347
  const argVals = [];
2980
- if (t.params.length > 0) {
3348
+ const checkedRest = t.rest === true && t.restAbi === undefined;
3349
+ let packed = null;
3350
+ if (checkedRest) {
3351
+ host.declare(`declare ptr @scr_dyn_apply(ptr, ptr, ptr)`);
3352
+ host.declare(`declare ptr @scr_dyn_new_arr()`);
3353
+ host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
3354
+ host.declare(`declare void @scr_dyn_arr_push_spread(ptr, ptr, ptr)`);
3355
+ packed = t.argumentsAll ? "%rest" : B.tmp();
3356
+ if (!t.argumentsAll)
3357
+ B.line(`${packed} = call ptr @scr_dyn_new_arr()`);
3358
+ t.params.forEach((p, i) => {
3359
+ if (!t.argumentsAll) {
3360
+ const v = this.toDynExpr(B, p, `%a${i}`);
3361
+ B.line(`call void @scr_dyn_arr_push(ptr ${packed}, ptr ${v})`);
3362
+ }
3363
+ if (isRefCounted(p))
3364
+ B.line(`call void ${releaseSym(host, p)}(ptr %a${i})`);
3365
+ });
3366
+ if (!t.argumentsAll) {
3367
+ B.line(`call void @scr_dyn_arr_push_spread(ptr ${packed}, ptr %rest, ptr ${host.cstr("")})`);
3368
+ B.line(`call void @scr_dyn_release(ptr %rest)`);
3369
+ }
3370
+ }
3371
+ else if (t.params.length > 0) {
2981
3372
  const arr = B.slot();
2982
3373
  B.entryAllocas.push(`${arr} = alloca [${t.params.length} x ptr]`);
2983
3374
  t.params.forEach((p, i) => {
@@ -2994,7 +3385,12 @@ export class LlDyn {
2994
3385
  // The kind is FUNC by construction; `what` is unreachable — spelled
2995
3386
  // anyway (the C's "value").
2996
3387
  const r = B.tmp();
2997
- B.line(`${r} = call ptr @scr_dyn_call(ptr ${fnv}, ptr ${argsPtr}, ${host.sizeType} ${t.params.length}, ptr ${host.cstr("value")})`);
3388
+ if (packed) {
3389
+ B.line(`${r} = call ptr @scr_dyn_apply(ptr ${fnv}, ptr ${packed}, ptr ${host.cstr("value")})`);
3390
+ B.line(`call void @scr_dyn_release(ptr ${packed})`);
3391
+ }
3392
+ else
3393
+ B.line(`${r} = call ptr @scr_dyn_call(ptr ${fnv}, ptr ${argsPtr}, ${host.sizeType} ${t.params.length}, ptr ${host.cstr("value")})`);
2998
3394
  B.line(`call void @scr_dyn_release(ptr ${fnv})`);
2999
3395
  for (const v of argVals)
3000
3396
  B.line(`call void @scr_dyn_release(ptr ${v})`);
@@ -3014,7 +3410,7 @@ export class LlDyn {
3014
3410
  B.line(`call void @scr_dyn_release(ptr ${r})`);
3015
3411
  B.terminate(`ret ${this.valTy(t.ret)} ${out}`);
3016
3412
  }
3017
- const params = ["ptr %sc_env", ...t.params.map((p, i) => `${this.valTy(p)} %a${i}`)].join(", ");
3413
+ const params = ["ptr %sc_env", ...t.params.map((p, i) => `${this.valTy(p)} %a${i}`), ...(checkedRest ? ["ptr %rest"] : [])].join(", ");
3018
3414
  this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(${params}) ${FN_ATTRS} { ; dyn fn adapter to ${key}`, B.render(), `}`, ``);
3019
3415
  return name;
3020
3416
  }