@scriptc/compiler 0.4.5 → 0.4.6

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 (1200) hide show
  1. package/ambient/node-fallback/assert-strict.d.ts +47 -0
  2. package/ambient/node-fallback/assert.d.ts +86 -0
  3. package/ambient/node-fallback/async_hooks.d.ts +41 -0
  4. package/ambient/node-fallback/buffer.d.ts +23 -0
  5. package/ambient/node-fallback/child_process.d.ts +242 -0
  6. package/ambient/node-fallback/cluster.d.ts +17 -0
  7. package/ambient/node-fallback/constants.d.ts +15 -0
  8. package/ambient/node-fallback/crypto.d.ts +837 -0
  9. package/ambient/node-fallback/dgram.d.ts +58 -0
  10. package/ambient/node-fallback/diagnostics_channel.d.ts +87 -0
  11. package/ambient/node-fallback/dns-promises.d.ts +27 -0
  12. package/ambient/node-fallback/dns.d.ts +65 -0
  13. package/ambient/node-fallback/events.d.ts +60 -0
  14. package/ambient/node-fallback/fs-promises.d.ts +225 -0
  15. package/ambient/node-fallback/fs.d.ts +641 -0
  16. package/ambient/node-fallback/graceful-fs.d.ts +9 -0
  17. package/ambient/node-fallback/http.d.ts +326 -0
  18. package/ambient/node-fallback/http2.d.ts +816 -0
  19. package/ambient/node-fallback/https.d.ts +59 -0
  20. package/ambient/node-fallback/module.d.ts +10 -0
  21. package/ambient/node-fallback/net.d.ts +374 -0
  22. package/ambient/node-fallback/os.d.ts +288 -0
  23. package/ambient/node-fallback/path-posix.d.ts +22 -0
  24. package/ambient/node-fallback/path-win32.d.ts +22 -0
  25. package/ambient/node-fallback/path.d.ts +55 -0
  26. package/ambient/node-fallback/process.d.ts +11 -0
  27. package/ambient/node-fallback/punycode.d.ts +18 -0
  28. package/ambient/node-fallback/querystring.d.ts +55 -0
  29. package/ambient/node-fallback/stream-consumers.d.ts +21 -0
  30. package/ambient/node-fallback/stream-promises.d.ts +28 -0
  31. package/ambient/node-fallback/stream-web.d.ts +36 -0
  32. package/ambient/node-fallback/stream.d.ts +644 -0
  33. package/ambient/node-fallback/string_decoder.d.ts +20 -0
  34. package/ambient/node-fallback/test.d.ts +236 -0
  35. package/ambient/node-fallback/timers-promises.d.ts +31 -0
  36. package/ambient/node-fallback/timers.d.ts +28 -0
  37. package/ambient/node-fallback/tls.d.ts +169 -0
  38. package/ambient/node-fallback/url.d.ts +95 -0
  39. package/ambient/node-fallback/util-types.d.ts +50 -0
  40. package/ambient/node-fallback/util.d.ts +416 -0
  41. package/ambient/node-fallback/v8.d.ts +43 -0
  42. package/ambient/node-fallback/worker_threads.d.ts +113 -0
  43. package/ambient/node-fallback/zlib.d.ts +422 -0
  44. package/ambient/scriptc-node-fallback.d.ts +224 -6688
  45. package/dist/backend/cycle-analysis.js +4 -0
  46. package/dist/backend/cycle-analysis.js.map +1 -1
  47. package/dist/backend/executable-features.d.ts +1 -1
  48. package/dist/backend/executable-features.js +15 -2
  49. package/dist/backend/executable-features.js.map +1 -1
  50. package/dist/backend/huge-text.d.ts +16 -0
  51. package/dist/backend/huge-text.js +103 -0
  52. package/dist/backend/huge-text.js.map +1 -0
  53. package/dist/backend/huge-text.test.d.ts +1 -0
  54. package/dist/backend/huge-text.test.js +73 -0
  55. package/dist/backend/huge-text.test.js.map +1 -0
  56. package/dist/backend/library-pack.js +1 -1
  57. package/dist/backend/library-pack.js.map +1 -1
  58. package/dist/backend/link-plan-core.d.ts +10 -0
  59. package/dist/backend/link-plan-core.js +14 -2
  60. package/dist/backend/link-plan-core.js.map +1 -1
  61. package/dist/backend/link-plan-core.test.d.ts +1 -0
  62. package/dist/backend/link-plan-core.test.js +20 -0
  63. package/dist/backend/link-plan-core.test.js.map +1 -0
  64. package/dist/backend/link-plan.d.ts +8 -0
  65. package/dist/backend/link-plan.js +7 -0
  66. package/dist/backend/link-plan.js.map +1 -1
  67. package/dist/backend/linker.js +37 -14
  68. package/dist/backend/linker.js.map +1 -1
  69. package/dist/backend/lld.d.ts +13 -0
  70. package/dist/backend/lld.js +18 -1
  71. package/dist/backend/lld.js.map +1 -1
  72. package/dist/backend/lld.test.js +7 -1
  73. package/dist/backend/lld.test.js.map +1 -1
  74. package/dist/backend/llvm/alloc.d.ts +2 -0
  75. package/dist/backend/llvm/alloc.js +1 -1
  76. package/dist/backend/llvm/alloc.js.map +1 -1
  77. package/dist/backend/llvm/arenas.d.ts +78 -0
  78. package/dist/backend/llvm/arenas.js +313 -0
  79. package/dist/backend/llvm/arenas.js.map +1 -0
  80. package/dist/backend/llvm/arenas.test.d.ts +1 -0
  81. package/dist/backend/llvm/arenas.test.js +140 -0
  82. package/dist/backend/llvm/arenas.test.js.map +1 -0
  83. package/dist/backend/llvm/blocks.d.ts +11 -1
  84. package/dist/backend/llvm/blocks.js +23 -5
  85. package/dist/backend/llvm/blocks.js.map +1 -1
  86. package/dist/backend/llvm/bytes-headers.d.ts +19 -0
  87. package/dist/backend/llvm/bytes-headers.js +55 -0
  88. package/dist/backend/llvm/bytes-headers.js.map +1 -0
  89. package/dist/backend/llvm/bytes-loop-versions.d.ts +4 -3
  90. package/dist/backend/llvm/bytes-loop-versions.js +42 -7
  91. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  92. package/dist/backend/llvm/bytes-loop-versions.test.js +39 -4
  93. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  94. package/dist/backend/llvm/call-lifetimes.d.ts +5 -0
  95. package/dist/backend/llvm/call-lifetimes.js +43 -8
  96. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  97. package/dist/backend/llvm/call-lifetimes.test.js +26 -0
  98. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  99. package/dist/backend/llvm/checked-narrows.d.ts +3 -0
  100. package/dist/backend/llvm/checked-narrows.js +8 -1
  101. package/dist/backend/llvm/checked-narrows.js.map +1 -1
  102. package/dist/backend/llvm/class-unions.d.ts +21 -0
  103. package/dist/backend/llvm/class-unions.js +141 -0
  104. package/dist/backend/llvm/class-unions.js.map +1 -0
  105. package/dist/backend/llvm/class-unions.test.d.ts +1 -0
  106. package/dist/backend/llvm/class-unions.test.js +137 -0
  107. package/dist/backend/llvm/class-unions.test.js.map +1 -0
  108. package/dist/backend/llvm/classes.d.ts +46 -8
  109. package/dist/backend/llvm/classes.js +259 -32
  110. package/dist/backend/llvm/classes.js.map +1 -1
  111. package/dist/backend/llvm/classes.test.js +4 -0
  112. package/dist/backend/llvm/classes.test.js.map +1 -1
  113. package/dist/backend/llvm/common.d.ts +23 -0
  114. package/dist/backend/llvm/common.js +34 -0
  115. package/dist/backend/llvm/common.js.map +1 -1
  116. package/dist/backend/llvm/constant-callbacks.test.js +39 -0
  117. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  118. package/dist/backend/llvm/constant-choices.d.ts +32 -0
  119. package/dist/backend/llvm/constant-choices.js +209 -0
  120. package/dist/backend/llvm/constant-choices.js.map +1 -0
  121. package/dist/backend/llvm/constant-choices.test.d.ts +1 -0
  122. package/dist/backend/llvm/constant-choices.test.js +94 -0
  123. package/dist/backend/llvm/constant-choices.test.js.map +1 -0
  124. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  125. package/dist/backend/llvm/counted-loops.js +60 -7
  126. package/dist/backend/llvm/counted-loops.js.map +1 -1
  127. package/dist/backend/llvm/counted-loops.test.d.ts +1 -0
  128. package/dist/backend/llvm/counted-loops.test.js +34 -0
  129. package/dist/backend/llvm/counted-loops.test.js.map +1 -0
  130. package/dist/backend/llvm/cpu-dispatch.d.ts +26 -0
  131. package/dist/backend/llvm/cpu-dispatch.js +279 -0
  132. package/dist/backend/llvm/cpu-dispatch.js.map +1 -0
  133. package/dist/backend/llvm/dense-array-access.d.ts +13 -2
  134. package/dist/backend/llvm/dense-array-access.js +60 -6
  135. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  136. package/dist/backend/llvm/dyn-handle-tags.test.js +40 -14
  137. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  138. package/dist/backend/llvm/dyn.d.ts +28 -2
  139. package/dist/backend/llvm/dyn.js +176 -27
  140. package/dist/backend/llvm/dyn.js.map +1 -1
  141. package/dist/backend/llvm/emit-function.js +25 -3
  142. package/dist/backend/llvm/emit-function.js.map +1 -1
  143. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  144. package/dist/backend/llvm/emit-journal.js.map +1 -1
  145. package/dist/backend/llvm/emit-module.d.ts +5 -3
  146. package/dist/backend/llvm/emit-module.js +362 -74
  147. package/dist/backend/llvm/emit-module.js.map +1 -1
  148. package/dist/backend/llvm/emit-statements.js +327 -59
  149. package/dist/backend/llvm/emit-statements.js.map +1 -1
  150. package/dist/backend/llvm/emitter.d.ts +223 -33
  151. package/dist/backend/llvm/emitter.js +713 -100
  152. package/dist/backend/llvm/emitter.js.map +1 -1
  153. package/dist/backend/llvm/emitter.test.js +20 -1
  154. package/dist/backend/llvm/emitter.test.js.map +1 -1
  155. package/dist/backend/llvm/expr-async.js +32 -6
  156. package/dist/backend/llvm/expr-async.js.map +1 -1
  157. package/dist/backend/llvm/expr-bytes.d.ts +9 -1
  158. package/dist/backend/llvm/expr-bytes.js +105 -9
  159. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  160. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  161. package/dist/backend/llvm/expr-callbacks.js +29 -22
  162. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  163. package/dist/backend/llvm/expr-calls.d.ts +0 -4
  164. package/dist/backend/llvm/expr-calls.js +116 -14
  165. package/dist/backend/llvm/expr-calls.js.map +1 -1
  166. package/dist/backend/llvm/expr-containers.js +77 -12
  167. package/dist/backend/llvm/expr-containers.js.map +1 -1
  168. package/dist/backend/llvm/expr-context.d.ts +22 -0
  169. package/dist/backend/llvm/expr-control.d.ts +4 -0
  170. package/dist/backend/llvm/expr-control.js +485 -426
  171. package/dist/backend/llvm/expr-control.js.map +1 -1
  172. package/dist/backend/llvm/expr-dispatch.js +4 -0
  173. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  174. package/dist/backend/llvm/expr-dynamic.js +3 -3
  175. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  176. package/dist/backend/llvm/expr-primitives.d.ts +6 -0
  177. package/dist/backend/llvm/expr-primitives.js +119 -58
  178. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  179. package/dist/backend/llvm/expr-primitives.test.js +11 -2
  180. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  181. package/dist/backend/llvm/expr-records.d.ts +36 -4
  182. package/dist/backend/llvm/expr-records.js +249 -37
  183. package/dist/backend/llvm/expr-records.js.map +1 -1
  184. package/dist/backend/llvm/expr-stream-bridges.js +124 -7
  185. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  186. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  187. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  188. package/dist/backend/llvm/expr-stream-callbacks.js +13 -14
  189. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  190. package/dist/backend/llvm/frame-escapes.d.ts +11 -0
  191. package/dist/backend/llvm/frame-escapes.js +219 -0
  192. package/dist/backend/llvm/frame-escapes.js.map +1 -0
  193. package/dist/backend/llvm/function-layout.d.ts +15 -0
  194. package/dist/backend/llvm/function-layout.js +40 -0
  195. package/dist/backend/llvm/function-layout.js.map +1 -0
  196. package/dist/backend/llvm/heap-census.d.ts +34 -0
  197. package/dist/backend/llvm/heap-census.js +163 -0
  198. package/dist/backend/llvm/heap-census.js.map +1 -0
  199. package/dist/backend/llvm/inline-arrays.d.ts +41 -0
  200. package/dist/backend/llvm/inline-arrays.js +195 -0
  201. package/dist/backend/llvm/inline-arrays.js.map +1 -0
  202. package/dist/backend/llvm/int32-kind-loops.js +2 -0
  203. package/dist/backend/llvm/int32-kind-loops.js.map +1 -1
  204. package/dist/backend/llvm/integer-clones.d.ts +32 -5
  205. package/dist/backend/llvm/integer-clones.js +237 -44
  206. package/dist/backend/llvm/integer-clones.js.map +1 -1
  207. package/dist/backend/llvm/integer-clones.test.js +120 -0
  208. package/dist/backend/llvm/integer-clones.test.js.map +1 -1
  209. package/dist/backend/llvm/iterative-teardown.test.d.ts +1 -0
  210. package/dist/backend/llvm/iterative-teardown.test.js +62 -0
  211. package/dist/backend/llvm/iterative-teardown.test.js.map +1 -0
  212. package/dist/backend/llvm/js-ic.js +246 -62
  213. package/dist/backend/llvm/js-ic.js.map +1 -1
  214. package/dist/backend/llvm/lib-connect.js +1 -1
  215. package/dist/backend/llvm/lib-connect.js.map +1 -1
  216. package/dist/backend/llvm/lib-datagram.js +2 -2
  217. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  218. package/dist/backend/llvm/lib-dispatch.js +153 -16
  219. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  220. package/dist/backend/llvm/lib-filesystem.d.ts +8 -0
  221. package/dist/backend/llvm/lib-filesystem.js +48 -4
  222. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  223. package/dist/backend/llvm/lib-http2.js +4 -3
  224. package/dist/backend/llvm/lib-http2.js.map +1 -1
  225. package/dist/backend/llvm/lib-lookup.js +1 -1
  226. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  227. package/dist/backend/llvm/lib-network.js +15 -1
  228. package/dist/backend/llvm/lib-network.js.map +1 -1
  229. package/dist/backend/llvm/lib-process.js +32 -8
  230. package/dist/backend/llvm/lib-process.js.map +1 -1
  231. package/dist/backend/llvm/lib-shared.d.ts +3 -0
  232. package/dist/backend/llvm/lib-shared.js +191 -28
  233. package/dist/backend/llvm/lib-shared.js.map +1 -1
  234. package/dist/backend/llvm/lib-stream.js +1 -1
  235. package/dist/backend/llvm/lib-stream.js.map +1 -1
  236. package/dist/backend/llvm/local-array-reads.js +15 -1
  237. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  238. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  239. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  240. package/dist/backend/llvm/local-extents.d.ts +22 -0
  241. package/dist/backend/llvm/local-extents.js +102 -0
  242. package/dist/backend/llvm/local-extents.js.map +1 -1
  243. package/dist/backend/llvm/local-union-storage.js +15 -2
  244. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  245. package/dist/backend/llvm/local-union-storage.test.js +1 -1
  246. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  247. package/dist/backend/llvm/loop-callees.d.ts +21 -0
  248. package/dist/backend/llvm/loop-callees.js +119 -0
  249. package/dist/backend/llvm/loop-callees.js.map +1 -0
  250. package/dist/backend/llvm/loop-callees.test.d.ts +1 -0
  251. package/dist/backend/llvm/loop-callees.test.js +65 -0
  252. package/dist/backend/llvm/loop-callees.test.js.map +1 -0
  253. package/dist/backend/llvm/loop-entry-versions.d.ts +17 -0
  254. package/dist/backend/llvm/loop-entry-versions.js +185 -0
  255. package/dist/backend/llvm/loop-entry-versions.js.map +1 -0
  256. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  257. package/dist/backend/llvm/map-number-lookup.test.js +13 -4
  258. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  259. package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -0
  260. package/dist/backend/llvm/map-read-lifetimes.js +51 -1
  261. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  262. package/dist/backend/llvm/map-read-lifetimes.test.js +6 -3
  263. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  264. package/dist/backend/llvm/nullable-unions.d.ts +67 -10
  265. package/dist/backend/llvm/nullable-unions.js +218 -22
  266. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  267. package/dist/backend/llvm/nullable-unions.test.js +124 -1
  268. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  269. package/dist/backend/llvm/periodic-guards.d.ts +16 -0
  270. package/dist/backend/llvm/periodic-guards.js +91 -0
  271. package/dist/backend/llvm/periodic-guards.js.map +1 -0
  272. package/dist/backend/llvm/periodic-guards.test.d.ts +1 -0
  273. package/dist/backend/llvm/periodic-guards.test.js +64 -0
  274. package/dist/backend/llvm/periodic-guards.test.js.map +1 -0
  275. package/dist/backend/llvm/publish.d.ts +12 -2
  276. package/dist/backend/llvm/publish.js +15 -8
  277. package/dist/backend/llvm/publish.js.map +1 -1
  278. package/dist/backend/llvm/rebound-parameters.d.ts +4 -1
  279. package/dist/backend/llvm/rebound-parameters.js +17 -1
  280. package/dist/backend/llvm/rebound-parameters.js.map +1 -1
  281. package/dist/backend/llvm/receivers.d.ts +7 -0
  282. package/dist/backend/llvm/receivers.js +77 -10
  283. package/dist/backend/llvm/receivers.js.map +1 -1
  284. package/dist/backend/llvm/record-union-keys.test.js +29 -0
  285. package/dist/backend/llvm/record-union-keys.test.js.map +1 -1
  286. package/dist/backend/llvm/record-views.d.ts +29 -0
  287. package/dist/backend/llvm/record-views.js +249 -0
  288. package/dist/backend/llvm/record-views.js.map +1 -0
  289. package/dist/backend/llvm/record-views.test.d.ts +1 -0
  290. package/dist/backend/llvm/record-views.test.js +118 -0
  291. package/dist/backend/llvm/record-views.test.js.map +1 -0
  292. package/dist/backend/llvm/reference-writes.js +21 -0
  293. package/dist/backend/llvm/reference-writes.js.map +1 -1
  294. package/dist/backend/llvm/reference-writes.test.js +42 -0
  295. package/dist/backend/llvm/reference-writes.test.js.map +1 -1
  296. package/dist/backend/llvm/regex-matchers.d.ts +5 -1
  297. package/dist/backend/llvm/regex-matchers.js +173 -21
  298. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  299. package/dist/backend/llvm/regex-matchers.test.js +39 -1
  300. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  301. package/dist/backend/llvm/region-groups.d.ts +67 -0
  302. package/dist/backend/llvm/region-groups.js +1719 -0
  303. package/dist/backend/llvm/region-groups.js.map +1 -0
  304. package/dist/backend/llvm/region-groups.test.d.ts +1 -0
  305. package/dist/backend/llvm/region-groups.test.js +197 -0
  306. package/dist/backend/llvm/region-groups.test.js.map +1 -0
  307. package/dist/backend/llvm/region-ir.d.ts +31 -0
  308. package/dist/backend/llvm/region-ir.js +256 -0
  309. package/dist/backend/llvm/region-ir.js.map +1 -0
  310. package/dist/backend/llvm/region-sites.d.ts +20 -0
  311. package/dist/backend/llvm/region-sites.js +327 -0
  312. package/dist/backend/llvm/region-sites.js.map +1 -0
  313. package/dist/backend/llvm/region-sites.test.d.ts +1 -0
  314. package/dist/backend/llvm/region-sites.test.js +216 -0
  315. package/dist/backend/llvm/region-sites.test.js.map +1 -0
  316. package/dist/backend/llvm/repr-report.d.ts +9 -0
  317. package/dist/backend/llvm/repr-report.js +143 -0
  318. package/dist/backend/llvm/repr-report.js.map +1 -0
  319. package/dist/backend/llvm/repr-report.test.d.ts +1 -0
  320. package/dist/backend/llvm/repr-report.test.js +62 -0
  321. package/dist/backend/llvm/repr-report.test.js.map +1 -0
  322. package/dist/backend/llvm/runtime-registries.test.d.ts +1 -0
  323. package/dist/backend/llvm/runtime-registries.test.js +88 -0
  324. package/dist/backend/llvm/runtime-registries.test.js.map +1 -0
  325. package/dist/backend/llvm/serialized-ir-emission.test.js +1 -0
  326. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  327. package/dist/backend/llvm/shape-union-tags.test.d.ts +1 -0
  328. package/dist/backend/llvm/shape-union-tags.test.js +75 -0
  329. package/dist/backend/llvm/shape-union-tags.test.js.map +1 -0
  330. package/dist/backend/llvm/shapes.d.ts +60 -10
  331. package/dist/backend/llvm/shapes.js +233 -51
  332. package/dist/backend/llvm/shapes.js.map +1 -1
  333. package/dist/backend/llvm/shapes.test.js +37 -18
  334. package/dist/backend/llvm/shapes.test.js.map +1 -1
  335. package/dist/backend/llvm/speculative-integers.d.ts +3 -0
  336. package/dist/backend/llvm/speculative-integers.js +20 -8
  337. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  338. package/dist/backend/llvm/split.js +6 -1
  339. package/dist/backend/llvm/split.js.map +1 -1
  340. package/dist/backend/llvm/split.test.js +23 -0
  341. package/dist/backend/llvm/split.test.js.map +1 -1
  342. package/dist/backend/llvm/stack-callbacks.js +4 -2
  343. package/dist/backend/llvm/stack-callbacks.js.map +1 -1
  344. package/dist/backend/llvm/stack-objects.d.ts +12 -3
  345. package/dist/backend/llvm/stack-objects.js +110 -22
  346. package/dist/backend/llvm/stack-objects.js.map +1 -1
  347. package/dist/backend/llvm/stack-objects.test.js +144 -0
  348. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  349. package/dist/backend/llvm/stack-unions.test.js +24 -1
  350. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  351. package/dist/backend/llvm/string-lifetimes.js +2 -1
  352. package/dist/backend/llvm/string-lifetimes.js.map +1 -1
  353. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  354. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  355. package/dist/backend/llvm/string-reads.d.ts +4 -0
  356. package/dist/backend/llvm/string-reads.js +27 -0
  357. package/dist/backend/llvm/string-reads.js.map +1 -1
  358. package/dist/backend/llvm/test-boxed-unions.d.ts +10 -8
  359. package/dist/backend/llvm/test-boxed-unions.js +20 -25
  360. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  361. package/dist/backend/llvm/union-repr.js +9 -8
  362. package/dist/backend/llvm/union-repr.js.map +1 -1
  363. package/dist/backend/llvm/union-retype.test.js +45 -2
  364. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  365. package/dist/backend/llvm/unwind-abi.d.ts +20 -8
  366. package/dist/backend/llvm/unwind-abi.js +177 -70
  367. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  368. package/dist/backend/llvm/unwind-abi.test.js +90 -3
  369. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  370. package/dist/backend/llvm/walk-borrows.d.ts +3 -2
  371. package/dist/backend/llvm/walk-borrows.js +2 -2
  372. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  373. package/dist/backend/llvm/walk-borrows.test.js +18 -0
  374. package/dist/backend/llvm/walk-borrows.test.js.map +1 -1
  375. package/dist/backend/llvm/walkers.d.ts +14 -1
  376. package/dist/backend/llvm/walkers.js +103 -11
  377. package/dist/backend/llvm/walkers.js.map +1 -1
  378. package/dist/backend/llvm/wrapping-sums.d.ts +26 -6
  379. package/dist/backend/llvm/wrapping-sums.js +64 -12
  380. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  381. package/dist/backend/loop-polls.d.ts +4 -2
  382. package/dist/backend/loop-polls.js +11 -2
  383. package/dist/backend/loop-polls.js.map +1 -1
  384. package/dist/backend/mangle.d.ts +0 -5
  385. package/dist/backend/mangle.js +0 -9
  386. package/dist/backend/mangle.js.map +1 -1
  387. package/dist/backend/may-throw.d.ts +10 -9
  388. package/dist/backend/may-throw.js +189 -27
  389. package/dist/backend/may-throw.js.map +1 -1
  390. package/dist/backend/may-throw.test.js +44 -7
  391. package/dist/backend/may-throw.test.js.map +1 -1
  392. package/dist/backend/native/compiler-fingerprint.d.ts +5 -0
  393. package/dist/backend/native/compiler-fingerprint.js +62 -16
  394. package/dist/backend/native/compiler-fingerprint.js.map +1 -1
  395. package/dist/backend/native/contracts.d.ts +31 -8
  396. package/dist/backend/native/executable.js +56 -32
  397. package/dist/backend/native/executable.js.map +1 -1
  398. package/dist/backend/native/library.js +3 -4
  399. package/dist/backend/native/library.js.map +1 -1
  400. package/dist/backend/native/object-merge.d.ts +3 -1
  401. package/dist/backend/native/object-merge.js +24 -11
  402. package/dist/backend/native/object-merge.js.map +1 -1
  403. package/dist/backend/native/program-shards.js +6 -3
  404. package/dist/backend/native/program-shards.js.map +1 -1
  405. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  406. package/dist/backend/native/runtime-inputs.js +3 -0
  407. package/dist/backend/native/runtime-inputs.js.map +1 -1
  408. package/dist/backend/native/vendor.d.ts +1 -1
  409. package/dist/backend/native-codegen-core.d.ts +15 -6
  410. package/dist/backend/native-codegen-core.js +20 -9
  411. package/dist/backend/native-codegen-core.js.map +1 -1
  412. package/dist/backend/native-codegen.js +51 -5
  413. package/dist/backend/native-codegen.js.map +1 -1
  414. package/dist/backend/native-codegen.test.js +82 -8
  415. package/dist/backend/native-codegen.test.js.map +1 -1
  416. package/dist/backend/native-link-info-core.d.ts +30 -0
  417. package/dist/backend/native-link-info-core.js.map +1 -1
  418. package/dist/backend/native-profile.d.ts +68 -4
  419. package/dist/backend/native-profile.js +86 -14
  420. package/dist/backend/native-profile.js.map +1 -1
  421. package/dist/backend/native-profile.test.js +127 -4
  422. package/dist/backend/native-profile.test.js.map +1 -1
  423. package/dist/backend/native-toolchain.d.ts +1 -1
  424. package/dist/backend/native-toolchain.js +1 -1
  425. package/dist/backend/native-toolchain.js.map +1 -1
  426. package/dist/backend/native-toolchain.test.js +58 -4
  427. package/dist/backend/native-toolchain.test.js.map +1 -1
  428. package/dist/backend/native-tools.d.ts +17 -3
  429. package/dist/backend/native-tools.js +12 -4
  430. package/dist/backend/native-tools.js.map +1 -1
  431. package/dist/backend/native-tools.test.d.ts +1 -0
  432. package/dist/backend/native-tools.test.js +76 -0
  433. package/dist/backend/native-tools.test.js.map +1 -0
  434. package/dist/backend/object-localize.js +69 -9
  435. package/dist/backend/object-localize.js.map +1 -1
  436. package/dist/backend/object-localize.test.js +99 -10
  437. package/dist/backend/object-localize.test.js.map +1 -1
  438. package/dist/backend/publication.d.ts +2 -0
  439. package/dist/backend/publication.js +4 -0
  440. package/dist/backend/publication.js.map +1 -1
  441. package/dist/backend/runtime-abi.d.ts +2 -2
  442. package/dist/backend/runtime-abi.js +2 -2
  443. package/dist/backend/runtime-pack-core.d.ts +19 -0
  444. package/dist/backend/runtime-pack-core.js +23 -3
  445. package/dist/backend/runtime-pack-core.js.map +1 -1
  446. package/dist/backend/runtime-pack-targets.test.js +1 -1
  447. package/dist/backend/runtime-pack.test.js +48 -2
  448. package/dist/backend/runtime-pack.test.js.map +1 -1
  449. package/dist/backend/target-cpu.d.ts +2 -0
  450. package/dist/backend/target-cpu.js +4 -0
  451. package/dist/backend/target-cpu.js.map +1 -1
  452. package/dist/backend/target-diagnostics.js +1 -19
  453. package/dist/backend/target-diagnostics.js.map +1 -1
  454. package/dist/backend/target-diagnostics.test.js +1 -1
  455. package/dist/backend/target-diagnostics.test.js.map +1 -1
  456. package/dist/backend/targets.d.ts +28 -0
  457. package/dist/backend/targets.js +70 -0
  458. package/dist/backend/targets.js.map +1 -1
  459. package/dist/backend/targets.test.js +75 -1
  460. package/dist/backend/targets.test.js.map +1 -1
  461. package/dist/backend/vendor-archives.d.ts +1 -1
  462. package/dist/backend/vendor-archives.js +25 -12
  463. package/dist/backend/vendor-archives.js.map +1 -1
  464. package/dist/backend/vendor-inputs.d.ts +15 -2
  465. package/dist/backend/vendor-inputs.js +59 -3
  466. package/dist/backend/vendor-inputs.js.map +1 -1
  467. package/dist/backend/vendor-inputs.test.d.ts +1 -0
  468. package/dist/backend/vendor-inputs.test.js +74 -0
  469. package/dist/backend/vendor-inputs.test.js.map +1 -0
  470. package/dist/cli/command.js +95 -5
  471. package/dist/cli/command.js.map +1 -1
  472. package/dist/cli/host.d.ts +3 -0
  473. package/dist/cli/output-options.d.ts +3 -0
  474. package/dist/cli/output-options.js +8 -2
  475. package/dist/cli/output-options.js.map +1 -1
  476. package/dist/cli/usage.d.ts +28 -1
  477. package/dist/cli/usage.js +56 -6
  478. package/dist/cli/usage.js.map +1 -1
  479. package/dist/compat/fetch-profile.d.ts +3 -0
  480. package/dist/compat/fetch-profile.js +23 -3
  481. package/dist/compat/fetch-profile.js.map +1 -1
  482. package/dist/compile-types.d.ts +45 -0
  483. package/dist/contracts/check.js +70 -2
  484. package/dist/contracts/check.js.map +1 -1
  485. package/dist/contracts/int32-elements.d.ts +2 -1
  486. package/dist/contracts/int32-elements.js.map +1 -1
  487. package/dist/coverage/report.d.ts +5 -1
  488. package/dist/coverage/report.js +83 -2
  489. package/dist/coverage/report.js.map +1 -1
  490. package/dist/coverage/verdict-cache.d.ts +2 -0
  491. package/dist/coverage/verdict-cache.js +5 -10
  492. package/dist/coverage/verdict-cache.js.map +1 -1
  493. package/dist/diagnostics/codes.d.ts +145 -0
  494. package/dist/diagnostics/codes.js +159 -0
  495. package/dist/diagnostics/codes.js.map +1 -0
  496. package/dist/diagnostics/codes.test.d.ts +1 -0
  497. package/dist/diagnostics/codes.test.js +78 -0
  498. package/dist/diagnostics/codes.test.js.map +1 -0
  499. package/dist/diagnostics/diagnostic.d.ts +101 -2
  500. package/dist/diagnostics/diagnostic.js +155 -0
  501. package/dist/diagnostics/diagnostic.js.map +1 -1
  502. package/dist/diagnostics/dynamic-slots.d.ts +23 -0
  503. package/dist/diagnostics/dynamic-slots.js +29 -0
  504. package/dist/diagnostics/dynamic-slots.js.map +1 -0
  505. package/dist/diagnostics/dynamic-tier.d.ts +6 -0
  506. package/dist/diagnostics/dynamic-tier.js +8 -1
  507. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  508. package/dist/diagnostics/envelope.d.ts +43 -1
  509. package/dist/diagnostics/envelope.js +19 -1
  510. package/dist/diagnostics/envelope.js.map +1 -1
  511. package/dist/diagnostics/envelope.test.js.map +1 -1
  512. package/dist/diagnostics/render.d.ts +3 -1
  513. package/dist/diagnostics/render.js +27 -6
  514. package/dist/diagnostics/render.js.map +1 -1
  515. package/dist/executable/executable-cache.d.ts +41 -0
  516. package/dist/executable/executable-cache.js +39 -1
  517. package/dist/executable/executable-cache.js.map +1 -1
  518. package/dist/executable/executable-cache.test.js +4 -1
  519. package/dist/executable/executable-cache.test.js.map +1 -1
  520. package/dist/executable/prepare.d.ts +2 -1
  521. package/dist/executable/prepare.js +421 -10
  522. package/dist/executable/prepare.js.map +1 -1
  523. package/dist/frontend/analysis.js +1 -0
  524. package/dist/frontend/analysis.js.map +1 -1
  525. package/dist/frontend/canon-map.d.ts +17 -0
  526. package/dist/frontend/canon-map.js +177 -0
  527. package/dist/frontend/canon-map.js.map +1 -0
  528. package/dist/frontend/canon.d.ts +122 -0
  529. package/dist/frontend/canon.js +462 -0
  530. package/dist/frontend/canon.js.map +1 -0
  531. package/dist/frontend/contract-types.d.ts +9 -1
  532. package/dist/frontend/contract-types.js +46 -4
  533. package/dist/frontend/contract-types.js.map +1 -1
  534. package/dist/frontend/decl-projection.d.ts +3 -0
  535. package/dist/frontend/decl-projection.js +121 -3
  536. package/dist/frontend/decl-projection.js.map +1 -1
  537. package/dist/frontend/dts-paths.d.ts +17 -4
  538. package/dist/frontend/dts-paths.js +149 -5
  539. package/dist/frontend/dts-paths.js.map +1 -1
  540. package/dist/frontend/fork-target.js +4 -4
  541. package/dist/frontend/fork-target.js.map +1 -1
  542. package/dist/frontend/fork-target.test.js +3 -3
  543. package/dist/frontend/fork-target.test.js.map +1 -1
  544. package/dist/frontend/heritage-elements.d.ts +15 -0
  545. package/dist/frontend/heritage-elements.js +18 -0
  546. package/dist/frontend/heritage-elements.js.map +1 -0
  547. package/dist/frontend/heritage-elements.test.d.ts +1 -0
  548. package/dist/frontend/heritage-elements.test.js +68 -0
  549. package/dist/frontend/heritage-elements.test.js.map +1 -0
  550. package/dist/frontend/input-tracker.d.ts +20 -0
  551. package/dist/frontend/input-tracker.js +74 -4
  552. package/dist/frontend/input-tracker.js.map +1 -1
  553. package/dist/frontend/input-tracker.test.js +66 -0
  554. package/dist/frontend/input-tracker.test.js.map +1 -1
  555. package/dist/frontend/lowering/any-collection-residue.d.ts +9 -0
  556. package/dist/frontend/lowering/any-collection-residue.js +42 -0
  557. package/dist/frontend/lowering/any-collection-residue.js.map +1 -0
  558. package/dist/frontend/lowering/array-values.d.ts +44 -2
  559. package/dist/frontend/lowering/array-values.js +193 -3
  560. package/dist/frontend/lowering/array-values.js.map +1 -1
  561. package/dist/frontend/lowering/builtin-namespaces.d.ts +6 -2
  562. package/dist/frontend/lowering/builtin-namespaces.js +28 -6
  563. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  564. package/dist/frontend/lowering/builtins/array-classes.d.ts +69 -0
  565. package/dist/frontend/lowering/builtins/array-classes.js +729 -0
  566. package/dist/frontend/lowering/builtins/array-classes.js.map +1 -0
  567. package/dist/frontend/lowering/builtins/callable-aliases.js +4 -0
  568. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  569. package/dist/frontend/lowering/builtins/child-process-methods.js +34 -0
  570. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  571. package/dist/frontend/lowering/builtins/disposable-stack.js +1 -3
  572. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  573. package/dist/frontend/lowering/builtins/errors.d.ts +13 -9
  574. package/dist/frontend/lowering/builtins/errors.js +136 -56
  575. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  576. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  577. package/dist/frontend/lowering/builtins/filesystem-calls.js +85 -4
  578. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  579. package/dist/frontend/lowering/builtins/filesystem.d.ts +11 -6
  580. package/dist/frontend/lowering/builtins/filesystem.js +270 -24
  581. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  582. package/dist/frontend/lowering/builtins/json.js +7 -1
  583. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  584. package/dist/frontend/lowering/builtins/mime.d.ts +25 -0
  585. package/dist/frontend/lowering/builtins/mime.js +167 -0
  586. package/dist/frontend/lowering/builtins/mime.js.map +1 -0
  587. package/dist/frontend/lowering/builtins/module-bindings.d.ts +3 -0
  588. package/dist/frontend/lowering/builtins/module-bindings.js +6 -0
  589. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  590. package/dist/frontend/lowering/builtins/module-calls.js +79 -12
  591. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  592. package/dist/frontend/lowering/builtins/module-resolution.d.ts +7 -4
  593. package/dist/frontend/lowering/builtins/module-resolution.js +115 -13
  594. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  595. package/dist/frontend/lowering/builtins/navigator.d.ts +3 -1
  596. package/dist/frontend/lowering/builtins/navigator.js +22 -8
  597. package/dist/frontend/lowering/builtins/navigator.js.map +1 -1
  598. package/dist/frontend/lowering/builtins/process.js +49 -9
  599. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  600. package/dist/frontend/lowering/builtins/promises.js +18 -3
  601. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  602. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +6 -2
  603. package/dist/frontend/lowering/builtins/promisify-callback.js +19 -6
  604. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  605. package/dist/frontend/lowering/builtins/properties.js +23 -5
  606. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  607. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +42 -0
  608. package/dist/frontend/lowering/builtins/web-streams-dyn.js +321 -0
  609. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -0
  610. package/dist/frontend/lowering/builtins/x509.js +35 -5
  611. package/dist/frontend/lowering/builtins/x509.js.map +1 -1
  612. package/dist/frontend/lowering/call-arguments.d.ts +14 -1
  613. package/dist/frontend/lowering/call-arguments.js +84 -70
  614. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  615. package/dist/frontend/lowering/call-signatures.js +108 -24
  616. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  617. package/dist/frontend/lowering/class-attributes.js +6 -5
  618. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  619. package/dist/frontend/lowering/class-dynamic-dispatch.js +40 -19
  620. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  621. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  622. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  623. package/dist/frontend/lowering/class-protocol-dispatch.js +4 -0
  624. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  625. package/dist/frontend/lowering/class-protocols.d.ts +61 -1
  626. package/dist/frontend/lowering/class-protocols.js +297 -21
  627. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  628. package/dist/frontend/lowering/class-to-primitive.d.ts +3 -2
  629. package/dist/frontend/lowering/class-to-primitive.js +15 -5
  630. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  631. package/dist/frontend/lowering/coercions/asserted.d.ts +16 -0
  632. package/dist/frontend/lowering/coercions/asserted.js +79 -0
  633. package/dist/frontend/lowering/coercions/asserted.js.map +1 -0
  634. package/dist/frontend/lowering/coercions/function-adapters.d.ts +13 -0
  635. package/dist/frontend/lowering/coercions/function-adapters.js +70 -3
  636. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  637. package/dist/frontend/lowering/coercions/state.d.ts +23 -0
  638. package/dist/frontend/lowering/coercions/state.js +9 -0
  639. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  640. package/dist/frontend/lowering/coercions/structural-plans.js +67 -1
  641. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  642. package/dist/frontend/lowering/coercions/structural.d.ts +10 -0
  643. package/dist/frontend/lowering/coercions/structural.js +134 -4
  644. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  645. package/dist/frontend/lowering/coercions/unions.d.ts +11 -0
  646. package/dist/frontend/lowering/coercions/unions.js +83 -4
  647. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  648. package/dist/frontend/lowering/completion-callbacks.js +3 -2
  649. package/dist/frontend/lowering/completion-callbacks.js.map +1 -1
  650. package/dist/frontend/lowering/containers/array-callbacks.d.ts +10 -0
  651. package/dist/frontend/lowering/containers/array-callbacks.js +224 -81
  652. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  653. package/dist/frontend/lowering/containers/array-concat.d.ts +5 -2
  654. package/dist/frontend/lowering/containers/array-concat.js +76 -7
  655. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  656. package/dist/frontend/lowering/containers/array-construction.d.ts +9 -4
  657. package/dist/frontend/lowering/containers/array-construction.js +112 -100
  658. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  659. package/dist/frontend/lowering/containers/array-methods.js +193 -45
  660. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  661. package/dist/frontend/lowering/containers/array-pipelines.d.ts +3 -0
  662. package/dist/frontend/lowering/containers/array-pipelines.js +81 -13
  663. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  664. package/dist/frontend/lowering/containers/callback-arguments.d.ts +1 -0
  665. package/dist/frontend/lowering/containers/callback-arguments.js +28 -2
  666. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  667. package/dist/frontend/lowering/containers/collection-methods.js +13 -3
  668. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  669. package/dist/frontend/lowering/containers/filter-predicates.js +34 -3
  670. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  671. package/dist/frontend/lowering/containers/indexed-objects.d.ts +34 -1
  672. package/dist/frontend/lowering/containers/indexed-objects.js +131 -72
  673. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  674. package/dist/frontend/lowering/cycle-initialization.js +43 -6
  675. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  676. package/dist/frontend/lowering/decl-origin.d.ts +49 -0
  677. package/dist/frontend/lowering/decl-origin.js +402 -0
  678. package/dist/frontend/lowering/decl-origin.js.map +1 -0
  679. package/dist/frontend/lowering/deferred-module-initializers.d.ts +2 -0
  680. package/dist/frontend/lowering/deferred-module-initializers.js +7 -0
  681. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  682. package/dist/frontend/lowering/divergences.js +5 -0
  683. package/dist/frontend/lowering/divergences.js.map +1 -1
  684. package/dist/frontend/lowering/dynamic-tier.d.ts +8 -2
  685. package/dist/frontend/lowering/dynamic-tier.js +111 -3
  686. package/dist/frontend/lowering/dynamic-tier.js.map +1 -1
  687. package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -1
  688. package/dist/frontend/lowering/expressions/array-literals.js +43 -5
  689. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  690. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +48 -0
  691. package/dist/frontend/lowering/expressions/asserted-receiver.js +233 -0
  692. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -0
  693. package/dist/frontend/lowering/expressions/binary.js +136 -1
  694. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  695. package/dist/frontend/lowering/expressions/element-access.d.ts +7 -0
  696. package/dist/frontend/lowering/expressions/element-access.js +363 -12
  697. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  698. package/dist/frontend/lowering/expressions/identifiers.d.ts +3 -0
  699. package/dist/frontend/lowering/expressions/identifiers.js +78 -62
  700. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  701. package/dist/frontend/lowering/expressions/message-listeners.d.ts +3 -0
  702. package/dist/frontend/lowering/expressions/message-listeners.js +19 -0
  703. package/dist/frontend/lowering/expressions/message-listeners.js.map +1 -0
  704. package/dist/frontend/lowering/expressions/narrowing.js +224 -6
  705. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  706. package/dist/frontend/lowering/expressions/nullish-assignment.js +5 -2
  707. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  708. package/dist/frontend/lowering/expressions/object-literals.d.ts +1 -1
  709. package/dist/frontend/lowering/expressions/object-literals.js +282 -24
  710. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  711. package/dist/frontend/lowering/expressions/property-access.d.ts +15 -3
  712. package/dist/frontend/lowering/expressions/property-access.js +397 -74
  713. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  714. package/dist/frontend/lowering/expressions/relational.js +202 -70
  715. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  716. package/dist/frontend/lowering/expressions/typeof.js +9 -1
  717. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  718. package/dist/frontend/lowering/expressions/union-fields.d.ts +28 -8
  719. package/dist/frontend/lowering/expressions/union-fields.js +168 -14
  720. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  721. package/dist/frontend/lowering/frozen-records.d.ts +8 -0
  722. package/dist/frontend/lowering/frozen-records.js +56 -9
  723. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  724. package/dist/frontend/lowering/function-context.d.ts +3 -0
  725. package/dist/frontend/lowering/function-context.js +4 -1
  726. package/dist/frontend/lowering/function-context.js.map +1 -1
  727. package/dist/frontend/lowering/function-returns.d.ts +4 -0
  728. package/dist/frontend/lowering/function-returns.js +231 -2
  729. package/dist/frontend/lowering/function-returns.js.map +1 -1
  730. package/dist/frontend/lowering/generator-delegation.js +3 -2
  731. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  732. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +26 -0
  733. package/dist/frontend/lowering/generator-dynamic-dispatch.js +294 -2
  734. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  735. package/dist/frontend/lowering/generic-functions.d.ts +10 -0
  736. package/dist/frontend/lowering/generic-functions.js +67 -7
  737. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  738. package/dist/frontend/lowering/global-values.d.ts +37 -0
  739. package/dist/frontend/lowering/global-values.js +395 -0
  740. package/dist/frontend/lowering/global-values.js.map +1 -0
  741. package/dist/frontend/lowering/handle-properties.js +3 -2
  742. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  743. package/dist/frontend/lowering/handle-properties.test.d.ts +1 -0
  744. package/dist/frontend/lowering/handle-properties.test.js +25 -0
  745. package/dist/frontend/lowering/handle-properties.test.js.map +1 -0
  746. package/dist/frontend/lowering/import-meta.d.ts +3 -0
  747. package/dist/frontend/lowering/import-meta.js +8 -3
  748. package/dist/frontend/lowering/import-meta.js.map +1 -1
  749. package/dist/frontend/lowering/iterator-adapters.js +3 -3
  750. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  751. package/dist/frontend/lowering/key-order-witness.d.ts +2 -0
  752. package/dist/frontend/lowering/key-order-witness.js +10 -0
  753. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  754. package/dist/frontend/lowering/lower-array-sort.d.ts +5 -1
  755. package/dist/frontend/lowering/lower-array-sort.js +16 -2
  756. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  757. package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -0
  758. package/dist/frontend/lowering/lower-builtin-values.js +65 -16
  759. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  760. package/dist/frontend/lowering/lower-calls.js +222 -24
  761. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  762. package/dist/frontend/lowering/lower-classes.d.ts +6 -0
  763. package/dist/frontend/lowering/lower-classes.js +154 -20
  764. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  765. package/dist/frontend/lowering/lower-console.js +25 -2
  766. package/dist/frontend/lowering/lower-console.js.map +1 -1
  767. package/dist/frontend/lowering/lower-exprs.d.ts +29 -0
  768. package/dist/frontend/lowering/lower-exprs.js +544 -24
  769. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  770. package/dist/frontend/lowering/lower-functions.js +93 -18
  771. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  772. package/dist/frontend/lowering/lower-global-value.d.ts +4 -1
  773. package/dist/frontend/lowering/lower-global-value.js +10 -3
  774. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  775. package/dist/frontend/lowering/lower-inspect.d.ts +44 -4
  776. package/dist/frontend/lowering/lower-inspect.js +723 -26
  777. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  778. package/dist/frontend/lowering/lower-modules.d.ts +3 -1
  779. package/dist/frontend/lowering/lower-modules.js +189 -24
  780. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  781. package/dist/frontend/lowering/lower-namespaces.d.ts +7 -0
  782. package/dist/frontend/lowering/lower-namespaces.js +23 -0
  783. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  784. package/dist/frontend/lowering/lower-node-island.d.ts +74 -0
  785. package/dist/frontend/lowering/lower-node-island.js +1931 -0
  786. package/dist/frontend/lowering/lower-node-island.js.map +1 -0
  787. package/dist/frontend/lowering/lower-server.js +44 -0
  788. package/dist/frontend/lowering/lower-server.js.map +1 -1
  789. package/dist/frontend/lowering/lower-shared-modules.d.ts +27 -0
  790. package/dist/frontend/lowering/lower-shared-modules.js +611 -0
  791. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -0
  792. package/dist/frontend/lowering/lower-stdlib.js +85 -9
  793. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  794. package/dist/frontend/lowering/lower-stmts.d.ts +2 -6
  795. package/dist/frontend/lowering/lower-stmts.js +781 -143
  796. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  797. package/dist/frontend/lowering/lower-stream.js +548 -36
  798. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  799. package/dist/frontend/lowering/lower-timers.js +9 -0
  800. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  801. package/dist/frontend/lowering/lowerer.d.ts +514 -10
  802. package/dist/frontend/lowering/lowerer.js +2667 -163
  803. package/dist/frontend/lowering/lowerer.js.map +1 -1
  804. package/dist/frontend/lowering/lowerer.test.js +44 -1
  805. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  806. package/dist/frontend/lowering/maybe-promise.d.ts +6 -0
  807. package/dist/frontend/lowering/maybe-promise.js +13 -0
  808. package/dist/frontend/lowering/maybe-promise.js.map +1 -1
  809. package/dist/frontend/lowering/module-namespace-elements.d.ts +12 -0
  810. package/dist/frontend/lowering/module-namespace-elements.js +114 -18
  811. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  812. package/dist/frontend/lowering/nan-coded-reads.d.ts +11 -0
  813. package/dist/frontend/lowering/nan-coded-reads.js +45 -2
  814. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  815. package/dist/frontend/lowering/narrowing-stability.d.ts +4 -0
  816. package/dist/frontend/lowering/narrowing-stability.js +14 -6
  817. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  818. package/dist/frontend/lowering/receiver-returns.d.ts +3 -0
  819. package/dist/frontend/lowering/receiver-returns.js +134 -0
  820. package/dist/frontend/lowering/receiver-returns.js.map +1 -0
  821. package/dist/frontend/lowering/record-inherited.d.ts +26 -0
  822. package/dist/frontend/lowering/record-inherited.js +807 -0
  823. package/dist/frontend/lowering/record-inherited.js.map +1 -0
  824. package/dist/frontend/lowering/runtime-optional-elements.d.ts +31 -1
  825. package/dist/frontend/lowering/runtime-optional-elements.js +105 -13
  826. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  827. package/dist/frontend/lowering/runtime-optional-guards.d.ts +3 -0
  828. package/dist/frontend/lowering/runtime-optional-guards.js +35 -7
  829. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  830. package/dist/frontend/lowering/runtime-optional-guards.test.js +59 -1
  831. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  832. package/dist/frontend/lowering/stable-names.d.ts +8 -0
  833. package/dist/frontend/lowering/stable-names.js +22 -0
  834. package/dist/frontend/lowering/stable-names.js.map +1 -1
  835. package/dist/frontend/lowering/stable-names.test.d.ts +1 -0
  836. package/dist/frontend/lowering/stable-names.test.js +16 -0
  837. package/dist/frontend/lowering/stable-names.test.js.map +1 -0
  838. package/dist/frontend/lowering/static-typeof.d.ts +5 -4
  839. package/dist/frontend/lowering/static-typeof.js +10 -4
  840. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  841. package/dist/frontend/lowering/structural-instances.d.ts +22 -0
  842. package/dist/frontend/lowering/structural-instances.js +282 -0
  843. package/dist/frontend/lowering/structural-instances.js.map +1 -0
  844. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  845. package/dist/frontend/lowering/surfaces.js +108 -12
  846. package/dist/frontend/lowering/surfaces.js.map +1 -1
  847. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  848. package/dist/frontend/lowering/symbol-fields.js +32 -0
  849. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  850. package/dist/frontend/lowering/type-failure.d.ts +17 -0
  851. package/dist/frontend/lowering/type-failure.js +163 -0
  852. package/dist/frontend/lowering/type-failure.js.map +1 -0
  853. package/dist/frontend/lowering/typed-arguments.d.ts +5 -6
  854. package/dist/frontend/lowering/typed-arguments.js +10 -2
  855. package/dist/frontend/lowering/typed-arguments.js.map +1 -1
  856. package/dist/frontend/lowering/union-narrow.d.ts +9 -1
  857. package/dist/frontend/lowering/union-narrow.js +31 -2
  858. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  859. package/dist/frontend/lowering/union-retag.test.js +42 -2
  860. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  861. package/dist/frontend/lowering/unit-journal.d.ts +194 -0
  862. package/dist/frontend/lowering/unit-journal.js +556 -0
  863. package/dist/frontend/lowering/unit-journal.js.map +1 -0
  864. package/dist/frontend/lowering/unit-journal.test.d.ts +1 -0
  865. package/dist/frontend/lowering/unit-journal.test.js +335 -0
  866. package/dist/frontend/lowering/unit-journal.test.js.map +1 -0
  867. package/dist/frontend/lowering/width-lift.d.ts +19 -0
  868. package/dist/frontend/node-api-import.d.ts +21 -0
  869. package/dist/frontend/node-api-import.js +88 -0
  870. package/dist/frontend/node-api-import.js.map +1 -0
  871. package/dist/frontend/npm-static-type-exports-host.js +4 -3
  872. package/dist/frontend/npm-static-type-exports-host.js.map +1 -1
  873. package/dist/frontend/npm-static.js +9 -2
  874. package/dist/frontend/npm-static.js.map +1 -1
  875. package/dist/frontend/package-shims.d.ts +6 -2
  876. package/dist/frontend/package-shims.js +13 -2
  877. package/dist/frontend/package-shims.js.map +1 -1
  878. package/dist/frontend/pipeline.d.ts +11 -4
  879. package/dist/frontend/pipeline.js +249 -26
  880. package/dist/frontend/pipeline.js.map +1 -1
  881. package/dist/frontend/process-fork.d.ts +3 -0
  882. package/dist/frontend/process-fork.js.map +1 -1
  883. package/dist/frontend/program-analysis.d.ts +6 -0
  884. package/dist/frontend/program-analysis.js +4 -0
  885. package/dist/frontend/program-analysis.js.map +1 -1
  886. package/dist/frontend/program.d.ts +12 -1
  887. package/dist/frontend/program.js +256 -36
  888. package/dist/frontend/program.js.map +1 -1
  889. package/dist/frontend/resolve.js +8 -2
  890. package/dist/frontend/resolve.js.map +1 -1
  891. package/dist/frontend/shape-inference/analyze.d.ts +23 -1
  892. package/dist/frontend/shape-inference/analyze.js +982 -97
  893. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  894. package/dist/frontend/shape-inference/constant-graphs.d.ts +2 -0
  895. package/dist/frontend/shape-inference/constant-graphs.js +39 -4
  896. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -1
  897. package/dist/frontend/shape-inference/domain.d.ts +2 -0
  898. package/dist/frontend/shape-inference/domain.js.map +1 -1
  899. package/dist/frontend/shape-inference/fallback.d.ts +17 -0
  900. package/dist/frontend/shape-inference/fallback.js +303 -0
  901. package/dist/frontend/shape-inference/fallback.js.map +1 -0
  902. package/dist/frontend/shape-inference/index.d.ts +75 -1
  903. package/dist/frontend/shape-inference/index.js +531 -2
  904. package/dist/frontend/shape-inference/index.js.map +1 -1
  905. package/dist/frontend/shape-inference/inferred-checks.d.ts +2 -0
  906. package/dist/frontend/shape-inference/inferred-checks.js +90 -0
  907. package/dist/frontend/shape-inference/inferred-checks.js.map +1 -0
  908. package/dist/frontend/shape-inference/memo.d.ts +30 -0
  909. package/dist/frontend/shape-inference/memo.js +99 -0
  910. package/dist/frontend/shape-inference/memo.js.map +1 -0
  911. package/dist/frontend/shape-inference/overlay.d.ts +81 -0
  912. package/dist/frontend/shape-inference/overlay.js +1160 -0
  913. package/dist/frontend/shape-inference/overlay.js.map +1 -0
  914. package/dist/frontend/shape-inference/registry.test.d.ts +1 -0
  915. package/dist/frontend/shape-inference/registry.test.js +34 -0
  916. package/dist/frontend/shape-inference/registry.test.js.map +1 -0
  917. package/dist/frontend/shape-inference/report.js +42 -8
  918. package/dist/frontend/shape-inference/report.js.map +1 -1
  919. package/dist/frontend/shape-inference/static-objects.d.ts +29 -0
  920. package/dist/frontend/shape-inference/static-objects.js +1951 -0
  921. package/dist/frontend/shape-inference/static-objects.js.map +1 -0
  922. package/dist/frontend/tier-analysis.d.ts +53 -1
  923. package/dist/frontend/tier-analysis.js +133 -0
  924. package/dist/frontend/tier-analysis.js.map +1 -1
  925. package/dist/frontend/ts7/api.js +4 -2
  926. package/dist/frontend/ts7/api.js.map +1 -1
  927. package/dist/frontend/ts7/ast-node.d.ts +9 -0
  928. package/dist/frontend/ts7/ast-node.js +42 -10
  929. package/dist/frontend/ts7/ast-node.js.map +1 -1
  930. package/dist/frontend/ts7/ast-node.test.js +23 -0
  931. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  932. package/dist/frontend/ts7/ast-wire-protocols.test.d.ts +1 -0
  933. package/dist/frontend/ts7/ast-wire-protocols.test.js +93 -0
  934. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -0
  935. package/dist/frontend/ts7/ast-wire.d.ts +18 -0
  936. package/dist/frontend/ts7/ast-wire.js +66 -4
  937. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  938. package/dist/frontend/ts7/checker-server.d.ts +12 -11
  939. package/dist/frontend/ts7/checker-server.js +28 -12
  940. package/dist/frontend/ts7/checker-server.js.map +1 -1
  941. package/dist/frontend/ts7/checker-server.test.js +8 -3
  942. package/dist/frontend/ts7/checker-server.test.js.map +1 -1
  943. package/dist/frontend/ts7/checker.d.ts +4 -0
  944. package/dist/frontend/ts7/checker.js +9 -0
  945. package/dist/frontend/ts7/checker.js.map +1 -1
  946. package/dist/frontend/ts7/checker.test.js +216 -205
  947. package/dist/frontend/ts7/checker.test.js.map +1 -1
  948. package/dist/frontend/ts7/lib-diagnostics.d.ts +71 -4
  949. package/dist/frontend/ts7/lib-diagnostics.js +337 -20
  950. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  951. package/dist/frontend/ts7/lib-diagnostics.test.js +268 -5
  952. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  953. package/dist/frontend/ts7/native-api.d.ts +4 -0
  954. package/dist/frontend/ts7/native-api.js +36 -1
  955. package/dist/frontend/ts7/native-api.js.map +1 -1
  956. package/dist/frontend/ts7/program-host.d.ts +19 -2
  957. package/dist/frontend/ts7/program-host.js +69 -9
  958. package/dist/frontend/ts7/program-host.js.map +1 -1
  959. package/dist/frontend/ts7/program-host.test.js +42 -1
  960. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  961. package/dist/frontend/ts7/rpc-filesystem.d.ts +4 -2
  962. package/dist/frontend/ts7/rpc-filesystem.js +23 -2
  963. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
  964. package/dist/frontend/ts7/rpc-filesystem.test.js +28 -2
  965. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
  966. package/dist/frontend/ts7/semantic-checker.js +73 -5
  967. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  968. package/dist/frontend/ts7/semantic-checker.test.js +106 -74
  969. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  970. package/dist/frontend/ts7/semantic-json.d.ts +2 -6
  971. package/dist/frontend/ts7/semantic-model-71.test.d.ts +1 -0
  972. package/dist/frontend/ts7/semantic-model-71.test.js +131 -0
  973. package/dist/frontend/ts7/semantic-model-71.test.js.map +1 -0
  974. package/dist/frontend/ts7/semantic-model.d.ts +121 -3
  975. package/dist/frontend/ts7/semantic-model.js +245 -8
  976. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  977. package/dist/frontend/ts7/session.d.ts +19 -1
  978. package/dist/frontend/ts7/session.js +111 -11
  979. package/dist/frontend/ts7/session.js.map +1 -1
  980. package/dist/frontend/ts7/session.test.js +259 -239
  981. package/dist/frontend/ts7/session.test.js.map +1 -1
  982. package/dist/frontend/ts7/test-servers.d.ts +12 -0
  983. package/dist/frontend/ts7/test-servers.js +16 -0
  984. package/dist/frontend/ts7/test-servers.js.map +1 -0
  985. package/dist/frontend/tsc-codes.js +6 -3
  986. package/dist/frontend/tsc-codes.js.map +1 -1
  987. package/dist/frontend/type-mapper.d.ts +61 -1
  988. package/dist/frontend/type-mapper.js +577 -28
  989. package/dist/frontend/type-mapper.js.map +1 -1
  990. package/dist/frontend/type-patches/command.d.ts +19 -0
  991. package/dist/frontend/type-patches/command.js +352 -0
  992. package/dist/frontend/type-patches/command.js.map +1 -0
  993. package/dist/frontend/type-patches/layer.d.ts +45 -0
  994. package/dist/frontend/type-patches/layer.js +409 -0
  995. package/dist/frontend/type-patches/layer.js.map +1 -0
  996. package/dist/frontend/type-patches/locate.d.ts +41 -0
  997. package/dist/frontend/type-patches/locate.js +914 -0
  998. package/dist/frontend/type-patches/locate.js.map +1 -0
  999. package/dist/frontend/type-patches/locate.test.d.ts +1 -0
  1000. package/dist/frontend/type-patches/locate.test.js +179 -0
  1001. package/dist/frontend/type-patches/locate.test.js.map +1 -0
  1002. package/dist/frontend/type-patches/selector.d.ts +43 -0
  1003. package/dist/frontend/type-patches/selector.js +126 -0
  1004. package/dist/frontend/type-patches/selector.js.map +1 -0
  1005. package/dist/frontend/type-patches/selector.test.d.ts +1 -0
  1006. package/dist/frontend/type-patches/selector.test.js +56 -0
  1007. package/dist/frontend/type-patches/selector.test.js.map +1 -0
  1008. package/dist/frontend/type-patches/semver.d.ts +19 -0
  1009. package/dist/frontend/type-patches/semver.js +221 -0
  1010. package/dist/frontend/type-patches/semver.js.map +1 -0
  1011. package/dist/frontend/type-patches/semver.test.d.ts +1 -0
  1012. package/dist/frontend/type-patches/semver.test.js +47 -0
  1013. package/dist/frontend/type-patches/semver.test.js.map +1 -0
  1014. package/dist/frontend/worker-target.test.js +2 -2
  1015. package/dist/frontend/worker-target.test.js.map +1 -1
  1016. package/dist/index.d.ts +4 -1
  1017. package/dist/index.js +292 -27
  1018. package/dist/index.js.map +1 -1
  1019. package/dist/ir/builtin-effects.js +51 -5
  1020. package/dist/ir/builtin-effects.js.map +1 -1
  1021. package/dist/ir/builtin-signatures.d.ts +4 -3
  1022. package/dist/ir/builtin-signatures.js +277 -12
  1023. package/dist/ir/builtin-signatures.js.map +1 -1
  1024. package/dist/ir/callback-specialization.js +108 -67
  1025. package/dist/ir/callback-specialization.js.map +1 -1
  1026. package/dist/ir/capture-values.d.ts +7 -1
  1027. package/dist/ir/capture-values.js +28 -5
  1028. package/dist/ir/capture-values.js.map +1 -1
  1029. package/dist/ir/char-unit-locals.js +38 -42
  1030. package/dist/ir/char-unit-locals.js.map +1 -1
  1031. package/dist/ir/expression-inlining.js +12 -6
  1032. package/dist/ir/expression-inlining.js.map +1 -1
  1033. package/dist/ir/fields.generated.d.ts +751 -0
  1034. package/dist/ir/fields.generated.js +2071 -0
  1035. package/dist/ir/fields.generated.js.map +1 -0
  1036. package/dist/ir/fields.test.d.ts +1 -0
  1037. package/dist/ir/fields.test.js +113 -0
  1038. package/dist/ir/fields.test.js.map +1 -0
  1039. package/dist/ir/function-references.js +4 -0
  1040. package/dist/ir/function-references.js.map +1 -1
  1041. package/dist/ir/function-references.test.js +25 -0
  1042. package/dist/ir/function-references.test.js.map +1 -1
  1043. package/dist/ir/inline-array-sources.d.ts +15 -0
  1044. package/dist/ir/inline-array-sources.js +1825 -0
  1045. package/dist/ir/inline-array-sources.js.map +1 -0
  1046. package/dist/ir/inline-arrays.d.ts +41 -0
  1047. package/dist/ir/inline-arrays.js +533 -0
  1048. package/dist/ir/inline-arrays.js.map +1 -0
  1049. package/dist/ir/inline-arrays.test.d.ts +1 -0
  1050. package/dist/ir/inline-arrays.test.js +225 -0
  1051. package/dist/ir/inline-arrays.test.js.map +1 -0
  1052. package/dist/ir/int32-slots.d.ts +6 -0
  1053. package/dist/ir/int32-slots.js +154 -16
  1054. package/dist/ir/int32-slots.js.map +1 -1
  1055. package/dist/ir/int32-slots.test.js +48 -0
  1056. package/dist/ir/int32-slots.test.js.map +1 -1
  1057. package/dist/ir/integer-loops.d.ts +12 -0
  1058. package/dist/ir/integer-loops.js +23 -0
  1059. package/dist/ir/integer-loops.js.map +1 -1
  1060. package/dist/ir/integer-ranges.d.ts +7 -1
  1061. package/dist/ir/integer-ranges.js +29 -2
  1062. package/dist/ir/integer-ranges.js.map +1 -1
  1063. package/dist/ir/intrinsic-signatures.js +2 -1
  1064. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1065. package/dist/ir/ir.d.ts +103 -5
  1066. package/dist/ir/ir.js +38 -4
  1067. package/dist/ir/ir.js.map +1 -1
  1068. package/dist/ir/ir.test.js +134 -1
  1069. package/dist/ir/ir.test.js.map +1 -1
  1070. package/dist/ir/jsval.js +211 -29
  1071. package/dist/ir/jsval.js.map +1 -1
  1072. package/dist/ir/jsval.test.js +120 -0
  1073. package/dist/ir/jsval.test.js.map +1 -1
  1074. package/dist/ir/loop-entry-ranges.d.ts +38 -0
  1075. package/dist/ir/loop-entry-ranges.js +259 -0
  1076. package/dist/ir/loop-entry-ranges.js.map +1 -0
  1077. package/dist/ir/loop-entry-ranges.test.d.ts +1 -0
  1078. package/dist/ir/loop-entry-ranges.test.js +191 -0
  1079. package/dist/ir/loop-entry-ranges.test.js.map +1 -0
  1080. package/dist/ir/node-index.d.ts +3 -0
  1081. package/dist/ir/node-index.js +6 -0
  1082. package/dist/ir/node-index.js.map +1 -1
  1083. package/dist/ir/numeric-call-specialization.d.ts +9 -6
  1084. package/dist/ir/numeric-call-specialization.js +164 -34
  1085. package/dist/ir/numeric-call-specialization.js.map +1 -1
  1086. package/dist/ir/paired-while-loops.js +23 -19
  1087. package/dist/ir/paired-while-loops.js.map +1 -1
  1088. package/dist/ir/parameter-versions.js +6 -3
  1089. package/dist/ir/parameter-versions.js.map +1 -1
  1090. package/dist/ir/receiver-readers.d.ts +10 -0
  1091. package/dist/ir/receiver-readers.js +65 -28
  1092. package/dist/ir/receiver-readers.js.map +1 -1
  1093. package/dist/ir/row-pairs.d.ts +9 -1
  1094. package/dist/ir/row-pairs.js +136 -43
  1095. package/dist/ir/row-pairs.js.map +1 -1
  1096. package/dist/ir/row-pairs.test.js +25 -5
  1097. package/dist/ir/row-pairs.test.js.map +1 -1
  1098. package/dist/ir/runtime-features.d.ts +33 -1
  1099. package/dist/ir/runtime-features.js +104 -6
  1100. package/dist/ir/runtime-features.js.map +1 -1
  1101. package/dist/ir/runtime-features.test.js +13 -0
  1102. package/dist/ir/runtime-features.test.js.map +1 -1
  1103. package/dist/ir/saturating-loop-jams.d.ts +24 -0
  1104. package/dist/ir/saturating-loop-jams.js +420 -0
  1105. package/dist/ir/saturating-loop-jams.js.map +1 -0
  1106. package/dist/ir/saturating-loop-jams.test.d.ts +1 -0
  1107. package/dist/ir/saturating-loop-jams.test.js +196 -0
  1108. package/dist/ir/saturating-loop-jams.test.js.map +1 -0
  1109. package/dist/ir/scalar-records.js +9 -3
  1110. package/dist/ir/scalar-records.js.map +1 -1
  1111. package/dist/ir/self-captures.js +2 -1
  1112. package/dist/ir/self-captures.js.map +1 -1
  1113. package/dist/ir/serialize.d.ts +5 -1
  1114. package/dist/ir/serialize.js +7 -1
  1115. package/dist/ir/serialize.js.map +1 -1
  1116. package/dist/ir/traverse.js +3 -0
  1117. package/dist/ir/traverse.js.map +1 -1
  1118. package/dist/ir/validate.js +91 -9
  1119. package/dist/ir/validate.js.map +1 -1
  1120. package/dist/library/ir-policy.js +1 -0
  1121. package/dist/library/ir-policy.js.map +1 -1
  1122. package/dist/native/cache.js +2 -0
  1123. package/dist/native/cache.js.map +1 -1
  1124. package/dist/native/cli.js +54 -7
  1125. package/dist/native/cli.js.map +1 -1
  1126. package/dist/native/compiler.d.ts +3 -0
  1127. package/dist/native/compiler.js +173 -36
  1128. package/dist/native/compiler.js.map +1 -1
  1129. package/dist/native/compiler.test.js +86 -3
  1130. package/dist/native/compiler.test.js.map +1 -1
  1131. package/dist/native/executable-cache.d.ts +20 -2
  1132. package/dist/native/executable-cache.js +17 -10
  1133. package/dist/native/executable-cache.js.map +1 -1
  1134. package/dist/native/executable-cache.test.js +38 -1
  1135. package/dist/native/executable-cache.test.js.map +1 -1
  1136. package/dist/native/linker-job.d.ts +71 -0
  1137. package/dist/native/linker-job.js +242 -0
  1138. package/dist/native/linker-job.js.map +1 -0
  1139. package/dist/native/linker-job.test.d.ts +1 -0
  1140. package/dist/native/linker-job.test.js +349 -0
  1141. package/dist/native/linker-job.test.js.map +1 -0
  1142. package/dist/native/prepare.js +15 -2
  1143. package/dist/native/prepare.js.map +1 -1
  1144. package/dist/native/sanitizer.js +10 -15
  1145. package/dist/native/sanitizer.js.map +1 -1
  1146. package/dist/native/sanitizer.test.js +152 -66
  1147. package/dist/native/sanitizer.test.js.map +1 -1
  1148. package/dist/native/toolchain.d.ts +11 -2
  1149. package/dist/native/toolchain.js +43 -17
  1150. package/dist/native/toolchain.js.map +1 -1
  1151. package/dist/native/toolchain.test.js +75 -0
  1152. package/dist/native/toolchain.test.js.map +1 -1
  1153. package/dist/node-islands/boundary.d.ts +37 -0
  1154. package/dist/node-islands/boundary.js +135 -0
  1155. package/dist/node-islands/boundary.js.map +1 -0
  1156. package/dist/node-islands/classify.js +1 -1
  1157. package/dist/node-islands/classify.js.map +1 -1
  1158. package/dist/node-islands/effect-gate.d.ts +11 -0
  1159. package/dist/node-islands/effect-gate.js +746 -0
  1160. package/dist/node-islands/effect-gate.js.map +1 -0
  1161. package/dist/node-islands/effect-gate.test.d.ts +1 -0
  1162. package/dist/node-islands/effect-gate.test.js +152 -0
  1163. package/dist/node-islands/effect-gate.test.js.map +1 -0
  1164. package/dist/node-islands/libnode-pack.d.ts +68 -0
  1165. package/dist/node-islands/libnode-pack.js +199 -0
  1166. package/dist/node-islands/libnode-pack.js.map +1 -0
  1167. package/dist/node-islands/libnode-pack.test.d.ts +1 -0
  1168. package/dist/node-islands/libnode-pack.test.js +258 -0
  1169. package/dist/node-islands/libnode-pack.test.js.map +1 -0
  1170. package/dist/node-islands/libnode.d.ts +32 -0
  1171. package/dist/node-islands/libnode.js +212 -0
  1172. package/dist/node-islands/libnode.js.map +1 -0
  1173. package/dist/node-islands/libnode.test.d.ts +1 -0
  1174. package/dist/node-islands/libnode.test.js +170 -0
  1175. package/dist/node-islands/libnode.test.js.map +1 -0
  1176. package/dist/node-islands/modules.d.ts +96 -0
  1177. package/dist/node-islands/modules.js +803 -0
  1178. package/dist/node-islands/modules.js.map +1 -0
  1179. package/dist/node-islands/modules.test.d.ts +1 -0
  1180. package/dist/node-islands/modules.test.js +276 -0
  1181. package/dist/node-islands/modules.test.js.map +1 -0
  1182. package/dist/node-islands/resolve.d.ts +8 -0
  1183. package/dist/node-islands/resolve.js +10 -0
  1184. package/dist/node-islands/resolve.js.map +1 -0
  1185. package/dist/node-islands/snapshot.d.ts +16 -0
  1186. package/dist/node-islands/snapshot.js +486 -0
  1187. package/dist/node-islands/snapshot.js.map +1 -0
  1188. package/dist/node-islands/snapshot.test.d.ts +1 -0
  1189. package/dist/node-islands/snapshot.test.js +56 -0
  1190. package/dist/node-islands/snapshot.test.js.map +1 -0
  1191. package/dist/project-config.d.ts +37 -1
  1192. package/dist/project-config.js +159 -7
  1193. package/dist/project-config.js.map +1 -1
  1194. package/dist/project-config.test.js +153 -0
  1195. package/dist/project-config.test.js.map +1 -1
  1196. package/dist/startup-cache.d.ts +1 -0
  1197. package/dist/startup-cache.js +1 -0
  1198. package/dist/startup-cache.js.map +1 -1
  1199. package/package.json +24 -21
  1200. package/surface-manifest.json +47 -7
