@scriptc/compiler 0.4.2 → 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 (636) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +397 -37
  2. package/dist/backend/cycle-analysis.d.ts +4 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +21 -9
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +473 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +258 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  58. package/dist/backend/llvm/dense-array-access.js +222 -52
  59. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  61. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  63. package/dist/backend/llvm/dense-array-loops.js +194 -5
  64. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  66. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  67. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  68. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn.d.ts +26 -0
  70. package/dist/backend/llvm/dyn.js +352 -61
  71. package/dist/backend/llvm/dyn.js.map +1 -1
  72. package/dist/backend/llvm/emit-function.js +11 -20
  73. package/dist/backend/llvm/emit-function.js.map +1 -1
  74. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  75. package/dist/backend/llvm/emit-journal.js +170 -0
  76. package/dist/backend/llvm/emit-journal.js.map +1 -0
  77. package/dist/backend/llvm/emit-module.js +195 -27
  78. package/dist/backend/llvm/emit-module.js.map +1 -1
  79. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  80. package/dist/backend/llvm/emit-statements.js +268 -84
  81. package/dist/backend/llvm/emit-statements.js.map +1 -1
  82. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  83. package/dist/backend/llvm/emitter-state.js +14 -0
  84. package/dist/backend/llvm/emitter-state.js.map +1 -0
  85. package/dist/backend/llvm/emitter.d.ts +176 -37
  86. package/dist/backend/llvm/emitter.js +724 -85
  87. package/dist/backend/llvm/emitter.js.map +1 -1
  88. package/dist/backend/llvm/emitter.test.js +54 -5
  89. package/dist/backend/llvm/emitter.test.js.map +1 -1
  90. package/dist/backend/llvm/expr-bytes.js +34 -12
  91. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  92. package/dist/backend/llvm/expr-callbacks.js +47 -0
  93. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  94. package/dist/backend/llvm/expr-calls.js +28 -14
  95. package/dist/backend/llvm/expr-calls.js.map +1 -1
  96. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  97. package/dist/backend/llvm/expr-containers.js +129 -37
  98. package/dist/backend/llvm/expr-containers.js.map +1 -1
  99. package/dist/backend/llvm/expr-context.d.ts +14 -0
  100. package/dist/backend/llvm/expr-dynamic.js +18 -11
  101. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +100 -28
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  105. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  106. package/dist/backend/llvm/expr-records.d.ts +12 -0
  107. package/dist/backend/llvm/expr-records.js +106 -0
  108. package/dist/backend/llvm/expr-records.js.map +1 -1
  109. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  110. package/dist/backend/llvm/expr-stream-bridges.js +194 -65
  111. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  115. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  118. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  119. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  120. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  121. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  122. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  123. package/dist/backend/llvm/integer-values.d.ts +20 -1
  124. package/dist/backend/llvm/integer-values.js +71 -0
  125. package/dist/backend/llvm/integer-values.js.map +1 -1
  126. package/dist/backend/llvm/js-ic.d.ts +1 -1
  127. package/dist/backend/llvm/js-ic.js +1 -1
  128. package/dist/backend/llvm/js-ic.js.map +1 -1
  129. package/dist/backend/llvm/key-orders.d.ts +7 -0
  130. package/dist/backend/llvm/key-orders.js +33 -0
  131. package/dist/backend/llvm/key-orders.js.map +1 -0
  132. package/dist/backend/llvm/lib-connect.js +4 -0
  133. package/dist/backend/llvm/lib-connect.js.map +1 -1
  134. package/dist/backend/llvm/lib-datagram.js +11 -0
  135. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  136. package/dist/backend/llvm/lib-dispatch.js +80 -2
  137. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  138. package/dist/backend/llvm/lib-filesystem.js +4 -4
  139. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  140. package/dist/backend/llvm/lib-http2.js +4 -0
  141. package/dist/backend/llvm/lib-http2.js.map +1 -1
  142. package/dist/backend/llvm/lib-lookup.js +16 -6
  143. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  144. package/dist/backend/llvm/lib-shared.js +73 -2
  145. package/dist/backend/llvm/lib-shared.js.map +1 -1
  146. package/dist/backend/llvm/lib-stream.js +35 -5
  147. package/dist/backend/llvm/lib-stream.js.map +1 -1
  148. package/dist/backend/llvm/local-array-reads.js +115 -19
  149. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  150. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  151. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  152. package/dist/backend/llvm/loop-state.d.ts +33 -0
  153. package/dist/backend/llvm/loop-state.js +42 -0
  154. package/dist/backend/llvm/loop-state.js.map +1 -0
  155. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  156. package/dist/backend/llvm/map-number-lookup.js +91 -31
  157. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  158. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  159. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  160. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  161. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  162. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  163. package/dist/backend/llvm/nullable-unions.js +15 -3
  164. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  165. package/dist/backend/llvm/publish.d.ts +10 -0
  166. package/dist/backend/llvm/publish.js +12 -0
  167. package/dist/backend/llvm/publish.js.map +1 -1
  168. package/dist/backend/llvm/receivers.js +6 -1
  169. package/dist/backend/llvm/receivers.js.map +1 -1
  170. package/dist/backend/llvm/record-results.d.ts +1 -9
  171. package/dist/backend/llvm/record-results.js +2 -11
  172. package/dist/backend/llvm/record-results.js.map +1 -1
  173. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  174. package/dist/backend/llvm/reference-writes.js +89 -72
  175. package/dist/backend/llvm/reference-writes.js.map +1 -1
  176. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  177. package/dist/backend/llvm/running-extrema.js +115 -0
  178. package/dist/backend/llvm/running-extrema.js.map +1 -0
  179. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  180. package/dist/backend/llvm/running-extrema.test.js +89 -0
  181. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  182. package/dist/backend/llvm/shapes.d.ts +71 -15
  183. package/dist/backend/llvm/shapes.js +222 -33
  184. package/dist/backend/llvm/shapes.js.map +1 -1
  185. package/dist/backend/llvm/shapes.test.js +53 -7
  186. package/dist/backend/llvm/shapes.test.js.map +1 -1
  187. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  188. package/dist/backend/llvm/speculative-integers.js +2 -2
  189. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  190. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  191. package/dist/backend/llvm/stack-objects.js +5 -2
  192. package/dist/backend/llvm/stack-objects.js.map +1 -1
  193. package/dist/backend/llvm/string-reads.d.ts +12 -0
  194. package/dist/backend/llvm/string-reads.js +44 -0
  195. package/dist/backend/llvm/string-reads.js.map +1 -1
  196. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  197. package/dist/backend/llvm/walk-borrows.js +46 -41
  198. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  199. package/dist/backend/llvm/walkers.d.ts +3 -0
  200. package/dist/backend/llvm/walkers.js +88 -65
  201. package/dist/backend/llvm/walkers.js.map +1 -1
  202. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  203. package/dist/backend/llvm/wrapping-sums.js +126 -0
  204. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  205. package/dist/backend/may-throw.d.ts +8 -10
  206. package/dist/backend/may-throw.js +14 -10
  207. package/dist/backend/may-throw.js.map +1 -1
  208. package/dist/backend/native/contracts.d.ts +5 -0
  209. package/dist/backend/native/executable.js +7 -0
  210. package/dist/backend/native/executable.js.map +1 -1
  211. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  212. package/dist/backend/native/runtime-inputs.js +1 -0
  213. package/dist/backend/native/runtime-inputs.js.map +1 -1
  214. package/dist/backend/native-link-info-core.d.ts +4 -0
  215. package/dist/backend/native-link-info-core.js.map +1 -1
  216. package/dist/backend/publication.d.ts +12 -1
  217. package/dist/backend/publication.js +37 -14
  218. package/dist/backend/publication.js.map +1 -1
  219. package/dist/backend/publication.test.js +30 -0
  220. package/dist/backend/publication.test.js.map +1 -1
  221. package/dist/backend/result-slots.d.ts +16 -0
  222. package/dist/backend/result-slots.js +23 -0
  223. package/dist/backend/result-slots.js.map +1 -0
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +1 -0
  227. package/dist/backend/runtime-pack-core.js +1 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +2 -1
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.test.js +2 -1
  232. package/dist/backend/runtime-pack.test.js.map +1 -1
  233. package/dist/backend/stack-observations.d.ts +2 -1
  234. package/dist/backend/stack-observations.js +67 -42
  235. package/dist/backend/stack-observations.js.map +1 -1
  236. package/dist/backend/target-diagnostics.js +5 -3
  237. package/dist/backend/target-diagnostics.js.map +1 -1
  238. package/dist/backend/warm-cache.js +1 -0
  239. package/dist/backend/warm-cache.js.map +1 -1
  240. package/dist/cli/usage.d.ts +1 -1
  241. package/dist/cli/usage.js +3 -3
  242. package/dist/compat/fetch-profile.js +1 -1
  243. package/dist/compat/fetch-profile.js.map +1 -1
  244. package/dist/contracts/check.js +4 -3
  245. package/dist/contracts/check.js.map +1 -1
  246. package/dist/contracts/int32-elements.js +10 -2
  247. package/dist/contracts/int32-elements.js.map +1 -1
  248. package/dist/coverage/report.js +12 -3
  249. package/dist/coverage/report.js.map +1 -1
  250. package/dist/diagnostics/diagnostic.d.ts +4 -0
  251. package/dist/diagnostics/diagnostic.js.map +1 -1
  252. package/dist/diagnostics/envelope.d.ts +3 -0
  253. package/dist/diagnostics/envelope.js +1 -0
  254. package/dist/diagnostics/envelope.js.map +1 -1
  255. package/dist/executable/executable-cache.d.ts +2 -0
  256. package/dist/executable/executable-cache.js +1 -0
  257. package/dist/executable/executable-cache.js.map +1 -1
  258. package/dist/executable/executable-cache.test.js +1 -0
  259. package/dist/executable/executable-cache.test.js.map +1 -1
  260. package/dist/frontend/decl-projection.d.ts +41 -0
  261. package/dist/frontend/decl-projection.js +854 -0
  262. package/dist/frontend/decl-projection.js.map +1 -0
  263. package/dist/frontend/decl-projection.test.d.ts +1 -0
  264. package/dist/frontend/decl-projection.test.js +30 -0
  265. package/dist/frontend/decl-projection.test.js.map +1 -0
  266. package/dist/frontend/dts-paths.d.ts +15 -0
  267. package/dist/frontend/dts-paths.js +25 -0
  268. package/dist/frontend/dts-paths.js.map +1 -1
  269. package/dist/frontend/input-tracker.d.ts +6 -0
  270. package/dist/frontend/input-tracker.js +51 -28
  271. package/dist/frontend/input-tracker.js.map +1 -1
  272. package/dist/frontend/input-tracker.test.js +19 -0
  273. package/dist/frontend/input-tracker.test.js.map +1 -1
  274. package/dist/frontend/lowering/array-values.js +100 -2
  275. package/dist/frontend/lowering/array-values.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  277. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  279. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/crypto.js +84 -9
  281. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  283. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  284. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  285. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  286. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  288. package/dist/frontend/lowering/builtins/promises.js +88 -2
  289. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  290. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  291. package/dist/frontend/lowering/builtins/readline.js +35 -3
  292. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/url.js +24 -1
  294. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  295. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  296. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  297. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  298. package/dist/frontend/lowering/class-callbacks.js +82 -12
  299. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  300. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  301. package/dist/frontend/lowering/class-construction.js +17 -3
  302. package/dist/frontend/lowering/class-construction.js.map +1 -1
  303. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +39 -2
  304. package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -108
  305. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  306. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  307. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  308. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  309. package/dist/frontend/lowering/class-iterables.js +9 -1
  310. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  311. package/dist/frontend/lowering/class-method-mutations.js +32 -9
  312. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  313. package/dist/frontend/lowering/class-prototypes.js +31 -2
  314. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  315. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  316. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  317. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  318. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  319. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  320. package/dist/frontend/lowering/coercions/structural.js +91 -1
  321. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  322. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  323. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  324. package/dist/frontend/lowering/containers/array-callbacks.js +338 -18
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  327. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  328. package/dist/frontend/lowering/containers/array-methods.js +15 -0
  329. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  330. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  331. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  332. package/dist/frontend/lowering/containers/bytes.js +2 -1
  333. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  334. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  335. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  336. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  337. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  338. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  339. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  340. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  341. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  342. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  343. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  344. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  345. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  346. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  347. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  348. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  349. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  350. package/dist/frontend/lowering/divergences.js +9 -1
  351. package/dist/frontend/lowering/divergences.js.map +1 -1
  352. package/dist/frontend/lowering/error-methods.js +47 -2
  353. package/dist/frontend/lowering/error-methods.js.map +1 -1
  354. package/dist/frontend/lowering/expressions/array-literals.js +47 -0
  355. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  356. package/dist/frontend/lowering/expressions/binary.js +36 -2
  357. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  358. package/dist/frontend/lowering/expressions/element-access.js +90 -13
  359. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  360. package/dist/frontend/lowering/expressions/identifiers.js +33 -4
  361. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  362. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  363. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  364. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  365. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  366. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  367. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  368. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  369. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  370. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  371. package/dist/frontend/lowering/expressions/property-access.js +113 -11
  372. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  373. package/dist/frontend/lowering/expressions/relational.js +212 -33
  374. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  375. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  376. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  377. package/dist/frontend/lowering/expressions/updates.js +22 -3
  378. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  379. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  380. package/dist/frontend/lowering/frozen-records.js +322 -0
  381. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  382. package/dist/frontend/lowering/function-returns.js +49 -0
  383. package/dist/frontend/lowering/function-returns.js.map +1 -1
  384. package/dist/frontend/lowering/generic-functions.js +7 -2
  385. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  386. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  387. package/dist/frontend/lowering/iterable-values.js +297 -0
  388. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  389. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  390. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  391. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  392. package/dist/frontend/lowering/js-class-fields.js +45 -10
  393. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  394. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  395. package/dist/frontend/lowering/key-order-witness.js +770 -22
  396. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  397. package/dist/frontend/lowering/key-order-witness.test.js +428 -8
  398. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  399. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  400. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  401. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  402. package/dist/frontend/lowering/lower-calls.js +443 -41
  403. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  404. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  405. package/dist/frontend/lowering/lower-classes.js +302 -22
  406. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  407. package/dist/frontend/lowering/lower-dgram.js +3 -1
  408. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  409. package/dist/frontend/lowering/lower-exprs.js +10 -2
  410. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  411. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  412. package/dist/frontend/lowering/lower-functions.js +83 -0
  413. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  414. package/dist/frontend/lowering/lower-generators.js +41 -31
  415. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  416. package/dist/frontend/lowering/lower-global-value.js +6 -3
  417. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  418. package/dist/frontend/lowering/lower-inspect.js +18 -6
  419. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  420. package/dist/frontend/lowering/lower-modules.js +32 -0
  421. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  422. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  423. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  424. package/dist/frontend/lowering/lower-server.js +2 -2
  425. package/dist/frontend/lowering/lower-server.js.map +1 -1
  426. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  427. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  428. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  429. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  430. package/dist/frontend/lowering/lower-stmts.js +454 -48
  431. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  432. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  433. package/dist/frontend/lowering/lower-stream.js +1483 -156
  434. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  435. package/dist/frontend/lowering/lowerer.d.ts +77 -6
  436. package/dist/frontend/lowering/lowerer.js +313 -29
  437. package/dist/frontend/lowering/lowerer.js.map +1 -1
  438. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  439. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  440. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  441. package/dist/frontend/lowering/new-target.d.ts +12 -0
  442. package/dist/frontend/lowering/new-target.js +280 -0
  443. package/dist/frontend/lowering/new-target.js.map +1 -0
  444. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  445. package/dist/frontend/lowering/surfaces.js +18 -6
  446. package/dist/frontend/lowering/surfaces.js.map +1 -1
  447. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  448. package/dist/frontend/lowering/undefined-index.js +82 -0
  449. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  450. package/dist/frontend/lowering/var-hoisting.js +29 -13
  451. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  452. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  453. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  454. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  455. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  456. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  457. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  458. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  459. package/dist/frontend/npm-static.js +4 -20
  460. package/dist/frontend/npm-static.js.map +1 -1
  461. package/dist/frontend/package-shims.d.ts +3 -0
  462. package/dist/frontend/package-shims.js +71 -8
  463. package/dist/frontend/package-shims.js.map +1 -1
  464. package/dist/frontend/pipeline.js +18 -10
  465. package/dist/frontend/pipeline.js.map +1 -1
  466. package/dist/frontend/process-fork.d.ts +25 -0
  467. package/dist/frontend/process-fork.js +2 -0
  468. package/dist/frontend/process-fork.js.map +1 -0
  469. package/dist/frontend/program.d.ts +8 -1
  470. package/dist/frontend/program.js +484 -69
  471. package/dist/frontend/program.js.map +1 -1
  472. package/dist/frontend/program.test.js +43 -3
  473. package/dist/frontend/program.test.js.map +1 -1
  474. package/dist/frontend/token-equivalence.d.ts +3 -0
  475. package/dist/frontend/token-equivalence.js +409 -0
  476. package/dist/frontend/token-equivalence.js.map +1 -0
  477. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  478. package/dist/frontend/token-equivalence.test.js +67 -0
  479. package/dist/frontend/token-equivalence.test.js.map +1 -0
  480. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  481. package/dist/frontend/ts7/ast-node.js +1048 -103
  482. package/dist/frontend/ts7/ast-node.js.map +1 -1
  483. package/dist/frontend/ts7/ast-node.test.js +24 -0
  484. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  485. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  486. package/dist/frontend/ts7/ast-wire.js +34 -24
  487. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  488. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  489. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  490. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  491. package/dist/frontend/ts7/checker-backend.js +2 -2
  492. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  493. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  494. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  495. package/dist/frontend/ts7/checker.d.ts +4 -0
  496. package/dist/frontend/ts7/checker.js +7 -0
  497. package/dist/frontend/ts7/checker.js.map +1 -1
  498. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  499. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  500. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  501. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  502. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  503. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  504. package/dist/frontend/ts7/program-host.d.ts +7 -0
  505. package/dist/frontend/ts7/program-host.js +25 -2
  506. package/dist/frontend/ts7/program-host.js.map +1 -1
  507. package/dist/frontend/ts7/session.d.ts +14 -1
  508. package/dist/frontend/ts7/session.js +22 -0
  509. package/dist/frontend/ts7/session.js.map +1 -1
  510. package/dist/frontend/type-mapper.d.ts +13 -1
  511. package/dist/frontend/type-mapper.js +191 -11
  512. package/dist/frontend/type-mapper.js.map +1 -1
  513. package/dist/index.d.ts +0 -5
  514. package/dist/index.js +34 -4
  515. package/dist/index.js.map +1 -1
  516. package/dist/ir/analysis.js +5 -3
  517. package/dist/ir/analysis.js.map +1 -1
  518. package/dist/ir/array-length-stability.d.ts +4 -0
  519. package/dist/ir/array-length-stability.js +19 -6
  520. package/dist/ir/array-length-stability.js.map +1 -1
  521. package/dist/ir/array-length-stability.test.js +24 -0
  522. package/dist/ir/array-length-stability.test.js.map +1 -1
  523. package/dist/ir/builtin-effects.d.ts +7 -0
  524. package/dist/ir/builtin-effects.js +52 -0
  525. package/dist/ir/builtin-effects.js.map +1 -1
  526. package/dist/ir/builtin-signatures.d.ts +6 -4
  527. package/dist/ir/builtin-signatures.js +166 -13
  528. package/dist/ir/builtin-signatures.js.map +1 -1
  529. package/dist/ir/callback-specialization.d.ts +2 -1
  530. package/dist/ir/callback-specialization.js +23 -18
  531. package/dist/ir/callback-specialization.js.map +1 -1
  532. package/dist/ir/char-unit-locals.d.ts +19 -0
  533. package/dist/ir/char-unit-locals.js +185 -0
  534. package/dist/ir/char-unit-locals.js.map +1 -0
  535. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  536. package/dist/ir/char-unit-locals.test.js +94 -0
  537. package/dist/ir/char-unit-locals.test.js.map +1 -0
  538. package/dist/ir/final-fields.d.ts +2 -1
  539. package/dist/ir/final-fields.js +14 -16
  540. package/dist/ir/final-fields.js.map +1 -1
  541. package/dist/ir/function-references.d.ts +2 -0
  542. package/dist/ir/function-references.js +2 -0
  543. package/dist/ir/function-references.js.map +1 -1
  544. package/dist/ir/function-references.test.js +3 -0
  545. package/dist/ir/function-references.test.js.map +1 -1
  546. package/dist/ir/initializer-bindings.d.ts +2 -1
  547. package/dist/ir/initializer-bindings.js +27 -20
  548. package/dist/ir/initializer-bindings.js.map +1 -1
  549. package/dist/ir/int32-arrays.d.ts +108 -0
  550. package/dist/ir/int32-arrays.js +831 -0
  551. package/dist/ir/int32-arrays.js.map +1 -0
  552. package/dist/ir/int32-slots.d.ts +24 -2
  553. package/dist/ir/int32-slots.js +259 -57
  554. package/dist/ir/int32-slots.js.map +1 -1
  555. package/dist/ir/integer-loops.d.ts +3 -3
  556. package/dist/ir/integer-loops.js +14 -6
  557. package/dist/ir/integer-loops.js.map +1 -1
  558. package/dist/ir/integer-loops.test.js +10 -0
  559. package/dist/ir/integer-loops.test.js.map +1 -1
  560. package/dist/ir/integer-ranges.d.ts +5 -0
  561. package/dist/ir/integer-ranges.js +125 -12
  562. package/dist/ir/integer-ranges.js.map +1 -1
  563. package/dist/ir/integer-ranges.test.js +30 -0
  564. package/dist/ir/integer-ranges.test.js.map +1 -1
  565. package/dist/ir/ir.d.ts +70 -7
  566. package/dist/ir/ir.js +58 -1
  567. package/dist/ir/ir.js.map +1 -1
  568. package/dist/ir/ir.test.js +21 -1
  569. package/dist/ir/ir.test.js.map +1 -1
  570. package/dist/ir/js-ic.d.ts +19 -2
  571. package/dist/ir/js-ic.js +95 -11
  572. package/dist/ir/js-ic.js.map +1 -1
  573. package/dist/ir/js-ic.test.js +188 -0
  574. package/dist/ir/js-ic.test.js.map +1 -1
  575. package/dist/ir/node-index.d.ts +57 -0
  576. package/dist/ir/node-index.js +215 -0
  577. package/dist/ir/node-index.js.map +1 -0
  578. package/dist/ir/paired-while-loops.d.ts +25 -0
  579. package/dist/ir/paired-while-loops.js +335 -0
  580. package/dist/ir/paired-while-loops.js.map +1 -0
  581. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  582. package/dist/ir/paired-while-loops.test.js +163 -0
  583. package/dist/ir/paired-while-loops.test.js.map +1 -0
  584. package/dist/ir/parameter-versions.d.ts +25 -0
  585. package/dist/ir/parameter-versions.js +300 -0
  586. package/dist/ir/parameter-versions.js.map +1 -0
  587. package/dist/ir/runtime-features.d.ts +34 -13
  588. package/dist/ir/runtime-features.js +152 -38
  589. package/dist/ir/runtime-features.js.map +1 -1
  590. package/dist/ir/serialize.d.ts +12 -2
  591. package/dist/ir/serialize.js +16 -3
  592. package/dist/ir/serialize.js.map +1 -1
  593. package/dist/ir/serialize.test.js +17 -0
  594. package/dist/ir/serialize.test.js.map +1 -1
  595. package/dist/ir/traverse.js +18 -6
  596. package/dist/ir/traverse.js.map +1 -1
  597. package/dist/ir/validate.js +122 -36
  598. package/dist/ir/validate.js.map +1 -1
  599. package/dist/library/ir-policy.js +2 -0
  600. package/dist/library/ir-policy.js.map +1 -1
  601. package/dist/native/cache.d.ts +6 -1
  602. package/dist/native/cache.js +28 -5
  603. package/dist/native/cache.js.map +1 -1
  604. package/dist/native/cache.test.js +16 -2
  605. package/dist/native/cache.test.js.map +1 -1
  606. package/dist/native/cli.js +21 -1
  607. package/dist/native/cli.js.map +1 -1
  608. package/dist/native/compiler.js +8 -6
  609. package/dist/native/compiler.js.map +1 -1
  610. package/dist/native/executable-cache.d.ts +1 -1
  611. package/dist/native/executable-cache.js +2 -2
  612. package/dist/native/executable-cache.js.map +1 -1
  613. package/dist/native/prepare.d.ts +3 -1
  614. package/dist/native/prepare.js +119 -31
  615. package/dist/native/prepare.js.map +1 -1
  616. package/dist/native/prepare.test.js +78 -18
  617. package/dist/native/prepare.test.js.map +1 -1
  618. package/dist/native/sanitizer.test.js +2 -0
  619. package/dist/native/sanitizer.test.js.map +1 -1
  620. package/dist/native/text-file.d.ts +13 -3
  621. package/dist/native/text-file.js +63 -9
  622. package/dist/native/text-file.js.map +1 -1
  623. package/dist/native/text-file.test.d.ts +1 -0
  624. package/dist/native/text-file.test.js +49 -0
  625. package/dist/native/text-file.test.js.map +1 -0
  626. package/dist/native/toolchain.js +4 -4
  627. package/dist/native/toolchain.js.map +1 -1
  628. package/dist/native/toolchain.test.js +3 -3
  629. package/dist/native/toolchain.test.js.map +1 -1
  630. package/package.json +21 -21
  631. package/shims/chalk/v5.ts +688 -0
  632. package/shims/hono-node-server/v2.ts +645 -0
  633. package/shims/hot-shots/client.ts +1126 -0
  634. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  635. package/shims/hot-shots/v8.ts +8 -0
  636. package/surface-manifest.json +26 -4
