@scriptc/compiler 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (726) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +470 -66
  2. package/dist/backend/cycle-analysis.d.ts +4 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +21 -9
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +479 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/debug-info.js +2 -5
  58. package/dist/backend/llvm/debug-info.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  65. package/dist/backend/llvm/dense-array-loops.js +194 -5
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +30 -0
  72. package/dist/backend/llvm/dyn.js +373 -70
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +13 -28
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +211 -33
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  82. package/dist/backend/llvm/emit-statements.js +268 -84
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +186 -37
  88. package/dist/backend/llvm/emitter.js +733 -90
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +65 -7
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +11 -13
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.js +48 -20
  95. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  96. package/dist/backend/llvm/expr-callbacks.js +47 -0
  97. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  98. package/dist/backend/llvm/expr-calls.js +28 -14
  99. package/dist/backend/llvm/expr-calls.js.map +1 -1
  100. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  101. package/dist/backend/llvm/expr-containers.js +143 -37
  102. package/dist/backend/llvm/expr-containers.js.map +1 -1
  103. package/dist/backend/llvm/expr-context.d.ts +14 -0
  104. package/dist/backend/llvm/expr-dynamic.js +18 -11
  105. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +119 -38
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.d.ts +12 -0
  111. package/dist/backend/llvm/expr-records.js +106 -0
  112. package/dist/backend/llvm/expr-records.js.map +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  114. package/dist/backend/llvm/expr-stream-bridges.js +210 -69
  115. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  118. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  119. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  120. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  121. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  122. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  123. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  124. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  125. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  126. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  127. package/dist/backend/llvm/integer-values.d.ts +25 -1
  128. package/dist/backend/llvm/integer-values.js +95 -0
  129. package/dist/backend/llvm/integer-values.js.map +1 -1
  130. package/dist/backend/llvm/js-ic.d.ts +1 -1
  131. package/dist/backend/llvm/js-ic.js +1 -1
  132. package/dist/backend/llvm/js-ic.js.map +1 -1
  133. package/dist/backend/llvm/key-orders.d.ts +7 -0
  134. package/dist/backend/llvm/key-orders.js +33 -0
  135. package/dist/backend/llvm/key-orders.js.map +1 -0
  136. package/dist/backend/llvm/lib-connect.js +4 -0
  137. package/dist/backend/llvm/lib-connect.js.map +1 -1
  138. package/dist/backend/llvm/lib-datagram.js +11 -0
  139. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  140. package/dist/backend/llvm/lib-dispatch.js +213 -5
  141. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  142. package/dist/backend/llvm/lib-filesystem.js +4 -4
  143. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  144. package/dist/backend/llvm/lib-http2.js +4 -0
  145. package/dist/backend/llvm/lib-http2.js.map +1 -1
  146. package/dist/backend/llvm/lib-lookup.js +16 -6
  147. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  148. package/dist/backend/llvm/lib-process.js +37 -1
  149. package/dist/backend/llvm/lib-process.js.map +1 -1
  150. package/dist/backend/llvm/lib-shared.js +94 -2
  151. package/dist/backend/llvm/lib-shared.js.map +1 -1
  152. package/dist/backend/llvm/lib-stream.js +35 -5
  153. package/dist/backend/llvm/lib-stream.js.map +1 -1
  154. package/dist/backend/llvm/local-array-reads.js +115 -19
  155. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  156. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  157. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  158. package/dist/backend/llvm/loop-state.d.ts +33 -0
  159. package/dist/backend/llvm/loop-state.js +42 -0
  160. package/dist/backend/llvm/loop-state.js.map +1 -0
  161. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  162. package/dist/backend/llvm/map-number-lookup.js +91 -31
  163. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  164. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  165. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  166. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  167. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  168. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  169. package/dist/backend/llvm/nullable-unions.js +15 -3
  170. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  171. package/dist/backend/llvm/publish.d.ts +10 -0
  172. package/dist/backend/llvm/publish.js +15 -3
  173. package/dist/backend/llvm/publish.js.map +1 -1
  174. package/dist/backend/llvm/receivers.js +6 -1
  175. package/dist/backend/llvm/receivers.js.map +1 -1
  176. package/dist/backend/llvm/record-results.d.ts +1 -9
  177. package/dist/backend/llvm/record-results.js +2 -11
  178. package/dist/backend/llvm/record-results.js.map +1 -1
  179. package/dist/backend/llvm/reference-effects.js +3 -0
  180. package/dist/backend/llvm/reference-effects.js.map +1 -1
  181. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  182. package/dist/backend/llvm/reference-writes.js +89 -72
  183. package/dist/backend/llvm/reference-writes.js.map +1 -1
  184. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  185. package/dist/backend/llvm/running-extrema.js +115 -0
  186. package/dist/backend/llvm/running-extrema.js.map +1 -0
  187. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  188. package/dist/backend/llvm/running-extrema.test.js +89 -0
  189. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  190. package/dist/backend/llvm/shapes.d.ts +71 -15
  191. package/dist/backend/llvm/shapes.js +224 -40
  192. package/dist/backend/llvm/shapes.js.map +1 -1
  193. package/dist/backend/llvm/shapes.test.js +53 -7
  194. package/dist/backend/llvm/shapes.test.js.map +1 -1
  195. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  196. package/dist/backend/llvm/speculative-integers.js +2 -2
  197. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  198. package/dist/backend/llvm/stack-captures.js +1 -5
  199. package/dist/backend/llvm/stack-captures.js.map +1 -1
  200. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  201. package/dist/backend/llvm/stack-objects.js +5 -2
  202. package/dist/backend/llvm/stack-objects.js.map +1 -1
  203. package/dist/backend/llvm/string-reads.d.ts +12 -0
  204. package/dist/backend/llvm/string-reads.js +44 -0
  205. package/dist/backend/llvm/string-reads.js.map +1 -1
  206. package/dist/backend/llvm/union-repr.d.ts +4 -3
  207. package/dist/backend/llvm/union-repr.js +6 -5
  208. package/dist/backend/llvm/union-repr.js.map +1 -1
  209. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  210. package/dist/backend/llvm/walk-borrows.js +46 -41
  211. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  212. package/dist/backend/llvm/walkers.d.ts +3 -0
  213. package/dist/backend/llvm/walkers.js +101 -65
  214. package/dist/backend/llvm/walkers.js.map +1 -1
  215. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  216. package/dist/backend/llvm/wrapping-sums.js +126 -0
  217. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  218. package/dist/backend/may-throw.d.ts +8 -10
  219. package/dist/backend/may-throw.js +14 -10
  220. package/dist/backend/may-throw.js.map +1 -1
  221. package/dist/backend/native/contracts.d.ts +5 -0
  222. package/dist/backend/native/executable.js +7 -0
  223. package/dist/backend/native/executable.js.map +1 -1
  224. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  225. package/dist/backend/native/runtime-inputs.js +1 -0
  226. package/dist/backend/native/runtime-inputs.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.test.js +6 -4
  231. package/dist/backend/native-codegen.test.js.map +1 -1
  232. package/dist/backend/native-link-info-core.d.ts +4 -0
  233. package/dist/backend/native-link-info-core.js.map +1 -1
  234. package/dist/backend/publication.d.ts +12 -1
  235. package/dist/backend/publication.js +37 -14
  236. package/dist/backend/publication.js.map +1 -1
  237. package/dist/backend/publication.test.js +30 -0
  238. package/dist/backend/publication.test.js.map +1 -1
  239. package/dist/backend/result-slots.d.ts +16 -0
  240. package/dist/backend/result-slots.js +23 -0
  241. package/dist/backend/result-slots.js.map +1 -0
  242. package/dist/backend/runtime-abi.d.ts +2 -2
  243. package/dist/backend/runtime-abi.js +2 -2
  244. package/dist/backend/runtime-pack-core.d.ts +1 -0
  245. package/dist/backend/runtime-pack-core.js +1 -0
  246. package/dist/backend/runtime-pack-core.js.map +1 -1
  247. package/dist/backend/runtime-pack-targets.test.js +2 -1
  248. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  249. package/dist/backend/runtime-pack.test.js +2 -1
  250. package/dist/backend/runtime-pack.test.js.map +1 -1
  251. package/dist/backend/stack-observations.d.ts +2 -1
  252. package/dist/backend/stack-observations.js +67 -42
  253. package/dist/backend/stack-observations.js.map +1 -1
  254. package/dist/backend/target-cpu.d.ts +26 -0
  255. package/dist/backend/target-cpu.js +98 -0
  256. package/dist/backend/target-cpu.js.map +1 -0
  257. package/dist/backend/target-cpu.test.d.ts +1 -0
  258. package/dist/backend/target-cpu.test.js +38 -0
  259. package/dist/backend/target-cpu.test.js.map +1 -0
  260. package/dist/backend/target-diagnostics.js +5 -3
  261. package/dist/backend/target-diagnostics.js.map +1 -1
  262. package/dist/backend/warm-cache.js +1 -0
  263. package/dist/backend/warm-cache.js.map +1 -1
  264. package/dist/cli/command.js +20 -1
  265. package/dist/cli/command.js.map +1 -1
  266. package/dist/cli/usage.d.ts +4 -1
  267. package/dist/cli/usage.js +10 -3
  268. package/dist/cli/usage.js.map +1 -1
  269. package/dist/compat/fetch-profile.js +1 -1
  270. package/dist/compat/fetch-profile.js.map +1 -1
  271. package/dist/compile-types.d.ts +7 -0
  272. package/dist/contracts/check.js +4 -3
  273. package/dist/contracts/check.js.map +1 -1
  274. package/dist/contracts/int32-elements.js +10 -2
  275. package/dist/contracts/int32-elements.js.map +1 -1
  276. package/dist/coverage/report.js +12 -3
  277. package/dist/coverage/report.js.map +1 -1
  278. package/dist/diagnostics/diagnostic.d.ts +4 -0
  279. package/dist/diagnostics/diagnostic.js +1 -1
  280. package/dist/diagnostics/diagnostic.js.map +1 -1
  281. package/dist/diagnostics/envelope.d.ts +3 -0
  282. package/dist/diagnostics/envelope.js +1 -0
  283. package/dist/diagnostics/envelope.js.map +1 -1
  284. package/dist/executable/executable-cache.d.ts +5 -0
  285. package/dist/executable/executable-cache.js +5 -0
  286. package/dist/executable/executable-cache.js.map +1 -1
  287. package/dist/executable/executable-cache.test.js +3 -0
  288. package/dist/executable/executable-cache.test.js.map +1 -1
  289. package/dist/frontend/decl-projection.d.ts +41 -0
  290. package/dist/frontend/decl-projection.js +949 -0
  291. package/dist/frontend/decl-projection.js.map +1 -0
  292. package/dist/frontend/decl-projection.test.d.ts +1 -0
  293. package/dist/frontend/decl-projection.test.js +30 -0
  294. package/dist/frontend/decl-projection.test.js.map +1 -0
  295. package/dist/frontend/dts-paths.d.ts +15 -0
  296. package/dist/frontend/dts-paths.js +25 -0
  297. package/dist/frontend/dts-paths.js.map +1 -1
  298. package/dist/frontend/input-tracker.d.ts +6 -0
  299. package/dist/frontend/input-tracker.js +51 -28
  300. package/dist/frontend/input-tracker.js.map +1 -1
  301. package/dist/frontend/input-tracker.test.js +19 -0
  302. package/dist/frontend/input-tracker.test.js.map +1 -1
  303. package/dist/frontend/lowering/array-values.js +100 -2
  304. package/dist/frontend/lowering/array-values.js.map +1 -1
  305. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  306. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  307. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  308. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  309. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  310. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  311. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  312. package/dist/frontend/lowering/builtins/crypto.js +87 -10
  313. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/dates.js +4 -1
  315. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  317. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  318. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  319. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  321. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  322. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  323. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  324. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  325. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  326. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  327. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  329. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
  331. package/dist/frontend/lowering/builtins/promises.js +236 -139
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  334. package/dist/frontend/lowering/builtins/readline.js +35 -3
  335. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/url.js +24 -1
  337. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/call-signatures.js +0 -1
  341. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  342. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  343. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  344. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  345. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  346. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  347. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  348. package/dist/frontend/lowering/class-callbacks.js +82 -12
  349. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  350. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  351. package/dist/frontend/lowering/class-construction.js +17 -3
  352. package/dist/frontend/lowering/class-construction.js.map +1 -1
  353. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
  355. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  358. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  359. package/dist/frontend/lowering/class-iterables.js +9 -1
  360. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  361. package/dist/frontend/lowering/class-method-mutations.js +83 -24
  362. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  363. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  364. package/dist/frontend/lowering/class-protocols.js +183 -1
  365. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  366. package/dist/frontend/lowering/class-prototypes.js +31 -2
  367. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  368. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  369. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  370. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  371. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  372. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  373. package/dist/frontend/lowering/coercions/structural.js +91 -1
  374. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  375. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  376. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  377. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  378. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  379. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  380. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  381. package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
  382. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  383. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  384. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  385. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  386. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  387. package/dist/frontend/lowering/containers/array-methods.js +26 -3
  388. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  390. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  391. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  392. package/dist/frontend/lowering/containers/bytes.js +455 -46
  393. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  394. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  395. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  396. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  397. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  399. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  400. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  401. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  402. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  407. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  408. package/dist/frontend/lowering/date-values.d.ts +11 -0
  409. package/dist/frontend/lowering/date-values.js +207 -0
  410. package/dist/frontend/lowering/date-values.js.map +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  412. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  413. package/dist/frontend/lowering/divergences.js +9 -1
  414. package/dist/frontend/lowering/divergences.js.map +1 -1
  415. package/dist/frontend/lowering/error-methods.js +47 -2
  416. package/dist/frontend/lowering/error-methods.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/array-literals.js +53 -0
  418. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/binary.js +100 -28
  420. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/element-access.js +169 -13
  422. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  423. package/dist/frontend/lowering/expressions/identifiers.js +64 -5
  424. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  425. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  426. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  427. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  428. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  429. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  430. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  431. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  433. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  434. package/dist/frontend/lowering/expressions/property-access.js +168 -10
  435. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  436. package/dist/frontend/lowering/expressions/relational.js +212 -33
  437. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  438. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  439. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  440. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  441. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  442. package/dist/frontend/lowering/expressions/updates.js +39 -3
  443. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  444. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  445. package/dist/frontend/lowering/frozen-records.js +322 -0
  446. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  447. package/dist/frontend/lowering/function-returns.js +64 -0
  448. package/dist/frontend/lowering/function-returns.js.map +1 -1
  449. package/dist/frontend/lowering/generic-functions.js +7 -2
  450. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  451. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  452. package/dist/frontend/lowering/indexed-unions.js +401 -0
  453. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  454. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  455. package/dist/frontend/lowering/iterable-values.js +297 -0
  456. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  457. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  458. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  459. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  460. package/dist/frontend/lowering/js-class-fields.js +45 -10
  461. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  462. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  463. package/dist/frontend/lowering/key-order-witness.js +974 -48
  464. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  465. package/dist/frontend/lowering/key-order-witness.test.js +530 -10
  466. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  467. package/dist/frontend/lowering/lower-assert.js +15 -3
  468. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  469. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  470. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  471. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  472. package/dist/frontend/lowering/lower-calls.js +462 -44
  473. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  474. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  475. package/dist/frontend/lowering/lower-classes.js +324 -69
  476. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  477. package/dist/frontend/lowering/lower-dgram.js +3 -1
  478. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  479. package/dist/frontend/lowering/lower-exprs.js +215 -3
  480. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  481. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  482. package/dist/frontend/lowering/lower-functions.js +83 -0
  483. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  484. package/dist/frontend/lowering/lower-generators.js +42 -32
  485. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  486. package/dist/frontend/lowering/lower-global-value.js +6 -3
  487. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  488. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  489. package/dist/frontend/lowering/lower-inspect.js +53 -17
  490. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  491. package/dist/frontend/lowering/lower-modules.js +53 -5
  492. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  493. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  494. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.js +2 -2
  496. package/dist/frontend/lowering/lower-server.js.map +1 -1
  497. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  498. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  499. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  500. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  501. package/dist/frontend/lowering/lower-stmts.js +553 -81
  502. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  503. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  504. package/dist/frontend/lowering/lower-stream.js +1483 -156
  505. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  506. package/dist/frontend/lowering/lowerer.d.ts +107 -8
  507. package/dist/frontend/lowering/lowerer.js +381 -36
  508. package/dist/frontend/lowering/lowerer.js.map +1 -1
  509. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  510. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  511. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  512. package/dist/frontend/lowering/new-target.d.ts +12 -0
  513. package/dist/frontend/lowering/new-target.js +280 -0
  514. package/dist/frontend/lowering/new-target.js.map +1 -0
  515. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  516. package/dist/frontend/lowering/object-factory-new.js +20 -6
  517. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  518. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  519. package/dist/frontend/lowering/overload-choice.js +190 -0
  520. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  521. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  522. package/dist/frontend/lowering/surfaces.js +73 -8
  523. package/dist/frontend/lowering/surfaces.js.map +1 -1
  524. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  525. package/dist/frontend/lowering/undefined-index.js +82 -0
  526. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  527. package/dist/frontend/lowering/var-hoisting.js +29 -13
  528. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  529. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  530. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  531. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  532. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  533. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  534. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  535. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  536. package/dist/frontend/npm-static.js +4 -20
  537. package/dist/frontend/npm-static.js.map +1 -1
  538. package/dist/frontend/package-shims.d.ts +3 -0
  539. package/dist/frontend/package-shims.js +71 -8
  540. package/dist/frontend/package-shims.js.map +1 -1
  541. package/dist/frontend/pipeline.js +19 -11
  542. package/dist/frontend/pipeline.js.map +1 -1
  543. package/dist/frontend/process-fork.d.ts +25 -0
  544. package/dist/frontend/process-fork.js +2 -0
  545. package/dist/frontend/process-fork.js.map +1 -0
  546. package/dist/frontend/program-analysis.d.ts +5 -1
  547. package/dist/frontend/program-analysis.js +5 -0
  548. package/dist/frontend/program-analysis.js.map +1 -1
  549. package/dist/frontend/program.d.ts +21 -6
  550. package/dist/frontend/program.js +681 -83
  551. package/dist/frontend/program.js.map +1 -1
  552. package/dist/frontend/program.test.js +43 -3
  553. package/dist/frontend/program.test.js.map +1 -1
  554. package/dist/frontend/token-equivalence.d.ts +3 -0
  555. package/dist/frontend/token-equivalence.js +409 -0
  556. package/dist/frontend/token-equivalence.js.map +1 -0
  557. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  558. package/dist/frontend/token-equivalence.test.js +67 -0
  559. package/dist/frontend/token-equivalence.test.js.map +1 -0
  560. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  561. package/dist/frontend/ts7/ast-node.js +1048 -103
  562. package/dist/frontend/ts7/ast-node.js.map +1 -1
  563. package/dist/frontend/ts7/ast-node.test.js +24 -0
  564. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  565. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  566. package/dist/frontend/ts7/ast-wire.js +34 -24
  567. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  568. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  569. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  570. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  571. package/dist/frontend/ts7/checker-backend.js +2 -2
  572. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  573. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  574. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  575. package/dist/frontend/ts7/checker.d.ts +4 -0
  576. package/dist/frontend/ts7/checker.js +7 -0
  577. package/dist/frontend/ts7/checker.js.map +1 -1
  578. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  579. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  580. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  581. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  582. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  583. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  584. package/dist/frontend/ts7/program-host.d.ts +7 -0
  585. package/dist/frontend/ts7/program-host.js +25 -2
  586. package/dist/frontend/ts7/program-host.js.map +1 -1
  587. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  588. package/dist/frontend/ts7/semantic-model.js +5 -0
  589. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  590. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  591. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  592. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  593. package/dist/frontend/ts7/semantic-types.js +1 -1
  594. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  595. package/dist/frontend/ts7/session.d.ts +14 -1
  596. package/dist/frontend/ts7/session.js +22 -0
  597. package/dist/frontend/ts7/session.js.map +1 -1
  598. package/dist/frontend/type-mapper.d.ts +13 -1
  599. package/dist/frontend/type-mapper.js +229 -20
  600. package/dist/frontend/type-mapper.js.map +1 -1
  601. package/dist/index.d.ts +0 -5
  602. package/dist/index.js +46 -4
  603. package/dist/index.js.map +1 -1
  604. package/dist/ir/analysis.js +5 -3
  605. package/dist/ir/analysis.js.map +1 -1
  606. package/dist/ir/array-length-stability.d.ts +4 -0
  607. package/dist/ir/array-length-stability.js +19 -6
  608. package/dist/ir/array-length-stability.js.map +1 -1
  609. package/dist/ir/array-length-stability.test.js +24 -0
  610. package/dist/ir/array-length-stability.test.js.map +1 -1
  611. package/dist/ir/builtin-effects.d.ts +7 -0
  612. package/dist/ir/builtin-effects.js +60 -0
  613. package/dist/ir/builtin-effects.js.map +1 -1
  614. package/dist/ir/builtin-signatures.d.ts +6 -4
  615. package/dist/ir/builtin-signatures.js +222 -13
  616. package/dist/ir/builtin-signatures.js.map +1 -1
  617. package/dist/ir/callback-specialization.d.ts +2 -1
  618. package/dist/ir/callback-specialization.js +23 -18
  619. package/dist/ir/callback-specialization.js.map +1 -1
  620. package/dist/ir/char-unit-locals.d.ts +19 -0
  621. package/dist/ir/char-unit-locals.js +185 -0
  622. package/dist/ir/char-unit-locals.js.map +1 -0
  623. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  624. package/dist/ir/char-unit-locals.test.js +94 -0
  625. package/dist/ir/char-unit-locals.test.js.map +1 -0
  626. package/dist/ir/final-fields.d.ts +2 -1
  627. package/dist/ir/final-fields.js +14 -16
  628. package/dist/ir/final-fields.js.map +1 -1
  629. package/dist/ir/function-references.d.ts +2 -0
  630. package/dist/ir/function-references.js +2 -0
  631. package/dist/ir/function-references.js.map +1 -1
  632. package/dist/ir/function-references.test.js +3 -0
  633. package/dist/ir/function-references.test.js.map +1 -1
  634. package/dist/ir/initializer-bindings.d.ts +2 -1
  635. package/dist/ir/initializer-bindings.js +27 -20
  636. package/dist/ir/initializer-bindings.js.map +1 -1
  637. package/dist/ir/int32-arrays.d.ts +108 -0
  638. package/dist/ir/int32-arrays.js +831 -0
  639. package/dist/ir/int32-arrays.js.map +1 -0
  640. package/dist/ir/int32-slots.d.ts +24 -2
  641. package/dist/ir/int32-slots.js +266 -57
  642. package/dist/ir/int32-slots.js.map +1 -1
  643. package/dist/ir/int32-slots.test.js +33 -0
  644. package/dist/ir/int32-slots.test.js.map +1 -1
  645. package/dist/ir/integer-loops.d.ts +3 -3
  646. package/dist/ir/integer-loops.js +28 -10
  647. package/dist/ir/integer-loops.js.map +1 -1
  648. package/dist/ir/integer-loops.test.js +10 -0
  649. package/dist/ir/integer-loops.test.js.map +1 -1
  650. package/dist/ir/integer-ranges.d.ts +5 -0
  651. package/dist/ir/integer-ranges.js +125 -12
  652. package/dist/ir/integer-ranges.js.map +1 -1
  653. package/dist/ir/integer-ranges.test.js +30 -0
  654. package/dist/ir/integer-ranges.test.js.map +1 -1
  655. package/dist/ir/ir.d.ts +83 -10
  656. package/dist/ir/ir.js +77 -6
  657. package/dist/ir/ir.js.map +1 -1
  658. package/dist/ir/ir.test.js +23 -2
  659. package/dist/ir/ir.test.js.map +1 -1
  660. package/dist/ir/js-ic.d.ts +4 -0
  661. package/dist/ir/js-ic.js +17 -1
  662. package/dist/ir/js-ic.js.map +1 -1
  663. package/dist/ir/js-ic.test.js +46 -0
  664. package/dist/ir/js-ic.test.js.map +1 -1
  665. package/dist/ir/node-index.d.ts +57 -0
  666. package/dist/ir/node-index.js +215 -0
  667. package/dist/ir/node-index.js.map +1 -0
  668. package/dist/ir/paired-while-loops.d.ts +25 -0
  669. package/dist/ir/paired-while-loops.js +335 -0
  670. package/dist/ir/paired-while-loops.js.map +1 -0
  671. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  672. package/dist/ir/paired-while-loops.test.js +163 -0
  673. package/dist/ir/paired-while-loops.test.js.map +1 -0
  674. package/dist/ir/parameter-versions.d.ts +25 -0
  675. package/dist/ir/parameter-versions.js +300 -0
  676. package/dist/ir/parameter-versions.js.map +1 -0
  677. package/dist/ir/runtime-features.d.ts +34 -13
  678. package/dist/ir/runtime-features.js +177 -39
  679. package/dist/ir/runtime-features.js.map +1 -1
  680. package/dist/ir/serialize.d.ts +12 -2
  681. package/dist/ir/serialize.js +16 -3
  682. package/dist/ir/serialize.js.map +1 -1
  683. package/dist/ir/serialize.test.js +17 -0
  684. package/dist/ir/serialize.test.js.map +1 -1
  685. package/dist/ir/traverse.js +18 -6
  686. package/dist/ir/traverse.js.map +1 -1
  687. package/dist/ir/validate.js +167 -40
  688. package/dist/ir/validate.js.map +1 -1
  689. package/dist/library/ir-policy.js +3 -0
  690. package/dist/library/ir-policy.js.map +1 -1
  691. package/dist/native/cache.d.ts +6 -1
  692. package/dist/native/cache.js +28 -5
  693. package/dist/native/cache.js.map +1 -1
  694. package/dist/native/cache.test.js +16 -2
  695. package/dist/native/cache.test.js.map +1 -1
  696. package/dist/native/cli.js +21 -1
  697. package/dist/native/cli.js.map +1 -1
  698. package/dist/native/compiler.js +8 -6
  699. package/dist/native/compiler.js.map +1 -1
  700. package/dist/native/executable-cache.d.ts +1 -1
  701. package/dist/native/executable-cache.js +2 -2
  702. package/dist/native/executable-cache.js.map +1 -1
  703. package/dist/native/prepare.d.ts +4 -2
  704. package/dist/native/prepare.js +130 -32
  705. package/dist/native/prepare.js.map +1 -1
  706. package/dist/native/prepare.test.js +96 -20
  707. package/dist/native/prepare.test.js.map +1 -1
  708. package/dist/native/sanitizer.test.js +2 -0
  709. package/dist/native/sanitizer.test.js.map +1 -1
  710. package/dist/native/text-file.d.ts +13 -3
  711. package/dist/native/text-file.js +63 -9
  712. package/dist/native/text-file.js.map +1 -1
  713. package/dist/native/text-file.test.d.ts +1 -0
  714. package/dist/native/text-file.test.js +49 -0
  715. package/dist/native/text-file.test.js.map +1 -0
  716. package/dist/native/toolchain.js +4 -4
  717. package/dist/native/toolchain.js.map +1 -1
  718. package/dist/native/toolchain.test.js +3 -3
  719. package/dist/native/toolchain.test.js.map +1 -1
  720. package/package.json +21 -21
  721. package/shims/chalk/v5.ts +688 -0
  722. package/shims/hono-node-server/v2.ts +645 -0
  723. package/shims/hot-shots/client.ts +1126 -0
  724. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  725. package/shims/hot-shots/v8.ts +8 -0
  726. package/surface-manifest.json +27 -7
