@scriptc/compiler 0.4.2 → 0.4.4

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 (726) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +470 -66
  2. package/dist/backend/cycle-analysis.d.ts +4 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +21 -9
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +479 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/debug-info.js +2 -5
  58. package/dist/backend/llvm/debug-info.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  65. package/dist/backend/llvm/dense-array-loops.js +194 -5
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +30 -0
  72. package/dist/backend/llvm/dyn.js +373 -70
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +13 -28
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +211 -33
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  82. package/dist/backend/llvm/emit-statements.js +268 -84
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +186 -37
  88. package/dist/backend/llvm/emitter.js +733 -90
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +65 -7
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +11 -13
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.js +48 -20
  95. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  96. package/dist/backend/llvm/expr-callbacks.js +47 -0
  97. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  98. package/dist/backend/llvm/expr-calls.js +28 -14
  99. package/dist/backend/llvm/expr-calls.js.map +1 -1
  100. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  101. package/dist/backend/llvm/expr-containers.js +143 -37
  102. package/dist/backend/llvm/expr-containers.js.map +1 -1
  103. package/dist/backend/llvm/expr-context.d.ts +14 -0
  104. package/dist/backend/llvm/expr-dynamic.js +18 -11
  105. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +119 -38
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.d.ts +12 -0
  111. package/dist/backend/llvm/expr-records.js +106 -0
  112. package/dist/backend/llvm/expr-records.js.map +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  114. package/dist/backend/llvm/expr-stream-bridges.js +210 -69
  115. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  118. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  119. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  120. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  121. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  122. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  123. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  124. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  125. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  126. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  127. package/dist/backend/llvm/integer-values.d.ts +25 -1
  128. package/dist/backend/llvm/integer-values.js +95 -0
  129. package/dist/backend/llvm/integer-values.js.map +1 -1
  130. package/dist/backend/llvm/js-ic.d.ts +1 -1
  131. package/dist/backend/llvm/js-ic.js +1 -1
  132. package/dist/backend/llvm/js-ic.js.map +1 -1
  133. package/dist/backend/llvm/key-orders.d.ts +7 -0
  134. package/dist/backend/llvm/key-orders.js +33 -0
  135. package/dist/backend/llvm/key-orders.js.map +1 -0
  136. package/dist/backend/llvm/lib-connect.js +4 -0
  137. package/dist/backend/llvm/lib-connect.js.map +1 -1
  138. package/dist/backend/llvm/lib-datagram.js +11 -0
  139. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  140. package/dist/backend/llvm/lib-dispatch.js +213 -5
  141. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  142. package/dist/backend/llvm/lib-filesystem.js +4 -4
  143. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  144. package/dist/backend/llvm/lib-http2.js +4 -0
  145. package/dist/backend/llvm/lib-http2.js.map +1 -1
  146. package/dist/backend/llvm/lib-lookup.js +16 -6
  147. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  148. package/dist/backend/llvm/lib-process.js +37 -1
  149. package/dist/backend/llvm/lib-process.js.map +1 -1
  150. package/dist/backend/llvm/lib-shared.js +94 -2
  151. package/dist/backend/llvm/lib-shared.js.map +1 -1
  152. package/dist/backend/llvm/lib-stream.js +35 -5
  153. package/dist/backend/llvm/lib-stream.js.map +1 -1
  154. package/dist/backend/llvm/local-array-reads.js +115 -19
  155. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  156. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  157. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  158. package/dist/backend/llvm/loop-state.d.ts +33 -0
  159. package/dist/backend/llvm/loop-state.js +42 -0
  160. package/dist/backend/llvm/loop-state.js.map +1 -0
  161. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  162. package/dist/backend/llvm/map-number-lookup.js +91 -31
  163. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  164. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  165. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  166. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  167. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  168. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  169. package/dist/backend/llvm/nullable-unions.js +15 -3
  170. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  171. package/dist/backend/llvm/publish.d.ts +10 -0
  172. package/dist/backend/llvm/publish.js +15 -3
  173. package/dist/backend/llvm/publish.js.map +1 -1
  174. package/dist/backend/llvm/receivers.js +6 -1
  175. package/dist/backend/llvm/receivers.js.map +1 -1
  176. package/dist/backend/llvm/record-results.d.ts +1 -9
  177. package/dist/backend/llvm/record-results.js +2 -11
  178. package/dist/backend/llvm/record-results.js.map +1 -1
  179. package/dist/backend/llvm/reference-effects.js +3 -0
  180. package/dist/backend/llvm/reference-effects.js.map +1 -1
  181. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  182. package/dist/backend/llvm/reference-writes.js +89 -72
  183. package/dist/backend/llvm/reference-writes.js.map +1 -1
  184. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  185. package/dist/backend/llvm/running-extrema.js +115 -0
  186. package/dist/backend/llvm/running-extrema.js.map +1 -0
  187. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  188. package/dist/backend/llvm/running-extrema.test.js +89 -0
  189. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  190. package/dist/backend/llvm/shapes.d.ts +71 -15
  191. package/dist/backend/llvm/shapes.js +224 -40
  192. package/dist/backend/llvm/shapes.js.map +1 -1
  193. package/dist/backend/llvm/shapes.test.js +53 -7
  194. package/dist/backend/llvm/shapes.test.js.map +1 -1
  195. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  196. package/dist/backend/llvm/speculative-integers.js +2 -2
  197. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  198. package/dist/backend/llvm/stack-captures.js +1 -5
  199. package/dist/backend/llvm/stack-captures.js.map +1 -1
  200. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  201. package/dist/backend/llvm/stack-objects.js +5 -2
  202. package/dist/backend/llvm/stack-objects.js.map +1 -1
  203. package/dist/backend/llvm/string-reads.d.ts +12 -0
  204. package/dist/backend/llvm/string-reads.js +44 -0
  205. package/dist/backend/llvm/string-reads.js.map +1 -1
  206. package/dist/backend/llvm/union-repr.d.ts +4 -3
  207. package/dist/backend/llvm/union-repr.js +6 -5
  208. package/dist/backend/llvm/union-repr.js.map +1 -1
  209. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  210. package/dist/backend/llvm/walk-borrows.js +46 -41
  211. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  212. package/dist/backend/llvm/walkers.d.ts +3 -0
  213. package/dist/backend/llvm/walkers.js +101 -65
  214. package/dist/backend/llvm/walkers.js.map +1 -1
  215. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  216. package/dist/backend/llvm/wrapping-sums.js +126 -0
  217. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  218. package/dist/backend/may-throw.d.ts +8 -10
  219. package/dist/backend/may-throw.js +14 -10
  220. package/dist/backend/may-throw.js.map +1 -1
  221. package/dist/backend/native/contracts.d.ts +5 -0
  222. package/dist/backend/native/executable.js +7 -0
  223. package/dist/backend/native/executable.js.map +1 -1
  224. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  225. package/dist/backend/native/runtime-inputs.js +1 -0
  226. package/dist/backend/native/runtime-inputs.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.test.js +6 -4
  231. package/dist/backend/native-codegen.test.js.map +1 -1
  232. package/dist/backend/native-link-info-core.d.ts +4 -0
  233. package/dist/backend/native-link-info-core.js.map +1 -1
  234. package/dist/backend/publication.d.ts +12 -1
  235. package/dist/backend/publication.js +37 -14
  236. package/dist/backend/publication.js.map +1 -1
  237. package/dist/backend/publication.test.js +30 -0
  238. package/dist/backend/publication.test.js.map +1 -1
  239. package/dist/backend/result-slots.d.ts +16 -0
  240. package/dist/backend/result-slots.js +23 -0
  241. package/dist/backend/result-slots.js.map +1 -0
  242. package/dist/backend/runtime-abi.d.ts +2 -2
  243. package/dist/backend/runtime-abi.js +2 -2
  244. package/dist/backend/runtime-pack-core.d.ts +1 -0
  245. package/dist/backend/runtime-pack-core.js +1 -0
  246. package/dist/backend/runtime-pack-core.js.map +1 -1
  247. package/dist/backend/runtime-pack-targets.test.js +2 -1
  248. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  249. package/dist/backend/runtime-pack.test.js +2 -1
  250. package/dist/backend/runtime-pack.test.js.map +1 -1
  251. package/dist/backend/stack-observations.d.ts +2 -1
  252. package/dist/backend/stack-observations.js +67 -42
  253. package/dist/backend/stack-observations.js.map +1 -1
  254. package/dist/backend/target-cpu.d.ts +26 -0
  255. package/dist/backend/target-cpu.js +98 -0
  256. package/dist/backend/target-cpu.js.map +1 -0
  257. package/dist/backend/target-cpu.test.d.ts +1 -0
  258. package/dist/backend/target-cpu.test.js +38 -0
  259. package/dist/backend/target-cpu.test.js.map +1 -0
  260. package/dist/backend/target-diagnostics.js +5 -3
  261. package/dist/backend/target-diagnostics.js.map +1 -1
  262. package/dist/backend/warm-cache.js +1 -0
  263. package/dist/backend/warm-cache.js.map +1 -1
  264. package/dist/cli/command.js +20 -1
  265. package/dist/cli/command.js.map +1 -1
  266. package/dist/cli/usage.d.ts +4 -1
  267. package/dist/cli/usage.js +10 -3
  268. package/dist/cli/usage.js.map +1 -1
  269. package/dist/compat/fetch-profile.js +1 -1
  270. package/dist/compat/fetch-profile.js.map +1 -1
  271. package/dist/compile-types.d.ts +7 -0
  272. package/dist/contracts/check.js +4 -3
  273. package/dist/contracts/check.js.map +1 -1
  274. package/dist/contracts/int32-elements.js +10 -2
  275. package/dist/contracts/int32-elements.js.map +1 -1
  276. package/dist/coverage/report.js +12 -3
  277. package/dist/coverage/report.js.map +1 -1
  278. package/dist/diagnostics/diagnostic.d.ts +4 -0
  279. package/dist/diagnostics/diagnostic.js +1 -1
  280. package/dist/diagnostics/diagnostic.js.map +1 -1
  281. package/dist/diagnostics/envelope.d.ts +3 -0
  282. package/dist/diagnostics/envelope.js +1 -0
  283. package/dist/diagnostics/envelope.js.map +1 -1
  284. package/dist/executable/executable-cache.d.ts +5 -0
  285. package/dist/executable/executable-cache.js +5 -0
  286. package/dist/executable/executable-cache.js.map +1 -1
  287. package/dist/executable/executable-cache.test.js +3 -0
  288. package/dist/executable/executable-cache.test.js.map +1 -1
  289. package/dist/frontend/decl-projection.d.ts +41 -0
  290. package/dist/frontend/decl-projection.js +949 -0
  291. package/dist/frontend/decl-projection.js.map +1 -0
  292. package/dist/frontend/decl-projection.test.d.ts +1 -0
  293. package/dist/frontend/decl-projection.test.js +30 -0
  294. package/dist/frontend/decl-projection.test.js.map +1 -0
  295. package/dist/frontend/dts-paths.d.ts +15 -0
  296. package/dist/frontend/dts-paths.js +25 -0
  297. package/dist/frontend/dts-paths.js.map +1 -1
  298. package/dist/frontend/input-tracker.d.ts +6 -0
  299. package/dist/frontend/input-tracker.js +51 -28
  300. package/dist/frontend/input-tracker.js.map +1 -1
  301. package/dist/frontend/input-tracker.test.js +19 -0
  302. package/dist/frontend/input-tracker.test.js.map +1 -1
  303. package/dist/frontend/lowering/array-values.js +100 -2
  304. package/dist/frontend/lowering/array-values.js.map +1 -1
  305. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  306. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  307. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  308. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  309. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  310. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  311. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  312. package/dist/frontend/lowering/builtins/crypto.js +87 -10
  313. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/dates.js +4 -1
  315. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  317. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  318. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  319. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  321. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  322. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  323. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  324. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  325. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  326. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  327. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  329. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
  331. package/dist/frontend/lowering/builtins/promises.js +236 -139
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  334. package/dist/frontend/lowering/builtins/readline.js +35 -3
  335. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/url.js +24 -1
  337. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/call-signatures.js +0 -1
  341. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  342. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  343. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  344. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  345. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  346. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  347. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  348. package/dist/frontend/lowering/class-callbacks.js +82 -12
  349. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  350. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  351. package/dist/frontend/lowering/class-construction.js +17 -3
  352. package/dist/frontend/lowering/class-construction.js.map +1 -1
  353. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
  355. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  358. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  359. package/dist/frontend/lowering/class-iterables.js +9 -1
  360. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  361. package/dist/frontend/lowering/class-method-mutations.js +83 -24
  362. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  363. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  364. package/dist/frontend/lowering/class-protocols.js +183 -1
  365. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  366. package/dist/frontend/lowering/class-prototypes.js +31 -2
  367. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  368. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  369. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  370. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  371. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  372. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  373. package/dist/frontend/lowering/coercions/structural.js +91 -1
  374. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  375. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  376. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  377. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  378. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  379. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  380. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  381. package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
  382. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  383. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  384. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  385. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  386. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  387. package/dist/frontend/lowering/containers/array-methods.js +26 -3
  388. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  390. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  391. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  392. package/dist/frontend/lowering/containers/bytes.js +455 -46
  393. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  394. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  395. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  396. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  397. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  399. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  400. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  401. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  402. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  407. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  408. package/dist/frontend/lowering/date-values.d.ts +11 -0
  409. package/dist/frontend/lowering/date-values.js +207 -0
  410. package/dist/frontend/lowering/date-values.js.map +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  412. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  413. package/dist/frontend/lowering/divergences.js +9 -1
  414. package/dist/frontend/lowering/divergences.js.map +1 -1
  415. package/dist/frontend/lowering/error-methods.js +47 -2
  416. package/dist/frontend/lowering/error-methods.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/array-literals.js +53 -0
  418. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/binary.js +100 -28
  420. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/element-access.js +169 -13
  422. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  423. package/dist/frontend/lowering/expressions/identifiers.js +64 -5
  424. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  425. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  426. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  427. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  428. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  429. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  430. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  431. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  433. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  434. package/dist/frontend/lowering/expressions/property-access.js +168 -10
  435. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  436. package/dist/frontend/lowering/expressions/relational.js +212 -33
  437. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  438. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  439. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  440. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  441. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  442. package/dist/frontend/lowering/expressions/updates.js +39 -3
  443. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  444. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  445. package/dist/frontend/lowering/frozen-records.js +322 -0
  446. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  447. package/dist/frontend/lowering/function-returns.js +64 -0
  448. package/dist/frontend/lowering/function-returns.js.map +1 -1
  449. package/dist/frontend/lowering/generic-functions.js +7 -2
  450. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  451. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  452. package/dist/frontend/lowering/indexed-unions.js +401 -0
  453. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  454. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  455. package/dist/frontend/lowering/iterable-values.js +297 -0
  456. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  457. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  458. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  459. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  460. package/dist/frontend/lowering/js-class-fields.js +45 -10
  461. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  462. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  463. package/dist/frontend/lowering/key-order-witness.js +974 -48
  464. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  465. package/dist/frontend/lowering/key-order-witness.test.js +530 -10
  466. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  467. package/dist/frontend/lowering/lower-assert.js +15 -3
  468. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  469. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  470. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  471. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  472. package/dist/frontend/lowering/lower-calls.js +462 -44
  473. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  474. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  475. package/dist/frontend/lowering/lower-classes.js +324 -69
  476. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  477. package/dist/frontend/lowering/lower-dgram.js +3 -1
  478. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  479. package/dist/frontend/lowering/lower-exprs.js +215 -3
  480. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  481. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  482. package/dist/frontend/lowering/lower-functions.js +83 -0
  483. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  484. package/dist/frontend/lowering/lower-generators.js +42 -32
  485. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  486. package/dist/frontend/lowering/lower-global-value.js +6 -3
  487. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  488. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  489. package/dist/frontend/lowering/lower-inspect.js +53 -17
  490. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  491. package/dist/frontend/lowering/lower-modules.js +53 -5
  492. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  493. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  494. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.js +2 -2
  496. package/dist/frontend/lowering/lower-server.js.map +1 -1
  497. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  498. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  499. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  500. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  501. package/dist/frontend/lowering/lower-stmts.js +553 -81
  502. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  503. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  504. package/dist/frontend/lowering/lower-stream.js +1483 -156
  505. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  506. package/dist/frontend/lowering/lowerer.d.ts +107 -8
  507. package/dist/frontend/lowering/lowerer.js +381 -36
  508. package/dist/frontend/lowering/lowerer.js.map +1 -1
  509. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  510. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  511. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  512. package/dist/frontend/lowering/new-target.d.ts +12 -0
  513. package/dist/frontend/lowering/new-target.js +280 -0
  514. package/dist/frontend/lowering/new-target.js.map +1 -0
  515. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  516. package/dist/frontend/lowering/object-factory-new.js +20 -6
  517. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  518. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  519. package/dist/frontend/lowering/overload-choice.js +190 -0
  520. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  521. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  522. package/dist/frontend/lowering/surfaces.js +73 -8
  523. package/dist/frontend/lowering/surfaces.js.map +1 -1
  524. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  525. package/dist/frontend/lowering/undefined-index.js +82 -0
  526. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  527. package/dist/frontend/lowering/var-hoisting.js +29 -13
  528. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  529. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  530. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  531. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  532. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  533. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  534. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  535. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  536. package/dist/frontend/npm-static.js +4 -20
  537. package/dist/frontend/npm-static.js.map +1 -1
  538. package/dist/frontend/package-shims.d.ts +3 -0
  539. package/dist/frontend/package-shims.js +71 -8
  540. package/dist/frontend/package-shims.js.map +1 -1
  541. package/dist/frontend/pipeline.js +19 -11
  542. package/dist/frontend/pipeline.js.map +1 -1
  543. package/dist/frontend/process-fork.d.ts +25 -0
  544. package/dist/frontend/process-fork.js +2 -0
  545. package/dist/frontend/process-fork.js.map +1 -0
  546. package/dist/frontend/program-analysis.d.ts +5 -1
  547. package/dist/frontend/program-analysis.js +5 -0
  548. package/dist/frontend/program-analysis.js.map +1 -1
  549. package/dist/frontend/program.d.ts +21 -6
  550. package/dist/frontend/program.js +681 -83
  551. package/dist/frontend/program.js.map +1 -1
  552. package/dist/frontend/program.test.js +43 -3
  553. package/dist/frontend/program.test.js.map +1 -1
  554. package/dist/frontend/token-equivalence.d.ts +3 -0
  555. package/dist/frontend/token-equivalence.js +409 -0
  556. package/dist/frontend/token-equivalence.js.map +1 -0
  557. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  558. package/dist/frontend/token-equivalence.test.js +67 -0
  559. package/dist/frontend/token-equivalence.test.js.map +1 -0
  560. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  561. package/dist/frontend/ts7/ast-node.js +1048 -103
  562. package/dist/frontend/ts7/ast-node.js.map +1 -1
  563. package/dist/frontend/ts7/ast-node.test.js +24 -0
  564. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  565. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  566. package/dist/frontend/ts7/ast-wire.js +34 -24
  567. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  568. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  569. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  570. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  571. package/dist/frontend/ts7/checker-backend.js +2 -2
  572. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  573. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  574. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  575. package/dist/frontend/ts7/checker.d.ts +4 -0
  576. package/dist/frontend/ts7/checker.js +7 -0
  577. package/dist/frontend/ts7/checker.js.map +1 -1
  578. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  579. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  580. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  581. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  582. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  583. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  584. package/dist/frontend/ts7/program-host.d.ts +7 -0
  585. package/dist/frontend/ts7/program-host.js +25 -2
  586. package/dist/frontend/ts7/program-host.js.map +1 -1
  587. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  588. package/dist/frontend/ts7/semantic-model.js +5 -0
  589. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  590. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  591. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  592. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  593. package/dist/frontend/ts7/semantic-types.js +1 -1
  594. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  595. package/dist/frontend/ts7/session.d.ts +14 -1
  596. package/dist/frontend/ts7/session.js +22 -0
  597. package/dist/frontend/ts7/session.js.map +1 -1
  598. package/dist/frontend/type-mapper.d.ts +13 -1
  599. package/dist/frontend/type-mapper.js +229 -20
  600. package/dist/frontend/type-mapper.js.map +1 -1
  601. package/dist/index.d.ts +0 -5
  602. package/dist/index.js +46 -4
  603. package/dist/index.js.map +1 -1
  604. package/dist/ir/analysis.js +5 -3
  605. package/dist/ir/analysis.js.map +1 -1
  606. package/dist/ir/array-length-stability.d.ts +4 -0
  607. package/dist/ir/array-length-stability.js +19 -6
  608. package/dist/ir/array-length-stability.js.map +1 -1
  609. package/dist/ir/array-length-stability.test.js +24 -0
  610. package/dist/ir/array-length-stability.test.js.map +1 -1
  611. package/dist/ir/builtin-effects.d.ts +7 -0
  612. package/dist/ir/builtin-effects.js +60 -0
  613. package/dist/ir/builtin-effects.js.map +1 -1
  614. package/dist/ir/builtin-signatures.d.ts +6 -4
  615. package/dist/ir/builtin-signatures.js +222 -13
  616. package/dist/ir/builtin-signatures.js.map +1 -1
  617. package/dist/ir/callback-specialization.d.ts +2 -1
  618. package/dist/ir/callback-specialization.js +23 -18
  619. package/dist/ir/callback-specialization.js.map +1 -1
  620. package/dist/ir/char-unit-locals.d.ts +19 -0
  621. package/dist/ir/char-unit-locals.js +185 -0
  622. package/dist/ir/char-unit-locals.js.map +1 -0
  623. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  624. package/dist/ir/char-unit-locals.test.js +94 -0
  625. package/dist/ir/char-unit-locals.test.js.map +1 -0
  626. package/dist/ir/final-fields.d.ts +2 -1
  627. package/dist/ir/final-fields.js +14 -16
  628. package/dist/ir/final-fields.js.map +1 -1
  629. package/dist/ir/function-references.d.ts +2 -0
  630. package/dist/ir/function-references.js +2 -0
  631. package/dist/ir/function-references.js.map +1 -1
  632. package/dist/ir/function-references.test.js +3 -0
  633. package/dist/ir/function-references.test.js.map +1 -1
  634. package/dist/ir/initializer-bindings.d.ts +2 -1
  635. package/dist/ir/initializer-bindings.js +27 -20
  636. package/dist/ir/initializer-bindings.js.map +1 -1
  637. package/dist/ir/int32-arrays.d.ts +108 -0
  638. package/dist/ir/int32-arrays.js +831 -0
  639. package/dist/ir/int32-arrays.js.map +1 -0
  640. package/dist/ir/int32-slots.d.ts +24 -2
  641. package/dist/ir/int32-slots.js +266 -57
  642. package/dist/ir/int32-slots.js.map +1 -1
  643. package/dist/ir/int32-slots.test.js +33 -0
  644. package/dist/ir/int32-slots.test.js.map +1 -1
  645. package/dist/ir/integer-loops.d.ts +3 -3
  646. package/dist/ir/integer-loops.js +28 -10
  647. package/dist/ir/integer-loops.js.map +1 -1
  648. package/dist/ir/integer-loops.test.js +10 -0
  649. package/dist/ir/integer-loops.test.js.map +1 -1
  650. package/dist/ir/integer-ranges.d.ts +5 -0
  651. package/dist/ir/integer-ranges.js +125 -12
  652. package/dist/ir/integer-ranges.js.map +1 -1
  653. package/dist/ir/integer-ranges.test.js +30 -0
  654. package/dist/ir/integer-ranges.test.js.map +1 -1
  655. package/dist/ir/ir.d.ts +83 -10
  656. package/dist/ir/ir.js +77 -6
  657. package/dist/ir/ir.js.map +1 -1
  658. package/dist/ir/ir.test.js +23 -2
  659. package/dist/ir/ir.test.js.map +1 -1
  660. package/dist/ir/js-ic.d.ts +4 -0
  661. package/dist/ir/js-ic.js +17 -1
  662. package/dist/ir/js-ic.js.map +1 -1
  663. package/dist/ir/js-ic.test.js +46 -0
  664. package/dist/ir/js-ic.test.js.map +1 -1
  665. package/dist/ir/node-index.d.ts +57 -0
  666. package/dist/ir/node-index.js +215 -0
  667. package/dist/ir/node-index.js.map +1 -0
  668. package/dist/ir/paired-while-loops.d.ts +25 -0
  669. package/dist/ir/paired-while-loops.js +335 -0
  670. package/dist/ir/paired-while-loops.js.map +1 -0
  671. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  672. package/dist/ir/paired-while-loops.test.js +163 -0
  673. package/dist/ir/paired-while-loops.test.js.map +1 -0
  674. package/dist/ir/parameter-versions.d.ts +25 -0
  675. package/dist/ir/parameter-versions.js +300 -0
  676. package/dist/ir/parameter-versions.js.map +1 -0
  677. package/dist/ir/runtime-features.d.ts +34 -13
  678. package/dist/ir/runtime-features.js +177 -39
  679. package/dist/ir/runtime-features.js.map +1 -1
  680. package/dist/ir/serialize.d.ts +12 -2
  681. package/dist/ir/serialize.js +16 -3
  682. package/dist/ir/serialize.js.map +1 -1
  683. package/dist/ir/serialize.test.js +17 -0
  684. package/dist/ir/serialize.test.js.map +1 -1
  685. package/dist/ir/traverse.js +18 -6
  686. package/dist/ir/traverse.js.map +1 -1
  687. package/dist/ir/validate.js +167 -40
  688. package/dist/ir/validate.js.map +1 -1
  689. package/dist/library/ir-policy.js +3 -0
  690. package/dist/library/ir-policy.js.map +1 -1
  691. package/dist/native/cache.d.ts +6 -1
  692. package/dist/native/cache.js +28 -5
  693. package/dist/native/cache.js.map +1 -1
  694. package/dist/native/cache.test.js +16 -2
  695. package/dist/native/cache.test.js.map +1 -1
  696. package/dist/native/cli.js +21 -1
  697. package/dist/native/cli.js.map +1 -1
  698. package/dist/native/compiler.js +8 -6
  699. package/dist/native/compiler.js.map +1 -1
  700. package/dist/native/executable-cache.d.ts +1 -1
  701. package/dist/native/executable-cache.js +2 -2
  702. package/dist/native/executable-cache.js.map +1 -1
  703. package/dist/native/prepare.d.ts +4 -2
  704. package/dist/native/prepare.js +130 -32
  705. package/dist/native/prepare.js.map +1 -1
  706. package/dist/native/prepare.test.js +96 -20
  707. package/dist/native/prepare.test.js.map +1 -1
  708. package/dist/native/sanitizer.test.js +2 -0
  709. package/dist/native/sanitizer.test.js.map +1 -1
  710. package/dist/native/text-file.d.ts +13 -3
  711. package/dist/native/text-file.js +63 -9
  712. package/dist/native/text-file.js.map +1 -1
  713. package/dist/native/text-file.test.d.ts +1 -0
  714. package/dist/native/text-file.test.js +49 -0
  715. package/dist/native/text-file.test.js.map +1 -0
  716. package/dist/native/toolchain.js +4 -4
  717. package/dist/native/toolchain.js.map +1 -1
  718. package/dist/native/toolchain.test.js +3 -3
  719. package/dist/native/toolchain.test.js.map +1 -1
  720. package/package.json +21 -21
  721. package/shims/chalk/v5.ts +688 -0
  722. package/shims/hono-node-server/v2.ts +645 -0
  723. package/shims/hot-shots/client.ts +1126 -0
  724. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  725. package/shims/hot-shots/v8.ts +8 -0
  726. package/surface-manifest.json +27 -7
