@scriptc/compiler 0.4.1 → 0.4.3

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 (999) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +977 -113
  2. package/dist/backend/cycle-analysis.d.ts +5 -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 +9 -1
  8. package/dist/backend/cycle-mutability.js +21 -3
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +6 -1
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +7 -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 +5 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +23 -4
  18. package/dist/backend/llvm/alloc.js +61 -8
  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 +23 -10
  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 +70 -7
  37. package/dist/backend/llvm/bytes-loop-versions.js +567 -30
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +389 -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 +74 -1
  44. package/dist/backend/llvm/classes.js +364 -54
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +384 -17
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +10 -6
  49. package/dist/backend/llvm/common.js +10 -6
  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 +91 -56
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  55. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  56. package/dist/backend/llvm/counted-loops.d.ts +11 -1
  57. package/dist/backend/llvm/counted-loops.js +80 -23
  58. package/dist/backend/llvm/counted-loops.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 +35 -16
  65. package/dist/backend/llvm/dense-array-loops.js +237 -12
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +140 -15
  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 +51 -1
  72. package/dist/backend/llvm/dyn.js +683 -69
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +33 -26
  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 +208 -34
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -27
  82. package/dist/backend/llvm/emit-statements.js +577 -93
  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 +314 -49
  88. package/dist/backend/llvm/emitter.js +1241 -129
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +54 -5
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +19 -0
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  95. package/dist/backend/llvm/expr-bytes.js +144 -52
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.js +47 -0
  98. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  99. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  100. package/dist/backend/llvm/expr-calls.js +62 -36
  101. package/dist/backend/llvm/expr-calls.js.map +1 -1
  102. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  103. package/dist/backend/llvm/expr-containers.js +148 -40
  104. package/dist/backend/llvm/expr-containers.js.map +1 -1
  105. package/dist/backend/llvm/expr-context.d.ts +14 -0
  106. package/dist/backend/llvm/expr-control.js +2 -3
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dynamic.js +71 -16
  109. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  110. package/dist/backend/llvm/expr-primitives.js +126 -36
  111. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  112. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  113. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-records.d.ts +12 -0
  115. package/dist/backend/llvm/expr-records.js +106 -0
  116. package/dist/backend/llvm/expr-records.js.map +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  118. package/dist/backend/llvm/expr-stream-bridges.js +225 -64
  119. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  121. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  126. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  127. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  128. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  129. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  130. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  131. package/dist/backend/llvm/integer-values.d.ts +20 -1
  132. package/dist/backend/llvm/integer-values.js +71 -0
  133. package/dist/backend/llvm/integer-values.js.map +1 -1
  134. package/dist/backend/llvm/js-ic.d.ts +1 -1
  135. package/dist/backend/llvm/js-ic.js +1 -1
  136. package/dist/backend/llvm/js-ic.js.map +1 -1
  137. package/dist/backend/llvm/key-orders.d.ts +7 -0
  138. package/dist/backend/llvm/key-orders.js +33 -0
  139. package/dist/backend/llvm/key-orders.js.map +1 -0
  140. package/dist/backend/llvm/lib-connect.js +4 -0
  141. package/dist/backend/llvm/lib-connect.js.map +1 -1
  142. package/dist/backend/llvm/lib-datagram.js +11 -0
  143. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  144. package/dist/backend/llvm/lib-dispatch.js +90 -2
  145. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  146. package/dist/backend/llvm/lib-filesystem.js +65 -4
  147. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  148. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  149. package/dist/backend/llvm/lib-http2.js +24 -17
  150. package/dist/backend/llvm/lib-http2.js.map +1 -1
  151. package/dist/backend/llvm/lib-lookup.js +16 -6
  152. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  153. package/dist/backend/llvm/lib-process.js +65 -14
  154. package/dist/backend/llvm/lib-process.js.map +1 -1
  155. package/dist/backend/llvm/lib-shared.js +126 -3
  156. package/dist/backend/llvm/lib-shared.js.map +1 -1
  157. package/dist/backend/llvm/lib-stream.js +97 -30
  158. package/dist/backend/llvm/lib-stream.js.map +1 -1
  159. package/dist/backend/llvm/lib-tls.js +23 -0
  160. package/dist/backend/llvm/lib-tls.js.map +1 -1
  161. package/dist/backend/llvm/local-array-reads.js +181 -64
  162. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  163. package/dist/backend/llvm/local-array-reads.test.js +28 -0
  164. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  165. package/dist/backend/llvm/loop-state.d.ts +33 -0
  166. package/dist/backend/llvm/loop-state.js +42 -0
  167. package/dist/backend/llvm/loop-state.js.map +1 -0
  168. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  169. package/dist/backend/llvm/map-number-lookup.js +91 -31
  170. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  171. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  172. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  173. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  176. package/dist/backend/llvm/nullable-unions.js +15 -3
  177. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  178. package/dist/backend/llvm/publish.d.ts +18 -1
  179. package/dist/backend/llvm/publish.js +76 -25
  180. package/dist/backend/llvm/publish.js.map +1 -1
  181. package/dist/backend/llvm/publish.test.js +3 -0
  182. package/dist/backend/llvm/publish.test.js.map +1 -1
  183. package/dist/backend/llvm/receivers.js +7 -2
  184. package/dist/backend/llvm/receivers.js.map +1 -1
  185. package/dist/backend/llvm/record-results.d.ts +1 -9
  186. package/dist/backend/llvm/record-results.js +2 -11
  187. package/dist/backend/llvm/record-results.js.map +1 -1
  188. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  189. package/dist/backend/llvm/reference-writes.js +91 -72
  190. package/dist/backend/llvm/reference-writes.js.map +1 -1
  191. package/dist/backend/llvm/regex-matchers.js +161 -14
  192. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  193. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  194. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  195. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  196. package/dist/backend/llvm/running-extrema.js +115 -0
  197. package/dist/backend/llvm/running-extrema.js.map +1 -0
  198. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  199. package/dist/backend/llvm/running-extrema.test.js +89 -0
  200. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  201. package/dist/backend/llvm/shapes.d.ts +79 -21
  202. package/dist/backend/llvm/shapes.js +233 -42
  203. package/dist/backend/llvm/shapes.js.map +1 -1
  204. package/dist/backend/llvm/shapes.test.js +53 -7
  205. package/dist/backend/llvm/shapes.test.js.map +1 -1
  206. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  207. package/dist/backend/llvm/speculative-integers.js +2 -2
  208. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  209. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  210. package/dist/backend/llvm/stack-objects.js +5 -2
  211. package/dist/backend/llvm/stack-objects.js.map +1 -1
  212. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  213. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  214. package/dist/backend/llvm/string-reads.d.ts +15 -0
  215. package/dist/backend/llvm/string-reads.js +128 -0
  216. package/dist/backend/llvm/string-reads.js.map +1 -1
  217. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  218. package/dist/backend/llvm/walk-borrows.js +46 -41
  219. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  220. package/dist/backend/llvm/walkers.d.ts +3 -0
  221. package/dist/backend/llvm/walkers.js +88 -65
  222. package/dist/backend/llvm/walkers.js.map +1 -1
  223. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  224. package/dist/backend/llvm/wasm-modules.js +32 -9
  225. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  226. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  227. package/dist/backend/llvm/wrapping-sums.js +126 -0
  228. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  229. package/dist/backend/mangle.d.ts +3 -0
  230. package/dist/backend/mangle.js +5 -0
  231. package/dist/backend/mangle.js.map +1 -1
  232. package/dist/backend/may-throw.d.ts +8 -10
  233. package/dist/backend/may-throw.js +14 -10
  234. package/dist/backend/may-throw.js.map +1 -1
  235. package/dist/backend/native/contracts.d.ts +27 -4
  236. package/dist/backend/native/executable.js +31 -8
  237. package/dist/backend/native/executable.js.map +1 -1
  238. package/dist/backend/native/library.js +1 -0
  239. package/dist/backend/native/library.js.map +1 -1
  240. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  241. package/dist/backend/native/runtime-inputs.js +1 -0
  242. package/dist/backend/native/runtime-inputs.js.map +1 -1
  243. package/dist/backend/native-codegen.d.ts +11 -6
  244. package/dist/backend/native-codegen.js +36 -9
  245. package/dist/backend/native-codegen.js.map +1 -1
  246. package/dist/backend/native-codegen.test.js +0 -23
  247. package/dist/backend/native-codegen.test.js.map +1 -1
  248. package/dist/backend/native-link-info-core.d.ts +18 -4
  249. package/dist/backend/native-link-info-core.js.map +1 -1
  250. package/dist/backend/optimization.d.ts +2 -2
  251. package/dist/backend/publication.d.ts +12 -1
  252. package/dist/backend/publication.js +37 -14
  253. package/dist/backend/publication.js.map +1 -1
  254. package/dist/backend/publication.test.js +30 -0
  255. package/dist/backend/publication.test.js.map +1 -1
  256. package/dist/backend/result-slots.d.ts +16 -0
  257. package/dist/backend/result-slots.js +23 -0
  258. package/dist/backend/result-slots.js.map +1 -0
  259. package/dist/backend/runtime-abi.d.ts +2 -2
  260. package/dist/backend/runtime-abi.js +2 -2
  261. package/dist/backend/runtime-pack-core.d.ts +2 -1
  262. package/dist/backend/runtime-pack-core.js +2 -1
  263. package/dist/backend/runtime-pack-core.js.map +1 -1
  264. package/dist/backend/runtime-pack-targets.test.js +5 -1
  265. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  266. package/dist/backend/runtime-pack.d.ts +0 -21
  267. package/dist/backend/runtime-pack.js +0 -29
  268. package/dist/backend/runtime-pack.js.map +1 -1
  269. package/dist/backend/runtime-pack.test.js +10 -69
  270. package/dist/backend/runtime-pack.test.js.map +1 -1
  271. package/dist/backend/stack-observations.d.ts +2 -1
  272. package/dist/backend/stack-observations.js +67 -42
  273. package/dist/backend/stack-observations.js.map +1 -1
  274. package/dist/backend/target-diagnostics.js +33 -1
  275. package/dist/backend/target-diagnostics.js.map +1 -1
  276. package/dist/backend/warm-cache.js +4 -0
  277. package/dist/backend/warm-cache.js.map +1 -1
  278. package/dist/cli/command.js +26 -6
  279. package/dist/cli/command.js.map +1 -1
  280. package/dist/cli/usage.d.ts +5 -1
  281. package/dist/cli/usage.js +10 -5
  282. package/dist/cli/usage.js.map +1 -1
  283. package/dist/compat/fetch-profile.js +1 -1
  284. package/dist/compat/fetch-profile.js.map +1 -1
  285. package/dist/contracts/check.js +5 -4
  286. package/dist/contracts/check.js.map +1 -1
  287. package/dist/contracts/int32-elements.js +10 -2
  288. package/dist/contracts/int32-elements.js.map +1 -1
  289. package/dist/coverage/report.d.ts +7 -2
  290. package/dist/coverage/report.js +30 -3
  291. package/dist/coverage/report.js.map +1 -1
  292. package/dist/coverage/verdict-cache.d.ts +1 -0
  293. package/dist/coverage/verdict-cache.js +4 -0
  294. package/dist/coverage/verdict-cache.js.map +1 -1
  295. package/dist/coverage/verdict-semantic.js +4 -0
  296. package/dist/coverage/verdict-semantic.js.map +1 -1
  297. package/dist/diagnostics/diagnostic.d.ts +4 -0
  298. package/dist/diagnostics/diagnostic.js.map +1 -1
  299. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  300. package/dist/diagnostics/dynamic-tier.js +57 -0
  301. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  302. package/dist/diagnostics/envelope.d.ts +5 -1
  303. package/dist/diagnostics/envelope.js +6 -2
  304. package/dist/diagnostics/envelope.js.map +1 -1
  305. package/dist/executable/executable-cache.d.ts +25 -1
  306. package/dist/executable/executable-cache.js +60 -7
  307. package/dist/executable/executable-cache.js.map +1 -1
  308. package/dist/executable/executable-cache.test.js +46 -3
  309. package/dist/executable/executable-cache.test.js.map +1 -1
  310. package/dist/executable/prepare.js +3 -1
  311. package/dist/executable/prepare.js.map +1 -1
  312. package/dist/frontend/analysis.js +1 -0
  313. package/dist/frontend/analysis.js.map +1 -1
  314. package/dist/frontend/decl-projection.d.ts +41 -0
  315. package/dist/frontend/decl-projection.js +854 -0
  316. package/dist/frontend/decl-projection.js.map +1 -0
  317. package/dist/frontend/decl-projection.test.d.ts +1 -0
  318. package/dist/frontend/decl-projection.test.js +30 -0
  319. package/dist/frontend/decl-projection.test.js.map +1 -0
  320. package/dist/frontend/dispose-hook.d.ts +2 -0
  321. package/dist/frontend/dispose-hook.js +14 -0
  322. package/dist/frontend/dispose-hook.js.map +1 -0
  323. package/dist/frontend/dts-paths.d.ts +15 -0
  324. package/dist/frontend/dts-paths.js +25 -0
  325. package/dist/frontend/dts-paths.js.map +1 -1
  326. package/dist/frontend/input-tracker.d.ts +6 -0
  327. package/dist/frontend/input-tracker.js +51 -28
  328. package/dist/frontend/input-tracker.js.map +1 -1
  329. package/dist/frontend/input-tracker.test.js +19 -0
  330. package/dist/frontend/input-tracker.test.js.map +1 -1
  331. package/dist/frontend/jsx-entities.d.ts +4 -0
  332. package/dist/frontend/jsx-entities.js +259 -0
  333. package/dist/frontend/jsx-entities.js.map +1 -0
  334. package/dist/frontend/jsx-source.d.ts +71 -0
  335. package/dist/frontend/jsx-source.js +781 -0
  336. package/dist/frontend/jsx-source.js.map +1 -0
  337. package/dist/frontend/jsx-source.test.d.ts +1 -0
  338. package/dist/frontend/jsx-source.test.js +200 -0
  339. package/dist/frontend/jsx-source.test.js.map +1 -0
  340. package/dist/frontend/literal-values.test.js +8 -9
  341. package/dist/frontend/literal-values.test.js.map +1 -1
  342. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  343. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  344. package/dist/frontend/lowering/array-values.js +103 -4
  345. package/dist/frontend/lowering/array-values.js.map +1 -1
  346. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  347. package/dist/frontend/lowering/binding-analysis.js +2 -2
  348. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  350. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  351. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  353. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  355. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  356. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  357. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  358. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  359. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  361. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  362. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  363. package/dist/frontend/lowering/builtins/crypto.js +136 -5
  364. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  366. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  367. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  368. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  369. package/dist/frontend/lowering/builtins/dates.js +55 -26
  370. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  372. package/dist/frontend/lowering/builtins/dh.js +151 -0
  373. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  374. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  375. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  376. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  377. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  378. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  380. package/dist/frontend/lowering/builtins/errors.js +110 -0
  381. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  382. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  383. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  384. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  385. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  386. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  387. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  388. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  389. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  390. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  391. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  392. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  393. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  394. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  395. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/json.js +2 -1
  397. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  398. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  399. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  400. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  401. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  402. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  403. package/dist/frontend/lowering/builtins/numbers.js +18 -6
  404. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  405. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  406. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  407. package/dist/frontend/lowering/builtins/performance.js +3 -2
  408. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  409. package/dist/frontend/lowering/builtins/process.js +3 -2
  410. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  411. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  412. package/dist/frontend/lowering/builtins/promises.js +91 -4
  413. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  414. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  415. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  416. package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
  417. package/dist/frontend/lowering/builtins/readline.js +58 -9
  418. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/strings.js +13 -5
  420. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  421. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  422. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  423. package/dist/frontend/lowering/builtins/timers.js +1 -1
  424. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  425. package/dist/frontend/lowering/builtins/url.js +28 -4
  426. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/v8.js +2 -1
  428. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  429. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  430. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  431. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  432. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  433. package/dist/frontend/lowering/call-arguments.js +2 -1
  434. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  435. package/dist/frontend/lowering/call-signatures.js +13 -6
  436. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  437. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  438. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  439. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  440. package/dist/frontend/lowering/class-assertions.js +3 -2
  441. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  442. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  443. package/dist/frontend/lowering/class-callbacks.js +82 -12
  444. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  445. package/dist/frontend/lowering/class-construction.d.ts +6 -2
  446. package/dist/frontend/lowering/class-construction.js +25 -16
  447. package/dist/frontend/lowering/class-construction.js.map +1 -1
  448. package/dist/frontend/lowering/class-descriptors.js +1 -1
  449. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  450. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
  451. package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
  452. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  453. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
  454. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  455. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  456. package/dist/frontend/lowering/class-iterables.js +9 -1
  457. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  458. package/dist/frontend/lowering/class-method-mutations.js +35 -9
  459. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  460. package/dist/frontend/lowering/class-method-values.js +1 -1
  461. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  462. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  463. package/dist/frontend/lowering/class-protocols.js +64 -4
  464. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  465. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  466. package/dist/frontend/lowering/class-prototypes.js +67 -5
  467. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  468. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  469. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  470. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  471. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  472. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  473. package/dist/frontend/lowering/class-unions.js +2 -1
  474. package/dist/frontend/lowering/class-unions.js.map +1 -1
  475. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  476. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  477. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  478. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  479. package/dist/frontend/lowering/coercions/structural.js +99 -8
  480. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  481. package/dist/frontend/lowering/coercions/unions.js +8 -7
  482. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  483. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  484. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  485. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  486. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  487. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  488. package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
  489. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  490. package/dist/frontend/lowering/containers/array-concat.js +12 -1
  491. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  492. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  493. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  494. package/dist/frontend/lowering/containers/array-methods.js +21 -5
  495. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  496. package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
  497. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  498. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  499. package/dist/frontend/lowering/containers/bytes.js +131 -29
  500. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  501. package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
  502. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  503. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  504. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  505. package/dist/frontend/lowering/containers/collection-methods.js +15 -9
  506. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  507. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  508. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  509. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  510. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  511. package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
  512. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  513. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  514. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  515. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  516. package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
  517. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  518. package/dist/frontend/lowering/containers/string-replacement.js +45 -20
  519. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  520. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  521. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  522. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  523. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  524. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  525. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  526. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  527. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  528. package/dist/frontend/lowering/dispatch-sites.js +218 -0
  529. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  530. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  531. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  532. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  533. package/dist/frontend/lowering/divergences.js +9 -1
  534. package/dist/frontend/lowering/divergences.js.map +1 -1
  535. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  536. package/dist/frontend/lowering/dyn-streams.js +1 -1
  537. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  538. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  539. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  540. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  541. package/dist/frontend/lowering/error-methods.js +51 -2
  542. package/dist/frontend/lowering/error-methods.js.map +1 -1
  543. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  544. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  545. package/dist/frontend/lowering/expressions/binary.js +81 -5
  546. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  547. package/dist/frontend/lowering/expressions/element-access.js +107 -14
  548. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  549. package/dist/frontend/lowering/expressions/identifiers.js +79 -11
  550. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  551. package/dist/frontend/lowering/expressions/narrowing.js +130 -6
  552. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  553. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  554. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  555. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
  556. package/dist/frontend/lowering/expressions/object-literals.js +164 -56
  557. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  558. package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
  559. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  560. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  561. package/dist/frontend/lowering/expressions/property-access.js +211 -17
  562. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  563. package/dist/frontend/lowering/expressions/relational.js +267 -30
  564. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  565. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  566. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  567. package/dist/frontend/lowering/expressions/updates.js +85 -12
  568. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  569. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  570. package/dist/frontend/lowering/frozen-records.js +322 -0
  571. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  572. package/dist/frontend/lowering/function-returns.js +49 -0
  573. package/dist/frontend/lowering/function-returns.js.map +1 -1
  574. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  575. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  576. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  577. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  578. package/dist/frontend/lowering/generic-functions.js +455 -20
  579. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  580. package/dist/frontend/lowering/intern-tables.js +2 -1
  581. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  582. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  583. package/dist/frontend/lowering/iterable-values.js +297 -0
  584. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  585. package/dist/frontend/lowering/iterator-adapters.js +195 -9
  586. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  587. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  588. package/dist/frontend/lowering/js-class-fields.js +45 -10
  589. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  590. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  591. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  592. package/dist/frontend/lowering/json-require.js +2 -1
  593. package/dist/frontend/lowering/json-require.js.map +1 -1
  594. package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
  595. package/dist/frontend/lowering/key-order-witness.js +790 -25
  596. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  597. package/dist/frontend/lowering/key-order-witness.test.js +466 -10
  598. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  599. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  600. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  601. package/dist/frontend/lowering/lower-assert.js +6 -5
  602. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  603. package/dist/frontend/lowering/lower-async-iteration.js +7 -2
  604. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  605. package/dist/frontend/lowering/lower-calls.d.ts +11 -0
  606. package/dist/frontend/lowering/lower-calls.js +776 -126
  607. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  608. package/dist/frontend/lowering/lower-classes.d.ts +29 -2
  609. package/dist/frontend/lowering/lower-classes.js +581 -46
  610. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  611. package/dist/frontend/lowering/lower-dgram.js +6 -3
  612. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  613. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  614. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  615. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  616. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  617. package/dist/frontend/lowering/lower-exprs.js +126 -13
  618. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  619. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  620. package/dist/frontend/lowering/lower-functions.js +387 -72
  621. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  622. package/dist/frontend/lowering/lower-generators.js +41 -31
  623. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  624. package/dist/frontend/lowering/lower-global-value.js +6 -3
  625. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  626. package/dist/frontend/lowering/lower-inspect.js +28 -12
  627. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  628. package/dist/frontend/lowering/lower-mixins.js +2 -1
  629. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  630. package/dist/frontend/lowering/lower-mock.js +2 -1
  631. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  632. package/dist/frontend/lowering/lower-modules.js +47 -5
  633. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  634. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  635. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  636. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  637. package/dist/frontend/lowering/lower-namespaces.js +9 -4
  638. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  639. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  640. package/dist/frontend/lowering/lower-server.js +239 -61
  641. package/dist/frontend/lowering/lower-server.js.map +1 -1
  642. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  643. package/dist/frontend/lowering/lower-stdlib.js +42 -10
  644. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  645. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  646. package/dist/frontend/lowering/lower-stmts.js +622 -68
  647. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  648. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  649. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  650. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  651. package/dist/frontend/lowering/lower-stream.js +2055 -318
  652. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  653. package/dist/frontend/lowering/lower-timers.js +4 -3
  654. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  655. package/dist/frontend/lowering/lowerer.d.ts +197 -29
  656. package/dist/frontend/lowering/lowerer.js +862 -84
  657. package/dist/frontend/lowering/lowerer.js.map +1 -1
  658. package/dist/frontend/lowering/lowerer.test.js +21 -9
  659. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  660. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  661. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  662. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  663. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  664. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  665. package/dist/frontend/lowering/native-ffi.js +1 -1
  666. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  667. package/dist/frontend/lowering/new-target.d.ts +12 -0
  668. package/dist/frontend/lowering/new-target.js +280 -0
  669. package/dist/frontend/lowering/new-target.js.map +1 -0
  670. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  671. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  672. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  673. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  674. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  675. package/dist/frontend/lowering/private-brands.js +66 -15
  676. package/dist/frontend/lowering/private-brands.js.map +1 -1
  677. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  678. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  679. package/dist/frontend/lowering/require-initialization.js +2 -1
  680. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  681. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  682. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  683. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  684. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  685. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  686. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  687. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  688. package/dist/frontend/lowering/site-dependencies.js +84 -0
  689. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  690. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  691. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  692. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  693. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  694. package/dist/frontend/lowering/stable-names.js +35 -0
  695. package/dist/frontend/lowering/stable-names.js.map +1 -0
  696. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  697. package/dist/frontend/lowering/static-typeof.js +42 -3
  698. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  699. package/dist/frontend/lowering/strict-equality.js +2 -1
  700. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  701. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  702. package/dist/frontend/lowering/structural-positions.js +108 -0
  703. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  704. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  705. package/dist/frontend/lowering/surfaces.js +60 -32
  706. package/dist/frontend/lowering/surfaces.js.map +1 -1
  707. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  708. package/dist/frontend/lowering/undefined-index.js +82 -0
  709. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  710. package/dist/frontend/lowering/var-hoisting.js +66 -16
  711. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  712. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  713. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  714. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  715. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  716. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  717. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  718. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  719. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  720. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  721. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  722. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  723. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  724. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  725. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  726. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  727. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  728. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  729. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  730. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  731. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  732. package/dist/frontend/npm-static-type-exports.js +261 -0
  733. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  734. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  735. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  736. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  737. package/dist/frontend/npm-static-umd.d.ts +6 -0
  738. package/dist/frontend/npm-static-umd.js +203 -0
  739. package/dist/frontend/npm-static-umd.js.map +1 -0
  740. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  741. package/dist/frontend/npm-static-umd.test.js +105 -0
  742. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  743. package/dist/frontend/npm-static.d.ts +8 -0
  744. package/dist/frontend/npm-static.js +51 -22
  745. package/dist/frontend/npm-static.js.map +1 -1
  746. package/dist/frontend/package-shims.d.ts +3 -0
  747. package/dist/frontend/package-shims.js +71 -8
  748. package/dist/frontend/package-shims.js.map +1 -1
  749. package/dist/frontend/pipeline.js +18 -10
  750. package/dist/frontend/pipeline.js.map +1 -1
  751. package/dist/frontend/process-fork.d.ts +25 -0
  752. package/dist/frontend/process-fork.js +2 -0
  753. package/dist/frontend/process-fork.js.map +1 -0
  754. package/dist/frontend/program.d.ts +21 -1
  755. package/dist/frontend/program.js +586 -74
  756. package/dist/frontend/program.js.map +1 -1
  757. package/dist/frontend/program.test.js +44 -4
  758. package/dist/frontend/program.test.js.map +1 -1
  759. package/dist/frontend/services.d.ts +6 -0
  760. package/dist/frontend/services.js +18 -0
  761. package/dist/frontend/services.js.map +1 -1
  762. package/dist/frontend/token-equivalence.d.ts +3 -0
  763. package/dist/frontend/token-equivalence.js +409 -0
  764. package/dist/frontend/token-equivalence.js.map +1 -0
  765. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  766. package/dist/frontend/token-equivalence.test.js +67 -0
  767. package/dist/frontend/token-equivalence.test.js.map +1 -0
  768. package/dist/frontend/ts7/ast-node.d.ts +43 -7
  769. package/dist/frontend/ts7/ast-node.js +1176 -129
  770. package/dist/frontend/ts7/ast-node.js.map +1 -1
  771. package/dist/frontend/ts7/ast-node.test.js +84 -0
  772. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  773. package/dist/frontend/ts7/ast-wire.d.ts +29 -3
  774. package/dist/frontend/ts7/ast-wire.js +144 -31
  775. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  776. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  777. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  778. package/dist/frontend/ts7/ast.d.ts +23 -2
  779. package/dist/frontend/ts7/ast.js +143 -2
  780. package/dist/frontend/ts7/ast.js.map +1 -1
  781. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  782. package/dist/frontend/ts7/checker-backend.js +2 -2
  783. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  784. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  785. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  786. package/dist/frontend/ts7/checker.d.ts +17 -1
  787. package/dist/frontend/ts7/checker.js +82 -1
  788. package/dist/frontend/ts7/checker.js.map +1 -1
  789. package/dist/frontend/ts7/checker.test.js +9 -6
  790. package/dist/frontend/ts7/checker.test.js.map +1 -1
  791. package/dist/frontend/ts7/enums.d.ts +3 -3
  792. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  793. package/dist/frontend/ts7/enums.generated.js +21 -0
  794. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  795. package/dist/frontend/ts7/enums.js +19 -0
  796. package/dist/frontend/ts7/enums.js.map +1 -1
  797. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  798. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  799. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  800. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  801. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  802. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  803. package/dist/frontend/ts7/program-host.d.ts +7 -0
  804. package/dist/frontend/ts7/program-host.js +30 -4
  805. package/dist/frontend/ts7/program-host.js.map +1 -1
  806. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  807. package/dist/frontend/ts7/semantic-checker.js +25 -20
  808. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  809. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  810. package/dist/frontend/ts7/semantic-json.js +146 -0
  811. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  812. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  813. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  814. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  815. package/dist/frontend/ts7/semantic-model.js +67 -19
  816. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  817. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  818. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  819. package/dist/frontend/ts7/session.d.ts +14 -1
  820. package/dist/frontend/ts7/session.js +23 -1
  821. package/dist/frontend/ts7/session.js.map +1 -1
  822. package/dist/frontend/tsc-codes.d.ts +1 -1
  823. package/dist/frontend/tsc-codes.js +7 -0
  824. package/dist/frontend/tsc-codes.js.map +1 -1
  825. package/dist/frontend/type-mapper.d.ts +51 -7
  826. package/dist/frontend/type-mapper.js +456 -43
  827. package/dist/frontend/type-mapper.js.map +1 -1
  828. package/dist/frontend/type-mapper.test.js +1 -1
  829. package/dist/frontend/type-mapper.test.js.map +1 -1
  830. package/dist/frontend-process-args.d.ts +4 -0
  831. package/dist/frontend-process-args.js +52 -0
  832. package/dist/frontend-process-args.js.map +1 -0
  833. package/dist/frontend-process-args.test.d.ts +1 -0
  834. package/dist/frontend-process-args.test.js +47 -0
  835. package/dist/frontend-process-args.test.js.map +1 -0
  836. package/dist/frontend-process.d.ts +1 -0
  837. package/dist/frontend-process.js +23 -0
  838. package/dist/frontend-process.js.map +1 -0
  839. package/dist/heap-collection.d.ts +16 -0
  840. package/dist/heap-collection.js +42 -0
  841. package/dist/heap-collection.js.map +1 -0
  842. package/dist/heap-collection.test.d.ts +1 -0
  843. package/dist/heap-collection.test.js +59 -0
  844. package/dist/heap-collection.test.js.map +1 -0
  845. package/dist/heap-pressure.d.ts +2 -0
  846. package/dist/heap-pressure.js +12 -0
  847. package/dist/heap-pressure.js.map +1 -0
  848. package/dist/index.d.ts +2 -0
  849. package/dist/index.js +435 -89
  850. package/dist/index.js.map +1 -1
  851. package/dist/ir/analysis.js +5 -3
  852. package/dist/ir/analysis.js.map +1 -1
  853. package/dist/ir/array-length-stability.d.ts +4 -0
  854. package/dist/ir/array-length-stability.js +26 -6
  855. package/dist/ir/array-length-stability.js.map +1 -1
  856. package/dist/ir/array-length-stability.test.js +49 -0
  857. package/dist/ir/array-length-stability.test.js.map +1 -1
  858. package/dist/ir/builtin-effects.d.ts +7 -0
  859. package/dist/ir/builtin-effects.js +80 -0
  860. package/dist/ir/builtin-effects.js.map +1 -1
  861. package/dist/ir/builtin-signatures.d.ts +7 -1
  862. package/dist/ir/builtin-signatures.js +303 -21
  863. package/dist/ir/builtin-signatures.js.map +1 -1
  864. package/dist/ir/callback-specialization.d.ts +2 -1
  865. package/dist/ir/callback-specialization.js +23 -18
  866. package/dist/ir/callback-specialization.js.map +1 -1
  867. package/dist/ir/char-unit-locals.d.ts +19 -0
  868. package/dist/ir/char-unit-locals.js +185 -0
  869. package/dist/ir/char-unit-locals.js.map +1 -0
  870. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  871. package/dist/ir/char-unit-locals.test.js +94 -0
  872. package/dist/ir/char-unit-locals.test.js.map +1 -0
  873. package/dist/ir/final-fields.d.ts +3 -1
  874. package/dist/ir/final-fields.js +15 -17
  875. package/dist/ir/final-fields.js.map +1 -1
  876. package/dist/ir/function-references.d.ts +2 -0
  877. package/dist/ir/function-references.js +2 -0
  878. package/dist/ir/function-references.js.map +1 -1
  879. package/dist/ir/function-references.test.js +5 -0
  880. package/dist/ir/function-references.test.js.map +1 -1
  881. package/dist/ir/initializer-bindings.d.ts +2 -1
  882. package/dist/ir/initializer-bindings.js +27 -20
  883. package/dist/ir/initializer-bindings.js.map +1 -1
  884. package/dist/ir/int32-arrays.d.ts +108 -0
  885. package/dist/ir/int32-arrays.js +831 -0
  886. package/dist/ir/int32-arrays.js.map +1 -0
  887. package/dist/ir/int32-slots.d.ts +36 -6
  888. package/dist/ir/int32-slots.js +370 -171
  889. package/dist/ir/int32-slots.js.map +1 -1
  890. package/dist/ir/int32-slots.test.js +3 -1
  891. package/dist/ir/int32-slots.test.js.map +1 -1
  892. package/dist/ir/integer-loop-facts.d.ts +9 -4
  893. package/dist/ir/integer-loop-facts.js +93 -18
  894. package/dist/ir/integer-loop-facts.js.map +1 -1
  895. package/dist/ir/integer-loops.d.ts +49 -0
  896. package/dist/ir/integer-loops.js +202 -40
  897. package/dist/ir/integer-loops.js.map +1 -1
  898. package/dist/ir/integer-loops.test.js +211 -1
  899. package/dist/ir/integer-loops.test.js.map +1 -1
  900. package/dist/ir/integer-ranges.d.ts +5 -0
  901. package/dist/ir/integer-ranges.js +125 -12
  902. package/dist/ir/integer-ranges.js.map +1 -1
  903. package/dist/ir/integer-ranges.test.js +94 -0
  904. package/dist/ir/integer-ranges.test.js.map +1 -1
  905. package/dist/ir/ir.d.ts +87 -9
  906. package/dist/ir/ir.js +61 -2
  907. package/dist/ir/ir.js.map +1 -1
  908. package/dist/ir/ir.test.js +21 -1
  909. package/dist/ir/ir.test.js.map +1 -1
  910. package/dist/ir/js-ic.d.ts +19 -2
  911. package/dist/ir/js-ic.js +95 -11
  912. package/dist/ir/js-ic.js.map +1 -1
  913. package/dist/ir/js-ic.test.js +188 -0
  914. package/dist/ir/js-ic.test.js.map +1 -1
  915. package/dist/ir/node-index.d.ts +57 -0
  916. package/dist/ir/node-index.js +215 -0
  917. package/dist/ir/node-index.js.map +1 -0
  918. package/dist/ir/paired-while-loops.d.ts +25 -0
  919. package/dist/ir/paired-while-loops.js +335 -0
  920. package/dist/ir/paired-while-loops.js.map +1 -0
  921. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  922. package/dist/ir/paired-while-loops.test.js +163 -0
  923. package/dist/ir/paired-while-loops.test.js.map +1 -0
  924. package/dist/ir/parameter-versions.d.ts +25 -0
  925. package/dist/ir/parameter-versions.js +300 -0
  926. package/dist/ir/parameter-versions.js.map +1 -0
  927. package/dist/ir/runtime-features.d.ts +60 -15
  928. package/dist/ir/runtime-features.js +276 -35
  929. package/dist/ir/runtime-features.js.map +1 -1
  930. package/dist/ir/serialize.d.ts +12 -2
  931. package/dist/ir/serialize.js +16 -3
  932. package/dist/ir/serialize.js.map +1 -1
  933. package/dist/ir/serialize.test.js +17 -0
  934. package/dist/ir/serialize.test.js.map +1 -1
  935. package/dist/ir/tiers.js +1 -0
  936. package/dist/ir/tiers.js.map +1 -1
  937. package/dist/ir/traverse.d.ts +2 -0
  938. package/dist/ir/traverse.js +29 -5
  939. package/dist/ir/traverse.js.map +1 -1
  940. package/dist/ir/validate.js +171 -45
  941. package/dist/ir/validate.js.map +1 -1
  942. package/dist/library/ir-policy.js +12 -0
  943. package/dist/library/ir-policy.js.map +1 -1
  944. package/dist/library/library-cache.d.ts +2 -0
  945. package/dist/library/library-cache.js.map +1 -1
  946. package/dist/library/prepare.js +2 -0
  947. package/dist/library/prepare.js.map +1 -1
  948. package/dist/native/cache.d.ts +6 -1
  949. package/dist/native/cache.js +28 -5
  950. package/dist/native/cache.js.map +1 -1
  951. package/dist/native/cache.test.js +16 -2
  952. package/dist/native/cache.test.js.map +1 -1
  953. package/dist/native/cli.js +26 -1
  954. package/dist/native/cli.js.map +1 -1
  955. package/dist/native/compiler.js +8 -6
  956. package/dist/native/compiler.js.map +1 -1
  957. package/dist/native/executable-cache.d.ts +1 -1
  958. package/dist/native/executable-cache.js +2 -2
  959. package/dist/native/executable-cache.js.map +1 -1
  960. package/dist/native/prepare.d.ts +3 -1
  961. package/dist/native/prepare.js +123 -31
  962. package/dist/native/prepare.js.map +1 -1
  963. package/dist/native/prepare.test.js +78 -18
  964. package/dist/native/prepare.test.js.map +1 -1
  965. package/dist/native/sanitizer.test.js +6 -1
  966. package/dist/native/sanitizer.test.js.map +1 -1
  967. package/dist/native/text-file.d.ts +13 -3
  968. package/dist/native/text-file.js +63 -9
  969. package/dist/native/text-file.js.map +1 -1
  970. package/dist/native/text-file.test.d.ts +1 -0
  971. package/dist/native/text-file.test.js +49 -0
  972. package/dist/native/text-file.test.js.map +1 -0
  973. package/dist/native/toolchain.js +4 -4
  974. package/dist/native/toolchain.js.map +1 -1
  975. package/dist/native/toolchain.test.js +3 -3
  976. package/dist/native/toolchain.test.js.map +1 -1
  977. package/dist/startup-cache.d.ts +1 -0
  978. package/dist/startup-cache.js +1 -0
  979. package/dist/startup-cache.js.map +1 -1
  980. package/dist/text-parts.d.ts +7 -0
  981. package/dist/text-parts.js +44 -0
  982. package/dist/text-parts.js.map +1 -1
  983. package/dist/text-parts.test.d.ts +1 -0
  984. package/dist/text-parts.test.js +46 -0
  985. package/dist/text-parts.test.js.map +1 -0
  986. package/dist/timing.d.ts +9 -2
  987. package/dist/timing.js +7 -4
  988. package/dist/timing.js.map +1 -1
  989. package/dist/wasm/translate.d.ts +4 -0
  990. package/dist/wasm/translate.js +2 -2
  991. package/dist/wasm/translate.js.map +1 -1
  992. package/package.json +21 -21
  993. package/shims/chalk/v5.ts +688 -0
  994. package/shims/hono-node-server/v2.ts +645 -0
  995. package/shims/hot-shots/client.ts +1126 -0
  996. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  997. package/shims/hot-shots/v8.ts +8 -0
  998. package/shims/undici/core/client.ts +4 -4
  999. package/surface-manifest.json +44 -52