@@ -1,6 +1,6 @@
1
1
  import { isIdentityCollectionKey, isRefCounted, mapOf, POINTER_KINDS, runtimeRcStem, RUNTIME_EMITTER_CLASS, RUNTIME_EVENT_CLASS, RUNTIME_EVENT_TARGET_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, DYN, STRING, } from "../../ir/ir.js";
2
2
  import { mangleClassRelease, mangleClassRetain, mangleClassTrace, mangleRecordGcFree, mangleRecordClone, mangleRecordNew, mangleRecordRelease, mangleRecordRetain, mangleRecordStruct, mangleRecordTrace, } from "../mangle.js";
3
- import { CYC_HDR, cycTypeDescriptor, emitObjectAlloc, emitObjectFree, CYC_APPEND, cycleAppendDecls, cycleAppendHelper, inlineBufferingSupported, } from "./alloc.js";
3
+ import { CYC_HDR, cycTypeDescriptor, emitObjectAlloc, emitObjectFree, emitSegmentFree, CYC_APPEND, cycleAppendDecls, cycleAppendHelper, inlineBufferingSupported, } from "./alloc.js";
4
4
  import { SCR_ARR_FIELD, llvmCommentText } from "./common.js";
5
5
  import { NULLABLE_NULL, SHAPE_WORD_INDEX, shapeReleaseFn, shapeTagFn, shapeTraceFn, shapeWordHeader, } from "./nullable-unions.js";