@@ -1,10 +1,11 @@
1
+ import { emitPerKeyOrder } from "./key-orders.js";
1
2
  import { typedRefConstructor } from "./shapes.js";
2
3
  import { bindLiveArrayOps } from "./expr-stream-bridges.js";
3
- import { BYTES_ELEM_NUM, SCR_ARR_FIELD, f64Lit, sizeToDouble } from "./common.js";
4
+ import { BYTES_ELEM_NUM, SCR_ARR_FIELD, SCR_ARR_STATES, f64Lit, sizeToDouble } from "./common.js";
4
5
  import { emitUnionPeek, emitUnionTag } from "./union-repr.js";
5
6
  import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, storeInlineUnion, unionBoxBits, } from "./inline-unions.js";
6
7
  import { InternalCompilerError } from "../../errors.js";
7
- import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, isDynTypedRefType, isRefCounted, isUnitType, typeKey, } from "../../ir/ir.js";
8
+ import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordTextCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
8
9
  import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
9
10
  import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
10
11
  import { BlockBuilder } from "./blocks.js";
@@ -39,6 +40,15 @@ export const DYN_HANDLE_TAG_NUM = {
39
40
  cryptoHash: 52,
40
41
  cryptoHmac: 53,
41
42
  };
43
+ /** The handle tags of TextEncoder and TextDecoder records boxed as dyn
44
+ * (scr_dyn.h; scr_text_codec_dyn.c boxes and unboxes them). */
45
+ export const TEXT_CODEC_TAG_NUM = {
46
+ TextDecoder: 76,
47
+ TextEncoder: 77,
48
+ };
49
+ /** The decoder record fields scr_text_decoder_to_dyn reads, in its
50
+ * parameter order. */
51
+ const TEXT_DECODER_FIELDS = ["%TextDecoder", "%fatal", "%ignoreBOM", "%state"];
42
52
  /** Handle kinds whose runtime unit boxes them through its own function,
43
53
  * which installs the tag's ops on first use (scr_crypto.h). Programs that
44
54
  * never box one of these values do not link its dynamic members. */