@@ -1,10 +1,11 @@
1
+ import { emitPerKeyOrder } from "./key-orders.js";
1
2
  import { typedRefConstructor } from "./shapes.js";
2
3
  import { bindLiveArrayOps } from "./expr-stream-bridges.js";
3
- import { BYTES_ELEM_NUM, SCR_ARR_FIELD, f64Lit, sizeToDouble } from "./common.js";
4
+ import { BYTES_ELEM_NUM, SCR_ARR_FIELD, SCR_ARR_STATES, f64Lit, sizeToDouble } from "./common.js";
4
5
  import { emitUnionPeek, emitUnionTag } from "./union-repr.js";
5
6
  import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, storeInlineUnion, unionBoxBits, } from "./inline-unions.js";
6
7
  import { InternalCompilerError } from "../../errors.js";
7
- import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, isDynTypedRefType, isRefCounted, isUnitType, typeKey, } from "../../ir/ir.js";
8
+ import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordTextCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
8
9
  import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
9
10
  import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
10
11
  import { BlockBuilder } from "./blocks.js";
@@ -39,6 +40,15 @@ export const DYN_HANDLE_TAG_NUM = {
39
40
  cryptoHash: 52,
40
41
  cryptoHmac: 53,
41
42
  };
43
+ /** The handle tags of TextEncoder and TextDecoder records boxed as dyn
44
+ * (scr_dyn.h; scr_text_codec_dyn.c boxes and unboxes them). */
45
+ export const TEXT_CODEC_TAG_NUM = {
46
+ TextDecoder: 76,
47
+ TextEncoder: 77,
48
+ };
49
+ /** The decoder record fields scr_text_decoder_to_dyn reads, in its
50
+ * parameter order. */
51
+ const TEXT_DECODER_FIELDS = ["%TextDecoder", "%fatal", "%ignoreBOM", "%state"];
42
52
  /** Handle kinds whose runtime unit boxes them through its own function,
43
53
  * which installs the tag's ops on first use (scr_crypto.h). Programs that
44
54
  * never box one of these values do not link its dynamic members. */