6
6
  import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, } from "./inline-unions.js";
@@ -210,6 +210,7 @@ function nullableRetainSym(host, arm) {
210
210
  const sym = `@sc_nretain_${arm.kind}`;
211
211
  if (!host.nullableUnions.retainWrappers.has(sym))
212
212
  host.nullableUnions.retainWrappers.set(sym, retainSym(host, arm));
213
+ host.journalEntry?.("retainWrapper", sym, host.nullableUnions.retainWrappers.get(sym));
213
214
  return sym;
214
215
  }
215
216
  /** Definitions of the requested NULL-skipping retain wrappers. */
@@ -354,6 +355,8 @@ export function inlineRcFamily(host, stem, op) {
354
355
  }
355
356
  const RELEASE_RC_OPS = new Set([
356
357
  "str:retain",
358
+ "str:release",
359
+ "map:retain",
357
360
  "dyn:retain",
358
361
  "dyn:release",
359
362
  "js:retain",
@@ -428,12 +431,25 @@ function inlineRcName(family, op) {
428
431
  * thousands of release sites; a body with more calls scr_dyn_release, which
429
432
  * the inline helper mirrors, at every site. */
430
433
  export const INLINE_DYN_RELEASES_PER_FUNCTION = 256;
431
- /** Apply {@link INLINE_DYN_RELEASES_PER_FUNCTION} to each function of an
432
- * emitted module, given as parts joined by newlines. A function can span
433
- * parts (main's lines) and a part can hold several functions. */
434
- export function limitInlineDynReleases(parts) {
435
- const call = `call void @${inlineRcName("dyn", "release")}(`;
436
- const runtime = `call void @${INLINE_RC_FAMILIES["dyn"].release}(`;
434
+ /** Inlined string releases one function body keeps in `release` emission,
435
+ * which inlines string releases (RELEASE_RC_OPS); the bodies with the most of them, such as
436
+ * builders of string-heavy records and module initializers, would grow the
437
+ * most for the least gain, so a body with more calls scr_str_release at
438
+ * every site. */
439
+ export const INLINE_STR_RELEASES_PER_FUNCTION = 8;
440
+ /** Apply {@link INLINE_DYN_RELEASES_PER_FUNCTION}, and in `release` emission
441
+ * {@link INLINE_STR_RELEASES_PER_FUNCTION}, to each function of an emitted
442
+ * module, given as parts joined by newlines. A function can span parts
443
+ * (main's lines) and a part can hold several functions. */
444
+ export function limitInlineReleases(parts, mode) {
445
+ const dyn = limitInlineReleaseFamily(parts, "dyn", INLINE_DYN_RELEASES_PER_FUNCTION);
446
+ return mode === "release"
447
+ ? limitInlineReleaseFamily(dyn, "str", INLINE_STR_RELEASES_PER_FUNCTION)
448
+ : dyn;
449
+ }
450
+ function limitInlineReleaseFamily(parts, family, max) {
451
+ const call = `call void @${inlineRcName(family, "release")}(`;
452
+ const runtime = `call void @${INLINE_RC_FAMILIES[family].release}(`;
437
453
  // The function each release site belongs to: the last `define` line
438
454
  // before it, counted over the joined text.
439
455
  const sites = (part, each, first) => {
@@ -456,7 +472,7 @@ export function limitInlineDynReleases(parts) {
456
472
  let fn = 0;
457
473
  for (const part of parts)
458
474
  fn = sites(part, (_, f) => counts.set(f, (counts.get(f) ?? 0) + 1), fn);
459
- const over = new Set([...counts].filter(([, n]) => n > INLINE_DYN_RELEASES_PER_FUNCTION).map(([f]) => f));
475
+ const over = new Set([...counts].filter(([, n]) => n > max).map(([f]) => f));
460
476
  if (over.size === 0)
461
477
  return [...parts];
462
478
  fn = 0;
@@ -813,6 +829,7 @@ small = false) {
813
829
  elem.kind === "stats" || // fs.Stats snapshots: scr_stats_* adapters, no trace
814
830
  elem.kind === "dyn" || // native collection seeds/drains: traced REF
815
831
  elem.kind === "regex" || // RegExp values: scr_regex_* adapters, no trace (no refs inside)
832
+ elem.kind === "date" || // Date objects: scr_date_* adapters, no trace (no refs inside)
816
833
  (elem.kind === "array" && traceAdapter(host, elem) !== null);
817
834
  if (!useRef) {
818
835
  if (small) {
@@ -831,15 +848,33 @@ small = false) {
831
848
  }
832
849
  /** The %ScrArrOps descriptor (retain, release, trace, registry id) of a REF
833
850
  * element type, defined once per module and shared by all its arrays. It is
834
- * writable: the runtime stores its registry id on the first array. */
851
+ * writable: the runtime stores its registry id on the first array. Its tail
852
+ * padding is the runtime's flags word (0); arrays of compact class
853
+ * references (ShapeHost.compactArrayElem) spell the word out as
854
+ * SCR_ARR_OPS_COMPACT, and on 64-bit targets arrays whose element release
855
+ * does nothing (ShapeHost.releasesNothing) as SCR_ARR_OPS_RELEASE_NOTHING,
856
+ * so that destroying them only frees their storage. */
835
857
  export function arrOps(host, elem) {
836
858
  const v = vAdapters(host, elem);
837
859
  const trace = traceArg(host, elem);
838
860
  const part = (sym) => sym.replace(/^@/, "").replace(/[^A-Za-z0-9_.]/g, "_");
839
861
  const name = `@sc_arrops.${part(v.retain)}.${part(v.release)}.${part(trace)}`;
862
+ if (host.compactArrayElem?.(elem) === true) {
863
+ host.declare(`${name}.c = internal global { ptr, ptr, ptr, i32, i32 } { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0, i32 ${SCR_ARR_OPS_COMPACT} }`);
864
+ return `${name}.c`;
865
+ }
866
+ const nullable = host.nullableUnions.of(elem);
867
+ const payload = nullable?.repr === "single" ? nullable.arm : elem;
868
+ if (host.sizeType === "i64" && host.releasesNothing?.(payload) === true) {
869
+ host.declare(`${name}.n = internal global { ptr, ptr, ptr, i32, i32 } { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0, i32 ${SCR_ARR_OPS_RELEASE_NOTHING} }`);
870
+ return `${name}.n`;
871
+ }
840
872
  host.declare(`${name} = internal global %ScrArrOps { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0 }`);
841
873
  return name;
842
874
  }
875
+ /** scr_array.h SCR_ARR_OPS_COMPACT and SCR_ARR_OPS_RELEASE_NOTHING. */
876
+ const SCR_ARR_OPS_COMPACT = 1;
877
+ const SCR_ARR_OPS_RELEASE_NOTHING = 2;
843
878
  /* ── capture boxes ────────────────────────────────────────────────────── */
844
879
  /** Box construction call text (boxNewC's dispatch): plain-kind boxes for
845
880
  * the runtime-known payloads, obj-kind boxes (RC entry points + trace as
@@ -848,7 +883,6 @@ export function arrOps(host, elem) {
848
883
  export function boxNewCall(host, t) {
849
884
  const plain = {
850
885
  f64: 0,
851
- date: 0,
852
886
  procStream: 0,
853
887
  bool: 1,
854
888
  string: 2,
@@ -872,11 +906,7 @@ export function boxNewCall(host, t) {
872
906
  }
873
907
  /** Box accessor suffix (boxAccess): scalars unboxed, ref kinds pointers. */
874
908
  export function boxAccess(t) {
875
- return t.kind === "f64" || t.kind === "date" || t.kind === "procStream"
876
- ? "f64"
877
- : t.kind === "bool"
878
- ? "bool"
879
- : "ref";
909
+ return t.kind === "f64" || t.kind === "procStream" ? "f64" : t.kind === "bool" ? "bool" : "ref";
880
910
  }
881
911
  /* ── record shapes ────────────────────────────────────────────────────── */
882
912
  /** A record field's in-struct LLVM type. bool fields store as i8 (the C
@@ -889,7 +919,6 @@ export function llFieldType(t, inline) {
889
919
  return "ptr";
890
920
  switch (t.kind) {
891
921
  case "f64":
892
- case "date":
893
922
  case "procStream":
894
923
  return "double";
895
924
  case "bool":
@@ -1041,11 +1070,18 @@ export const DIRECT_DESTROY_CHAIN = 16;
1041
1070
  /** The release of child `value` (a loaded field, possibly NULL) inside a
1042
1071
  * teardown whose chain length is `%d`: the child's own release for a shared
1043
1072
  * or immortal reference, its teardown for the last one. Labels use `tag`;
1044
- * the lines end in the open block `${tag}.next`. */
1045
- export function directChildReleaseLines(host, tag, value, target, comment) {
1073
+ * the lines end in the open block `${tag}.next`.
1074
+ *
1075
+ * With `segment` (the child has the teardown's own type, in a segmented
1076
+ * teardown; segmentPrologueLines), the child's teardown appends its blocks
1077
+ * to the teardown's segment. */
1078
+ export function directChildReleaseLines(host, tag, value, target, comment, segment = false) {
1046
1079
  const S = host.sizeType;
1047
1080
  const C = target.count ?? S;
1048
- host.declare(`declare void @scr_rc_destroy(ptr, ptr)`);
1081
+ if (segment)
1082
+ host.declare(`declare ptr @scr_rc_destroy_seg(ptr, ptr, ptr, ptr)`);
1083
+ else
1084
+ host.declare(`declare void @scr_rc_destroy(ptr, ptr)`);
1049
1085
  const lines = [
1050
1086
  ` %${tag}.nn = icmp ne ptr ${value}, null`,
1051
1087
  ` br i1 %${tag}.nn, label %${tag}.chk, label %${tag}.next`,
@@ -1063,9 +1099,85 @@ export function directChildReleaseLines(host, tag, value, target, comment) {
1063
1099
  host.declare(`declare void @scr_cyc_on_dead(ptr)`);
1064
1100
  lines.push(` %${tag}.bufp = getelementptr i8, ptr ${value}, ${S} -${host.cycleBufOffset}`, ` %${tag}.buf = load i32, ptr %${tag}.bufp`, ` %${tag}.queued = icmp slt i32 %${tag}.buf, -1 ; buffered, not SCR_CYC_ACYCLIC`, ` br i1 %${tag}.queued, label %${tag}.unbuffer, label %${tag}.teardown`, `${tag}.unbuffer:`, ` call void @scr_cyc_on_dead(ptr ${value})`, ` br label %${tag}.teardown`, `${tag}.teardown:`);
1065
1101
  }
1066
- lines.push(` %${tag}.short = icmp ult i32 %d, ${DIRECT_DESTROY_CHAIN}`, ` br i1 %${tag}.short, label %${tag}.direct, label %${tag}.bounded`, `${tag}.direct:`, ` %${tag}.d = add i32 %d, 1`, ` call void @${target.destroy}_d(ptr ${value}, i32 %${tag}.d)`, ` br label %${tag}.next`, `${tag}.bounded:`, ` call void @scr_rc_destroy(ptr ${value}, ptr @${target.destroy})`, ` br label %${tag}.next`, `${tag}.next:`);
1102
+ lines.push(` %${tag}.short = icmp ult i32 %d, ${DIRECT_DESTROY_CHAIN}`, ` br i1 %${tag}.short, label %${tag}.direct, label %${tag}.bounded`, `${tag}.direct:`, ` %${tag}.d = add i32 %d, 1`);
1103
+ if (!segment) {
1104
+ lines.push(` call void @${target.destroy}_d(ptr ${value}, i32 %${tag}.d)`, ` br label %${tag}.next`, `${tag}.bounded:`, ` call void @scr_rc_destroy(ptr ${value}, ptr @${target.destroy})`, ` br label %${tag}.next`, `${tag}.next:`);
1105
+ return lines;
1106
+ }
1107
+ lines.push(` %${tag}.t = load ptr, ptr %sg.t`, ` %${tag}.dt = call ptr @${target.destroy}_s(ptr ${value}, i32 %${tag}.d, ptr %${tag}.t)`, ` store ptr %${tag}.dt, ptr %sg.t`, ` br label %${tag}.next`, `${tag}.bounded:`, ` %${tag}.bt = load ptr, ptr %sg.t`, ` %${tag}.rt = call ptr @scr_rc_destroy_seg(ptr ${value}, ptr @${target.destroy}_sc, ptr @${target.destroy}, ptr %${tag}.bt)`, ` store ptr %${tag}.rt, ptr %sg.t`, ` br label %${tag}.next`, `${tag}.next:`);
1067
1108
  return lines;
1068
1109
  }
1110
+ /* Teardown segments. A typed teardown that frees each block onto its free
1111
+ * list as it goes frees a tree in walk order, and the free lists, which are
1112
+ * LIFO, hand the blocks to the next allocations in the reverse order: a tree
1113
+ * built again in the same order as the last (each generation of a structure
1114
+ * a loop rebuilds) is laid out mirrored, and every walk over it, the next
1115
+ * teardown included, runs through memory backwards, which defeats the
1116
+ * hardware prefetchers. The runtime frees large dead sets of the cycle
1117
+ * collector in address order for the same reason (scr_mem_order_for_free).
1118
+ *
1119
+ * So the teardown of a type with children of its own type (the `_s` form,
1120
+ * segmentedTeardown) keeps the blocks it frees in a segment, linked through
1121
+ * their first words, which it builds in order through a tail pointer: the
1122
+ * `_s` form takes the segment's last link (the first word of its last block,
1123
+ * or the head slot of an empty segment) and returns the new one. A node
1124
+ * first releases its own block (emitObjectFree, keeping it), then appends it
1125
+ * ahead of its children's blocks when its address is the lower, behind them
1126
+ * otherwise (segmentTeardownLines), and the children append theirs in field
1127
+ * order, so a structure
1128
+ * built parent first (object literals allocate before their fields) or
1129
+ * children first (constructor arguments) comes back in ascending order. The
1130
+ * chain's first teardown (`_d`) frees the whole segment onto the class's
1131
+ * free list in one step (emitSegmentFree), and the walks over the next
1132
+ * generation run forward. A teardown past DIRECT_DESTROY_CHAIN appends
1133
+ * through scr_rc_destroy_seg, under the same depth budget as
1134
+ * scr_rc_destroy. Blocks outside the calling thread's arena are freed as
1135
+ * before; one type's blocks are all of one class. */
1136
+ /** Whether the teardown of a type whose reference fields have `fieldTypes`
1137
+ * (with direct targets `targets`) and whose own teardown is `destroy` keeps
1138
+ * a segment: a child field has its own type, and the inline allocation paths
1139
+ * are in use. */
1140
+ export function segmentedTeardown(host, destroy, fieldTypes, targets) {
1141
+ if (host.inlineAlloc !== true)
1142
+ return false;
1143
+ return fieldTypes.some((t) => directDestroyTarget(host, t, targets)?.destroy === destroy);
1144
+ }
1145
+ /** The first lines of a segmented teardown, in its entry block: the
1146
+ * segment's last link (`%sg.t`, from the `%tail` argument) and the kept own
1147
+ * block (`%sg.own`, for emitObjectFree). */
1148
+ export function segmentPrologueLines() {
1149
+ return [
1150
+ ` %sg.t = alloca ptr`,
1151
+ ` %sg.own = alloca ptr`,
1152
+ ` store ptr %tail, ptr %sg.t`,
1153
+ ` store ptr null, ptr %sg.own`,
1154
+ ];
1155
+ }
1156
+ /** The rest of a segmented teardown after emitObjectFree kept (or freed)
1157
+ * its own block: the block goes ahead of its children's when its address is
1158
+ * below the first non-NULL one of `children` (loaded fields of the
1159
+ * teardown's own type, which stand for their blocks) or there is none, and
1160
+ * behind them otherwise; then the children's releases (`releases`, given a
1161
+ * label prefix), and the segment's last link is returned. Each order has its
1162
+ * own copy of the releases, so neither keeps the decision, or the block once
1163
+ * it is appended, across the children's teardowns. */
1164
+ export function segmentTeardownLines(children, releases) {
1165
+ const lines = [` %sg.o = load ptr, ptr %sg.own`, ` %sg.kept = icmp ne ptr %sg.o, null`];
1166
+ let ref = "null";
1167
+ [...children].reverse().forEach((child, i) => {
1168
+ lines.push(` %sg.nn${i} = icmp ne ptr ${child}, null`, ` %sg.r${i} = select i1 %sg.nn${i}, ptr ${child}, ptr ${ref}`);
1169
+ ref = `%sg.r${i}`;
1170
+ });
1171
+ lines.push(` %sg.leaf = icmp eq ptr ${ref}, null`, ` %sg.lower = icmp ult ptr %sg.o, ${ref}`, ` %sg.first = or i1 %sg.leaf, %sg.lower`, ` %sg.ahead = and i1 %sg.kept, %sg.first`, ` br i1 %sg.ahead, label %sg.front, label %sg.back`, `sg.front:`, ...segmentAppendLines("a"), ...releases("ta"), ` br label %sg.ret`, `sg.back:`, ...releases("tb"), ` %sg.keep = icmp ne ptr %sg.o, null`, ` br i1 %sg.keep, label %sg.last, label %sg.ret`, `sg.last:`, ...segmentAppendLines("l"), ` br label %sg.ret`, `sg.ret:`, ` %sg.tr = load ptr, ptr %sg.t`, ` ret ptr %sg.tr`);
1172
+ return lines;
1173
+ }
1174
+ function segmentAppendLines(tag) {
1175
+ return [
1176
+ ` %sg.t${tag} = load ptr, ptr %sg.t`,
1177
+ ` store ptr %sg.o, ptr %sg.t${tag}`,
1178
+ ` store ptr %sg.o, ptr %sg.t`,
1179
+ ];
1180
+ }
1069
1181
  /** The direct-teardown target of a reference of `type`, if `targets` (keyed
1070
1182
  * `record:<id>` / `object:<class>`) has one. Nullable unions hold the arm's
1071
1183
  * pointer, NULL or an immortal sentinel, which the child release handles. */
@@ -1100,8 +1212,37 @@ export function usedDirectTargets(host, candidates, fieldTypes) {
1100
1212
  }
1101
1213
  /** The teardown definitions for `destroy`: with `chained`, the body takes
1102
1214
  * the chain length `%d` (directChildReleaseLines) and the runtime's
1103
- * one-argument entry starts a chain. */
1104
- export function destroyDefinitions(destroy, body, chained) {
1215
+ * one-argument entry starts a chain. With `segment` (the host, for a
1216
+ * segmented teardown), the body is a segment teardown's
1217
+ * (segmentPrologueLines to segmentTeardownLines), defined as `_s`, with
1218
+ * `_sc` for scr_rc_destroy_seg, and `_d` starts a segment and frees it. */
1219
+ export function destroyDefinitions(destroy, body, chained, segment = null) {
1220
+ if (segment !== null)
1221
+ return [
1222
+ `define internal ptr @${destroy}_s(ptr %o, i32 %d, ptr %tail) ${FN_ATTRS} {`,
1223
+ `entry:`,
1224
+ ...body,
1225
+ `}`,
1226
+ `define internal ptr @${destroy}_sc(ptr %o, ptr %tail) ${FN_ATTRS} {`,
1227
+ `entry:`,
1228
+ ` %t = call ptr @${destroy}_s(ptr %o, i32 0, ptr %tail)`,
1229
+ ` ret ptr %t`,
1230
+ `}`,
1231
+ `define internal void @${destroy}_d(ptr %o, i32 %d) ${FN_ATTRS} {`,
1232
+ `entry:`,
1233
+ ` %head = alloca ptr`,
1234
+ ` store ptr null, ptr %head`,
1235
+ ` %last = call ptr @${destroy}_s(ptr %o, i32 %d, ptr %head)`,
1236
+ ` %first = load ptr, ptr %head`,
1237
+ ...emitSegmentFree(segment, "sgf", "%first", "%last"),
1238
+ ` ret void`,
1239
+ `}`,
1240
+ `define internal void @${destroy}(ptr %o) ${FN_ATTRS} {`,
1241
+ `entry:`,
1242
+ ` call void @${destroy}_d(ptr %o, i32 0)`,
1243
+ ` ret void`,
1244
+ `}`,
1245
+ ];
1105
1246
  if (!chained)
1106
1247
  return [
1107
1248
  `define internal void @${destroy}(ptr %o) ${FN_ATTRS} {`,
@@ -1123,6 +1264,15 @@ export function destroyDefinitions(destroy, body, chained) {
1123
1264
  `}`,
1124
1265
  ];
1125
1266
  }
1267
+ /** The frozen bit of a freezable record's rc word (scr_rc.h SCR_RC_FROZEN):
1268
+ * bit 62 on 64-bit targets, bit 30 on 32-bit ones. */
1269
+ function recordFrozenBit(sizeType) {
1270
+ return 1n << (sizeType === "i64" ? 62n : 30n);
1271
+ }
1272
+ /** `value` as a signed LLVM integer literal of `sizeType`. */
1273
+ function sizeLiteral(sizeType, value) {
1274
+ return BigInt.asIntN(sizeType === "i64" ? 64 : 32, value).toString();
1275
+ }
1126
1276
  /** Common NULL/immortal/decrement skeleton for ordinary object releases.
1127
1277
  * `freeBody` owns the zero-ref teardown and must leave the current block at
1128
1278
  * its end; traced objects also get the possible-cycle-root branch.
@@ -1130,14 +1280,16 @@ export function destroyDefinitions(destroy, body, chained) {
1130
1280
  * `fnName` is only the inlinable fast path (releaseFastPath); the complete
1131
1281
  * release is `${fnName}_slow`, kept out of line so callers that inline the
1132
1282
  * release do not also inline its teardown. */
1133
- export function releaseBody(host, fnName, traced, freeBody, comment = "", bounded = true, immortal = false, chained = false) {
1283
+ export function releaseBody(host, fnName, traced, freeBody, comment = "", bounded = true, immortal = false, chained = false, segmented = false, frozen = false) {
1134
1284
  const S = host.sizeType;
1135
1285
  if (bounded)
1136
1286
  host.declare(`declare void @scr_rc_destroy(ptr, ptr)`);
1137
1287
  const destroy = `${fnName}_destroy`;
1288
+ // A freezable record's count is the word without its frozen bit.
1289
+ const notFrozen = sizeLiteral(S, ~recordFrozenBit(S));
1138
1290
  const lines = [
1139
- ...(bounded ? destroyDefinitions(destroy, freeBody, chained) : []),
1140
- ...releaseFastPath(host, fnName, `${fnName}_slow`, traced, comment, immortal),
1291
+ ...(bounded ? destroyDefinitions(destroy, freeBody, chained, segmented ? host : null) : []),
1292
+ ...releaseFastPath(host, fnName, `${fnName}_slow`, traced, comment, immortal, S, frozen),
1141
1293
  `define internal void @${fnName}_slow(ptr %o) noinline ${FN_ATTRS} {${comment ? ` ; ${comment}` : ""}`,
1142
1294
  `entry:`,
1143
1295
  ` %isnull = icmp eq ptr %o, null`,
@@ -1149,7 +1301,9 @@ export function releaseBody(host, fnName, traced, freeBody, comment = "", bounde
1149
1301
  `dec:`,
1150
1302
  ` %n = sub ${S} %rc, 1`,
1151
1303
  ` store ${S} %n, ptr %o`,
1152
- ` %dead = icmp eq ${S} %n, 0`,
1304
+ ...(frozen
1305
+ ? [` %refs = and ${S} %n, ${notFrozen}`, ` %dead = icmp eq ${S} %refs, 0`]
1306
+ : [` %dead = icmp eq ${S} %n, 0`]),
1153
1307
  ` br i1 %dead, label %free, label %${traced ? "root" : "done"}`,
1154
1308
  `free:`,
1155
1309
  ...(traced ? cycleDeadLines(host, "teardown") : []),
@@ -1170,10 +1324,14 @@ export function releaseBody(host, fnName, traced, freeBody, comment = "", bounde
1170
1324
  * call `slow`, which
1171
1325
  * holds the complete release: inlining it everywhere would copy teardowns
1172
1326
  * (and their destroy calls) into every caller. */
1173
- export function releaseFastPath(host, fnName, slow, traced, comment = "", immortal = false, count = host.sizeType) {
1327
+ export function releaseFastPath(host, fnName, slow, traced, comment = "", immortal = false, count = host.sizeType, frozen = false) {
1174
1328
  const S = count;
1175
1329
  if (immortal)
1176
1330
  return immortalRcBody(host, fnName, "void", comment);
1331
+ // A freezable record compares its count without the frozen bit: an
1332
+ // immortal word's count is then ~FROZEN, which the same compare sends to
1333
+ // `slow`.
1334
+ const notFrozen = ~recordFrozenBit(S);
1177
1335
  return [
1178
1336
  `define internal void @${fnName}(ptr %o) ${FN_ATTRS} {${comment ? ` ; ${comment} (fast path)` : ""}`,
1179
1337
  `entry:`,
@@ -1181,8 +1339,13 @@ export function releaseFastPath(host, fnName, slow, traced, comment = "", immort
1181
1339
  ` br i1 %isnull, label %done, label %check`,
1182
1340
  `check:`,
1183
1341
  ` %rc = load ${S}, ptr %o`,
1184
- ` %rcm2 = sub ${S} %rc, 2`,
1185
- ` %shared = icmp ult ${S} %rcm2, -3`,
1342
+ ...(frozen
1343
+ ? [
1344
+ ` %refs = and ${S} %rc, ${sizeLiteral(S, notFrozen)}`,
1345
+ ` %rcm2 = sub ${S} %refs, 2`,
1346
+ ` %shared = icmp ult ${S} %rcm2, ${sizeLiteral(S, notFrozen - 2n)}`,
1347
+ ]
1348
+ : [` %rcm2 = sub ${S} %rc, 2`, ` %shared = icmp ult ${S} %rcm2, -3`]),
1186
1349
  ` br i1 %shared, label %dec, label %slow`,
1187
1350
  `dec:`,
1188
1351
  ` %n = sub ${S} %rc, 1`,
@@ -1344,21 +1507,42 @@ export function emitRecordShapes(host, mod) {
1344
1507
  // direct children.
1345
1508
  const chained = directTargets.has(`record:${shape.id}`) ||
1346
1509
  refMembers.some((m) => directDestroyTarget(host, m.type, directTargets) !== null);
1347
- for (const m of refMembers) {
1348
- freeBody.push(` %f${t} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${m.index}`, ` %v${t} = load ptr, ptr %f${t}`);
1510
+ const destroy = `${mangleRecordRelease(shape.id)}_destroy`;
1511
+ const bounded = refMembers.some((member) => needsBoundedRelease(member.type));
1512
+ const segmented = bounded &&
1513
+ segmentedTeardown(host, destroy, refMembers.map((m) => m.type), directTargets);
1514
+ // Closed layouts can carry a kept record source (record-sources.ts).
1515
+ const observers = recordMayKeepSource(shape) ? "weak-or-source" : "weak";
1516
+ // A segmented teardown loads its fields, releases its own block, and
1517
+ // then releases the fields (segmentTeardownLines).
1518
+ const loads = [];
1519
+ const ownType = [];
1520
+ const release = (prefix, m, i) => {
1349
1521
  const direct = directDestroyTarget(host, m.type, directTargets);
1350
- if (direct) {
1351
- freeBody.push(...directChildReleaseLines(host, `td${t}`, `%v${t}`, direct, llvmCommentText(m.name)));
1352
- }
1353
- else {
1354
- freeBody.push(` call void ${releaseSym(host, m.type)}(ptr %v${t}) ; ${llvmCommentText(m.name)}`);
1522
+ if (direct === null)
1523
+ return [` call void ${releaseSym(host, m.type)}(ptr %v${i}) ; ${llvmCommentText(m.name)}`];
1524
+ const own = segmented && direct.destroy === destroy;
1525
+ return directChildReleaseLines(host, `${prefix}${i}`, `%v${i}`, direct, llvmCommentText(m.name), own);
1526
+ };
1527
+ for (const m of refMembers) {
1528
+ const fieldLines = [
1529
+ ` %f${t} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${m.index}`,
1530
+ ` %v${t} = load ptr, ptr %f${t}`,
1531
+ ];
1532
+ if (segmented) {
1533
+ loads.push(...fieldLines);
1534
+ if (directDestroyTarget(host, m.type, directTargets)?.destroy === destroy)
1535
+ ownType.push(`%v${t}`);
1355
1536
  }
1537
+ else
1538
+ freeBody.push(...fieldLines, ...release("td", m, t));
1356
1539
  t++;
1357
1540
  }
1358
- // Closed layouts can carry a kept record source (record-sources.ts).
1359
- const observers = recordMayKeepSource(shape) ? "weak-or-source" : "weak";
1360
- freeBody.push(...emitObjectFree(host, traced, observers));
1361
- defs.push(...releaseBody(host, mangleRecordRelease(shape.id), traced, freeBody, "", refMembers.some((member) => needsBoundedRelease(member.type)), false, chained), ``);
1541
+ if (segmented)
1542
+ freeBody.push(...segmentPrologueLines(), ...loads, ...emitObjectFree(host, traced, observers, "%sg.own"), ...segmentTeardownLines(ownType, (prefix) => refMembers.flatMap((m, i) => release(prefix, m, i))));
1543
+ else
1544
+ freeBody.push(...emitObjectFree(host, traced, observers));
1545
+ defs.push(...releaseBody(host, mangleRecordRelease(shape.id), traced, freeBody, "", bounded, false, chained, segmented, shape.freezable === true), ``);
1362
1546
  // new: zeroed allocation (+ the overflow map on index-signature
1363
1547
  // shapes), rc = 1. Traced shapes allocate with the collector header;
1364
1548
  // alloc.ts inlines the allocator fast paths and the alloc note.