@@ -114,6 +124,54 @@ export class LlDyn {
114
124
  constructor(host) {
115
125
  this.host = host;
116
126
  }
127
+ /** Journal replay (emit-journal.ts): builds or finds the helper a chunk
128
+ * emitter recorded, and answers its name. */
129
+ replayHelper(op, args) {
130
+ switch (op) {
131
+ case "dyn.collectionDynOps":
132
+ return this.collectionDynOps(args[0]);
133
+ case "dyn.dynMatchHelper":
134
+ return this.dynMatchHelper(args[0], args[1]);
135
+ case "dyn.jsonSchema":
136
+ return this.jsonSchema(args[0]);
137
+ case "dyn.recordNameTable": {
138
+ const shapeId = args[0];
139
+ return this.recordNameTable(shapeId, this.host.recordsById.get(shapeId)).names;
140
+ }
141
+ case "dyn.jsonParseHelper":
142
+ return this.jsonParseHelper(args[0]);
143
+ case "dyn.dynCheckHelper":
144
+ return this.dynCheckHelper(args[0], args[1]);
145
+ case "dyn.toDynHelper":
146
+ return this.toDynHelper(args[0]);
147
+ case "dyn.promiseDynAdapterHelper":
148
+ return this.promiseDynAdapterHelper(args[0]);
149
+ case "dyn.dynFuncThunkHelper":
150
+ return this.dynFuncThunkHelper(args[0]);
151
+ case "dyn.dynFuncBoxHelper":
152
+ return this.dynFuncBoxHelper(args[0]);
153
+ case "dyn.dynFuncAdapterHelper":
154
+ return this.dynFuncAdapterHelper(args[0]);
155
+ case "dyn.dynToStrHelper":
156
+ return this.dynToStrHelper();
157
+ case "dyn.dynIterNHelper":
158
+ return this.dynIterNHelper();
159
+ case "dyn.dynDestrCheckHelper":
160
+ return this.dynDestrCheckHelper();
161
+ case "dyn.dynKeyGetHelper":
162
+ return this.dynKeyGetHelper();
163
+ case "dyn.dynComputedKeyGetHelper":
164
+ return this.dynComputedKeyGetHelper();
165
+ case "dyn.caughtToDynHelper":
166
+ return this.caughtToDynHelper();
167
+ case "dyn.messageListenerHelper":
168
+ return this.messageListenerHelper(args[0]) ?? "";
169
+ case "dyn.messageReaderHelper":
170
+ return this.messageReaderHelper(args[0]);
171
+ default:
172
+ throw new InternalCompilerError(`llvm emitter bug: no dyn helper replay ${op}`);
173
+ }
174
+ }
117
175
  /** The types a dyn matcher or builder for `t` checks structurally: record
118
176
  * fields and index values, array elements and union arms. */
119
177
  structuralChildren(t) {
@@ -218,6 +276,34 @@ export class LlDyn {
218
276
  this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
219
277
  B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
220
278
  }
279
+ /** The order a dyn value tries a union's arms in: the canonical order,
280
+ * except that among the record arms, those with more required fields go
281
+ * first, then those with more fields. Records are width-tolerant, so an
282
+ * arm with fewer fields (`{}`, or one whose fields are all optional,
283
+ * matches every object) would otherwise take an object that a wider arm
284
+ * also matches and drop the fields only the wider arm has. */
285
+ unionArmOrder(def) {
286
+ const width = (i) => {
287
+ const arm = def.arms[i];
288
+ if (arm.kind !== "record")
289
+ return null;
290
+ const shape = this.host.recordsById.get(arm.shapeId);
291
+ if (!shape || shape.tuple)
292
+ return null;
293
+ const required = shape.fields.filter((field) => field.type.kind !== "union" ||
294
+ !this.host.unionsById.get(field.type.unionId)?.arms.some((x) => x.kind === "undefinedT")).length;
295
+ return [required, shape.fields.length];
296
+ };
297
+ const order = def.arms.map((_, i) => i);
298
+ const records = order.filter((i) => width(i) !== null);
299
+ const widest = [...records].sort((x, y) => {
300
+ const [rx, fx] = width(x);
301
+ const [ry, fy] = width(y);
302
+ return ry - rx || fy - fx || x - y;
303
+ });
304
+ records.forEach((slot, k) => (order[slot] = widest[k]));
305
+ return order;
306
+ }
221
307
  /** Branch to a variant only after its literal discriminator and complete
222
308
  * structure match. Use the same path for predicates and builders. */
223
309
  unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
@@ -258,7 +344,7 @@ export class LlDyn {
258
344
  }
259
345
  /** The value LLVM type of a dynCheck result / toDyn operand for `t`. */
260
346
  valTy(t) {
261
- return t.kind === "f64" || t.kind === "date" || t.kind === "procStream"
347
+ return t.kind === "f64" || t.kind === "procStream"
262
348
  ? "double"
263
349
  : t.kind === "bool"
264
350
  ? "i1"
@@ -271,6 +357,7 @@ export class LlDyn {
271
357
  return prior;
272
358
  const name = `sc_map_dyn_${this.mapDynOps.size}`;
273
359
  this.mapDynOps.set(key, name);
360
+ this.host.journalAllocated?.(name, "dyn.collectionDynOps", [t]);
274
361
  const keyType = t.kind === "map" ? t.key : t.elem;
275
362
  const valueType = t.kind === "map" ? t.value : { kind: "f64" };
276
363
  const emitSlot = (type, role) => {
@@ -311,6 +398,7 @@ export class LlDyn {
311
398
  emitSlot(keyType, "key");
312
399
  emitSlot(valueType, "value");
313
400
  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 }`, "");
401
+ this.host.journalBuilt?.();
314
402
  return name;
315
403
  }
316
404
  /* ── dyn node plumbing ─────────────────────────────────────────────── */
@@ -651,6 +739,17 @@ export class LlDyn {
651
739
  return existing;
652
740
  const name = `sc_dm_${this.dynMatchers.size}`;
653
741
  this.dynMatchers.set(matcherKey, name);
742
+ this.host.journalAllocated?.(name, "dyn.dynMatchHelper", [t, preserveRefs]);
743
+ const codec = textCodecRecordClass(t, (id) => this.host.recordsById.get(id));
744
+ if (codec !== null) {
745
+ // A codec matches only its own handle box.
746
+ const B = new BlockBuilder();
747
+ const matched = this.handleTagMatches(B, TEXT_CODEC_TAG_NUM[codec]);
748
+ B.terminate(`ret i1 ${matched}`);
749
+ this.defs.push(`define internal zeroext i1 @${name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
750
+ this.host.journalBuilt?.();
751
+ return name;
752
+ }
654
753
  const recursive = this.isRecursiveShape(t);
655
754
  const wrapped = recursive || this.holdsRecursiveShape(t);
656
755
  const B = new BlockBuilder();
@@ -675,7 +774,10 @@ export class LlDyn {
675
774
  const lPlain = B.newLabel("dm.tr.plain");
676
775
  B.condBr(capsule, lCapsule, lPlain);
677
776
  B.startBlock(lCapsule);
678
- if (preserveRefs) {
777
+ // A class target matches only capsules of that class (tested above):
778
+ // a materialized view is a plain object, which never carries a class
779
+ // brand, so materializing one cannot change the answer.
780
+ if (preserveRefs || (t.kind === "object" && t.className !== "%Error")) {
679
781
  B.terminate(`ret i1 false`);
680
782
  }
681
783
  else {
@@ -856,9 +958,10 @@ export class LlDyn {
856
958
  }
857
959
  B.condBr(readable, l0, fail);
858
960
  B.startBlock(l0);
859
- // dyn ('unknown') fields match ANY value, present or missing.
961
+ // dyn ('unknown') fields match ANY value, present or missing. The
962
+ // order index is no key.
860
963
  for (const f of shape.fields) {
861
- if (f.type.kind === "dyn")
964
+ if (f.type.kind === "dyn" || f.name === KEY_ORDER_FIELD)
862
965
  continue;
863
966
  const { value: m, release } = this.memberRead(B, f.name, f.type);
864
967
  const lNext = B.newLabel("dm.n");
@@ -986,6 +1089,7 @@ export class LlDyn {
986
1089
  this.defs.push(`define internal zeroext i1 @${wrapped ? `${name}_body` : name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
987
1090
  if (wrapped)
988
1091
  this.emitVisitWrapper(name, t, recursive ? "match" : "visit");
1092
+ this.host.journalBuilt?.();
989
1093
  return name;
990
1094
  }
991
1095
  /* ── schema-directed JSON.parse ───────────────────────────────── */
@@ -1022,9 +1126,10 @@ export class LlDyn {
1022
1126
  if (shape.fields.length > 64 || (shape.fields.length === 0 && !index))
1023
1127
  return false;
1024
1128
  visiting.add(t.shapeId);
1025
- return (shape.fields.every((f) => !f.name.startsWith("%") &&
1026
- f.name !== "__proto__" &&
1027
- this.jsonSchemaSupported(f.type, visiting, true)) &&
1129
+ return (shape.fields.every((f) => f.name === KEY_ORDER_FIELD ||
1130
+ (!f.name.startsWith("%") &&
1131
+ f.name !== "__proto__" &&
1132
+ this.jsonSchemaSupported(f.type, visiting, true))) &&
1028
1133
  (!index || this.jsonSchemaSupported(index, visiting)));
1029
1134
  }
1030
1135
  case "union":
@@ -1073,6 +1178,7 @@ export class LlDyn {
1073
1178
  const S = host.sizeType;
1074
1179
  const name = `sc_jsch_${this.jsonSchemas.size}`;
1075
1180
  this.jsonSchemas.set(key, name);
1181
+ this.host.journalAllocated?.(name, "dyn.jsonSchema", [t]);
1076
1182
  let body;
1077
1183
  switch (t.kind) {
1078
1184
  case "f64":
@@ -1097,7 +1203,9 @@ export class LlDyn {
1097
1203
  const base = host.nullableUnions.fieldBase(t.shapeId);
1098
1204
  const index = new Map(shape.fields.map((f, i) => [f.name, i + base]));
1099
1205
  // The runtime names kept-source keys by this index (record-sources.ts).
1100
- const order = recordSourceFieldOrder(shape);
1206
+ // The order index is no key: parsed values keep the table's order
1207
+ // and their source's own order.
1208
+ const order = recordSourceFieldOrder(shape).filter((name) => name !== KEY_ORDER_FIELD);
1101
1209
  if (recordMayKeepSource(shape))
1102
1210
  this.keepsRecordSources = true;
1103
1211
  const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
@@ -1130,6 +1238,7 @@ export class LlDyn {
1130
1238
  throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
1131
1239
  }
1132
1240
  this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr, ptr, ${S} } { ${body} }`, ``);
1241
+ this.host.journalBuilt?.();
1133
1242
  return name;
1134
1243
  }
1135
1244
  /** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
@@ -1187,6 +1296,16 @@ export class LlDyn {
1187
1296
  this.defs.push(`@${descriptor} = internal constant { ${S}, [7 x ${S}], [7 x ptr], ptr, ptr, ptr } { ${S} ${repr}, [7 x ${S}] [${tags.map((tag) => `${S} ${tag}`).join(", ")}], [7 x ptr] [${arms.join(", ")}], ptr ${nullValue}, ptr ${absentValue}, ptr ${box} }`, ``);
1188
1297
  return descriptor;
1189
1298
  }
1299
+ /** `record.sourceSpread(built, value)`: the built record keeps value's
1300
+ * kept-source order over its own declared names. */
1301
+ emitRecordSourceSpread(B, built, value, shapeId) {
1302
+ const host = this.host;
1303
+ const shape = host.recordsById.get(shapeId);
1304
+ this.keepsRecordSources = true;
1305
+ const names = this.recordNameTable(shapeId, shape);
1306
+ host.declare(`declare void @scr_record_source_spread(ptr, ptr, ptr, ptr, ${host.sizeType})`);
1307
+ B.line(`call void @scr_record_source_spread(ptr ${built}, ptr ${value}, ptr ${names.names}, ptr ${names.lens}, ${host.sizeType} ${shape.fields.length})`);
1308
+ }
1190
1309
  /** The declared-name tables scr_record_source_note scans: parallel
1191
1310
  * constant arrays of field-name bytes and byte lengths in declaration
1192
1311
  * order (the order the record serializes), interned per shape. Internal
@@ -1200,9 +1319,11 @@ export class LlDyn {
1200
1319
  const base = `sc_rnames_${this.recordNameTables.size}`;
1201
1320
  const table = { names: `@${base}`, lens: `@${base}_lens` };
1202
1321
  this.recordNameTables.set(shapeId, table);
1322
+ this.host.journalAllocated?.(base, "dyn.recordNameTable", [shapeId]);
1203
1323
  const n = shape.fields.length;
1204
1324
  const names = recordSourceFieldOrder(shape);
1205
1325
  this.defs.push(`@${base} = internal constant [${n} x ptr] [${names.map((name) => `ptr ${host.cstr(name)}`).join(", ")}]`, `@${base}_lens = internal constant [${n} x ${S}] [${names.map((name) => `${S} ${Buffer.byteLength(name, "utf8")}`).join(", ")}]`, ``);
1326
+ this.host.journalBuilt?.();
1206
1327
  return table;
1207
1328
  }
1208
1329
  /** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
@@ -1223,12 +1344,14 @@ export class LlDyn {
1223
1344
  const host = this.host;
1224
1345
  const name = `sc_jp_${this.jsonParsers.size}`;
1225
1346
  this.jsonParsers.set(key, name);
1347
+ this.host.journalAllocated?.(name, "dyn.jsonParseHelper", [t]);
1226
1348
  const schema = this.jsonSchema(t);
1227
1349
  const check = this.dynCheckHelper(t);
1228
1350
  host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
1229
1351
  host.declare(`declare ptr @scr_json_parse(ptr)`);
1230
1352
  host.declare(`declare void @scr_dyn_release(ptr)`);
1231
1353
  this.defs.push(`define internal ptr @${name}(ptr %text) ${FN_ATTRS} { ; JSON.parse as ${llvmCommentText(key)}`, `entry:`, ` %fast = call ptr @scr_json_parse_schema(ptr %text, ptr @${schema})`, ` %hit = icmp ne ptr %fast, null`, ` br i1 %hit, label %done, label %slow`, `done:`, ` ret ptr %fast`, `slow:`, ` %d = call ptr @scr_json_parse(ptr %text)`, ` %bad = icmp eq ptr %d, null`, ` br i1 %bad, label %fail, label %check`, `fail:`, ` ret ptr null`, `check:`, ` %v = call ptr @${check}(ptr %d, ptr null)`, ` call void @scr_dyn_release(ptr %d)`, ` ret ptr %v`, `}`, ``);
1354
+ this.host.journalBuilt?.();
1232
1355
  return name;
1233
1356
  }
1234
1357
  /* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
@@ -1243,6 +1366,7 @@ export class LlDyn {
1243
1366
  return existing;
1244
1367
  const name = `sc_dc_${this.dynBuilders.size}`;
1245
1368
  this.dynBuilders.set(builderKey, name);
1369
+ this.host.journalAllocated?.(name, "dyn.dynCheckHelper", [t, preserveRefs]);
1246
1370
  const recursive = this.isRecursiveShape(t);
1247
1371
  const memo = !recursive && this.holdsRecursiveShape(t) && this.valTy(t) === "ptr";
1248
1372
  const host = this.host;
@@ -1257,6 +1381,18 @@ export class LlDyn {
1257
1381
  B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
1258
1382
  B.terminate(`ret ptr ${checked}`);
1259
1383
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
1384
+ this.host.journalBuilt?.();
1385
+ return name;
1386
+ }
1387
+ const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
1388
+ if (codec !== null) {
1389
+ // The record the codec's handle box holds (+1), or the path TypeError.
1390
+ host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
1391
+ const checked = B.tmp();
1392
+ B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
1393
+ B.terminate(`ret ptr ${checked}`);
1394
+ this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
1395
+ this.host.journalBuilt?.();
1260
1396
  return name;
1261
1397
  }
1262
1398
  if (isRefCounted(t) && t.kind !== "dyn") {
@@ -1416,6 +1552,26 @@ export class LlDyn {
1416
1552
  B.line(`store ${member.type} ${oldValue}, ptr ${checkedPtr}`);
1417
1553
  });
1418
1554
  if (t.kind !== "record") {
1555
+ // Whether the dense slots carry states (SCR_ARR_STATES in
1556
+ // `spare`) moves with them; the rest of `spare` stays.
1557
+ const cachedSpare = B.tmp(), checkedSpare = B.tmp();
1558
+ const sparePtr = (array) => {
1559
+ const ptr = B.tmp();
1560
+ B.line(`${ptr} = getelementptr inbounds %ScrArr, ptr ${array}, i64 0, i32 ${SCR_ARR_FIELD.spare}`);
1561
+ return ptr;
1562
+ };
1563
+ const cachedSparePtr = sparePtr(cached), checkedSparePtr = sparePtr(checked);
1564
+ B.line(`${cachedSpare} = load i16, ptr ${cachedSparePtr}`);
1565
+ B.line(`${checkedSpare} = load i16, ptr ${checkedSparePtr}`);
1566
+ const exchange = (own, other, ptr) => {
1567
+ const kept = B.tmp(), moved = B.tmp(), next = B.tmp();
1568
+ B.line(`${kept} = and i16 ${own}, ${~SCR_ARR_STATES}`);
1569
+ B.line(`${moved} = and i16 ${other}, ${SCR_ARR_STATES}`);
1570
+ B.line(`${next} = or i16 ${kept}, ${moved}`);
1571
+ B.line(`store i16 ${next}, ptr ${ptr}`);
1572
+ };
1573
+ exchange(cachedSpare, checkedSpare, cachedSparePtr);
1574
+ exchange(checkedSpare, cachedSpare, checkedSparePtr);
1419
1575
  // Sparse slots and numeric properties live out of line; each
1420
1576
  // array keeps its own match metadata.
1421
1577
  host.declare("declare void @scr_arr_swap_indexed_ext(ptr, ptr)");
@@ -1461,10 +1617,10 @@ export class LlDyn {
1461
1617
  };
1462
1618
  switch (t.kind) {
1463
1619
  case "date": {
1464
- host.declare(`declare double @scr_dyn_native_date_value(ptr)`);
1620
+ host.declare(`declare ptr @scr_dyn_native_date_check(ptr, ptr)`);
1465
1621
  const r = B.tmp();
1466
- B.line(`${r} = call double @scr_dyn_native_date_value(ptr %d)`);
1467
- B.terminate(`ret double ${r}`);
1622
+ B.line(`${r} = call ptr @scr_dyn_native_date_check(ptr %d, ptr %path)`);
1623
+ B.terminate(`ret ptr ${r}`);
1468
1624
  break;
1469
1625
  }
1470
1626
  case "url":
@@ -1746,7 +1902,11 @@ export class LlDyn {
1746
1902
  B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
1747
1903
  if (recursive)
1748
1904
  this.recordBuilt(B, name, "%r0");
1905
+ // The order index stays 0: the source's own order is kept below
1906
+ // when it differs from the table.
1749
1907
  for (const f of shape.fields) {
1908
+ if (f.name === KEY_ORDER_FIELD)
1909
+ continue;
1750
1910
  const { value: m, release } = this.memberRead(B, f.name, f.type);
1751
1911
  this.pendingBail(B, "dcr.read", () => {
1752
1912
  B.line(`call void @${release}(ptr ${m})`);
@@ -1914,9 +2074,10 @@ export class LlDyn {
1914
2074
  const def = host.unionsById.get(t.unionId);
1915
2075
  if (!def)
1916
2076
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
1917
- // Arms in CANONICAL order, first FULL match wins. The matched
1918
- // arm's builder can no longer fail.
1919
- def.arms.forEach((arm, i) => {
2077
+ // Arms in unionArmOrder, first FULL match wins. The matched arm's
2078
+ // builder can no longer fail.
2079
+ for (const i of this.unionArmOrder(def)) {
2080
+ const arm = def.arms[i];
1920
2081
  const lHit = B.newLabel("dcu.h");
1921
2082
  const lNext = B.newLabel("dcu.n");
1922
2083
  this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
@@ -1958,7 +2119,7 @@ export class LlDyn {
1958
2119
  B.terminate(`ret ptr ${u}`);
1959
2120
  }
1960
2121
  B.startBlock(lNext);
1961
- });
2122
+ }
1962
2123
  if (preserveRefs) {
1963
2124
  B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
1964
2125
  B.terminate(`ret ptr null`);
@@ -2157,8 +2318,64 @@ export class LlDyn {
2157
2318
  this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${recursive || memo ? `${name}_body` : name}(ptr %d, ptr %path) ${FN_ATTRS} { ; check ${key}`, B.render(), `}`, ``);
2158
2319
  if (recursive || memo)
2159
2320
  this.emitVisitWrapper(name, t, recursive ? "build" : "memo");
2321
+ this.host.journalBuilt?.();
2160
2322
  return name;
2161
2323
  }
2324
+ /** `i1`: %d is a handle box with tag `tag`. */
2325
+ handleTagMatches(B, tag) {
2326
+ const kd = this.kindOf(B, "%d");
2327
+ const isHandle = B.tmp();
2328
+ B.line(`${isHandle} = icmp eq i32 ${kd}, ${DYN_KIND.HANDLE}`);
2329
+ const lHandle = B.newLabel("dm.handle");
2330
+ const lDone = B.newLabel("dm.handle.done");
2331
+ const entry = B.currentLabel();
2332
+ B.condBr(isHandle, lHandle, lDone);
2333
+ B.startBlock(lHandle);
2334
+ const tagPtr = B.tmp();
2335
+ const loaded = B.tmp();
2336
+ B.line(`${tagPtr} = getelementptr inbounds i8, ptr %d, i64 ${this.abiOffset(24, 20)} ; ->v.handle.tag`);
2337
+ B.line(`${loaded} = load i32, ptr ${tagPtr}`);
2338
+ const same = B.tmp();
2339
+ B.line(`${same} = icmp eq i32 ${loaded}, ${tag}`);
2340
+ B.br(lDone);
2341
+ B.startBlock(lDone);
2342
+ const matched = B.tmp();
2343
+ B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
2344
+ return matched;
2345
+ }
2346
+ /** A TextEncoder or TextDecoder record boxes as its handle (+1), which
2347
+ * holds the record by reference. A decoder passes the byte offsets of the
2348
+ * fields its boxed decode reads. */
2349
+ textCodecToDyn(B, t, shape, codec) {
2350
+ const host = this.host;
2351
+ const rc = vAdapters(host, t);
2352
+ const r = B.tmp();
2353
+ if (codec === "TextEncoder") {
2354
+ host.declare(`declare ptr @scr_text_encoder_to_dyn(ptr, ptr, ptr)`);
2355
+ B.line(`${r} = call ptr @scr_text_encoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release})`);
2356
+ }
2357
+ else {
2358
+ const struct = mangleRecordStruct(t.shapeId);
2359
+ const base = host.nullableUnions.fieldBase(t.shapeId);
2360
+ const start = B.tmp();
2361
+ B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
2362
+ const offsets = TEXT_DECODER_FIELDS.map((field) => {
2363
+ const index = shape.fields.findIndex((f) => f.name === field);
2364
+ if (index < 0)
2365
+ throw new InternalCompilerError(`llvm emitter bug: TextDecoder record lacks ${field}`);
2366
+ const p = B.tmp();
2367
+ const at = B.tmp();
2368
+ const offset = B.tmp();
2369
+ B.line(`${p} = getelementptr inbounds %${struct}, ptr %v, i64 0, i32 ${index + base} ; .${llvmCommentText(field)}`);
2370
+ B.line(`${at} = ptrtoint ptr ${p} to ${this.S}`);
2371
+ B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
2372
+ return `${this.S} ${offset}`;
2373
+ });
2374
+ host.declare(`declare ptr @scr_text_decoder_to_dyn(ptr, ptr, ptr, ${this.S}, ${this.S}, ${this.S}, ${this.S})`);
2375
+ B.line(`${r} = call ptr @scr_text_decoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
2376
+ }
2377
+ B.terminate(`ret ptr ${r}`);
2378
+ }
2162
2379
  /* ── toDynHelper (walkers.ts, ported) ─────────────────────────── */
2163
2380
  /** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn value from a
2164
2381
  * static one (+1), DEEP-COPYING composites. Borrows the operand.
@@ -2170,16 +2387,16 @@ export class LlDyn {
2170
2387
  return existing;
2171
2388
  const name = `sc_td_${this.toDynFns.size}`;
2172
2389
  this.toDynFns.set(key, name);
2390
+ this.host.journalAllocated?.(name, "dyn.toDynHelper", [t]);
2173
2391
  const host = this.host;
2174
2392
  const B = new BlockBuilder();
2175
2393
  let sourceAccessor = null;
2176
2394
  switch (t.kind) {
2177
2395
  case "date": {
2178
- // A Date handle holding the same time value; native Dates are
2179
- // immutable values, and so is the handle.
2180
- host.declare(`declare ptr @scr_dyn_native_date_from_ms(double)`);
2396
+ // A Date handle holding the same Date object.
2397
+ host.declare(`declare ptr @scr_dyn_native_date(ptr)`);
2181
2398
  const r = B.tmp();
2182
- B.line(`${r} = call ptr @scr_dyn_native_date_from_ms(double %v)`);
2399
+ B.line(`${r} = call ptr @scr_dyn_native_date(ptr %v)`);
2183
2400
  B.terminate(`ret ptr ${r}`);
2184
2401
  break;
2185
2402
  }
@@ -2319,6 +2536,11 @@ export class LlDyn {
2319
2536
  const shape = host.recordsById.get(t.shapeId);
2320
2537
  if (!shape)
2321
2538
  throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
2539
+ const codec = recordTextCodecClass(shape);
2540
+ if (codec !== null) {
2541
+ this.textCodecToDyn(B, t, shape, codec);
2542
+ break;
2543
+ }
2322
2544
  const struct = mangleRecordStruct(t.shapeId);
2323
2545
  const base = host.nullableUnions.fieldBase(t.shapeId);
2324
2546
  const fieldIndex = new Map(shape.fields.map((f, i) => [f.name, i + base]));
@@ -2401,58 +2623,68 @@ export class LlDyn {
2401
2623
  host.declare(`declare ptr @scr_dyn_new_obj()`);
2402
2624
  B.line(`${d} = call ptr @scr_dyn_new_obj()`);
2403
2625
  }
2404
- // Keys insert in DECLARED order (JS insertion order); internal
2405
- // '%'-fields follow so a record→dyn→record round trip keeps them.
2626
+ // Keys insert in DECLARED order (JS insertion order), or in the
2627
+ // value's own order for a shape with orderVariants; internal
2628
+ // '%'-fields follow so a record→dyn→record round trip keeps them
2629
+ // (all but the order index, which is no key).
2406
2630
  const byName = new Map(shape.fields.map((f) => [f.name, f]));
2407
2631
  // An accessor property is one key whose getter and setter are the
2408
2632
  // slot closures (see accessorSlotProp), in accessorOrder's place.
2409
- const order = shape.accessorOrder ?? shape.declaredOrder ?? shape.fields.map((f) => f.name);
2410
- const inOrder = new Set(order);
2411
- const accessors = new Set(shape.accessorOrder === undefined
2412
- ? []
2413
- : shape.fields.flatMap((f) => {
2414
- const slot = accessorSlotProp(f.name);
2415
- return slot === null ? [] : [slot.prop];
2416
- }));
2417
- const dynFields = [
2418
- ...order.flatMap((n) => {
2419
- if (accessors.has(n))
2420
- return [{ accessor: n }];
2421
- const f = byName.get(n);
2422
- return f === undefined ? [] : [f];
2423
- }),
2424
- ...shape.fields.filter((f) => !inOrder.has(f.name) && !(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
2425
- ];
2426
- for (const entry of dynFields) {
2427
- if ("accessor" in entry) {
2428
- host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
2429
- const boxed = (kind) => {
2430
- const slot = byName.get(`%${kind}:${entry.accessor}`);
2431
- if (slot === undefined)
2432
- return "null";
2433
- const fv = loadFieldOf(slot.name, slot.type);
2434
- const conv = B.tmp();
2435
- B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
2436
- return conv;
2437
- };
2438
- const getter = boxed("get");
2439
- const setter = boxed("set");
2440
- B.line(`call void @scr_dyn_obj_set_accessor(ptr ${d}, ptr ${host.cstr(entry.accessor)}, ${host.sizeType} ${Buffer.byteLength(entry.accessor, "utf8")}, ptr ${getter}, ptr ${setter}) ; ${llvmCommentText(entry.accessor)}`);
2441
- continue;
2442
- }
2443
- const f = entry;
2444
- const klen = Buffer.byteLength(f.name, "utf8");
2445
- const fv = loadFieldOf(f.name, f.type);
2446
- // An ABSENT optional field contributes no key.
2447
- const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
2448
- const conv = B.tmp();
2449
- B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
2450
- B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
2451
- if (lSkip !== null) {
2452
- B.br(lSkip);
2453
- B.startBlock(lSkip);
2633
+ const orders = shape.accessorOrder !== undefined ? [shape.accessorOrder] : shapeKeyOrders(shape);
2634
+ const perOrder = (order) => {
2635
+ const inOrder = new Set(order);
2636
+ const accessors = new Set(shape.accessorOrder === undefined
2637
+ ? []
2638
+ : shape.fields.flatMap((f) => {
2639
+ const slot = accessorSlotProp(f.name);
2640
+ return slot === null ? [] : [slot.prop];
2641
+ }));
2642
+ const dynFields = [
2643
+ ...order.flatMap((n) => {
2644
+ if (accessors.has(n))
2645
+ return [{ accessor: n }];
2646
+ const f = byName.get(n);
2647
+ return f === undefined ? [] : [f];
2648
+ }),
2649
+ ...shape.fields.filter((f) => !inOrder.has(f.name) &&
2650
+ f.name !== KEY_ORDER_FIELD &&
2651
+ !(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
2652
+ ];
2653
+ for (const entry of dynFields) {
2654
+ if ("accessor" in entry) {
2655
+ host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
2656
+ const boxed = (kind) => {
2657
+ const slot = byName.get(`%${kind}:${entry.accessor}`);
2658
+ if (slot === undefined)
2659
+ return "null";
2660
+ const fv = loadFieldOf(slot.name, slot.type);
2661
+ const conv = B.tmp();
2662
+ B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
2663
+ return conv;
2664
+ };
2665
+ const getter = boxed("get");
2666
+ const setter = boxed("set");
2667
+ B.line(`call void @scr_dyn_obj_set_accessor(ptr ${d}, ptr ${host.cstr(entry.accessor)}, ${host.sizeType} ${Buffer.byteLength(entry.accessor, "utf8")}, ptr ${getter}, ptr ${setter}) ; ${llvmCommentText(entry.accessor)}`);
2668
+ continue;
2669
+ }
2670
+ const f = entry;
2671
+ const klen = Buffer.byteLength(f.name, "utf8");
2672
+ const fv = loadFieldOf(f.name, f.type);
2673
+ // An ABSENT optional field contributes no key.
2674
+ const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
2675
+ const conv = B.tmp();
2676
+ B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
2677
+ B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
2678
+ if (lSkip !== null) {
2679
+ B.br(lSkip);
2680
+ B.startBlock(lSkip);
2681
+ }
2454
2682
  }
2455
- }
2683
+ };
2684
+ if (orders.length === 1)
2685
+ perOrder(orders[0]);
2686
+ else
2687
+ emitPerKeyOrder(B, shape, base, "%v", perOrder);
2456
2688
  // A Dirent row takes Node's Dirent prototype (the type probes) and
2457
2689
  // its Symbol(type) key; %dtype stays readable but non-enumerable.
2458
2690
  if (isDirentShape(shape)) {
@@ -2724,6 +2956,7 @@ export class LlDyn {
2724
2956
  if (sourceAccessor) {
2725
2957
  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`, `}`, ``);
2726
2958
  }
2959
+ this.host.journalBuilt?.();
2727
2960
  return name;
2728
2961
  }
2729
2962
  /** The checked-dynamic tree-promise settle adapter for one fulfillment payload type —
@@ -2740,6 +2973,7 @@ export class LlDyn {
2740
2973
  return existing;
2741
2974
  const name = `sc_pda_${this.promiseDynAdapters.size}`;
2742
2975
  this.promiseDynAdapters.set(key, name);
2976
+ this.host.journalAllocated?.(name, "dyn.promiseDynAdapterHelper", [inner]);
2743
2977
  const host = this.host;
2744
2978
  const B = new BlockBuilder();
2745
2979
  host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
@@ -2811,6 +3045,7 @@ export class LlDyn {
2811
3045
  }
2812
3046
  B.terminate(`ret void`);
2813
3047
  this.defs.push(`define internal void @${name}(ptr %dst, ptr %src) ${FN_ATTRS} { ; dyn-box settle adapter for promise<${key}>`, B.render(), `}`, ``);
3048
+ this.host.journalBuilt?.();
2814
3049
  return name;
2815
3050
  }
2816
3051
  /* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
@@ -2822,6 +3057,7 @@ export class LlDyn {
2822
3057
  return this.dynToStrFn;
2823
3058
  const name = "sc_ds";
2824
3059
  this.dynToStrFn = name;
3060
+ this.host.journalAllocated?.(name, "dyn.dynToStrHelper", []);
2825
3061
  const host = this.host;
2826
3062
  host.declare(`declare void @scr_jb_init(ptr)`);
2827
3063
  host.declare(`declare ptr @scr_jb_finish(ptr)`);
@@ -3112,6 +3348,7 @@ export class LlDyn {
3112
3348
  B.terminate(`ret ptr ${out}`);
3113
3349
  this.defs.push(`define internal ptr @${name}(ptr %d) ${FN_ATTRS} { ; String(unknown) -> owned (+1)`, B.render(), `}`, ``);
3114
3350
  }
3351
+ this.host.journalBuilt?.();
3115
3352
  return name;
3116
3353
  }
3117
3354
  /* ── caughtToDyn (walkers.ts, ported) ─────────────────────────── */
@@ -3122,6 +3359,7 @@ export class LlDyn {
3122
3359
  return this.caughtToDynFn;
3123
3360
  const name = "sc_cd";
3124
3361
  this.caughtToDynFn = name;
3362
+ this.host.journalAllocated?.(name, "dyn.caughtToDynHelper", []);
3125
3363
  const host = this.host;
3126
3364
  const B = new BlockBuilder();
3127
3365
  const kp = B.tmp();
@@ -3220,6 +3458,7 @@ export class LlDyn {
3220
3458
  B.terminate(`ret ptr ${e}`);
3221
3459
  }
3222
3460
  this.defs.push(`define internal ptr @${name}(ptr %c) ${FN_ATTRS} { ; caught -> unknown (+1, fresh tree)`, B.render(), `}`, ``);
3461
+ this.host.journalBuilt?.();
3223
3462
  return name;
3224
3463
  }
3225
3464
  /* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
@@ -3232,6 +3471,7 @@ export class LlDyn {
3232
3471
  this.helperMemo.set(name, name);
3233
3472
  const B = new BlockBuilder();
3234
3473
  const host = this.host;
3474
+ this.host.journalAllocated?.(name, "dyn.dynComputedKeyGetHelper", []);
3235
3475
  const stringHelper = this.dynKeyGetHelper();
3236
3476
  host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
3237
3477
  host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
@@ -3264,6 +3504,7 @@ export class LlDyn {
3264
3504
  B.line(`call void @scr_dyn_release(ptr ${key})`);
3265
3505
  B.terminate(`ret ptr ${value}`);
3266
3506
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
3507
+ this.host.journalBuilt?.();
3267
3508
  return name;
3268
3509
  }
3269
3510
  dynKeyGetHelper() {
@@ -3273,6 +3514,7 @@ export class LlDyn {
3273
3514
  return existing;
3274
3515
  const name = "sc_dyn_key_get";
3275
3516
  this.dynBuilders.set(memoKey, name);
3517
+ this.host.journalAllocated?.(name, "dyn.dynKeyGetHelper", []);
3276
3518
  const host = this.host;
3277
3519
  const B = new BlockBuilder();
3278
3520
  const kd = this.kindOf(B, "%d");
@@ -3651,6 +3893,7 @@ export class LlDyn {
3651
3893
  }
3652
3894
  retainUndef();
3653
3895
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %k, i1 zeroext %opt) ${FN_ATTRS} { ; d[k] on dyn`, B.render(), `}`, ``);
3896
+ this.host.journalBuilt?.();
3654
3897
  return name;
3655
3898
  }
3656
3899
  /* ── destructuring RequireObjectCoercible (ported) ─────────────────── */
@@ -3661,6 +3904,7 @@ export class LlDyn {
3661
3904
  return existing;
3662
3905
  const name = "sc_dyn_destr_check";
3663
3906
  this.dynBuilders.set(memoKey, name);
3907
+ this.host.journalAllocated?.(name, "dyn.dynDestrCheckHelper", []);
3664
3908
  const host = this.host;
3665
3909
  host.declare(`declare void @scr_jb_init(ptr)`);
3666
3910
  host.declare(`declare ptr @scr_jb_finish(ptr)`);
@@ -3710,6 +3954,7 @@ export class LlDyn {
3710
3954
  B.line(`call void @scr_throw_error(i32 1, ptr ${msg}) ; SCR_ERR_TYPE`);
3711
3955
  B.terminate(`ret void`);
3712
3956
  this.defs.push(`define internal void @${name}(ptr %d, ptr %spell, ptr %firstProp) ${FN_ATTRS} { ; destructuring RequireObjectCoercible`, B.render(), `}`, ``);
3957
+ this.host.journalBuilt?.();
3713
3958
  return name;
3714
3959
  }
3715
3960
  /* ── GetIterator + first-N steps (dynIterNHelper, ported) ──────────── */
@@ -3720,6 +3965,7 @@ export class LlDyn {
3720
3965
  return existing;
3721
3966
  const name = "sc_dyn_iter_n";
3722
3967
  this.dynBuilders.set(memoKey, name);
3968
+ this.host.journalAllocated?.(name, "dyn.dynIterNHelper", []);
3723
3969
  const host = this.host;
3724
3970
  host.declare(`declare ptr @scr_dyn_new_arr()`);
3725
3971
  host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
@@ -3914,12 +4160,38 @@ export class LlDyn {
3914
4160
  });
3915
4161
  B.terminate(`ret ptr ${out}`);
3916
4162
  this.defs.push(`define internal ptr @${name}(ptr %d, ${host.sizeType} %n, ptr %spelling) ${FN_ATTRS} { ; destructuring GetIterator + N steps`, B.render(), `}`, ``);
4163
+ this.host.journalBuilt?.();
3917
4164
  return name;
3918
4165
  }
3919
4166
  /* ── the checked-dynamic function boundary (ported) ────────────────── */
3920
4167
  /** The dyn argument spelling of one static value: dyn passes through
3921
4168
  * (+1), funcs box anonymously, everything else rides toDyn. `expr` is
3922
4169
  * BORROWED in every arm. Emits into the given builder. */
4170
+ /** A live capsule of a record or array value (+1; the value is
4171
+ * borrowed), as `dynFrom` with `liveRef` builds it; null for other
4172
+ * types. Closures boxed in a declaration-typed boundary program return
4173
+ * their records and arrays this way. */
4174
+ liveToDyn(B, t, expr) {
4175
+ const host = this.host;
4176
+ if (t.kind === "union") {
4177
+ const arms = host.unionsById.get(t.unionId)?.arms ?? [];
4178
+ if (!arms.some((arm) => arm.kind === "record" || arm.kind === "array"))
4179
+ return null;
4180
+ const boxed = B.tmp();
4181
+ B.line(`${boxed} = call ptr @${host.liveDynUnionRefAdapter(t)}(ptr ${expr})`);
4182
+ return boxed;
4183
+ }
4184
+ if ((t.kind !== "record" && t.kind !== "array") || !streamTypedRefEligible(t))
4185
+ return null;
4186
+ const key = typeKey(t);
4187
+ const adapter = host.liveDynRefAdapter(t);
4188
+ const rc = vAdapters(host, t);
4189
+ const boxed = B.tmp();
4190
+ B.line(`${boxed} = call ptr ${typedRefConstructor(host, t)}(ptr ${expr}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr @${adapter.snapshot}, ptr ${adapter.commit})`);
4191
+ for (const line of bindLiveArrayOps(host, adapter, boxed))
4192
+ B.line(line);
4193
+ return boxed;
4194
+ }
3923
4195
  toDynExpr(B, t, expr) {
3924
4196
  if (t.kind === "dyn")
3925
4197
  return this.retainDyn(B, expr);
@@ -3943,6 +4215,7 @@ export class LlDyn {
3943
4215
  return existing;
3944
4216
  const name = `sc_dfk_${this.dynFuncThunks.size}`;
3945
4217
  this.dynFuncThunks.set(key, name);
4218
+ this.host.journalAllocated?.(name, "dyn.dynFuncThunkHelper", [t]);
3946
4219
  const host = this.host;
3947
4220
  const B = new BlockBuilder();
3948
4221
  const argNames = [];
@@ -4041,6 +4314,22 @@ export class LlDyn {
4041
4314
  B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
4042
4315
  });
4043
4316
  }, "ptr null");
4317
+ // Declaration-typed boundary programs: an argument package code
4318
+ // passes keeps its identity (scr_dyn_decl_adopt).
4319
+ const capsule = this.host.declBoundary?.() === true ? this.liveToDyn(B, p, a) : null;
4320
+ if (capsule !== null) {
4321
+ host.declare(`declare void @scr_dyn_decl_adopt(ptr, ptr)`);
4322
+ host.declare(`declare void @scr_dyn_release(ptr)`);
4323
+ B.line(`call void @scr_dyn_decl_adopt(ptr ${ad}, ptr ${capsule})`);
4324
+ B.line(`call void @scr_dyn_release(ptr ${capsule})`);
4325
+ this.pendingBail(B, "dfk.adopt", () => {
4326
+ t.params.slice(0, i + 1).forEach((q, j) => {
4327
+ const name = j === i ? a : argNames[j];
4328
+ if (isRefCounted(q))
4329
+ B.line(`call void ${releaseSym(host, q)}(ptr ${name})`);
4330
+ });
4331
+ }, "ptr null");
4332
+ }
4044
4333
  argNames.push(a);
4045
4334
  }
4046
4335
  });
@@ -4075,12 +4364,15 @@ export class LlDyn {
4075
4364
  const r = B.tmp();
4076
4365
  B.line(`${r} = call ${retTy} ${fn}(${callArgs})`);
4077
4366
  this.pendingBail(B, "dfkr", () => { }, "ptr null");
4078
- const out = this.toDynExpr(B, t.ret, r);
4367
+ const out = this.host.declBoundary?.() === true
4368
+ ? (this.liveToDyn(B, t.ret, r) ?? this.toDynExpr(B, t.ret, r))
4369
+ : this.toDynExpr(B, t.ret, r);
4079
4370
  if (isRefCounted(t.ret))
4080
4371
  B.line(`call void ${releaseSym(host, t.ret)}(ptr ${r})`);
4081
4372
  B.terminate(`ret ptr ${out}`);
4082
4373
  }
4083
4374
  this.defs.push(`define internal ptr @${name}(ptr %c, ptr %args, ${host.sizeType} %argc) ${FN_ATTRS} { ; dyn call thunk for ${key}`, B.render(), `}`, ``);
4375
+ this.host.journalBuilt?.();
4084
4376
  return name;
4085
4377
  }
4086
4378
  /** The box builder dynFrom emits for one closure signature. */
@@ -4091,12 +4383,14 @@ export class LlDyn {
4091
4383
  return existing;
4092
4384
  const name = `sc_dfb_${this.dynFuncBoxes.size}`;
4093
4385
  this.dynFuncBoxes.set(key, name);
4386
+ this.host.journalAllocated?.(name, "dyn.dynFuncBoxHelper", [t]);
4094
4387
  const host = this.host;
4095
4388
  const thunk = this.dynFuncThunkHelper(t);
4096
4389
  host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
4097
4390
  host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
4098
4391
  const sigLit = host.cstr(key);
4099
4392
  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`, `}`, ``);
4393
+ this.host.journalBuilt?.();
4100
4394
  return name;
4101
4395
  }
4102
4396
  /** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
@@ -4118,11 +4412,15 @@ export class LlDyn {
4118
4412
  (t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
4119
4413
  this.messageReadable(param, new Set());
4120
4414
  if (!supported) {
4415
+ // A signature without an entry still takes a number.
4121
4416
  this.messageListeners.set(key, null);
4417
+ this.host.journalAllocated?.("", "dyn.messageListenerHelper", [t]);
4418
+ this.host.journalBuilt?.();
4122
4419
  return null;
4123
4420
  }
4124
4421
  const name = `sc_dml_${this.messageListeners.size}`;
4125
4422
  this.messageListeners.set(key, name);
4423
+ this.host.journalAllocated?.(name, "dyn.messageListenerHelper", [t]);
4126
4424
  const B = new BlockBuilder();
4127
4425
  B.entryAllocas.push(`%fail = alloca i1`);
4128
4426
  B.line(`store i1 false, ptr %fail`);
@@ -4149,6 +4447,7 @@ export class LlDyn {
4149
4447
  B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
4150
4448
  B.terminate(`ret i1 true`);
4151
4449
  this.defs.push(`define internal zeroext i1 @${name}(ptr %c, ptr %m) ${FN_ATTRS} { ; message entry for ${llvmCommentText(key)}`, B.render(), `}`, ``);
4450
+ this.host.journalBuilt?.();
4152
4451
  return name;
4153
4452
  }
4154
4453
  /** Whether a message reader can build T: numbers, booleans and strings;
@@ -4212,6 +4511,7 @@ export class LlDyn {
4212
4511
  return existing;
4213
4512
  const name = `sc_dmr_${this.messageReaders.size}`;
4214
4513
  this.messageReaders.set(key, name);
4514
+ this.host.journalAllocated?.(name, "dyn.messageReaderHelper", [t]);
4215
4515
  const host = this.host;
4216
4516
  const S = host.sizeType;
4217
4517
  if (t.kind !== "record")
@@ -4370,6 +4670,7 @@ export class LlDyn {
4370
4670
  B.line(`store i1 true, ptr %fail`);
4371
4671
  B.terminate(`ret ${retTy} ${dummy}`);
4372
4672
  this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(ptr %m, ${S} %n, ptr %fail) ${FN_ATTRS} { ; message reader for ${llvmCommentText(key)}`, B.render(), `}`, ``);
4673
+ this.host.journalBuilt?.();
4373
4674
  return name;
4374
4675
  }
4375
4676
  /** The adapter closure body for one TARGET signature: caps[0] is an
@@ -4381,6 +4682,7 @@ export class LlDyn {
4381
4682
  return existing;
4382
4683
  const name = `sc_dfa_${this.dynFuncAdapters.size}`;
4383
4684
  this.dynFuncAdapters.set(key, name);
4685
+ this.host.journalAllocated?.(name, "dyn.dynFuncAdapterHelper", [t]);
4384
4686
  const host = this.host;
4385
4687
  const B = new BlockBuilder();
4386
4688
  host.declare(`declare ptr @scr_box_get_ref(ptr)`);
@@ -4475,6 +4777,7 @@ export class LlDyn {
4475
4777
  ...(checkedRest ? ["ptr %rest"] : []),
4476
4778
  ].join(", ");
4477
4779
  this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(${params}) ${FN_ATTRS} { ; dyn fn adapter to ${key}`, B.render(), `}`, ``);
4780
+ this.host.journalBuilt?.();
4478
4781
  return name;
4479
4782
  }
4480
4783
  }