@@ -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. */
@@ -54,6 +64,14 @@ const DYN_HANDLE_BOX_FN = {
54
64
  const DYN_HANDLE_UNBOX_FN = {
55
65
  dgramSocket: "scr_dgram_from_dyn",
56
66
  };
67
+ /** ScrMessageKind (scr_message.h): the node kinds message readers test. */
68
+ const MESSAGE_KIND = {
69
+ UNDEFINED: 0,
70
+ NULL: 1,
71
+ BOOL: 2,
72
+ NUMBER: 3,
73
+ STRING: 4,
74
+ };
57
75
  export const DYN_KIND = {
58
76
  NULL: 0,
59
77
  BOOL: 1,
@@ -92,6 +110,8 @@ export class LlDyn {
92
110
  dynFuncThunks = new Map();
93
111
  dynFuncBoxes = new Map();
94
112
  dynFuncAdapters = new Map();
113
+ messageListeners = new Map();
114
+ messageReaders = new Map();
95
115
  promiseDynAdapters = new Map();
96
116
  mapDynOps = new Map();
97
117
  dynToStrFn = null;
@@ -104,6 +124,54 @@ export class LlDyn {
104
124
  constructor(host) {
105
125
  this.host = host;
106
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
+ }
107
175
  /** The types a dyn matcher or builder for `t` checks structurally: record
108
176
  * fields and index values, array elements and union arms. */
109
177
  structuralChildren(t) {
@@ -208,6 +276,34 @@ export class LlDyn {
208
276
  this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
209
277
  B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
210
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
+ }
211
307
  /** Branch to a variant only after its literal discriminator and complete
212
308
  * structure match. Use the same path for predicates and builders. */
213
309
  unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
@@ -261,6 +357,7 @@ export class LlDyn {
261
357
  return prior;
262
358
  const name = `sc_map_dyn_${this.mapDynOps.size}`;
263
359
  this.mapDynOps.set(key, name);
360
+ this.host.journalAllocated?.(name, "dyn.collectionDynOps", [t]);
264
361
  const keyType = t.kind === "map" ? t.key : t.elem;
265
362
  const valueType = t.kind === "map" ? t.value : { kind: "f64" };
266
363
  const emitSlot = (type, role) => {
@@ -301,6 +398,7 @@ export class LlDyn {
301
398
  emitSlot(keyType, "key");
302
399
  emitSlot(valueType, "value");
303
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?.();
304
402
  return name;
305
403
  }
306
404
  /* ── dyn node plumbing ─────────────────────────────────────────────── */
@@ -641,6 +739,17 @@ export class LlDyn {
641
739
  return existing;
642
740
  const name = `sc_dm_${this.dynMatchers.size}`;
643
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
+ }
644
753
  const recursive = this.isRecursiveShape(t);
645
754
  const wrapped = recursive || this.holdsRecursiveShape(t);
646
755
  const B = new BlockBuilder();
@@ -846,9 +955,10 @@ export class LlDyn {
846
955
  }
847
956
  B.condBr(readable, l0, fail);
848
957
  B.startBlock(l0);
849
- // dyn ('unknown') fields match ANY value, present or missing.
958
+ // dyn ('unknown') fields match ANY value, present or missing. The
959
+ // order index is no key.
850
960
  for (const f of shape.fields) {
851
- if (f.type.kind === "dyn")
961
+ if (f.type.kind === "dyn" || f.name === KEY_ORDER_FIELD)
852
962
  continue;
853
963
  const { value: m, release } = this.memberRead(B, f.name, f.type);
854
964
  const lNext = B.newLabel("dm.n");
@@ -976,6 +1086,7 @@ export class LlDyn {
976
1086
  this.defs.push(`define internal zeroext i1 @${wrapped ? `${name}_body` : name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
977
1087
  if (wrapped)
978
1088
  this.emitVisitWrapper(name, t, recursive ? "match" : "visit");
1089
+ this.host.journalBuilt?.();
979
1090
  return name;
980
1091
  }
981
1092
  /* ── schema-directed JSON.parse ───────────────────────────────── */
@@ -1012,9 +1123,10 @@ export class LlDyn {
1012
1123
  if (shape.fields.length > 64 || (shape.fields.length === 0 && !index))
1013
1124
  return false;
1014
1125
  visiting.add(t.shapeId);
1015
- return (shape.fields.every((f) => !f.name.startsWith("%") &&
1016
- f.name !== "__proto__" &&
1017
- this.jsonSchemaSupported(f.type, visiting, true)) &&
1126
+ return (shape.fields.every((f) => f.name === KEY_ORDER_FIELD ||
1127
+ (!f.name.startsWith("%") &&
1128
+ f.name !== "__proto__" &&
1129
+ this.jsonSchemaSupported(f.type, visiting, true))) &&
1018
1130
  (!index || this.jsonSchemaSupported(index, visiting)));
1019
1131
  }
1020
1132
  case "union":
@@ -1063,6 +1175,7 @@ export class LlDyn {
1063
1175
  const S = host.sizeType;
1064
1176
  const name = `sc_jsch_${this.jsonSchemas.size}`;
1065
1177
  this.jsonSchemas.set(key, name);
1178
+ this.host.journalAllocated?.(name, "dyn.jsonSchema", [t]);
1066
1179
  let body;
1067
1180
  switch (t.kind) {
1068
1181
  case "f64":
@@ -1087,7 +1200,9 @@ export class LlDyn {
1087
1200
  const base = host.nullableUnions.fieldBase(t.shapeId);
1088
1201
  const index = new Map(shape.fields.map((f, i) => [f.name, i + base]));
1089
1202
  // The runtime names kept-source keys by this index (record-sources.ts).
1090
- const order = recordSourceFieldOrder(shape);
1203
+ // The order index is no key: parsed values keep the table's order
1204
+ // and their source's own order.
1205
+ const order = recordSourceFieldOrder(shape).filter((name) => name !== KEY_ORDER_FIELD);
1091
1206
  if (recordMayKeepSource(shape))
1092
1207
  this.keepsRecordSources = true;
1093
1208
  const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
@@ -1120,6 +1235,7 @@ export class LlDyn {
1120
1235
  throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
1121
1236
  }
1122
1237
  this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr, ptr, ${S} } { ${body} }`, ``);
1238
+ this.host.journalBuilt?.();
1123
1239
  return name;
1124
1240
  }
1125
1241
  /** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
@@ -1190,9 +1306,11 @@ export class LlDyn {
1190
1306
  const base = `sc_rnames_${this.recordNameTables.size}`;
1191
1307
  const table = { names: `@${base}`, lens: `@${base}_lens` };
1192
1308
  this.recordNameTables.set(shapeId, table);
1309
+ this.host.journalAllocated?.(base, "dyn.recordNameTable", [shapeId]);
1193
1310
  const n = shape.fields.length;
1194
1311
  const names = recordSourceFieldOrder(shape);
1195
1312
  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(", ")}]`, ``);
1313
+ this.host.journalBuilt?.();
1196
1314
  return table;
1197
1315
  }
1198
1316
  /** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
@@ -1213,12 +1331,14 @@ export class LlDyn {
1213
1331
  const host = this.host;
1214
1332
  const name = `sc_jp_${this.jsonParsers.size}`;
1215
1333
  this.jsonParsers.set(key, name);
1334
+ this.host.journalAllocated?.(name, "dyn.jsonParseHelper", [t]);
1216
1335
  const schema = this.jsonSchema(t);
1217
1336
  const check = this.dynCheckHelper(t);
1218
1337
  host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
1219
1338
  host.declare(`declare ptr @scr_json_parse(ptr)`);
1220
1339
  host.declare(`declare void @scr_dyn_release(ptr)`);
1221
1340
  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`, `}`, ``);
1341
+ this.host.journalBuilt?.();
1222
1342
  return name;
1223
1343
  }
1224
1344
  /* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
@@ -1233,6 +1353,7 @@ export class LlDyn {
1233
1353
  return existing;
1234
1354
  const name = `sc_dc_${this.dynBuilders.size}`;
1235
1355
  this.dynBuilders.set(builderKey, name);
1356
+ this.host.journalAllocated?.(name, "dyn.dynCheckHelper", [t, preserveRefs]);
1236
1357
  const recursive = this.isRecursiveShape(t);
1237
1358
  const memo = !recursive && this.holdsRecursiveShape(t) && this.valTy(t) === "ptr";
1238
1359
  const host = this.host;
@@ -1247,6 +1368,18 @@ export class LlDyn {
1247
1368
  B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
1248
1369
  B.terminate(`ret ptr ${checked}`);
1249
1370
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
1371
+ this.host.journalBuilt?.();
1372
+ return name;
1373
+ }
1374
+ const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
1375
+ if (codec !== null) {
1376
+ // The record the codec's handle box holds (+1), or the path TypeError.
1377
+ host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
1378
+ const checked = B.tmp();
1379
+ B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
1380
+ B.terminate(`ret ptr ${checked}`);
1381
+ this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
1382
+ this.host.journalBuilt?.();
1250
1383
  return name;
1251
1384
  }
1252
1385
  if (isRefCounted(t) && t.kind !== "dyn") {
@@ -1406,6 +1539,26 @@ export class LlDyn {
1406
1539
  B.line(`store ${member.type} ${oldValue}, ptr ${checkedPtr}`);
1407
1540
  });
1408
1541
  if (t.kind !== "record") {
1542
+ // Whether the dense slots carry states (SCR_ARR_STATES in
1543
+ // `spare`) moves with them; the rest of `spare` stays.
1544
+ const cachedSpare = B.tmp(), checkedSpare = B.tmp();
1545
+ const sparePtr = (array) => {
1546
+ const ptr = B.tmp();
1547
+ B.line(`${ptr} = getelementptr inbounds %ScrArr, ptr ${array}, i64 0, i32 ${SCR_ARR_FIELD.spare}`);
1548
+ return ptr;
1549
+ };
1550
+ const cachedSparePtr = sparePtr(cached), checkedSparePtr = sparePtr(checked);
1551
+ B.line(`${cachedSpare} = load i16, ptr ${cachedSparePtr}`);
1552
+ B.line(`${checkedSpare} = load i16, ptr ${checkedSparePtr}`);
1553
+ const exchange = (own, other, ptr) => {
1554
+ const kept = B.tmp(), moved = B.tmp(), next = B.tmp();
1555
+ B.line(`${kept} = and i16 ${own}, ${~SCR_ARR_STATES}`);
1556
+ B.line(`${moved} = and i16 ${other}, ${SCR_ARR_STATES}`);
1557
+ B.line(`${next} = or i16 ${kept}, ${moved}`);
1558
+ B.line(`store i16 ${next}, ptr ${ptr}`);
1559
+ };
1560
+ exchange(cachedSpare, checkedSpare, cachedSparePtr);
1561
+ exchange(checkedSpare, cachedSpare, checkedSparePtr);
1409
1562
  // Sparse slots and numeric properties live out of line; each
1410
1563
  // array keeps its own match metadata.
1411
1564
  host.declare("declare void @scr_arr_swap_indexed_ext(ptr, ptr)");
@@ -1736,7 +1889,11 @@ export class LlDyn {
1736
1889
  B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
1737
1890
  if (recursive)
1738
1891
  this.recordBuilt(B, name, "%r0");
1892
+ // The order index stays 0: the source's own order is kept below
1893
+ // when it differs from the table.
1739
1894
  for (const f of shape.fields) {
1895
+ if (f.name === KEY_ORDER_FIELD)
1896
+ continue;
1740
1897
  const { value: m, release } = this.memberRead(B, f.name, f.type);
1741
1898
  this.pendingBail(B, "dcr.read", () => {
1742
1899
  B.line(`call void @${release}(ptr ${m})`);
@@ -1904,9 +2061,10 @@ export class LlDyn {
1904
2061
  const def = host.unionsById.get(t.unionId);
1905
2062
  if (!def)
1906
2063
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
1907
- // Arms in CANONICAL order, first FULL match wins. The matched
1908
- // arm's builder can no longer fail.
1909
- def.arms.forEach((arm, i) => {
2064
+ // Arms in unionArmOrder, first FULL match wins. The matched arm's
2065
+ // builder can no longer fail.
2066
+ for (const i of this.unionArmOrder(def)) {
2067
+ const arm = def.arms[i];
1910
2068
  const lHit = B.newLabel("dcu.h");
1911
2069
  const lNext = B.newLabel("dcu.n");
1912
2070
  this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
@@ -1948,7 +2106,7 @@ export class LlDyn {
1948
2106
  B.terminate(`ret ptr ${u}`);
1949
2107
  }
1950
2108
  B.startBlock(lNext);
1951
- });
2109
+ }
1952
2110
  if (preserveRefs) {
1953
2111
  B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
1954
2112
  B.terminate(`ret ptr null`);
@@ -2147,8 +2305,64 @@ export class LlDyn {
2147
2305
  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(), `}`, ``);
2148
2306
  if (recursive || memo)
2149
2307
  this.emitVisitWrapper(name, t, recursive ? "build" : "memo");
2308
+ this.host.journalBuilt?.();
2150
2309
  return name;
2151
2310
  }
2311
+ /** `i1`: %d is a handle box with tag `tag`. */
2312
+ handleTagMatches(B, tag) {
2313
+ const kd = this.kindOf(B, "%d");
2314
+ const isHandle = B.tmp();
2315
+ B.line(`${isHandle} = icmp eq i32 ${kd}, ${DYN_KIND.HANDLE}`);
2316
+ const lHandle = B.newLabel("dm.handle");
2317
+ const lDone = B.newLabel("dm.handle.done");
2318
+ const entry = B.currentLabel();
2319
+ B.condBr(isHandle, lHandle, lDone);
2320
+ B.startBlock(lHandle);
2321
+ const tagPtr = B.tmp();
2322
+ const loaded = B.tmp();
2323
+ B.line(`${tagPtr} = getelementptr inbounds i8, ptr %d, i64 ${this.abiOffset(24, 20)} ; ->v.handle.tag`);
2324
+ B.line(`${loaded} = load i32, ptr ${tagPtr}`);
2325
+ const same = B.tmp();
2326
+ B.line(`${same} = icmp eq i32 ${loaded}, ${tag}`);
2327
+ B.br(lDone);
2328
+ B.startBlock(lDone);
2329
+ const matched = B.tmp();
2330
+ B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
2331
+ return matched;
2332
+ }
2333
+ /** A TextEncoder or TextDecoder record boxes as its handle (+1), which
2334
+ * holds the record by reference. A decoder passes the byte offsets of the
2335
+ * fields its boxed decode reads. */
2336
+ textCodecToDyn(B, t, shape, codec) {
2337
+ const host = this.host;
2338
+ const rc = vAdapters(host, t);
2339
+ const r = B.tmp();
2340
+ if (codec === "TextEncoder") {
2341
+ host.declare(`declare ptr @scr_text_encoder_to_dyn(ptr, ptr, ptr)`);
2342
+ B.line(`${r} = call ptr @scr_text_encoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release})`);
2343
+ }
2344
+ else {
2345
+ const struct = mangleRecordStruct(t.shapeId);
2346
+ const base = host.nullableUnions.fieldBase(t.shapeId);
2347
+ const start = B.tmp();
2348
+ B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
2349
+ const offsets = TEXT_DECODER_FIELDS.map((field) => {
2350
+ const index = shape.fields.findIndex((f) => f.name === field);
2351
+ if (index < 0)
2352
+ throw new InternalCompilerError(`llvm emitter bug: TextDecoder record lacks ${field}`);
2353
+ const p = B.tmp();
2354
+ const at = B.tmp();
2355
+ const offset = B.tmp();
2356
+ B.line(`${p} = getelementptr inbounds %${struct}, ptr %v, i64 0, i32 ${index + base} ; .${llvmCommentText(field)}`);
2357
+ B.line(`${at} = ptrtoint ptr ${p} to ${this.S}`);
2358
+ B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
2359
+ return `${this.S} ${offset}`;
2360
+ });
2361
+ host.declare(`declare ptr @scr_text_decoder_to_dyn(ptr, ptr, ptr, ${this.S}, ${this.S}, ${this.S}, ${this.S})`);
2362
+ B.line(`${r} = call ptr @scr_text_decoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
2363
+ }
2364
+ B.terminate(`ret ptr ${r}`);
2365
+ }
2152
2366
  /* ── toDynHelper (walkers.ts, ported) ─────────────────────────── */
2153
2367
  /** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn value from a
2154
2368
  * static one (+1), DEEP-COPYING composites. Borrows the operand.
@@ -2160,6 +2374,7 @@ export class LlDyn {
2160
2374
  return existing;
2161
2375
  const name = `sc_td_${this.toDynFns.size}`;
2162
2376
  this.toDynFns.set(key, name);
2377
+ this.host.journalAllocated?.(name, "dyn.toDynHelper", [t]);
2163
2378
  const host = this.host;
2164
2379
  const B = new BlockBuilder();
2165
2380
  let sourceAccessor = null;
@@ -2309,6 +2524,11 @@ export class LlDyn {
2309
2524
  const shape = host.recordsById.get(t.shapeId);
2310
2525
  if (!shape)
2311
2526
  throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
2527
+ const codec = recordTextCodecClass(shape);
2528
+ if (codec !== null) {
2529
+ this.textCodecToDyn(B, t, shape, codec);
2530
+ break;
2531
+ }
2312
2532
  const struct = mangleRecordStruct(t.shapeId);
2313
2533
  const base = host.nullableUnions.fieldBase(t.shapeId);
2314
2534
  const fieldIndex = new Map(shape.fields.map((f, i) => [f.name, i + base]));
@@ -2391,58 +2611,68 @@ export class LlDyn {
2391
2611
  host.declare(`declare ptr @scr_dyn_new_obj()`);
2392
2612
  B.line(`${d} = call ptr @scr_dyn_new_obj()`);
2393
2613
  }
2394
- // Keys insert in DECLARED order (JS insertion order); internal
2395
- // '%'-fields follow so a record→dyn→record round trip keeps them.
2614
+ // Keys insert in DECLARED order (JS insertion order), or in the
2615
+ // value's own order for a shape with orderVariants; internal
2616
+ // '%'-fields follow so a record→dyn→record round trip keeps them
2617
+ // (all but the order index, which is no key).
2396
2618
  const byName = new Map(shape.fields.map((f) => [f.name, f]));
2397
2619
  // An accessor property is one key whose getter and setter are the
2398
2620
  // slot closures (see accessorSlotProp), in accessorOrder's place.
2399
- const order = shape.accessorOrder ?? shape.declaredOrder ?? shape.fields.map((f) => f.name);
2400
- const inOrder = new Set(order);
2401
- const accessors = new Set(shape.accessorOrder === undefined
2402
- ? []
2403
- : shape.fields.flatMap((f) => {
2404
- const slot = accessorSlotProp(f.name);
2405
- return slot === null ? [] : [slot.prop];
2406
- }));
2407
- const dynFields = [
2408
- ...order.flatMap((n) => {
2409
- if (accessors.has(n))
2410
- return [{ accessor: n }];
2411
- const f = byName.get(n);
2412
- return f === undefined ? [] : [f];
2413
- }),
2414
- ...shape.fields.filter((f) => !inOrder.has(f.name) && !(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
2415
- ];
2416
- for (const entry of dynFields) {
2417
- if ("accessor" in entry) {
2418
- host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
2419
- const boxed = (kind) => {
2420
- const slot = byName.get(`%${kind}:${entry.accessor}`);
2421
- if (slot === undefined)
2422
- return "null";
2423
- const fv = loadFieldOf(slot.name, slot.type);
2424
- const conv = B.tmp();
2425
- B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
2426
- return conv;
2427
- };
2428
- const getter = boxed("get");
2429
- const setter = boxed("set");
2430
- 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)}`);
2431
- continue;
2432
- }
2433
- const f = entry;
2434
- const klen = Buffer.byteLength(f.name, "utf8");
2435
- const fv = loadFieldOf(f.name, f.type);
2436
- // An ABSENT optional field contributes no key.
2437
- const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
2438
- const conv = B.tmp();
2439
- B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
2440
- B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
2441
- if (lSkip !== null) {
2442
- B.br(lSkip);
2443
- B.startBlock(lSkip);
2621
+ const orders = shape.accessorOrder !== undefined ? [shape.accessorOrder] : shapeKeyOrders(shape);
2622
+ const perOrder = (order) => {
2623
+ const inOrder = new Set(order);
2624
+ const accessors = new Set(shape.accessorOrder === undefined
2625
+ ? []
2626
+ : shape.fields.flatMap((f) => {
2627
+ const slot = accessorSlotProp(f.name);
2628
+ return slot === null ? [] : [slot.prop];
2629
+ }));
2630
+ const dynFields = [
2631
+ ...order.flatMap((n) => {
2632
+ if (accessors.has(n))
2633
+ return [{ accessor: n }];
2634
+ const f = byName.get(n);
2635
+ return f === undefined ? [] : [f];
2636
+ }),
2637
+ ...shape.fields.filter((f) => !inOrder.has(f.name) &&
2638
+ f.name !== KEY_ORDER_FIELD &&
2639
+ !(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
2640
+ ];
2641
+ for (const entry of dynFields) {
2642
+ if ("accessor" in entry) {
2643
+ host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
2644
+ const boxed = (kind) => {
2645
+ const slot = byName.get(`%${kind}:${entry.accessor}`);
2646
+ if (slot === undefined)
2647
+ return "null";
2648
+ const fv = loadFieldOf(slot.name, slot.type);
2649
+ const conv = B.tmp();
2650
+ B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
2651
+ return conv;
2652
+ };
2653
+ const getter = boxed("get");
2654
+ const setter = boxed("set");
2655
+ 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)}`);
2656
+ continue;
2657
+ }
2658
+ const f = entry;
2659
+ const klen = Buffer.byteLength(f.name, "utf8");
2660
+ const fv = loadFieldOf(f.name, f.type);
2661
+ // An ABSENT optional field contributes no key.
2662
+ const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
2663
+ const conv = B.tmp();
2664
+ B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
2665
+ B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
2666
+ if (lSkip !== null) {
2667
+ B.br(lSkip);
2668
+ B.startBlock(lSkip);
2669
+ }
2444
2670
  }
2445
- }
2671
+ };
2672
+ if (orders.length === 1)
2673
+ perOrder(orders[0]);
2674
+ else
2675
+ emitPerKeyOrder(B, shape, base, "%v", perOrder);
2446
2676
  // A Dirent row takes Node's Dirent prototype (the type probes) and
2447
2677
  // its Symbol(type) key; %dtype stays readable but non-enumerable.
2448
2678
  if (isDirentShape(shape)) {
@@ -2714,6 +2944,7 @@ export class LlDyn {
2714
2944
  if (sourceAccessor) {
2715
2945
  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`, `}`, ``);
2716
2946
  }
2947
+ this.host.journalBuilt?.();
2717
2948
  return name;
2718
2949
  }
2719
2950
  /** The checked-dynamic tree-promise settle adapter for one fulfillment payload type —
@@ -2730,6 +2961,7 @@ export class LlDyn {
2730
2961
  return existing;
2731
2962
  const name = `sc_pda_${this.promiseDynAdapters.size}`;
2732
2963
  this.promiseDynAdapters.set(key, name);
2964
+ this.host.journalAllocated?.(name, "dyn.promiseDynAdapterHelper", [inner]);
2733
2965
  const host = this.host;
2734
2966
  const B = new BlockBuilder();
2735
2967
  host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
@@ -2801,16 +3033,19 @@ export class LlDyn {
2801
3033
  }
2802
3034
  B.terminate(`ret void`);
2803
3035
  this.defs.push(`define internal void @${name}(ptr %dst, ptr %src) ${FN_ATTRS} { ; dyn-box settle adapter for promise<${key}>`, B.render(), `}`, ``);
3036
+ this.host.journalBuilt?.();
2804
3037
  return name;
2805
3038
  }
2806
3039
  /* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
2807
3040
  /** Node's String() over a dyn value — sc_ds (+1 result) over the
2808
- * recursive sc_ds_buf walker. Borrowed operand; never throws. */
3041
+ * recursive sc_ds_buf walker. Borrowed operand; an exception that an
3042
+ * object's toString or valueOf throws stays pending. */
2809
3043
  dynToStrHelper() {
2810
3044
  if (this.dynToStrFn)
2811
3045
  return this.dynToStrFn;
2812
3046
  const name = "sc_ds";
2813
3047
  this.dynToStrFn = name;
3048
+ this.host.journalAllocated?.(name, "dyn.dynToStrHelper", []);
2814
3049
  const host = this.host;
2815
3050
  host.declare(`declare void @scr_jb_init(ptr)`);
2816
3051
  host.declare(`declare ptr @scr_jb_finish(ptr)`);
@@ -2909,9 +3144,9 @@ export class LlDyn {
2909
3144
  B.startBlock(labels.get(DYN_KIND.ARR));
2910
3145
  {
2911
3146
  // Array.prototype.toString: join(",") — null/undefined ELEMENTS
2912
- // print empty (unlike top level), nested arrays flatten.
3147
+ // print empty (unlike top level), nested arrays flatten. The length
3148
+ // is read once, as join reads it.
2913
3149
  const n = this.lenOf(B, "%d");
2914
- const items = this.itemsOf(B, "%d");
2915
3150
  this.i64Loop(B, "ds.ar", n, (i, brNext) => {
2916
3151
  const nz = B.tmp();
2917
3152
  B.line(`${nz} = icmp ugt ${this.S} ${i}, 0`);
@@ -2922,7 +3157,22 @@ export class LlDyn {
2922
3157
  B.line(`call void @scr_jb_putc(ptr %b, i8 44)`);
2923
3158
  B.br(lel);
2924
3159
  B.startBlock(lel);
2925
- const e = this.itemAt(B, items, i);
3160
+ // Each index reads the element as join does (scr_dyn_arr_at, +1):
3161
+ // from the current storage, undefined past the current length,
3162
+ // and through the prototype for a hole. An element's toString
3163
+ // can append to, shrink or reallocate the array; a getter that
3164
+ // throws answers NULL with the exception pending.
3165
+ host.declare(`declare ptr @scr_dyn_arr_at(ptr, double)`);
3166
+ host.declare(`declare void @scr_dyn_release_v(ptr)`);
3167
+ const index = B.tmp();
3168
+ B.line(`${index} = uitofp ${this.S} ${i} to double`);
3169
+ const e = B.tmp();
3170
+ B.line(`${e} = call ptr @scr_dyn_arr_at(ptr %d, double ${index})`);
3171
+ const missing = B.tmp();
3172
+ B.line(`${missing} = icmp eq ptr ${e}, null`);
3173
+ const lGot = B.newLabel("ds.gt");
3174
+ B.condBr(missing, done, lGot);
3175
+ B.startBlock(lGot);
2926
3176
  const ek = this.kindOf(B, e);
2927
3177
  const isU = B.tmp();
2928
3178
  const isN = B.tmp();
@@ -2930,20 +3180,31 @@ export class LlDyn {
2930
3180
  B.line(`${isU} = icmp eq i32 ${ek}, ${DYN_KIND.UNDEF}`);
2931
3181
  B.line(`${isN} = icmp eq i32 ${ek}, ${DYN_KIND.NULL}`);
2932
3182
  B.line(`${unit} = or i1 ${isU}, ${isN}`);
2933
- const lSkip = B.newLabel("ds.sk");
2934
3183
  const lRec = B.newLabel("ds.rc");
3184
+ const lSkip = B.newLabel("ds.sk");
2935
3185
  B.condBr(unit, lSkip, lRec);
2936
3186
  B.startBlock(lSkip);
3187
+ B.line(`call void @scr_dyn_release_v(ptr ${e})`);
2937
3188
  brNext();
2938
3189
  B.startBlock(lRec);
2939
3190
  B.line(`call void @sc_ds_buf(ptr %b, ptr ${e})`);
3191
+ B.line(`call void @scr_dyn_release_v(ptr ${e})`);
3192
+ // The first exception an element's conversion throws ends the
3193
+ // conversion; later elements are not read.
3194
+ const thrown = B.tmp();
3195
+ for (const line of host.pendingTestLines(thrown))
3196
+ B.line(line.trimStart());
3197
+ const lMore = B.newLabel("ds.mo");
3198
+ B.condBr(thrown, done, lMore);
3199
+ B.startBlock(lMore);
2940
3200
  });
2941
3201
  B.br(done);
2942
3202
  }
2943
3203
  B.startBlock(labels.get(DYN_KIND.OBJ));
2944
3204
  {
2945
3205
  // The checked-dynamic tree's error encoding renders Error.prototype.toString;
2946
- // plain objects are "[object Object]".
3206
+ // other objects convert with ToPrimitive's string hint: a toString or
3207
+ // valueOf of their own or of their prototypes, else "[object Object]".
2947
3208
  const marker = this.objGetLit(B, "%d", "%error");
2948
3209
  const isErr = B.tmp();
2949
3210
  B.line(`${isErr} = icmp ne ptr ${marker}, null`);
@@ -2951,8 +3212,21 @@ export class LlDyn {
2951
3212
  const lPlain = B.newLabel("ds.pl");
2952
3213
  B.condBr(isErr, lErr, lPlain);
2953
3214
  B.startBlock(lPlain);
2954
- this.puts(B, "%b", "[object Object]");
2955
- B.br(done);
3215
+ {
3216
+ // Null leaves the exception the conversion threw pending.
3217
+ host.declare(`declare ptr @scr_dyn_string_coerce_js(ptr)`);
3218
+ host.declare(`declare void @scr_str_release(ptr)`);
3219
+ const text = B.tmp();
3220
+ B.line(`${text} = call ptr @scr_dyn_string_coerce_js(ptr %d)`);
3221
+ const converted = B.tmp();
3222
+ B.line(`${converted} = icmp ne ptr ${text}, null`);
3223
+ const lPut = B.newLabel("ds.pp");
3224
+ B.condBr(converted, lPut, done);
3225
+ B.startBlock(lPut);
3226
+ this.putScrStr(B, "%b", text);
3227
+ B.line(`call void @scr_str_release(ptr ${text})`);
3228
+ B.br(done);
3229
+ }
2956
3230
  B.startBlock(lErr);
2957
3231
  // Error.prototype.toString, reading name and message through the
2958
3232
  // prototype. Null leaves the exception its conversion threw pending.
@@ -3062,6 +3336,7 @@ export class LlDyn {
3062
3336
  B.terminate(`ret ptr ${out}`);
3063
3337
  this.defs.push(`define internal ptr @${name}(ptr %d) ${FN_ATTRS} { ; String(unknown) -> owned (+1)`, B.render(), `}`, ``);
3064
3338
  }
3339
+ this.host.journalBuilt?.();
3065
3340
  return name;
3066
3341
  }
3067
3342
  /* ── caughtToDyn (walkers.ts, ported) ─────────────────────────── */
@@ -3072,6 +3347,7 @@ export class LlDyn {
3072
3347
  return this.caughtToDynFn;
3073
3348
  const name = "sc_cd";
3074
3349
  this.caughtToDynFn = name;
3350
+ this.host.journalAllocated?.(name, "dyn.caughtToDynHelper", []);
3075
3351
  const host = this.host;
3076
3352
  const B = new BlockBuilder();
3077
3353
  const kp = B.tmp();
@@ -3170,6 +3446,7 @@ export class LlDyn {
3170
3446
  B.terminate(`ret ptr ${e}`);
3171
3447
  }
3172
3448
  this.defs.push(`define internal ptr @${name}(ptr %c) ${FN_ATTRS} { ; caught -> unknown (+1, fresh tree)`, B.render(), `}`, ``);
3449
+ this.host.journalBuilt?.();
3173
3450
  return name;
3174
3451
  }
3175
3452
  /* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
@@ -3182,6 +3459,7 @@ export class LlDyn {
3182
3459
  this.helperMemo.set(name, name);
3183
3460
  const B = new BlockBuilder();
3184
3461
  const host = this.host;
3462
+ this.host.journalAllocated?.(name, "dyn.dynComputedKeyGetHelper", []);
3185
3463
  const stringHelper = this.dynKeyGetHelper();
3186
3464
  host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
3187
3465
  host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
@@ -3214,6 +3492,7 @@ export class LlDyn {
3214
3492
  B.line(`call void @scr_dyn_release(ptr ${key})`);
3215
3493
  B.terminate(`ret ptr ${value}`);
3216
3494
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
3495
+ this.host.journalBuilt?.();
3217
3496
  return name;
3218
3497
  }
3219
3498
  dynKeyGetHelper() {
@@ -3223,6 +3502,7 @@ export class LlDyn {
3223
3502
  return existing;
3224
3503
  const name = "sc_dyn_key_get";
3225
3504
  this.dynBuilders.set(memoKey, name);
3505
+ this.host.journalAllocated?.(name, "dyn.dynKeyGetHelper", []);
3226
3506
  const host = this.host;
3227
3507
  const B = new BlockBuilder();
3228
3508
  const kd = this.kindOf(B, "%d");
@@ -3601,6 +3881,7 @@ export class LlDyn {
3601
3881
  }
3602
3882
  retainUndef();
3603
3883
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %k, i1 zeroext %opt) ${FN_ATTRS} { ; d[k] on dyn`, B.render(), `}`, ``);
3884
+ this.host.journalBuilt?.();
3604
3885
  return name;
3605
3886
  }
3606
3887
  /* ── destructuring RequireObjectCoercible (ported) ─────────────────── */
@@ -3611,6 +3892,7 @@ export class LlDyn {
3611
3892
  return existing;
3612
3893
  const name = "sc_dyn_destr_check";
3613
3894
  this.dynBuilders.set(memoKey, name);
3895
+ this.host.journalAllocated?.(name, "dyn.dynDestrCheckHelper", []);
3614
3896
  const host = this.host;
3615
3897
  host.declare(`declare void @scr_jb_init(ptr)`);
3616
3898
  host.declare(`declare ptr @scr_jb_finish(ptr)`);
@@ -3660,6 +3942,7 @@ export class LlDyn {
3660
3942
  B.line(`call void @scr_throw_error(i32 1, ptr ${msg}) ; SCR_ERR_TYPE`);
3661
3943
  B.terminate(`ret void`);
3662
3944
  this.defs.push(`define internal void @${name}(ptr %d, ptr %spell, ptr %firstProp) ${FN_ATTRS} { ; destructuring RequireObjectCoercible`, B.render(), `}`, ``);
3945
+ this.host.journalBuilt?.();
3663
3946
  return name;
3664
3947
  }
3665
3948
  /* ── GetIterator + first-N steps (dynIterNHelper, ported) ──────────── */
@@ -3670,6 +3953,7 @@ export class LlDyn {
3670
3953
  return existing;
3671
3954
  const name = "sc_dyn_iter_n";
3672
3955
  this.dynBuilders.set(memoKey, name);
3956
+ this.host.journalAllocated?.(name, "dyn.dynIterNHelper", []);
3673
3957
  const host = this.host;
3674
3958
  host.declare(`declare ptr @scr_dyn_new_arr()`);
3675
3959
  host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
@@ -3864,12 +4148,38 @@ export class LlDyn {
3864
4148
  });
3865
4149
  B.terminate(`ret ptr ${out}`);
3866
4150
  this.defs.push(`define internal ptr @${name}(ptr %d, ${host.sizeType} %n, ptr %spelling) ${FN_ATTRS} { ; destructuring GetIterator + N steps`, B.render(), `}`, ``);
4151
+ this.host.journalBuilt?.();
3867
4152
  return name;
3868
4153
  }
3869
4154
  /* ── the checked-dynamic function boundary (ported) ────────────────── */
3870
4155
  /** The dyn argument spelling of one static value: dyn passes through
3871
4156
  * (+1), funcs box anonymously, everything else rides toDyn. `expr` is
3872
4157
  * BORROWED in every arm. Emits into the given builder. */
4158
+ /** A live capsule of a record or array value (+1; the value is
4159
+ * borrowed), as `dynFrom` with `liveRef` builds it; null for other
4160
+ * types. Closures boxed in a declaration-typed boundary program return
4161
+ * their records and arrays this way. */
4162
+ liveToDyn(B, t, expr) {
4163
+ const host = this.host;
4164
+ if (t.kind === "union") {
4165
+ const arms = host.unionsById.get(t.unionId)?.arms ?? [];
4166
+ if (!arms.some((arm) => arm.kind === "record" || arm.kind === "array"))
4167
+ return null;
4168
+ const boxed = B.tmp();
4169
+ B.line(`${boxed} = call ptr @${host.liveDynUnionRefAdapter(t)}(ptr ${expr})`);
4170
+ return boxed;
4171
+ }
4172
+ if ((t.kind !== "record" && t.kind !== "array") || !streamTypedRefEligible(t))
4173
+ return null;
4174
+ const key = typeKey(t);
4175
+ const adapter = host.liveDynRefAdapter(t);
4176
+ const rc = vAdapters(host, t);
4177
+ const boxed = B.tmp();
4178
+ 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})`);
4179
+ for (const line of bindLiveArrayOps(host, adapter, boxed))
4180
+ B.line(line);
4181
+ return boxed;
4182
+ }
3873
4183
  toDynExpr(B, t, expr) {
3874
4184
  if (t.kind === "dyn")
3875
4185
  return this.retainDyn(B, expr);
@@ -3893,6 +4203,7 @@ export class LlDyn {
3893
4203
  return existing;
3894
4204
  const name = `sc_dfk_${this.dynFuncThunks.size}`;
3895
4205
  this.dynFuncThunks.set(key, name);
4206
+ this.host.journalAllocated?.(name, "dyn.dynFuncThunkHelper", [t]);
3896
4207
  const host = this.host;
3897
4208
  const B = new BlockBuilder();
3898
4209
  const argNames = [];
@@ -3991,6 +4302,22 @@ export class LlDyn {
3991
4302
  B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
3992
4303
  });
3993
4304
  }, "ptr null");
4305
+ // Declaration-typed boundary programs: an argument package code
4306
+ // passes keeps its identity (scr_dyn_decl_adopt).
4307
+ const capsule = this.host.declBoundary?.() === true ? this.liveToDyn(B, p, a) : null;
4308
+ if (capsule !== null) {
4309
+ host.declare(`declare void @scr_dyn_decl_adopt(ptr, ptr)`);
4310
+ host.declare(`declare void @scr_dyn_release(ptr)`);
4311
+ B.line(`call void @scr_dyn_decl_adopt(ptr ${ad}, ptr ${capsule})`);
4312
+ B.line(`call void @scr_dyn_release(ptr ${capsule})`);
4313
+ this.pendingBail(B, "dfk.adopt", () => {
4314
+ t.params.slice(0, i + 1).forEach((q, j) => {
4315
+ const name = j === i ? a : argNames[j];
4316
+ if (isRefCounted(q))
4317
+ B.line(`call void ${releaseSym(host, q)}(ptr ${name})`);
4318
+ });
4319
+ }, "ptr null");
4320
+ }
3994
4321
  argNames.push(a);
3995
4322
  }
3996
4323
  });
@@ -4025,12 +4352,15 @@ export class LlDyn {
4025
4352
  const r = B.tmp();
4026
4353
  B.line(`${r} = call ${retTy} ${fn}(${callArgs})`);
4027
4354
  this.pendingBail(B, "dfkr", () => { }, "ptr null");
4028
- const out = this.toDynExpr(B, t.ret, r);
4355
+ const out = this.host.declBoundary?.() === true
4356
+ ? (this.liveToDyn(B, t.ret, r) ?? this.toDynExpr(B, t.ret, r))
4357
+ : this.toDynExpr(B, t.ret, r);
4029
4358
  if (isRefCounted(t.ret))
4030
4359
  B.line(`call void ${releaseSym(host, t.ret)}(ptr ${r})`);
4031
4360
  B.terminate(`ret ptr ${out}`);
4032
4361
  }
4033
4362
  this.defs.push(`define internal ptr @${name}(ptr %c, ptr %args, ${host.sizeType} %argc) ${FN_ATTRS} { ; dyn call thunk for ${key}`, B.render(), `}`, ``);
4363
+ this.host.journalBuilt?.();
4034
4364
  return name;
4035
4365
  }
4036
4366
  /** The box builder dynFrom emits for one closure signature. */
@@ -4041,12 +4371,294 @@ export class LlDyn {
4041
4371
  return existing;
4042
4372
  const name = `sc_dfb_${this.dynFuncBoxes.size}`;
4043
4373
  this.dynFuncBoxes.set(key, name);
4374
+ this.host.journalAllocated?.(name, "dyn.dynFuncBoxHelper", [t]);
4044
4375
  const host = this.host;
4045
4376
  const thunk = this.dynFuncThunkHelper(t);
4046
4377
  host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
4047
4378
  host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
4048
4379
  const sigLit = host.cstr(key);
4049
4380
  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`, `}`, ``);
4381
+ this.host.journalBuilt?.();
4382
+ return name;
4383
+ }
4384
+ /** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
4385
+ * closure registered as a 'message' listener (ScrDynMessageListener):
4386
+ * builds the closure's parameter from the message's nodes and calls the
4387
+ * closure. It answers false, without calling it, when the message does
4388
+ * not have the parameter's exact layout, and the listener then runs
4389
+ * through its thunk on the decoded message, as before. Null when the
4390
+ * signature's parameter has no message reader (messageReadable). */
4391
+ messageListenerHelper(t) {
4392
+ const key = typeKey(t);
4393
+ const existing = this.messageListeners.get(key);
4394
+ if (existing !== undefined)
4395
+ return existing;
4396
+ const param = t.params[0];
4397
+ const supported = t.params.length === 1 &&
4398
+ t.rest !== true &&
4399
+ param !== undefined &&
4400
+ (t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
4401
+ this.messageReadable(param, new Set());
4402
+ if (!supported) {
4403
+ // A signature without an entry still takes a number.
4404
+ this.messageListeners.set(key, null);
4405
+ this.host.journalAllocated?.("", "dyn.messageListenerHelper", [t]);
4406
+ this.host.journalBuilt?.();
4407
+ return null;
4408
+ }
4409
+ const name = `sc_dml_${this.messageListeners.size}`;
4410
+ this.messageListeners.set(key, name);
4411
+ this.host.journalAllocated?.(name, "dyn.messageListenerHelper", [t]);
4412
+ const B = new BlockBuilder();
4413
+ B.entryAllocas.push(`%fail = alloca i1`);
4414
+ B.line(`store i1 false, ptr %fail`);
4415
+ const value = B.tmp();
4416
+ B.line(`${value} = call ${this.valTy(param)} @${this.messageReaderHelper(param)}(ptr %m, ${this.host.sizeType} 0, ptr %fail)`);
4417
+ const failed = B.tmp();
4418
+ B.line(`${failed} = load i1, ptr %fail`);
4419
+ const lMiss = B.newLabel("dml.miss");
4420
+ const lCall = B.newLabel("dml.call");
4421
+ B.condBr(failed, lMiss, lCall);
4422
+ B.startBlock(lMiss);
4423
+ B.terminate(`ret i1 false`);
4424
+ B.startBlock(lCall);
4425
+ // The closure consumes its parameter; a pending exception stays for
4426
+ // the emitter, as after the thunk.
4427
+ const fnp = B.tmp();
4428
+ const fn = B.tmp();
4429
+ B.line(`${fnp} = getelementptr inbounds %ScrClosure, ptr %c, i64 0, i32 1`);
4430
+ B.line(`${fn} = load ptr, ptr ${fnp}`);
4431
+ const args = `ptr %c, ${this.valTy(param)} ${value}`;
4432
+ if (t.ret.kind === "void")
4433
+ B.line(`call void ${fn}(${args})`);
4434
+ else
4435
+ B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
4436
+ B.terminate(`ret i1 true`);
4437
+ this.defs.push(`define internal zeroext i1 @${name}(ptr %c, ptr %m) ${FN_ATTRS} { ; message entry for ${llvmCommentText(key)}`, B.render(), `}`, ``);
4438
+ this.host.journalBuilt?.();
4439
+ return name;
4440
+ }
4441
+ /** Whether a message reader can build T: numbers, booleans and strings;
4442
+ * records of them with only declared fields, none of union type; and
4443
+ * boxed unions of those arms and null or undefined without a literal
4444
+ * discriminator, with at most one number, boolean and string arm. */
4445
+ messageReadable(t, seen) {
4446
+ switch (t.kind) {
4447
+ case "f64":
4448
+ case "bool":
4449
+ case "string":
4450
+ return true;
4451
+ case "record": {
4452
+ const shape = this.host.recordsById.get(t.shapeId);
4453
+ if (!shape || shape.tuple || shape.indexValue || shape.fields.length === 0)
4454
+ return false;
4455
+ if (seen.has(t.shapeId) || this.isRecursiveShape(t))
4456
+ return false;
4457
+ seen.add(t.shapeId);
4458
+ const readable = shape.fields.every((f) => !f.name.startsWith("%") &&
4459
+ f.type.kind !== "union" &&
4460
+ llFieldType(f.type, this.host.inlineUnions.record(f.type)) !== INLINE_UNION_FIELD &&
4461
+ this.messageReadable(f.type, seen));
4462
+ seen.delete(t.shapeId);
4463
+ return readable;
4464
+ }
4465
+ case "union": {
4466
+ const def = this.host.unionsById.get(t.unionId);
4467
+ // A discriminated union's checked conversion also tests the arm's
4468
+ // literal discriminator, which the readers do not.
4469
+ if (!def || def.discriminant || this.host.nullableUnions.has(t.unionId))
4470
+ return false;
4471
+ const scalars = new Set();
4472
+ for (const arm of def.arms) {
4473
+ if (arm.kind === "nullT" || arm.kind === "undefinedT")
4474
+ continue;
4475
+ if (arm.kind === "f64" || arm.kind === "bool" || arm.kind === "string") {
4476
+ if (scalars.has(arm.kind))
4477
+ return false;
4478
+ scalars.add(arm.kind);
4479
+ continue;
4480
+ }
4481
+ if (arm.kind !== "record" || !this.messageReadable(arm, seen))
4482
+ return false;
4483
+ }
4484
+ return true;
4485
+ }
4486
+ default:
4487
+ return false;
4488
+ }
4489
+ }
4490
+ /** `sc_dmr_<n>(ptr message, size node, ptr fail) -> T`: T (+1) built
4491
+ * from a message node, for a type messageReadable accepts. Sets *fail
4492
+ * and returns a dummy when the node does not have T's layout: the arm
4493
+ * the checked conversion would choose, a record's declared keys in
4494
+ * declaration order and no others. */
4495
+ messageReaderHelper(t) {
4496
+ const key = typeKey(t);
4497
+ const existing = this.messageReaders.get(key);
4498
+ if (existing)
4499
+ return existing;
4500
+ const name = `sc_dmr_${this.messageReaders.size}`;
4501
+ this.messageReaders.set(key, name);
4502
+ this.host.journalAllocated?.(name, "dyn.messageReaderHelper", [t]);
4503
+ const host = this.host;
4504
+ const S = host.sizeType;
4505
+ if (t.kind !== "record")
4506
+ host.declare(`declare i32 @scr_message_kind(ptr, ${S})`);
4507
+ const retTy = this.valTy(t);
4508
+ const dummy = retTy === "double" ? f64Lit(0) : retTy === "i1" ? "false" : "null";
4509
+ const B = new BlockBuilder();
4510
+ const lFail = B.newLabel("dmr.fail");
4511
+ // scr_message_fields tests a record's kind itself.
4512
+ const kind = B.tmp();
4513
+ if (t.kind !== "record")
4514
+ B.line(`${kind} = call i32 @scr_message_kind(ptr %m, ${S} %n)`);
4515
+ const requireKind = (want) => {
4516
+ const ok = B.tmp();
4517
+ B.line(`${ok} = icmp eq i32 ${kind}, ${want}`);
4518
+ const lOk = B.newLabel("dmr.kind");
4519
+ B.condBr(ok, lOk, lFail);
4520
+ B.startBlock(lOk);
4521
+ };
4522
+ switch (t.kind) {
4523
+ case "f64":
4524
+ case "bool": {
4525
+ host.declare(`declare double @scr_message_number(ptr, ${S})`);
4526
+ requireKind(t.kind === "f64" ? MESSAGE_KIND.NUMBER : MESSAGE_KIND.BOOL);
4527
+ const n = B.tmp();
4528
+ B.line(`${n} = call double @scr_message_number(ptr %m, ${S} %n)`);
4529
+ if (t.kind === "f64")
4530
+ B.terminate(`ret double ${n}`);
4531
+ else {
4532
+ const b = B.tmp();
4533
+ B.line(`${b} = fcmp une double ${n}, ${f64Lit(0)}`);
4534
+ B.terminate(`ret i1 ${b}`);
4535
+ }
4536
+ break;
4537
+ }
4538
+ case "string": {
4539
+ host.declare(`declare ptr @scr_message_string(ptr, ${S})`);
4540
+ requireKind(MESSAGE_KIND.STRING);
4541
+ const str = B.tmp();
4542
+ B.line(`${str} = call ptr @scr_message_string(ptr %m, ${S} %n)`);
4543
+ B.terminate(`ret ptr ${str}`);
4544
+ break;
4545
+ }
4546
+ case "record": {
4547
+ const shape = host.recordsById.get(t.shapeId);
4548
+ const order = recordSourceFieldOrder(shape);
4549
+ const fields = new Map(shape.fields.map((f, i) => [f.name, { field: f, index: i }]));
4550
+ const base = host.nullableUnions.fieldBase(t.shapeId);
4551
+ const struct = mangleRecordStruct(t.shapeId);
4552
+ const names = this.recordNameTable(t.shapeId, shape);
4553
+ host.declare(`declare zeroext i1 @scr_message_fields(ptr, ${S}, ptr, ptr, ${S}, ptr)`);
4554
+ B.entryAllocas.push(`%kids = alloca [${order.length} x ${S}]`);
4555
+ const matched = B.tmp();
4556
+ B.line(`${matched} = call zeroext i1 @scr_message_fields(ptr %m, ${S} %n, ptr ${names.names}, ptr ${names.lens}, ${S} ${order.length}, ptr %kids)`);
4557
+ const lBuild = B.newLabel("dmr.build");
4558
+ B.condBr(matched, lBuild, lFail);
4559
+ B.startBlock(lBuild);
4560
+ B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
4561
+ order.forEach((fieldName, i) => {
4562
+ const { field, index } = fields.get(fieldName);
4563
+ const kidp = B.tmp();
4564
+ const kid = B.tmp();
4565
+ B.line(`${kidp} = getelementptr inbounds [${order.length} x ${S}], ptr %kids, i64 0, i64 ${i}`);
4566
+ B.line(`${kid} = load ${S}, ptr ${kidp}`);
4567
+ const v = B.tmp();
4568
+ B.line(`${v} = call ${this.valTy(field.type)} @${this.messageReaderHelper(field.type)}(ptr %m, ${S} ${kid}, ptr %fail)`);
4569
+ const failed = B.tmp();
4570
+ B.line(`${failed} = load i1, ptr %fail`);
4571
+ const lDrop = B.newLabel("dmr.drop");
4572
+ const lStore = B.newLabel("dmr.store");
4573
+ B.condBr(failed, lDrop, lStore);
4574
+ B.startBlock(lDrop);
4575
+ B.line(`call void ${releaseSym(host, t)}(ptr %r0)`);
4576
+ B.terminate(`ret ptr null`);
4577
+ B.startBlock(lStore);
4578
+ const p = B.tmp();
4579
+ B.line(`${p} = getelementptr inbounds %${struct}, ptr %r0, i64 0, i32 ${index + base} ; .${llvmCommentText(fieldName)}`);
4580
+ const fieldTy = llFieldType(field.type, host.inlineUnions.record(field.type));
4581
+ if (fieldTy === "i8") {
4582
+ const z = B.tmp();
4583
+ B.line(`${z} = zext i1 ${v} to i8`);
4584
+ B.line(`store i8 ${z}, ptr ${p}`);
4585
+ }
4586
+ else {
4587
+ B.line(`store ${fieldTy} ${v}, ptr ${p}`);
4588
+ }
4589
+ });
4590
+ B.terminate(`ret ptr %r0`);
4591
+ break;
4592
+ }
4593
+ case "union": {
4594
+ const def = host.unionsById.get(t.unionId);
4595
+ def.arms.forEach((arm, i) => {
4596
+ const lNext = B.newLabel("dmr.next");
4597
+ if (arm.kind === "nullT" || arm.kind === "undefinedT") {
4598
+ const hit = B.tmp();
4599
+ B.line(`${hit} = icmp eq i32 ${kind}, ${arm.kind === "nullT" ? MESSAGE_KIND.NULL : MESSAGE_KIND.UNDEFINED}`);
4600
+ const lHit = B.newLabel("dmr.unit");
4601
+ B.condBr(hit, lHit, lNext);
4602
+ B.startBlock(lHit);
4603
+ B.terminate(`ret ptr ${host.unitInstanceRef(t.unionId, i)}`);
4604
+ B.startBlock(lNext);
4605
+ return;
4606
+ }
4607
+ if (arm.kind !== "record") {
4608
+ const want = arm.kind === "f64"
4609
+ ? MESSAGE_KIND.NUMBER
4610
+ : arm.kind === "bool"
4611
+ ? MESSAGE_KIND.BOOL
4612
+ : MESSAGE_KIND.STRING;
4613
+ const hit = B.tmp();
4614
+ B.line(`${hit} = icmp eq i32 ${kind}, ${want}`);
4615
+ const lHit = B.newLabel("dmr.arm");
4616
+ B.condBr(hit, lHit, lNext);
4617
+ B.startBlock(lHit);
4618
+ }
4619
+ // A record arm that does not match leaves *fail clear for the
4620
+ // next arm, like the checked conversion's next-arm match.
4621
+ const v = B.tmp();
4622
+ B.line(`${v} = call ${this.valTy(arm)} @${this.messageReaderHelper(arm)}(ptr %m, ${S} %n, ptr %fail)`);
4623
+ if (arm.kind === "record") {
4624
+ const failed = B.tmp();
4625
+ B.line(`${failed} = load i1, ptr %fail`);
4626
+ const lHit = B.newLabel("dmr.arm");
4627
+ const lMiss = B.newLabel("dmr.miss");
4628
+ B.condBr(failed, lMiss, lHit);
4629
+ B.startBlock(lMiss);
4630
+ B.line(`store i1 false, ptr %fail`);
4631
+ B.br(lNext);
4632
+ B.startBlock(lHit);
4633
+ }
4634
+ const u = B.tmp();
4635
+ if (arm.kind === "f64") {
4636
+ host.declare(`declare ptr @scr_union_new_f64(i32, double)`);
4637
+ B.line(`${u} = call ptr @scr_union_new_f64(i32 ${i}, double ${v})`);
4638
+ }
4639
+ else if (arm.kind === "bool") {
4640
+ host.declare(`declare ptr @scr_union_new_bool(i32, i1 zeroext)`);
4641
+ B.line(`${u} = call ptr @scr_union_new_bool(i32 ${i}, i1 ${v})`);
4642
+ }
4643
+ else {
4644
+ const rc = vAdapters(host, arm);
4645
+ host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
4646
+ B.line(`${u} = call ptr @scr_union_new_ref(i32 ${i}, ptr ${v}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, arm)})`);
4647
+ }
4648
+ B.terminate(`ret ptr ${u}`);
4649
+ B.startBlock(lNext);
4650
+ });
4651
+ B.br(lFail);
4652
+ break;
4653
+ }
4654
+ default:
4655
+ throw new InternalCompilerError(`llvm emitter bug: message reader of ${key}`);
4656
+ }
4657
+ B.startBlock(lFail);
4658
+ B.line(`store i1 true, ptr %fail`);
4659
+ B.terminate(`ret ${retTy} ${dummy}`);
4660
+ 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(), `}`, ``);
4661
+ this.host.journalBuilt?.();
4050
4662
  return name;
4051
4663
  }
4052
4664
  /** The adapter closure body for one TARGET signature: caps[0] is an
@@ -4058,6 +4670,7 @@ export class LlDyn {
4058
4670
  return existing;
4059
4671
  const name = `sc_dfa_${this.dynFuncAdapters.size}`;
4060
4672
  this.dynFuncAdapters.set(key, name);
4673
+ this.host.journalAllocated?.(name, "dyn.dynFuncAdapterHelper", [t]);
4061
4674
  const host = this.host;
4062
4675
  const B = new BlockBuilder();
4063
4676
  host.declare(`declare ptr @scr_box_get_ref(ptr)`);
@@ -4152,6 +4765,7 @@ export class LlDyn {
4152
4765
  ...(checkedRest ? ["ptr %rest"] : []),
4153
4766
  ].join(", ");
4154
4767
  this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(${params}) ${FN_ATTRS} { ; dyn fn adapter to ${key}`, B.render(), `}`, ``);
4768
+ this.host.journalBuilt?.();
4155
4769
  return name;
4156
4770
  }
4157
4771
  }