@@ -1,5 +1,6 @@
1
1
  import { keyedHelperName } from "./stable-names.js";
2
2
  import { perKeyOrder } from "./key-order-witness.js";
3
+ import { elementMayBeForeign } from "./array-values.js";
3
4
  import { classPrototypeView } from "./class-prototypes.js";
4
5
  import { dynUndefinedExpr, boolLit, helperLoc, nodeThrowExpr, numLit, strLit, varRef, } from "../../ir/build.js";
5
6
  import { builtinClassDynValueOf, builtinClassKindOf } from "./builtins/builtin-class-dyn.js";
@@ -7,17 +8,19 @@ import { InternalCompilerError } from "../../errors.js";
7
8
  import * as ts from "../ts7/adapter.js";
8
9
  import { unsignedHex } from "../../format-integer.js";
9
10
  import { jsFuncNameOf } from "./lowerer.js";
10
- import { isJsSourceFile } from "../program.js";
11
- import { BOOL, CAUGHT, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, isUnitType, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, CLASS_FIELD_ATTRIBUTES_PREFIX, classDynViewSupported, DYN_CLASS_PROPERTIES, isClassOwnEnumerableFieldName, isDirentShape, isDynTypedRefType, recordTextCodecClass, shapeHasAccessorSlots, shapeKeyOrders, typeKey, } from "../../ir/ir.js";
11
+ import { isJsSourceFile, locOf } from "../program.js";
12
+ import { noLoweringDiag } from "../../diagnostics/diagnostic.js";
13
+ import { BOOL, CAUGHT, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, isUnitType, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, funcOf, arrayOf, CLASS_FIELD_ATTRIBUTES_PREFIX, classDynViewSupported, DYN_CLASS_PROPERTIES, isClassOwnEnumerableFieldName, isDirentShape, isDynTypedRefType, recordTextCodecClass, shapeHasAccessorSlots, shapeKeyOrders, typeKey, } from "../../ir/ir.js";
12
14
  import { accessorCall, findMethodOn } from "./lower-classes.js";