@@ -114,6 +124,54 @@ export class LlDyn {
114
124
  constructor(host) {
115
125
  this.host = host;
116
126
  }
127
+ /** Journal replay (emit-journal.ts): builds or finds the helper a chunk
128
+ * emitter recorded, and answers its name. */
129
+ replayHelper(op, args) {
130
+ switch (op) {
131
+ case "dyn.collectionDynOps":
132
+ return this.collectionDynOps(args[0]);
133
+ case "dyn.dynMatchHelper":
134
+ return this.dynMatchHelper(args[0], args[1]);
135
+ case "dyn.jsonSchema":
136
+ return this.jsonSchema(args[0]);
137
+ case "dyn.recordNameTable": {
138
+ const shapeId = args[0];
139
+ return this.recordNameTable(shapeId, this.host.recordsById.get(shapeId)).names;
140
+ }
141
+ case "dyn.jsonParseHelper":
142
+ return this.jsonParseHelper(args[0]);
143
+ case "dyn.dynCheckHelper":
144
+ return this.dynCheckHelper(args[0], args[1]);
145
+ case "dyn.toDynHelper":
146
+ return this.toDynHelper(args[0]);
147
+ case "dyn.promiseDynAdapterHelper":
148
+ return this.promiseDynAdapterHelper(args[0]);
149
+ case "dyn.dynFuncThunkHelper":
150
+ return this.dynFuncThunkHelper(args[0]);
151
+ case "dyn.dynFuncBoxHelper":
152
+ return this.dynFuncBoxHelper(args[0]);
153
+ case "dyn.dynFuncAdapterHelper":
154
+ return this.dynFuncAdapterHelper(args[0]);
155
+ case "dyn.dynToStrHelper":
156
+ return this.dynToStrHelper();
157
+ case "dyn.dynIterNHelper":
158
+ return this.dynIterNHelper();
159
+ case "dyn.dynDestrCheckHelper":
160
+ return this.dynDestrCheckHelper();
161
+ case "dyn.dynKeyGetHelper":
162
+ return this.dynKeyGetHelper();
163
+ case "dyn.dynComputedKeyGetHelper":
164
+ return this.dynComputedKeyGetHelper();
165
+ case "dyn.caughtToDynHelper":
166
+ return this.caughtToDynHelper();
167
+ case "dyn.messageListenerHelper":
168
+ return this.messageListenerHelper(args[0]) ?? "";
169
+ case "dyn.messageReaderHelper":
170
+ return this.messageReaderHelper(args[0]);
171
+ default:
172
+ throw new InternalCompilerError(`llvm emitter bug: no dyn helper replay ${op}`);
173
+ }
174
+ }
117
175
  /** The types a dyn matcher or builder for `t` checks structurally: record
118
176
  * fields and index values, array elements and union arms. */
119
177
  structuralChildren(t) {
@@ -218,6 +276,34 @@ export class LlDyn {
218
276
  this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
219
277
  B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
220
278
  }
279
+ /** The order a dyn value tries a union's arms in: the canonical order,
280
+ * except that among the record arms, those with more required fields go
281
+ * first, then those with more fields. Records are width-tolerant, so an
282
+ * arm with fewer fields (`{}`, or one whose fields are all optional,
283
+ * matches every object) would otherwise take an object that a wider arm
284
+ * also matches and drop the fields only the wider arm has. */
285
+ unionArmOrder(def) {
286
+ const width = (i) => {
287
+ const arm = def.arms[i];
288
+ if (arm.kind !== "record")
289
+ return null;
290
+ const shape = this.host.recordsById.get(arm.shapeId);
291
+ if (!shape || shape.tuple)
292
+ return null;
293
+ const required = shape.fields.filter((field) => field.type.kind !== "union" ||
294
+ !this.host.unionsById.get(field.type.unionId)?.arms.some((x) => x.kind === "undefinedT")).length;
295
+ return [required, shape.fields.length];
296
+ };
297
+ const order = def.arms.map((_, i) => i);
298
+ const records = order.filter((i) => width(i) !== null);
299
+ const widest = [...records].sort((x, y) => {
300
+ const [rx, fx] = width(x);
301
+ const [ry, fy] = width(y);
302
+ return ry - rx || fy - fx || x - y;
303
+ });
304
+ records.forEach((slot, k) => (order[slot] = widest[k]));
305
+ return order;
306
+ }
221
307
  /** Branch to a variant only after its literal discriminator and complete
222
308
  * structure match. Use the same path for predicates and builders. */
223
309
  unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
@@ -271,6 +357,7 @@ export class LlDyn {
271
357
  return prior;
272
358
  const name = `sc_map_dyn_${this.mapDynOps.size}`;
273
359
  this.mapDynOps.set(key, name);
360
+ this.host.journalAllocated?.(name, "dyn.collectionDynOps", [t]);
274
361
  const keyType = t.kind === "map" ? t.key : t.elem;
275
362
  const valueType = t.kind === "map" ? t.value : { kind: "f64" };
276
363
  const emitSlot = (type, role) => {
@@ -311,6 +398,7 @@ export class LlDyn {
311
398
  emitSlot(keyType, "key");
312
399
  emitSlot(valueType, "value");
313
400
  this.defs.push(`@${name} = internal constant { ptr, ptr, ptr, ptr, ptr, ptr } { ptr ${this.host.cstr(key)}, ptr @${name}_key_box, ptr @${name}_key_unbox, ptr @${this.dynMatchHelper(keyType)}, ptr @${name}_value_box, ptr @${name}_value_unbox }`, "");
401
+ this.host.journalBuilt?.();
314
402
  return name;
315
403
  }
316
404
  /* ── dyn node plumbing ─────────────────────────────────────────────── */
@@ -651,6 +739,17 @@ export class LlDyn {
651
739
  return existing;
652
740
  const name = `sc_dm_${this.dynMatchers.size}`;
653
741
  this.dynMatchers.set(matcherKey, name);
742
+ this.host.journalAllocated?.(name, "dyn.dynMatchHelper", [t, preserveRefs]);
743
+ const codec = textCodecRecordClass(t, (id) => this.host.recordsById.get(id));
744
+ if (codec !== null) {
745
+ // A codec matches only its own handle box.
746
+ const B = new BlockBuilder();
747
+ const matched = this.handleTagMatches(B, TEXT_CODEC_TAG_NUM[codec]);
748
+ B.terminate(`ret i1 ${matched}`);
749
+ this.defs.push(`define internal zeroext i1 @${name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
750
+ this.host.journalBuilt?.();
751
+ return name;
752
+ }
654
753
  const recursive = this.isRecursiveShape(t);
655
754
  const wrapped = recursive || this.holdsRecursiveShape(t);
656
755
  const B = new BlockBuilder();
@@ -856,9 +955,10 @@ export class LlDyn {
856
955
  }
857
956
  B.condBr(readable, l0, fail);
858
957
  B.startBlock(l0);
859
- // 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.
860
960
  for (const f of shape.fields) {
861
- if (f.type.kind === "dyn")
961
+ if (f.type.kind === "dyn" || f.name === KEY_ORDER_FIELD)
862
962
  continue;
863
963
  const { value: m, release } = this.memberRead(B, f.name, f.type);
864
964
  const lNext = B.newLabel("dm.n");
@@ -986,6 +1086,7 @@ export class LlDyn {
986
1086
  this.defs.push(`define internal zeroext i1 @${wrapped ? `${name}_body` : name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
987
1087
  if (wrapped)
988
1088
  this.emitVisitWrapper(name, t, recursive ? "match" : "visit");
1089
+ this.host.journalBuilt?.();
989
1090
  return name;
990
1091
  }
991
1092
  /* ── schema-directed JSON.parse ───────────────────────────────── */
@@ -1022,9 +1123,10 @@ export class LlDyn {
1022
1123
  if (shape.fields.length > 64 || (shape.fields.length === 0 && !index))
1023
1124
  return false;
1024
1125
  visiting.add(t.shapeId);
1025
- return (shape.fields.every((f) => !f.name.startsWith("%") &&
1026
- f.name !== "__proto__" &&
1027
- 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))) &&
1028
1130
  (!index || this.jsonSchemaSupported(index, visiting)));
1029
1131
  }
1030
1132
  case "union":
@@ -1073,6 +1175,7 @@ export class LlDyn {
1073
1175
  const S = host.sizeType;
1074
1176
  const name = `sc_jsch_${this.jsonSchemas.size}`;
1075
1177
  this.jsonSchemas.set(key, name);
1178
+ this.host.journalAllocated?.(name, "dyn.jsonSchema", [t]);
1076
1179
  let body;
1077
1180
  switch (t.kind) {
1078
1181
  case "f64":
@@ -1097,7 +1200,9 @@ export class LlDyn {
1097
1200
  const base = host.nullableUnions.fieldBase(t.shapeId);
1098
1201
  const index = new Map(shape.fields.map((f, i) => [f.name, i + base]));
1099
1202
  // The runtime names kept-source keys by this index (record-sources.ts).
1100
- 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);
1101
1206
  if (recordMayKeepSource(shape))
1102
1207
  this.keepsRecordSources = true;
1103
1208
  const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
@@ -1130,6 +1235,7 @@ export class LlDyn {
1130
1235
  throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
1131
1236
  }
1132
1237
  this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr, ptr, ${S} } { ${body} }`, ``);
1238
+ this.host.journalBuilt?.();
1133
1239
  return name;
1134
1240
  }
1135
1241
  /** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
@@ -1200,9 +1306,11 @@ export class LlDyn {
1200
1306
  const base = `sc_rnames_${this.recordNameTables.size}`;
1201
1307
  const table = { names: `@${base}`, lens: `@${base}_lens` };
1202
1308
  this.recordNameTables.set(shapeId, table);
1309
+ this.host.journalAllocated?.(base, "dyn.recordNameTable", [shapeId]);
1203
1310
  const n = shape.fields.length;
1204
1311
  const names = recordSourceFieldOrder(shape);
1205
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?.();
1206
1314
  return table;
1207
1315
  }
1208
1316
  /** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
@@ -1223,12 +1331,14 @@ export class LlDyn {
1223
1331
  const host = this.host;
1224
1332
  const name = `sc_jp_${this.jsonParsers.size}`;
1225
1333
  this.jsonParsers.set(key, name);
1334
+ this.host.journalAllocated?.(name, "dyn.jsonParseHelper", [t]);
1226
1335
  const schema = this.jsonSchema(t);
1227
1336
  const check = this.dynCheckHelper(t);
1228
1337
  host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
1229
1338
  host.declare(`declare ptr @scr_json_parse(ptr)`);
1230
1339
  host.declare(`declare void @scr_dyn_release(ptr)`);
1231
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?.();
1232
1342
  return name;
1233
1343
  }
1234
1344
  /* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
@@ -1243,6 +1353,7 @@ export class LlDyn {
1243
1353
  return existing;
1244
1354
  const name = `sc_dc_${this.dynBuilders.size}`;
1245
1355
  this.dynBuilders.set(builderKey, name);
1356
+ this.host.journalAllocated?.(name, "dyn.dynCheckHelper", [t, preserveRefs]);
1246
1357
  const recursive = this.isRecursiveShape(t);
1247
1358
  const memo = !recursive && this.holdsRecursiveShape(t) && this.valTy(t) === "ptr";
1248
1359
  const host = this.host;
@@ -1257,6 +1368,18 @@ export class LlDyn {
1257
1368
  B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
1258
1369
  B.terminate(`ret ptr ${checked}`);
1259
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?.();
1260
1383
  return name;
1261
1384
  }
1262
1385
  if (isRefCounted(t) && t.kind !== "dyn") {
@@ -1416,6 +1539,26 @@ export class LlDyn {
1416
1539
  B.line(`store ${member.type} ${oldValue}, ptr ${checkedPtr}`);
1417
1540
  });
1418
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);
1419
1562
  // Sparse slots and numeric properties live out of line; each
1420
1563
  // array keeps its own match metadata.
1421
1564
  host.declare("declare void @scr_arr_swap_indexed_ext(ptr, ptr)");
@@ -1746,7 +1889,11 @@ export class LlDyn {
1746
1889
  B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
1747
1890
  if (recursive)
1748
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.
1749
1894
  for (const f of shape.fields) {
1895
+ if (f.name === KEY_ORDER_FIELD)
1896
+ continue;
1750
1897
  const { value: m, release } = this.memberRead(B, f.name, f.type);
1751
1898
  this.pendingBail(B, "dcr.read", () => {
1752
1899
  B.line(`call void @${release}(ptr ${m})`);
@@ -1914,9 +2061,10 @@ export class LlDyn {
1914
2061
  const def = host.unionsById.get(t.unionId);
1915
2062
  if (!def)
1916
2063
  throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
1917
- // Arms in CANONICAL order, first FULL match wins. The matched
1918
- // arm's builder can no longer fail.
1919
- def.arms.forEach((arm, i) => {
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];
1920
2068
  const lHit = B.newLabel("dcu.h");
1921
2069
  const lNext = B.newLabel("dcu.n");
1922
2070
  this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
@@ -1958,7 +2106,7 @@ export class LlDyn {
1958
2106
  B.terminate(`ret ptr ${u}`);
1959
2107
  }
1960
2108
  B.startBlock(lNext);
1961
- });
2109
+ }
1962
2110
  if (preserveRefs) {
1963
2111
  B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
1964
2112
  B.terminate(`ret ptr null`);
@@ -2157,8 +2305,64 @@ export class LlDyn {
2157
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(), `}`, ``);
2158
2306
  if (recursive || memo)
2159
2307
  this.emitVisitWrapper(name, t, recursive ? "build" : "memo");
2308
+ this.host.journalBuilt?.();
2160
2309
  return name;
2161
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
+ }
2162
2366
  /* ── toDynHelper (walkers.ts, ported) ─────────────────────────── */
2163
2367
  /** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn value from a
2164
2368
  * static one (+1), DEEP-COPYING composites. Borrows the operand.
@@ -2170,6 +2374,7 @@ export class LlDyn {
2170
2374
  return existing;
2171
2375
  const name = `sc_td_${this.toDynFns.size}`;
2172
2376
  this.toDynFns.set(key, name);
2377
+ this.host.journalAllocated?.(name, "dyn.toDynHelper", [t]);
2173
2378
  const host = this.host;
2174
2379
  const B = new BlockBuilder();
2175
2380
  let sourceAccessor = null;
@@ -2319,6 +2524,11 @@ export class LlDyn {
2319
2524
  const shape = host.recordsById.get(t.shapeId);
2320
2525
  if (!shape)
2321
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
+ }
2322
2532
  const struct = mangleRecordStruct(t.shapeId);
2323
2533
  const base = host.nullableUnions.fieldBase(t.shapeId);
2324
2534
  const fieldIndex = new Map(shape.fields.map((f, i) => [f.name, i + base]));
@@ -2401,58 +2611,68 @@ export class LlDyn {
2401
2611
  host.declare(`declare ptr @scr_dyn_new_obj()`);
2402
2612
  B.line(`${d} = call ptr @scr_dyn_new_obj()`);
2403
2613
  }
2404
- // Keys insert in DECLARED order (JS insertion order); internal
2405
- // '%'-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).
2406
2618
  const byName = new Map(shape.fields.map((f) => [f.name, f]));
2407
2619
  // An accessor property is one key whose getter and setter are the
2408
2620
  // slot closures (see accessorSlotProp), in accessorOrder's place.
2409
- const order = shape.accessorOrder ?? shape.declaredOrder ?? shape.fields.map((f) => f.name);
2410
- const inOrder = new Set(order);
2411
- const accessors = new Set(shape.accessorOrder === undefined
2412
- ? []
2413
- : shape.fields.flatMap((f) => {
2414
- const slot = accessorSlotProp(f.name);
2415
- return slot === null ? [] : [slot.prop];
2416
- }));
2417
- const dynFields = [
2418
- ...order.flatMap((n) => {
2419
- if (accessors.has(n))
2420
- return [{ accessor: n }];
2421
- const f = byName.get(n);
2422
- return f === undefined ? [] : [f];
2423
- }),
2424
- ...shape.fields.filter((f) => !inOrder.has(f.name) && !(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
2425
- ];
2426
- for (const entry of dynFields) {
2427
- if ("accessor" in entry) {
2428
- host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
2429
- const boxed = (kind) => {
2430
- const slot = byName.get(`%${kind}:${entry.accessor}`);
2431
- if (slot === undefined)
2432
- return "null";
2433
- const fv = loadFieldOf(slot.name, slot.type);
2434
- const conv = B.tmp();
2435
- B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
2436
- return conv;
2437
- };
2438
- const getter = boxed("get");
2439
- const setter = boxed("set");
2440
- B.line(`call void @scr_dyn_obj_set_accessor(ptr ${d}, ptr ${host.cstr(entry.accessor)}, ${host.sizeType} ${Buffer.byteLength(entry.accessor, "utf8")}, ptr ${getter}, ptr ${setter}) ; ${llvmCommentText(entry.accessor)}`);
2441
- continue;
2442
- }
2443
- const f = entry;
2444
- const klen = Buffer.byteLength(f.name, "utf8");
2445
- const fv = loadFieldOf(f.name, f.type);
2446
- // An ABSENT optional field contributes no key.
2447
- const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
2448
- const conv = B.tmp();
2449
- B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
2450
- B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
2451
- if (lSkip !== null) {
2452
- B.br(lSkip);
2453
- B.startBlock(lSkip);
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
+ }
2454
2670
  }
2455
- }
2671
+ };
2672
+ if (orders.length === 1)
2673
+ perOrder(orders[0]);
2674
+ else
2675
+ emitPerKeyOrder(B, shape, base, "%v", perOrder);
2456
2676
  // A Dirent row takes Node's Dirent prototype (the type probes) and
2457
2677
  // its Symbol(type) key; %dtype stays readable but non-enumerable.
2458
2678
  if (isDirentShape(shape)) {
@@ -2724,6 +2944,7 @@ export class LlDyn {
2724
2944
  if (sourceAccessor) {
2725
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`, `}`, ``);
2726
2946
  }
2947
+ this.host.journalBuilt?.();
2727
2948
  return name;
2728
2949
  }
2729
2950
  /** The checked-dynamic tree-promise settle adapter for one fulfillment payload type —
@@ -2740,6 +2961,7 @@ export class LlDyn {
2740
2961
  return existing;
2741
2962
  const name = `sc_pda_${this.promiseDynAdapters.size}`;
2742
2963
  this.promiseDynAdapters.set(key, name);
2964
+ this.host.journalAllocated?.(name, "dyn.promiseDynAdapterHelper", [inner]);
2743
2965
  const host = this.host;
2744
2966
  const B = new BlockBuilder();
2745
2967
  host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
@@ -2811,6 +3033,7 @@ export class LlDyn {
2811
3033
  }
2812
3034
  B.terminate(`ret void`);
2813
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?.();
2814
3037
  return name;
2815
3038
  }
2816
3039
  /* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
@@ -2822,6 +3045,7 @@ export class LlDyn {
2822
3045
  return this.dynToStrFn;
2823
3046
  const name = "sc_ds";
2824
3047
  this.dynToStrFn = name;
3048
+ this.host.journalAllocated?.(name, "dyn.dynToStrHelper", []);
2825
3049
  const host = this.host;
2826
3050
  host.declare(`declare void @scr_jb_init(ptr)`);
2827
3051
  host.declare(`declare ptr @scr_jb_finish(ptr)`);
@@ -3112,6 +3336,7 @@ export class LlDyn {
3112
3336
  B.terminate(`ret ptr ${out}`);
3113
3337
  this.defs.push(`define internal ptr @${name}(ptr %d) ${FN_ATTRS} { ; String(unknown) -> owned (+1)`, B.render(), `}`, ``);
3114
3338
  }
3339
+ this.host.journalBuilt?.();
3115
3340
  return name;
3116
3341
  }
3117
3342
  /* ── caughtToDyn (walkers.ts, ported) ─────────────────────────── */
@@ -3122,6 +3347,7 @@ export class LlDyn {
3122
3347
  return this.caughtToDynFn;
3123
3348
  const name = "sc_cd";
3124
3349
  this.caughtToDynFn = name;
3350
+ this.host.journalAllocated?.(name, "dyn.caughtToDynHelper", []);
3125
3351
  const host = this.host;
3126
3352
  const B = new BlockBuilder();
3127
3353
  const kp = B.tmp();
@@ -3220,6 +3446,7 @@ export class LlDyn {
3220
3446
  B.terminate(`ret ptr ${e}`);
3221
3447
  }
3222
3448
  this.defs.push(`define internal ptr @${name}(ptr %c) ${FN_ATTRS} { ; caught -> unknown (+1, fresh tree)`, B.render(), `}`, ``);
3449
+ this.host.journalBuilt?.();
3223
3450
  return name;
3224
3451
  }
3225
3452
  /* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
@@ -3232,6 +3459,7 @@ export class LlDyn {
3232
3459
  this.helperMemo.set(name, name);
3233
3460
  const B = new BlockBuilder();
3234
3461
  const host = this.host;
3462
+ this.host.journalAllocated?.(name, "dyn.dynComputedKeyGetHelper", []);
3235
3463
  const stringHelper = this.dynKeyGetHelper();
3236
3464
  host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
3237
3465
  host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
@@ -3264,6 +3492,7 @@ export class LlDyn {
3264
3492
  B.line(`call void @scr_dyn_release(ptr ${key})`);
3265
3493
  B.terminate(`ret ptr ${value}`);
3266
3494
  this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
3495
+ this.host.journalBuilt?.();
3267
3496
  return name;
3268
3497
  }
3269
3498
  dynKeyGetHelper() {
@@ -3273,6 +3502,7 @@ export class LlDyn {
3273
3502
  return existing;
3274
3503
  const name = "sc_dyn_key_get";
3275
3504
  this.dynBuilders.set(memoKey, name);
3505
+ this.host.journalAllocated?.(name, "dyn.dynKeyGetHelper", []);
3276
3506
  const host = this.host;
3277
3507
  const B = new BlockBuilder();
3278
3508
  const kd = this.kindOf(B, "%d");
@@ -3651,6 +3881,7 @@ export class LlDyn {
3651
3881
  }
3652
3882
  retainUndef();
3653
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?.();
3654
3885
  return name;
3655
3886
  }
3656
3887
  /* ── destructuring RequireObjectCoercible (ported) ─────────────────── */
@@ -3661,6 +3892,7 @@ export class LlDyn {
3661
3892
  return existing;
3662
3893
  const name = "sc_dyn_destr_check";
3663
3894
  this.dynBuilders.set(memoKey, name);
3895
+ this.host.journalAllocated?.(name, "dyn.dynDestrCheckHelper", []);
3664
3896
  const host = this.host;
3665
3897
  host.declare(`declare void @scr_jb_init(ptr)`);
3666
3898
  host.declare(`declare ptr @scr_jb_finish(ptr)`);
@@ -3710,6 +3942,7 @@ export class LlDyn {
3710
3942
  B.line(`call void @scr_throw_error(i32 1, ptr ${msg}) ; SCR_ERR_TYPE`);
3711
3943
  B.terminate(`ret void`);
3712
3944
  this.defs.push(`define internal void @${name}(ptr %d, ptr %spell, ptr %firstProp) ${FN_ATTRS} { ; destructuring RequireObjectCoercible`, B.render(), `}`, ``);
3945
+ this.host.journalBuilt?.();
3713
3946
  return name;
3714
3947
  }
3715
3948
  /* ── GetIterator + first-N steps (dynIterNHelper, ported) ──────────── */
@@ -3720,6 +3953,7 @@ export class LlDyn {
3720
3953
  return existing;
3721
3954
  const name = "sc_dyn_iter_n";
3722
3955
  this.dynBuilders.set(memoKey, name);
3956
+ this.host.journalAllocated?.(name, "dyn.dynIterNHelper", []);
3723
3957
  const host = this.host;
3724
3958
  host.declare(`declare ptr @scr_dyn_new_arr()`);
3725
3959
  host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
@@ -3914,12 +4148,38 @@ export class LlDyn {
3914
4148
  });
3915
4149
  B.terminate(`ret ptr ${out}`);
3916
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?.();
3917
4152
  return name;
3918
4153
  }
3919
4154
  /* ── the checked-dynamic function boundary (ported) ────────────────── */
3920
4155
  /** The dyn argument spelling of one static value: dyn passes through
3921
4156
  * (+1), funcs box anonymously, everything else rides toDyn. `expr` is
3922
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
+ }
3923
4183
  toDynExpr(B, t, expr) {
3924
4184
  if (t.kind === "dyn")
3925
4185
  return this.retainDyn(B, expr);
@@ -3943,6 +4203,7 @@ export class LlDyn {
3943
4203
  return existing;
3944
4204
  const name = `sc_dfk_${this.dynFuncThunks.size}`;
3945
4205
  this.dynFuncThunks.set(key, name);
4206
+ this.host.journalAllocated?.(name, "dyn.dynFuncThunkHelper", [t]);
3946
4207
  const host = this.host;
3947
4208
  const B = new BlockBuilder();
3948
4209
  const argNames = [];
@@ -4041,6 +4302,22 @@ export class LlDyn {
4041
4302
  B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
4042
4303
  });
4043
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
+ }
4044
4321
  argNames.push(a);
4045
4322
  }
4046
4323
  });
@@ -4075,12 +4352,15 @@ export class LlDyn {
4075
4352
  const r = B.tmp();
4076
4353
  B.line(`${r} = call ${retTy} ${fn}(${callArgs})`);
4077
4354
  this.pendingBail(B, "dfkr", () => { }, "ptr null");
4078
- 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);
4079
4358
  if (isRefCounted(t.ret))
4080
4359
  B.line(`call void ${releaseSym(host, t.ret)}(ptr ${r})`);
4081
4360
  B.terminate(`ret ptr ${out}`);
4082
4361
  }
4083
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?.();
4084
4364
  return name;
4085
4365
  }
4086
4366
  /** The box builder dynFrom emits for one closure signature. */
@@ -4091,12 +4371,14 @@ export class LlDyn {
4091
4371
  return existing;
4092
4372
  const name = `sc_dfb_${this.dynFuncBoxes.size}`;
4093
4373
  this.dynFuncBoxes.set(key, name);
4374
+ this.host.journalAllocated?.(name, "dyn.dynFuncBoxHelper", [t]);
4094
4375
  const host = this.host;
4095
4376
  const thunk = this.dynFuncThunkHelper(t);
4096
4377
  host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
4097
4378
  host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
4098
4379
  const sigLit = host.cstr(key);
4099
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?.();
4100
4382
  return name;
4101
4383
  }
4102
4384
  /** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
@@ -4118,11 +4400,15 @@ export class LlDyn {
4118
4400
  (t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
4119
4401
  this.messageReadable(param, new Set());
4120
4402
  if (!supported) {
4403
+ // A signature without an entry still takes a number.
4121
4404
  this.messageListeners.set(key, null);
4405
+ this.host.journalAllocated?.("", "dyn.messageListenerHelper", [t]);
4406
+ this.host.journalBuilt?.();
4122
4407
  return null;
4123
4408
  }
4124
4409
  const name = `sc_dml_${this.messageListeners.size}`;
4125
4410
  this.messageListeners.set(key, name);
4411
+ this.host.journalAllocated?.(name, "dyn.messageListenerHelper", [t]);
4126
4412
  const B = new BlockBuilder();
4127
4413
  B.entryAllocas.push(`%fail = alloca i1`);
4128
4414
  B.line(`store i1 false, ptr %fail`);
@@ -4149,6 +4435,7 @@ export class LlDyn {
4149
4435
  B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
4150
4436
  B.terminate(`ret i1 true`);
4151
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?.();
4152
4439
  return name;
4153
4440
  }
4154
4441
  /** Whether a message reader can build T: numbers, booleans and strings;
@@ -4212,6 +4499,7 @@ export class LlDyn {
4212
4499
  return existing;
4213
4500
  const name = `sc_dmr_${this.messageReaders.size}`;
4214
4501
  this.messageReaders.set(key, name);
4502
+ this.host.journalAllocated?.(name, "dyn.messageReaderHelper", [t]);
4215
4503
  const host = this.host;
4216
4504
  const S = host.sizeType;
4217
4505
  if (t.kind !== "record")
@@ -4370,6 +4658,7 @@ export class LlDyn {
4370
4658
  B.line(`store i1 true, ptr %fail`);
4371
4659
  B.terminate(`ret ${retTy} ${dummy}`);
4372
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?.();
4373
4662
  return name;
4374
4663
  }
4375
4664
  /** The adapter closure body for one TARGET signature: caps[0] is an
@@ -4381,6 +4670,7 @@ export class LlDyn {
4381
4670
  return existing;
4382
4671
  const name = `sc_dfa_${this.dynFuncAdapters.size}`;
4383
4672
  this.dynFuncAdapters.set(key, name);
4673
+ this.host.journalAllocated?.(name, "dyn.dynFuncAdapterHelper", [t]);
4384
4674
  const host = this.host;
4385
4675
  const B = new BlockBuilder();
4386
4676
  host.declare(`declare ptr @scr_box_get_ref(ptr)`);
@@ -4475,6 +4765,7 @@ export class LlDyn {
4475
4765
  ...(checkedRest ? ["ptr %rest"] : []),
4476
4766
  ].join(", ");
4477
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?.();
4478
4769
  return name;
4479
4770
  }
4480
4771
  }