13
15
  import { isSafeToDiscard, isSafeToRepeat } from "./expressions/evaluation-safety.js";
14
- import { symbolFieldDisplayName, TO_STRING_TAG_FIELD } from "./symbol-fields.js";
16
+ import { INSPECT_CUSTOM_MEMBER, symbolFieldDisplayName, TO_STRING_TAG_FIELD, } from "./symbol-fields.js";
15
17
  import { eventTargetRootOf } from "./lower-event-target.js";
16
18
  import { dateRootOf } from "./builtins/date-classes.js";
17
19
  import { lowerSystemErrorMap } from "./lower-system-errors.js";
18
20
  import { isPerfEntryType, perfEntryJson } from "./builtins/performance.js";
19
21
  import { recordMayKeepSource, recordSourceTest } from "./record-sources.js";
20
22
  import { nullProtoRecordShape, recordNullProtoTest } from "./null-prototype.js";
23
+ import { dynArgumentPack } from "./call-arguments.js";
21
24
  /* ── IR construction shorthand ───────────────────────────────────────── */
22
25
  function concatAll(parts, loc) {
23
26
  if (parts.length === 0)
@@ -724,6 +727,9 @@ function inspectSupport(lowerer, t, visiting, out) {
724
727
  const info = lowerer.classes.get(t.className);
725
728
  if (!info)
726
729
  return `class '${t.className}' has no inspect lowering`;
730
+ const custom = customInspectReason(lowerer, info);
731
+ if (custom !== null)
732
+ return custom;
727
733
  // EventTarget and Event subclasses render through Node's inspectors
728
734
  // for those classes (the runtime's capsule view), and so do classes
729
735
  // declared `extends Date`.
@@ -820,8 +826,10 @@ function isNumberFlag(lowerer, t, v, loc) {
820
826
  /** The rendering of one value of type `t` at runtime depth `recurse`
821
827
  * with the depth budget `depth` — a direct scalar libCall or a call of
822
828
  * the interned per-type helper. */
823
- export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
824
- const render = inspectExprBody(lowerer, t, value, recurse, depth, loc);
829
+ export function inspectExpr(lowerer, t, value, recurse, depth, loc,
830
+ /** The instance's own rendering, without its custom inspect method. */
831
+ ownRendering = false) {
832
+ const render = inspectExprBody(lowerer, t, value, recurse, depth, loc, ownRendering);
825
833
  // A top-level render through emitted helpers that can reach a refusal
826
834
  // (the 'not supported yet' Error of insp.dyn) unwinds the inspector to
827
835
  // its state before the render on every exit: the Error propagates out of
@@ -920,7 +928,7 @@ function inspectMayRefuse(lowerer, t) {
920
928
  };
921
929
  return walk(t);
922
930
  }
923
- function inspectExprBody(lowerer, t, value, recurse, depth, loc) {
931
+ function inspectExprBody(lowerer, t, value, recurse, depth, loc, ownRendering) {
924
932
  // A Dirent row renders through its dyn view: Node's `Dirent { ... }`
925
933
  // with the Symbol(type) key.
926
934
  if (t.kind === "record") {
@@ -1000,6 +1008,15 @@ function inspectExprBody(lowerer, t, value, recurse, depth, loc) {
1000
1008
  loc,
1001
1009
  };
1002
1010
  case "object":
1011
+ if (!ownRendering && customInspectMethodOf(lowerer, t.className)) {
1012
+ return {
1013
+ kind: "call",
1014
+ callee: customInspectHelper(lowerer, t, loc),
1015
+ args: [value, recurse, depth],
1016
+ type: STRING,
1017
+ loc,
1018
+ };
1019
+ }
1003
1020
  if (eventTargetRootOf(lowerer.classes.get(t.className)) !== null ||
1004
1021
  dateRootOf(lowerer.classes.get(t.className)) !== null) {
1005
1022
  return {
@@ -1166,6 +1183,272 @@ function classInspectsAddedProperties(lowerer, info) {
1166
1183
  return (info.def.fields.some((field) => field.name === DYN_CLASS_PROPERTIES || field.name.startsWith(CLASS_FIELD_ATTRIBUTES_PREFIX)) &&
1167
1184
  classDynViewSupported(info.def.fields, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)));
1168
1185
  }
1186
+ /* ── custom inspect methods ([util.inspect.custom]) ──────────────────── */
1187
+ /** The `[util.inspect.custom]` method a class's instances have, declared
1188
+ * on the class or a base; null when they have none. */
1189
+ function customInspectMethodOf(lowerer, className) {
1190
+ const info = lowerer.classes.get(className);
1191
+ return info ? (lowerer.findMethodOn(info, INSPECT_CUSTOM_MEMBER) ?? null) : null;
1192
+ }
1193
+ /** Why instances of a class with a custom inspect method have no static
1194
+ * rendering, or null. Node calls the method with the remaining depth, the
1195
+ * options and util.inspect; the method's parameters receive them as
1196
+ * checked-dynamic values, and its result renders in the instance's place. */
1197
+ function customInspectReason(lowerer, info) {
1198
+ const found = lowerer.findMethodOn(info, INSPECT_CUSTOM_MEMBER);
1199
+ if (!found) {
1200
+ const below = (c) => c.subclasses.some((s) => s.methods.has(INSPECT_CUSTOM_MEMBER) || below(s));
1201
+ return below(info)
1202
+ ? "classes whose subclasses declare [util.inspect.custom] have no inspect lowering yet (declare the method on the class itself)"
1203
+ : null;
1204
+ }
1205
+ if (found.sig.params.length > 3)
1206
+ return "[util.inspect.custom] methods with more than three parameters have no inspect lowering";
1207
+ for (const param of found.sig.params) {
1208
+ if (param.type.kind !== "dyn" &&
1209
+ !canDynCheckTo(param.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))
1210
+ return `[util.inspect.custom] methods with a '${lowerer.fmt(param.type)}' parameter have no inspect lowering`;
1211
+ }
1212
+ const ret = found.sig.ret;
1213
+ if (ret.kind === "object")
1214
+ return "[util.inspect.custom] methods that return a class instance have no inspect lowering";
1215
+ if (ret.kind !== "string" &&
1216
+ ret.kind !== "dyn" &&
1217
+ ret.kind !== "void" &&
1218
+ inspectSupport(lowerer, ret, new Set(), { recursive: false }) !== null)
1219
+ return `[util.inspect.custom] methods returning '${lowerer.fmt(ret)}' have no inspect lowering`;
1220
+ return null;
1221
+ }
1222
+ /** Whether values of `t` can hold a checked-dynamic value, whose own custom
1223
+ * inspect functions the runtime walk calls. */
1224
+ function typeReachesDyn(lowerer, t) {
1225
+ const seen = new Set();
1226
+ const walk = (u) => {
1227
+ if (u.kind === "dyn")
1228
+ return true;
1229
+ const k = typeKey(u);
1230
+ if (seen.has(k))
1231
+ return false;
1232
+ seen.add(k);
1233
+ return typeConstituents(lowerer, u).some(walk);
1234
+ };
1235
+ return walk(t);
1236
+ }
1237
+ /** Whether values of `t` can hold an instance of a class with a custom
1238
+ * inspect method. */
1239
+ export function typeReachesCustomInspect(lowerer, t) {
1240
+ const seen = new Set();
1241
+ const walk = (u) => {
1242
+ const k = typeKey(u);
1243
+ if (seen.has(k))
1244
+ return false;
1245
+ seen.add(k);
1246
+ if (u.kind === "object" && customInspectMethodOf(lowerer, u.className))
1247
+ return true;
1248
+ return typeConstituents(lowerer, u).some(walk);
1249
+ };
1250
+ return walk(t);
1251
+ }
1252
+ /** `%util.inspCustom.<n>(v, r, d): string` — formatValue's custom hook
1253
+ * over a class whose instances have a `[util.inspect.custom]` method:
1254
+ * with ctx.customInspect set, the method's result (a string re-indented
1255
+ * at the current level, the instance itself rendered normally, any other
1256
+ * value rendered in its place); otherwise the instance's own rendering. */
1257
+ function customInspectHelper(lowerer, t, loc) {
1258
+ const key = `inspCustom:${typeKey(t)}`;
1259
+ const existing = lowerer.inspectHelpers.get(key);
1260
+ if (existing)
1261
+ return existing;
1262
+ const name = keyedHelperName(lowerer, "%util.inspCustom", key);
1263
+ lowerer.inspectHelpers.set(key, name);
1264
+ const found = customInspectMethodOf(lowerer, t.className);
1265
+ const v = () => varRef("v.0", t, loc);
1266
+ const r = () => varRef("r.0", F64, loc);
1267
+ const d = () => varRef("d.0", F64, loc);
1268
+ const ret = (value) => ({ kind: "return", value, loc });
1269
+ const normal = () => inspectExpr(lowerer, t, v(), r(), d(), loc, true);
1270
+ const runtimeArgs = [
1271
+ { kind: "libCall", fn: "insp.customDepth", args: [r(), d()], type: DYN, loc },
1272
+ { kind: "libCall", fn: "insp.customOptions", args: [d()], type: DYN, loc },
1273
+ { kind: "libCall", fn: "insp.inspectFunction", args: [], type: DYN, loc },
1274
+ ];
1275
+ const locals = [
1276
+ { id: "v.0", name: "v", type: t, mutable: false },
1277
+ { id: "r.0", name: "r", type: F64, mutable: false },
1278
+ { id: "d.0", name: "d", type: F64, mutable: false },
1279
+ ];
1280
+ // The arguments read the walk's depth and options, so they evaluate
1281
+ // before the method's own context begins.
1282
+ const argDecls = found.sig.params.map((param, i) => {
1283
+ locals.push({ id: `arg${i}.0`, name: `arg${i}`, type: param.type, mutable: false });
1284
+ const init = lowerer.coerceToExpected(runtimeArgs[i], param.type);
1285
+ return { kind: "varDecl", localId: `arg${i}.0`, init, loc };
1286
+ });
1287
+ const args = found.sig.params.map((param, i) => varRef(`arg${i}.0`, param.type, loc));
1288
+ const resultT = found.sig.ret;
1289
+ const call = accessorCall(lowerer, t.className, INSPECT_CUSTOM_MEMBER, v(), args, resultT, loc);
1290
+ // The method runs in a fresh inspect context (insp.customCallBegin); the
1291
+ // walk's own context returns before the result renders. The token lets
1292
+ // an enclosing end restore this walk's context when the method throws.
1293
+ locals.push({ id: "tok.0", name: "tok", type: F64, mutable: false });
1294
+ const end = {
1295
+ kind: "exprStmt",
1296
+ expr: {
1297
+ kind: "libCall",
1298
+ fn: "insp.customCallEnd",
1299
+ args: [varRef("tok.0", F64, loc)],
1300
+ type: VOID,
1301
+ loc,
1302
+ },
1303
+ loc,
1304
+ };
1305
+ const render = [
1306
+ ...argDecls,
1307
+ {
1308
+ kind: "varDecl",
1309
+ localId: "tok.0",
1310
+ init: { kind: "libCall", fn: "insp.customCallBegin", args: [], type: F64, loc },
1311
+ loc,
1312
+ },
1313
+ ];
1314
+ if (resultT.kind === "void") {
1315
+ render.push({ kind: "exprStmt", expr: call, loc }, end);
1316
+ }
1317
+ else {
1318
+ locals.push({ id: "res.0", name: "res", type: resultT, mutable: false });
1319
+ render.push({ kind: "varDecl", localId: "res.0", init: call, loc }, end);
1320
+ }
1321
+ const res = () => varRef("res.0", resultT, loc);
1322
+ if (resultT.kind === "string") {
1323
+ render.push(ret({ kind: "libCall", fn: "insp.customText", args: [res()], type: STRING, loc }));
1324
+ }
1325
+ else if (resultT.kind === "dyn") {
1326
+ render.push({
1327
+ kind: "if",
1328
+ cond: {
1329
+ kind: "libCall",
1330
+ fn: "insp.customIsSelf",
1331
+ args: [res(), { kind: "dynFrom", value: v(), liveRef: true, type: DYN, loc }],
1332
+ type: BOOL,
1333
+ loc,
1334
+ },
1335
+ then: [ret(normal())],
1336
+ else_: null,
1337
+ loc,
1338
+ }, ret({ kind: "libCall", fn: "insp.customResult", args: [res(), r(), d()], type: STRING, loc }));
1339
+ }
1340
+ else if (resultT.kind === "void") {
1341
+ render.push(ret(strLit("undefined", loc)));
1342
+ }
1343
+ else {
1344
+ render.push(ret(inspectExpr(lowerer, resultT, res(), r(), d(), loc)));
1345
+ }
1346
+ lowerer.liftedFns.push({
1347
+ name,
1348
+ params: [
1349
+ { localId: "v.0", name: "v", type: t },
1350
+ { localId: "r.0", name: "r", type: F64 },
1351
+ { localId: "d.0", name: "d", type: F64 },
1352
+ ],
1353
+ returnType: STRING,
1354
+ locals,
1355
+ body: [
1356
+ {
1357
+ kind: "if",
1358
+ cond: { kind: "libCall", fn: "insp.customEnabled", args: [], type: BOOL, loc },
1359
+ then: render,
1360
+ else_: null,
1361
+ loc,
1362
+ },
1363
+ ret(normal()),
1364
+ ],
1365
+ loc,
1366
+ });
1367
+ return name;
1368
+ }
1369
+ /** `%util.inspCustomDyn.<n>(self, depth, options, inspect): dyn` — a
1370
+ * class's custom inspect method for its instances held as checked-dynamic
1371
+ * values: the runtime's inspect walk calls it with the instance's typed
1372
+ * ref and the method's three arguments. */
1373
+ function customInspectDynHelper(lowerer, t, loc) {
1374
+ const name = keyedHelperName(lowerer, "%util.inspCustomDyn", typeKey(t));
1375
+ const found = customInspectMethodOf(lowerer, t.className);
1376
+ const param = (id) => varRef(id, DYN, loc);
1377
+ const ids = ["depth.0", "options.0", "inspect.0"];
1378
+ const call = accessorCall(lowerer, t.className, INSPECT_CUSTOM_MEMBER, varRef("v.0", t, loc), found.sig.params.map((p, i) => lowerer.coerceToExpected(param(ids[i]), p.type)), found.sig.ret, loc);
1379
+ const body = [
1380
+ { kind: "varDecl", localId: "v.0", init: lowerer.coerceToExpected(param("self.0"), t), loc },
1381
+ ];
1382
+ if (found.sig.ret.kind === "void") {
1383
+ body.push({ kind: "exprStmt", expr: call, loc }, { kind: "return", value: dynUndefinedExpr(loc), loc });
1384
+ }
1385
+ else {
1386
+ body.push({ kind: "return", value: lowerer.coerceToExpected(call, DYN), loc });
1387
+ }
1388
+ const params = ["self.0", ...ids];
1389
+ lowerer.liftedFns.push({
1390
+ name,
1391
+ params: params.map((id) => ({ localId: id, name: id.slice(0, -2), type: DYN })),
1392
+ returnType: DYN,
1393
+ locals: [
1394
+ ...params.map((id) => ({ id, name: id.slice(0, -2), type: DYN, mutable: false })),
1395
+ { id: "v.0", name: "v", type: t, mutable: false },
1396
+ ],
1397
+ body,
1398
+ loc,
1399
+ });
1400
+ return name;
1401
+ }
1402
+ /** The statements %main runs first, in every thread: each class whose
1403
+ * instances have a custom inspect method registers its compiled call
1404
+ * under its instances' typed-ref type key (scr_insp_register_custom). */
1405
+ export function customInspectRegistrations(lowerer, loc) {
1406
+ const stmts = [];
1407
+ for (const info of lowerer.classes.values()) {
1408
+ if (info.def.runtime || info.def.abstract)
1409
+ continue;
1410
+ // Error classes register when their own properties render statically
1411
+ // (fieldedErrorReason): the others keep no method to call.
1412
+ if (isErrorClass(lowerer, info.def.name) && fieldedErrorReason(lowerer, info) !== null)
1413
+ continue;
1414
+ if (!lowerer.findMethodOn(info, INSPECT_CUSTOM_MEMBER))
1415
+ continue;
1416
+ // Only constructed classes have instances, and only their methods lower
1417
+ // (the constructor edge reaches the method).
1418
+ if (!lowerer.classCanBeConstructed(info))
1419
+ continue;
1420
+ if (customInspectReason(lowerer, info) !== null)
1421
+ continue;
1422
+ const t = { kind: "object", className: info.def.name };
1423
+ const fn = customInspectDynHelper(lowerer, t, loc);
1424
+ stmts.push({
1425
+ kind: "exprStmt",
1426
+ expr: {
1427
+ kind: "libCall",
1428
+ fn: "insp.registerCustom",
1429
+ args: [
1430
+ strLit(typeKey(t), loc),
1431
+ {
1432
+ kind: "dynFrom",
1433
+ value: {
1434
+ kind: "closure",
1435
+ fnName: fn,
1436
+ captures: [],
1437
+ type: funcOf([DYN, DYN, DYN, DYN], DYN),
1438
+ loc,
1439
+ },
1440
+ type: DYN,
1441
+ loc,
1442
+ },
1443
+ ],
1444
+ type: VOID,
1445
+ loc,
1446
+ },
1447
+ loc,
1448
+ });
1449
+ }
1450
+ return stmts;
1451
+ }
1169
1452
  /* ── the interned per-type helper ────────────────────────────────────── */
1170
1453
  /** `%util.insp.<n>(v, r, d): string` — formatValue over the static type:
1171
1454
  * empty composites answer their literals (before the depth check, Node's
@@ -1298,11 +1581,29 @@ function inspectHelper(lowerer, t, loc) {
1298
1581
  const i = () => varRef("i.0", F64, loc);
1299
1582
  const next = () => varRef("next.0", F64, loc);
1300
1583
  const hasMore = () => lt(i(), n());
1584
+ // A foreign element (state 3) holds a value outside the element type.
1585
+ const foreignElements = elementMayBeForeign(lowerer, t.elem);
1586
+ const foreign = () => ({
1587
+ kind: "libCall",
1588
+ fn: "array.foreign",
1589
+ args: [v(), i()],
1590
+ type: DYN,
1591
+ loc,
1592
+ });
1301
1593
  const isNumber = () => ({
1302
1594
  kind: "ternary",
1303
1595
  cond: eq(state(i()), numLit(1, loc)),
1304
1596
  then: isNumberFlag(lowerer, t.elem, () => at(i()), loc),
1305
- else_: boolLit(false, loc),
1597
+ else_: foreignElements
1598
+ ? {
1599
+ kind: "ternary",
1600
+ cond: eq(state(i()), numLit(3, loc)),
1601
+ then: isNumberFlag(lowerer, DYN, foreign, loc),
1602
+ else_: boolLit(false, loc),
1603
+ type: BOOL,
1604
+ loc,
1605
+ }
1606
+ : boolLit(false, loc),
1306
1607
  type: BOOL,
1307
1608
  loc,
1308
1609
  });
@@ -1380,7 +1681,16 @@ function inspectHelper(lowerer, t, loc) {
1380
1681
  kind: "ternary",
1381
1682
  cond: eq(state(i()), numLit(1, loc)),
1382
1683
  then: child(t.elem, at(i())),
1383
- else_: strLit("undefined", loc),
1684
+ else_: foreignElements
1685
+ ? {
1686
+ kind: "ternary",
1687
+ cond: eq(state(i()), numLit(3, loc)),
1688
+ then: child(DYN, foreign()),
1689
+ else_: strLit("undefined", loc),
1690
+ type: STRING,
1691
+ loc,
1692
+ }
1693
+ : strLit("undefined", loc),
1384
1694
  type: STRING,
1385
1695
  loc,
1386
1696
  }, isNumber()),
@@ -2185,9 +2495,17 @@ function isBufferTypeName(tname) {
2185
2495
  function isDataViewTypeName(tname) {
2186
2496
  return tname === "DataView" || tname.startsWith("DataView<");
2187
2497
  }
2188
- function parseInspectOptions(lowerer, node, recursive, dir = false) {
2498
+ function parseInspectOptions(lowerer, node, recursive, dir = false, atRunTime = false) {
2189
2499
  const surface = dir ? "console.dir" : "util.inspect";
2190
- const options = { depth: 2, breakLength: 80, compact: 3, sorted: false };
2500
+ const options = {
2501
+ depth: 2,
2502
+ breakLength: 80,
2503
+ compact: 3,
2504
+ sorted: false,
2505
+ runtime: false,
2506
+ depthKind: 0,
2507
+ customInspect: !dir,
2508
+ };
2191
2509
  if (!node || (ts.isIdentifier(node) && node.text === "undefined"))
2192
2510
  return options;
2193
2511
  if (!ts.isObjectLiteralExpression(node)) {
@@ -2195,6 +2513,11 @@ function parseInspectOptions(lowerer, node, recursive, dir = false) {
2195
2513
  }
2196
2514
  for (const prop of node.properties.nodes) {
2197
2515
  if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) {
2516
+ // `{ depth }` and `{ ...base }` hold values known at run time.
2517
+ if (atRunTime && (ts.isShorthandPropertyAssignment(prop) || ts.isSpreadAssignment(prop))) {
2518
+ options.runtime = true;
2519
+ continue;
2520
+ }
2198
2521
  lowerer.noLowering(`${surface} options in this form`, prop, "plain `key: literal` entries are the lowered options");
2199
2522
  }
2200
2523
  const key = prop.name.text;
@@ -2217,9 +2540,19 @@ function parseInspectOptions(lowerer, node, recursive, dir = false) {
2217
2540
  // bounded by the (finite) object graph — exactly Node.
2218
2541
  void recursive;
2219
2542
  options.depth = Infinity;
2543
+ options.depthKind = value.kind === ts.SyntaxKind.NullKeyword ? 1 : 0;
2544
+ }
2545
+ else if (ts.isIdentifier(value) && value.text === "undefined") {
2546
+ // Node's ctx.depth is undefined: no depth limit.
2547
+ options.depth = Infinity;
2548
+ options.depthKind = 2;
2220
2549
  }
2221
- else if (!(ts.isIdentifier(value) && value.text === "undefined")) {
2550
+ else {
2222
2551
  const n = numeric();
2552
+ if (n === null && atRunTime) {
2553
+ options.runtime = true;
2554
+ continue;
2555
+ }
2223
2556
  if (n === null) {
2224
2557
  lowerer.noLowering(`${surface} with a non-literal depth option`, value, "depth must be a numeric literal (or null)");
2225
2558
  }
@@ -2227,7 +2560,9 @@ function parseInspectOptions(lowerer, node, recursive, dir = false) {
2227
2560
  }
2228
2561
  }
2229
2562
  else if (key === "colors") {
2230
- if (value.kind !== ts.SyntaxKind.FalseKeyword) {
2563
+ if (value.kind !== ts.SyntaxKind.FalseKeyword && atRunTime)
2564
+ options.runtime = true;
2565
+ else if (value.kind !== ts.SyntaxKind.FalseKeyword) {
2231
2566
  lowerer.noLowering(`${surface} with colors: true`, value, "ANSI styling has no lowering — only colors: false");
2232
2567
  }
2233
2568
  }
@@ -2236,24 +2571,47 @@ function parseInspectOptions(lowerer, node, recursive, dir = false) {
2236
2571
  // compact of at least 1; false and smaller numbers break every
2237
2572
  // composite onto its own lines. compact: true is the older layout.
2238
2573
  const n = value.kind === ts.SyntaxKind.FalseKeyword ? 0 : numeric();
2574
+ if (n === null && atRunTime && value.kind !== ts.SyntaxKind.TrueKeyword) {
2575
+ options.runtime = true;
2576
+ continue;
2577
+ }
2239
2578
  if (n === null || Number.isNaN(n)) {
2240
2579
  lowerer.noLowering(`${surface} with this compact option`, value, "compact must be false or a numeric literal (compact: true has no lowering)");
2241
2580
  }
2242
- options.compact = Math.max(n, 0);
2581
+ // false is -1: the same layout as 0, and custom inspect functions
2582
+ // read it back as false.
2583
+ options.compact = value.kind === ts.SyntaxKind.FalseKeyword ? -1 : Math.max(n, 0);
2243
2584
  }
2244
2585
  else if (key === "sorted") {
2245
- if (value.kind !== ts.SyntaxKind.TrueKeyword && value.kind !== ts.SyntaxKind.FalseKeyword) {
2586
+ const sortedLiteral = value.kind === ts.SyntaxKind.TrueKeyword || value.kind === ts.SyntaxKind.FalseKeyword;
2587
+ if (!sortedLiteral &&
2588
+ atRunTime &&
2589
+ !ts.isArrowFunction(value) &&
2590
+ !ts.isFunctionExpression(value)) {
2591
+ options.runtime = true;
2592
+ continue;
2593
+ }
2594
+ if (!sortedLiteral) {
2246
2595
  lowerer.noLowering(`${surface} with this sorted option`, value, "sorted must be true or false (a comparator function has no lowering)");
2247
2596
  }
2248
2597
  options.sorted = value.kind === ts.SyntaxKind.TrueKeyword;
2249
2598
  }
2250
2599
  else if (key === "breakLength") {
2251
2600
  const n = ts.isIdentifier(value) && value.text === "Infinity" ? Infinity : numeric();
2601
+ if (n === null && atRunTime) {
2602
+ options.runtime = true;
2603
+ continue;
2604
+ }
2252
2605
  if (n === null || Number.isNaN(n)) {
2253
2606
  lowerer.noLowering(`${surface} with a non-literal breakLength option`, value, "breakLength must be a numeric literal or Infinity");
2254
2607
  }
2255
2608
  options.breakLength = n;
2256
2609
  }
2610
+ else if (!dir &&
2611
+ key === "customInspect" &&
2612
+ (value.kind === ts.SyntaxKind.TrueKeyword || value.kind === ts.SyntaxKind.FalseKeyword)) {
2613
+ options.customInspect = value.kind === ts.SyntaxKind.TrueKeyword;
2614
+ }
2257
2615
  else if (dir && key === "customInspect") {
2258
2616
  // console.dir's own default; only that value is lowered.
2259
2617
  if (value.kind !== ts.SyntaxKind.FalseKeyword) {
@@ -2359,12 +2717,68 @@ function directCallableInspect(lowerer, node, loc) {
2359
2717
  }
2360
2718
  return null;
2361
2719
  }
2362
- /** util.inspect(value[, options]) — the spoke's inspect entry. */
2720
+ /** util.inspect(value[, options]) and inspect(value, showHidden, depth,
2721
+ * colors) — the spoke's inspect entry. Options the compiler resolves
2722
+ * render through the static helpers; colors, option values known only at
2723
+ * run time and the legacy forms render the value's checked-dynamic view
2724
+ * in the runtime (insp.inspect). */
2363
2725
  function lowerInspectCall(lowerer, expr, loc) {
2364
- if (expr.arguments.nodes.length < 1 || expr.arguments.nodes.length > 2) {
2365
- lowerer.noLowering(`util.inspect with ${expr.arguments.nodes.length} arguments`, expr, "the supported forms are inspect(value) and inspect(value, options)");
2726
+ const args = expr.arguments.nodes;
2727
+ if (args.length < 1 || args.length > 4 || args.some(ts.isSpreadElement)) {
2728
+ lowerer.noLowering(`util.inspect with ${args.some(ts.isSpreadElement) ? "spread" : args.length} arguments`, expr, "the supported forms are inspect(value), inspect(value, options) and inspect(value, showHidden, depth, colors)");
2729
+ }
2730
+ if (args.length <= 2 && !inspectOptionsAtRunTime(lowerer, args[1]))
2731
+ return lowerInspectValue(lowerer, args[0], args[1], loc, false);
2732
+ return lowerRuntimeInspect(lowerer, args, loc);
2733
+ }
2734
+ /** Whether an options argument needs the runtime reader: an options value
2735
+ * that is not an object literal, or a literal with colors or a computed
2736
+ * depth, compact, breakLength or sorted value. Literal options otherwise
2737
+ * keep the static parse, which also reports the literal options neither
2738
+ * path lowers. */
2739
+ function inspectOptionsAtRunTime(lowerer, node) {
2740
+ if (!node || (ts.isIdentifier(node) && node.text === "undefined"))
2741
+ return false;
2742
+ if (!ts.isObjectLiteralExpression(node))
2743
+ return true;
2744
+ return parseInspectOptions(lowerer, node, false, false, true).runtime;
2745
+ }
2746
+ /** util.inspect over the value's checked-dynamic view, with every argument
2747
+ * evaluated in order and read in the runtime as Node's inspect reads it. */
2748
+ function lowerRuntimeInspect(lowerer, args, loc) {
2749
+ const valueNode = args[0];
2750
+ if (directCallableInspect(lowerer, valueNode, loc) !== null ||
2751
+ ts.isArrowFunction(valueNode) ||
2752
+ ts.isFunctionExpression(valueNode)) {
2753
+ lowerer.noLowering("util.inspect of a function or class with these options", valueNode, "pass the options as a literal without colors");
2754
+ }
2755
+ const value = lowerer.lowerExpr(valueNode);
2756
+ if (value.type.kind !== "dyn") {
2757
+ const reason = inspectSupport(lowerer, value.type, new Set(), { recursive: false });
2758
+ if (reason !== null)
2759
+ lowerer.noLowering(`util.inspect of '${lowerer.fmt(value.type)}' values`, valueNode, reason);
2760
+ if (!lowerer.dynConvertible(value.type))
2761
+ lowerer.noLowering(`util.inspect with these options of '${lowerer.fmt(value.type)}' values`, valueNode, "the options are read at run time, where the value renders through its checked-dynamic view");
2762
+ }
2763
+ const stmts = [];
2764
+ const held = (init) => {
2765
+ const local = lowerer.declareHiddenLocal("%inspectArg", DYN);
2766
+ stmts.push({ kind: "varDecl", localId: local.id, init, loc });
2767
+ return varRef(local.id, DYN, loc);
2768
+ };
2769
+ const operands = [held(lowerer.coerceToExpected(value, DYN))];
2770
+ for (let i = 1; i < 4; i++) {
2771
+ const node = args[i];
2772
+ operands.push(node ? held(lowerer.lowerExprExpecting(node, DYN)) : dynUndefinedExpr(loc));
2366
2773
  }
2367
- return lowerInspectValue(lowerer, expr.arguments.nodes[0], expr.arguments.nodes[1], loc, false);
2774
+ operands.push(numLit(args.length, loc));
2775
+ return {
2776
+ kind: "seqExpr",
2777
+ stmts,
2778
+ result: { kind: "libCall", fn: "insp.inspect", args: operands, type: STRING, loc },
2779
+ type: STRING,
2780
+ loc,
2781
+ };
2368
2782
  }
2369
2783
  /** `inspect(value, options)` over one value node: the shared body of
2370
2784
  * util.inspect and console.dir. console.dir is Node's `inspect(object,
@@ -2434,6 +2848,41 @@ export function lowerInspectValue(lowerer, valueNode, optionsNode, loc, dir) {
2434
2848
  }
2435
2849
  const options = parseInspectOptions(lowerer, optionsNode, walk.recursive, dir);
2436
2850
  const depth = options.depth;
2851
+ // Custom inspect functions read the options as Node spelled them: an
2852
+ // unbounded depth given as Infinity or undefined, and customInspect:
2853
+ // false (console.dir's default), apply around the render when the value
2854
+ // can reach a custom method; the previous settings return afterwards.
2855
+ const reachesCustom = typeReachesCustomInspect(lowerer, value.type) || typeReachesDyn(lowerer, value.type);
2856
+ const depthContext = reachesCustom && depth === Infinity && options.depthKind !== 1;
2857
+ const customContext = reachesCustom && !options.customInspect;
2858
+ if (depthContext || customContext) {
2859
+ const stmts = [];
2860
+ const restore = [];
2861
+ const setting = (fn, arg, type) => {
2862
+ const previous = lowerer.declareHiddenLocal("%inspectContext", type);
2863
+ const call = (a) => ({ kind: "libCall", fn, args: [a], type, loc });
2864
+ stmts.push({ kind: "varDecl", localId: previous.id, init: call(arg), loc });
2865
+ restore.push({ kind: "exprStmt", expr: call(varRef(previous.id, type, loc)), loc });
2866
+ };
2867
+ if (customContext)
2868
+ setting("insp.customInspect", boolLit(false, loc), BOOL);
2869
+ if (depthContext)
2870
+ setting("insp.depthKind", numLit(options.depthKind, loc), F64);
2871
+ const text = lowerer.declareHiddenLocal("%inspectText", STRING);
2872
+ stmts.push({
2873
+ kind: "varDecl",
2874
+ localId: text.id,
2875
+ init: withInspectLayout(lowerer, options, value, "inspect", (input) => inspectExpr(lowerer, value.type, input, numLit(0, loc), numLit(depth, loc), loc), loc),
2876
+ loc,
2877
+ });
2878
+ return {
2879
+ kind: "seqExpr",
2880
+ stmts: [...stmts, ...restore.reverse()],
2881
+ result: varRef(text.id, STRING, loc),
2882
+ type: STRING,
2883
+ loc,
2884
+ };
2885
+ }
2437
2886
  if (dir && value.type.kind === "dyn") {
2438
2887
  return withInspectLayout(lowerer, options, value, "dirDyn", (input) => ({
2439
2888
  kind: "libCall",
@@ -2450,7 +2899,10 @@ export function lowerInspectValue(lowerer, valueNode, optionsNode, loc, dir) {
2450
2899
  * formatNumber, strings verbatim, objects through inspect at the given
2451
2900
  * depth). Null = fence with the given reason. */
2452
2901
  function formatSArg(lowerer, node, depth, loc) {
2453
- const value = lowerer.lowerExpr(node);
2902
+ return formatSValue(lowerer, node, lowerer.lowerExpr(node), depth, loc);
2903
+ }
2904
+ /** formatSArg over the already-lowered value of `node`. */
2905
+ function formatSValue(lowerer, node, value, depth, loc) {
2454
2906
  const t = value.type;
2455
2907
  if (t.kind === "string")
2456
2908
  return value;
@@ -2471,7 +2923,7 @@ function formatSArg(lowerer, node, depth, loc) {
2471
2923
  if (t.kind === "dyn") {
2472
2924
  return {
2473
2925
  kind: "libCall",
2474
- fn: "insp.dynS",
2926
+ fn: "insp.dynFormatS",
2475
2927
  args: [value, numLit(depth, loc)],
2476
2928
  type: STRING,
2477
2929
  loc,
@@ -2528,6 +2980,9 @@ function formatOArg(lowerer, node, depth, loc) {
2528
2980
  const reason = inspectSupport(lowerer, value.type, new Set(), walk);
2529
2981
  if (reason !== null)
2530
2982
  lowerer.noLowering(`util.format %${depth === 4 ? "o" : "O"} of '${lowerer.fmt(value.type)}' values`, node, reason);
2983
+ if (depth === 4 && typeReachesCustomInspect(lowerer, value.type)) {
2984
+ lowerer.noLowering("util.format %o over values with [util.inspect.custom] methods", node, "%o passes showHidden to the methods — use %O");
2985
+ }
2531
2986
  if (depth === 4 && typeTreeHasHidden(lowerer, value.type, new Set())) {
2532
2987
  lowerer.noLowering("util.format %o over arrays", node, "%o renders with showHidden (arrays gain a hidden [length] entry) — use %O for the default rendering, or pass the value as unknown");
2533
2988
  }
@@ -2599,27 +3054,64 @@ function formatIntegerFixed(value, spec, loc) {
2599
3054
  /** util.format(...) / util.formatWithOptions({}, ...): the compile-time
2600
3055
  * %-substitution over a literal format string (formatWithOptionsInternal
2601
3056
  * ported exactly — the arg cursor, the args-exhausted guard, %c's
2602
- * consume-and-drop), with per-static-type conversions. Non-literal
2603
- * format strings lower only in the substitution-free shapes. */
3057
+ * consume-and-drop), with per-static-type conversions. Format strings
3058
+ * known only at run time, spread arguments and non-empty options lower to
3059
+ * the runtime formatter (lowerRuntimeFormat, heldFormatArgs). */
2604
3060
  export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverride, literalPrefix = "") {
2605
3061
  const argNodes = [...(argNodesOverride ?? expr.arguments.nodes)];
2606
3062
  if (withOptions) {
2607
3063
  const opts = argNodes.shift();
3064
+ // The empty literal {} is the defaults: exactly util.format.
2608
3065
  if (!opts || !ts.isObjectLiteralExpression(opts) || opts.properties.nodes.length > 0) {
2609
- lowerer.noLowering("util.formatWithOptions with a non-empty options literal", opts ?? expr, "only the empty literal {} (the defaults — exactly util.format) is lowered");
3066
+ if (opts && ts.isSpreadElement(opts)) {
3067
+ lowerer.noLowering("util.formatWithOptions with a spread options argument", opts, "pass the options object as the first argument");
3068
+ }
3069
+ return lowerRuntimeFormat(lowerer, argNodes, loc, opts ?? null);
2610
3070
  }
2611
3071
  }
2612
3072
  if (argNodes.length === 0)
2613
3073
  return strLit("", loc);
2614
3074
  const first = argNodes[0];
2615
3075
  const firstIsLiteral = ts.isStringLiteral(first) || ts.isNoSubstitutionTemplateLiteral(first);
3076
+ if (argNodes.some(ts.isSpreadElement)) {
3077
+ if (literalPrefix !== "" && !firstIsLiteral)
3078
+ throw new InternalCompilerError("a format prefix needs a literal format string");
3079
+ return lowerRuntimeFormat(lowerer, argNodes, loc, undefined, literalPrefix);
3080
+ }
2616
3081
  /** The rest-args tail: ` ` + (strings verbatim, everything else
2617
3082
  * inspected at the default depth). */
2618
3083
  const restArg = (node) => formatSArg(lowerer, node, 2, loc);
2619
3084
  if (!firstIsLiteral) {
2620
- const firstT = lowerer.mapTypeOf(lowerer.typeOf(first));
2621
- if (firstT?.kind === "string" && argNodes.length > 1) {
2622
- lowerer.noLowering("util.format with a runtime format string and further arguments", first, "the %-substitution positions are runtime-dependent — use a string literal");
3085
+ const runtime = argNodes.length > 1 ? runtimeFormatString(lowerer, first) : null;
3086
+ if (runtime === "other" && !formatStringConverts(lowerer, first))
3087
+ return lowerRuntimeFormat(lowerer, argNodes, loc);
3088
+ if (runtime !== null) {
3089
+ // A string that substitutes formats at run time; any other string
3090
+ // joins with the remaining arguments, as below.
3091
+ const held = heldFormatArgs(lowerer, argNodes, loc);
3092
+ if (!held.joinable) {
3093
+ return { kind: "seqExpr", stmts: held.stmts, result: held.format(), type: STRING, loc };
3094
+ }
3095
+ const joined = [];
3096
+ held.args.forEach((arg, i) => {
3097
+ if (i > 0)
3098
+ joined.push(strLit(" ", loc));
3099
+ joined.push(formatRestValue(lowerer, arg.node, arg.ref(), loc));
3100
+ });
3101
+ return {
3102
+ kind: "seqExpr",
3103
+ stmts: held.stmts,
3104
+ result: {
3105
+ kind: "ternary",
3106
+ cond: held.specifies,
3107
+ then: held.format(),
3108
+ else_: concatAll(joined, loc),
3109
+ type: STRING,
3110
+ loc,
3111
+ },
3112
+ type: STRING,
3113
+ loc,
3114
+ };
2623
3115
  }
2624
3116
  // No substitutions possible: every argument joins with spaces.
2625
3117
  const parts = [];
@@ -2881,6 +3373,211 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverrid
2881
3373
  }
2882
3374
  return concatAll(parts, loc);
2883
3375
  }
3376
+ /** One space-joined argument of util.format, as Node's formatter renders
3377
+ * it after the format string: strings verbatim, everything else through
3378
+ * inspect at the default depth. */
3379
+ function formatRestValue(lowerer, node, value, loc) {
3380
+ switch (value.type.kind) {
3381
+ case "string":
3382
+ return value;
3383
+ case "f64":
3384
+ return { kind: "libCall", fn: "insp.f64", args: [value], type: STRING, loc };
3385
+ case "bool":
3386
+ return { kind: "toString", operand: value, type: STRING, loc };
3387
+ case "dyn":
3388
+ return { kind: "libCall", fn: "insp.dynS", args: [value, numLit(2, loc)], type: STRING, loc };
3389
+ default:
3390
+ return lowerConsoleInspectArg(lowerer, node, value, "util.format", loc);
3391
+ }
3392
+ }
3393
+ const UNCONVERTIBLE_HINT = "the runtime formatter reads its arguments as checked-dynamic values — use a string literal format";
3394
+ /** A string-valued expression that throws the SC2020 refusal where it runs
3395
+ * (a JavaScript construct fence deferred to the branch that needs it). */
3396
+ function runtimeFenceValue(lowerer, surface, node, hint, loc) {
3397
+ const diag = noLoweringDiag(surface, locOf(node), hint);
3398
+ lowerer.runtimeFences.push(diag);
3399
+ const sf = ts.getSourceFileOfNode(node);
3400
+ const line = ts.getLineAndCharacterOfPosition(sf, diag.loc.start).line + 1;
3401
+ const slot = lowerer.declareHiddenLocal("%never", STRING);
3402
+ slot.mutable = true;
3403
+ return {
3404
+ kind: "seqExpr",
3405
+ stmts: [
3406
+ { kind: "varDecl", localId: slot.id, init: null, loc },
3407
+ {
3408
+ kind: "runtimeFence",
3409
+ code: diag.code,
3410
+ message: `${diag.message} [${diag.code} at ${diag.loc.file}:${line}]`,
3411
+ loc,
3412
+ },
3413
+ ],
3414
+ result: varRef(slot.id, STRING, loc),
3415
+ diverges: true,
3416
+ type: STRING,
3417
+ loc,
3418
+ };
3419
+ }
3420
+ /** Whether the held-argument form can test a format string whose type
3421
+ * only may hold a string: a union that converts to a checked-dynamic value,
3422
+ * or a value whose checker type does not map (its lowered type decides). */
3423
+ export function formatStringConverts(lowerer, first) {
3424
+ const t = lowerer.mapTypeOf(lowerer.typeOf(first));
3425
+ return t === null || t.kind === "dyn" || lowerer.dynConvertible(t);
3426
+ }
3427
+ /** How a non-literal format string is known: "string" and "dyn" values
3428
+ * test for a substitution at run time, "other" types (unions with a string
3429
+ * arm) format at run time, and null types never hold a string. */
3430
+ export function runtimeFormatString(lowerer, first) {
3431
+ const t = lowerer.mapTypeOf(lowerer.typeOf(first));
3432
+ if (t === null)
3433
+ return "other";
3434
+ if (t.kind === "string")
3435
+ return "string";
3436
+ if (t.kind === "dyn")
3437
+ return "dyn";
3438
+ if (t.kind === "union") {
3439
+ const arms = lowerer.unions.get(t.unionId)?.arms ?? [];
3440
+ return arms.some((arm) => arm.kind === "string" || arm.kind === "dyn") ? "other" : null;
3441
+ }
3442
+ return t.kind === "jsval" || t.kind === "caught" ? "other" : null;
3443
+ }
3444
+ /** The runtime formatter over a call's arguments: one checked-dynamic
3445
+ * pack in source order (spreads contribute their elements), after the
3446
+ * options when `options` is given (null: an omitted options argument,
3447
+ * which Node's validation rejects). A literal prefix joins a literal
3448
+ * format string. */
3449
+ export function lowerRuntimeFormat(lowerer, argNodes, loc, options, literalPrefix = "") {
3450
+ const stmts = [];
3451
+ let optionsRef = null;
3452
+ if (options !== undefined) {
3453
+ const held = lowerer.declareHiddenLocal("%formatOptions", DYN);
3454
+ stmts.push({
3455
+ kind: "varDecl",
3456
+ localId: held.id,
3457
+ init: options === null ? dynUndefinedExpr(loc) : lowerer.lowerExprExpecting(options, DYN),
3458
+ loc,
3459
+ });
3460
+ optionsRef = varRef(held.id, DYN, loc);
3461
+ }
3462
+ let nodes = argNodes;
3463
+ const leading = [];
3464
+ if (literalPrefix !== "") {
3465
+ const first = argNodes[0];
3466
+ leading.push(strLit(literalPrefix + first.text, loc));
3467
+ nodes = argNodes.slice(1);
3468
+ }
3469
+ const pack = dynArgumentPack(lowerer, nodes, loc, {
3470
+ leading,
3471
+ blame: argNodes[0] ?? options ?? undefined,
3472
+ });
3473
+ stmts.push(...pack.stmts);
3474
+ const result = optionsRef === null
3475
+ ? { kind: "libCall", fn: "insp.format", args: [pack.pack()], type: STRING, loc }
3476
+ : {
3477
+ kind: "libCall",
3478
+ fn: "insp.formatWithOptions",
3479
+ args: [optionsRef, pack.pack()],
3480
+ type: STRING,
3481
+ loc,
3482
+ };
3483
+ return { kind: "seqExpr", stmts, result, type: STRING, loc };
3484
+ }
3485
+ /** The arguments of a call whose first argument is a string or dyn value
3486
+ * known only at run time, each evaluated once into a hidden local:
3487
+ * `specifies` tests that string for a '%' before its last character, and
3488
+ * `format()` is the runtime formatter over the held values. The caller
3489
+ * renders the other branch (the space-joined arguments) from `args` when
3490
+ * every argument is `joinable` there. */
3491
+ export function heldFormatArgs(lowerer, argNodes, loc) {
3492
+ const stmts = [];
3493
+ let unconvertible = null;
3494
+ const unconvertibleSurface = (t) => `util.format with a runtime format string over '${lowerer.fmt(t)}' values`;
3495
+ const args = argNodes.map((node) => {
3496
+ const value = lowerer.lowerExpr(node);
3497
+ if (value.type.kind === "void") {
3498
+ lowerer.unsupported("SC1090", node, "util.format of a void call result (call it as its own statement, then pass undefined)");
3499
+ }
3500
+ // The space-joined branch prints these values as before; only a string
3501
+ // that substitutes refuses them, where it runs.
3502
+ if (value.type.kind !== "dyn" && !lowerer.dynConvertible(value.type))
3503
+ unconvertible ??= { node, type: value.type };
3504
+ // Unit values have no local: their effects run here and a literal
3505
+ // stands in.
3506
+ const k = value.type.kind;
3507
+ if (k === "undefinedT" || k === "nullT") {
3508
+ if (value.kind !== "unitLit")
3509
+ stmts.push({ kind: "exprStmt", expr: value, loc });
3510
+ const unit = k === "nullT" ? "null" : "undefined";
3511
+ return { node, ref: () => ({ kind: "unitLit", unit, type: value.type, loc }) };
3512
+ }
3513
+ const held = lowerer.declareHiddenLocal("%formatArg", value.type);
3514
+ stmts.push({ kind: "varDecl", localId: held.id, init: value, loc });
3515
+ return { node, ref: () => varRef(held.id, value.type, loc) };
3516
+ });
3517
+ const first = args[0].ref();
3518
+ // A lowered value that is neither a string nor convertible holds no
3519
+ // string, so it never substitutes.
3520
+ const specifies = first.type.kind === "string"
3521
+ ? { kind: "libCall", fn: "insp.formatSpecifies", args: [first], type: BOOL, loc }
3522
+ : first.type.kind === "dyn" || lowerer.dynConvertible(first.type)
3523
+ ? {
3524
+ kind: "libCall",
3525
+ fn: "insp.formatSpecifiesDyn",
3526
+ args: [lowerer.coerceToExpected(first, DYN)],
3527
+ type: BOOL,
3528
+ loc,
3529
+ }
3530
+ : { kind: "boolLit", value: false, type: BOOL, loc };
3531
+ const format = () => {
3532
+ if (unconvertible !== null) {
3533
+ const fenced = unconvertible;
3534
+ return runtimeFenceValue(lowerer, unconvertibleSurface(fenced.type), fenced.node, UNCONVERTIBLE_HINT, loc);
3535
+ }
3536
+ // Strings, numbers, booleans, null and undefined format without the
3537
+ // checked-dynamic walk other values need, which keeps it out of the
3538
+ // executable.
3539
+ const primitive = (t) => t.kind === "string" ||
3540
+ t.kind === "f64" ||
3541
+ t.kind === "bool" ||
3542
+ t.kind === "undefinedT" ||
3543
+ t.kind === "nullT" ||
3544
+ (t.kind === "union" && (lowerer.unions.get(t.unionId)?.arms.every(primitive) ?? false));
3545
+ // A native list of the checked values: converting into it is a tier
3546
+ // boundary, so the statement stays static.
3547
+ return {
3548
+ kind: "libCall",
3549
+ fn: args.every((arg) => primitive(arg.ref().type))
3550
+ ? "insp.formatPrimitives"
3551
+ : "insp.formatList",
3552
+ args: [
3553
+ {
3554
+ kind: "arrayLit",
3555
+ elems: args.map((arg) => lowerer.coerceToExpected(arg.ref(), DYN)),
3556
+ type: arrayOf(DYN),
3557
+ loc,
3558
+ },
3559
+ ],
3560
+ type: STRING,
3561
+ loc,
3562
+ };
3563
+ };
3564
+ // The space-joined branch renders each argument statically; arguments
3565
+ // the static rendering refuses take the runtime formatter in both cases.
3566
+ const joinable = args.every(({ ref }) => {
3567
+ const t = ref().type;
3568
+ if (t.kind === "func")
3569
+ return false;
3570
+ if (t.kind === "bytes")
3571
+ return true;
3572
+ return inspectSupport(lowerer, t, new Set(), { recursive: false }) === null;
3573
+ });
3574
+ // Without a joined branch every call formats: TypeScript refuses the
3575
+ // value at compile time.
3576
+ const refused = unconvertible;
3577
+ if (!joinable && refused !== null && !isJsSourceFile(ts.getSourceFileOfNode(refused.node)))
3578
+ lowerer.noLowering(unconvertibleSurface(refused.type), refused.node, UNCONVERTIBLE_HINT);
3579
+ return { stmts, args, specifies, format, joinable };
3580
+ }
2884
3581
  /** Arrays anywhere in the tree — the %o (showHidden) gate. */
2885
3582
  function typeTreeHasHidden(lowerer, t, visiting) {
2886
3583
  switch (t.kind) {