@scriptc/compiler 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (999) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +977 -113
  2. package/dist/backend/cycle-analysis.d.ts +5 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +9 -1
  8. package/dist/backend/cycle-mutability.js +21 -3
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +6 -1
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +7 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +5 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +23 -4
  18. package/dist/backend/llvm/alloc.js +61 -8
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +23 -10
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
  37. package/dist/backend/llvm/bytes-loop-versions.js +567 -30
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +74 -1
  44. package/dist/backend/llvm/classes.js +364 -54
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +384 -17
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +10 -6
  49. package/dist/backend/llvm/common.js +10 -6
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +91 -56
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  55. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  56. package/dist/backend/llvm/counted-loops.d.ts +11 -1
  57. package/dist/backend/llvm/counted-loops.js +80 -23
  58. package/dist/backend/llvm/counted-loops.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
  65. package/dist/backend/llvm/dense-array-loops.js +237 -12
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +140 -15
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +51 -1
  72. package/dist/backend/llvm/dyn.js +683 -69
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +33 -26
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +208 -34
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -27
  82. package/dist/backend/llvm/emit-statements.js +577 -93
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +314 -49
  88. package/dist/backend/llvm/emitter.js +1241 -129
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +54 -5
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +19 -0
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  95. package/dist/backend/llvm/expr-bytes.js +144 -52
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.js +47 -0
  98. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  99. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  100. package/dist/backend/llvm/expr-calls.js +62 -36
  101. package/dist/backend/llvm/expr-calls.js.map +1 -1
  102. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  103. package/dist/backend/llvm/expr-containers.js +148 -40
  104. package/dist/backend/llvm/expr-containers.js.map +1 -1
  105. package/dist/backend/llvm/expr-context.d.ts +14 -0
  106. package/dist/backend/llvm/expr-control.js +2 -3
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dynamic.js +71 -16
  109. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  110. package/dist/backend/llvm/expr-primitives.js +126 -36
  111. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  112. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  113. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-records.d.ts +12 -0
  115. package/dist/backend/llvm/expr-records.js +106 -0
  116. package/dist/backend/llvm/expr-records.js.map +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  118. package/dist/backend/llvm/expr-stream-bridges.js +225 -64
  119. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  121. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  126. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  127. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  128. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  129. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  130. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  131. package/dist/backend/llvm/integer-values.d.ts +20 -1
  132. package/dist/backend/llvm/integer-values.js +71 -0
  133. package/dist/backend/llvm/integer-values.js.map +1 -1
  134. package/dist/backend/llvm/js-ic.d.ts +1 -1
  135. package/dist/backend/llvm/js-ic.js +1 -1
  136. package/dist/backend/llvm/js-ic.js.map +1 -1
  137. package/dist/backend/llvm/key-orders.d.ts +7 -0
  138. package/dist/backend/llvm/key-orders.js +33 -0
  139. package/dist/backend/llvm/key-orders.js.map +1 -0
  140. package/dist/backend/llvm/lib-connect.js +4 -0
  141. package/dist/backend/llvm/lib-connect.js.map +1 -1
  142. package/dist/backend/llvm/lib-datagram.js +11 -0
  143. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  144. package/dist/backend/llvm/lib-dispatch.js +90 -2
  145. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  146. package/dist/backend/llvm/lib-filesystem.js +65 -4
  147. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  148. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  149. package/dist/backend/llvm/lib-http2.js +24 -17
  150. package/dist/backend/llvm/lib-http2.js.map +1 -1
  151. package/dist/backend/llvm/lib-lookup.js +16 -6
  152. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  153. package/dist/backend/llvm/lib-process.js +65 -14
  154. package/dist/backend/llvm/lib-process.js.map +1 -1
  155. package/dist/backend/llvm/lib-shared.js +126 -3
  156. package/dist/backend/llvm/lib-shared.js.map +1 -1
  157. package/dist/backend/llvm/lib-stream.js +97 -30
  158. package/dist/backend/llvm/lib-stream.js.map +1 -1
  159. package/dist/backend/llvm/lib-tls.js +23 -0
  160. package/dist/backend/llvm/lib-tls.js.map +1 -1
  161. package/dist/backend/llvm/local-array-reads.js +181 -64
  162. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  163. package/dist/backend/llvm/local-array-reads.test.js +28 -0
  164. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  165. package/dist/backend/llvm/loop-state.d.ts +33 -0
  166. package/dist/backend/llvm/loop-state.js +42 -0
  167. package/dist/backend/llvm/loop-state.js.map +1 -0
  168. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  169. package/dist/backend/llvm/map-number-lookup.js +91 -31
  170. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  171. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  172. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  173. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  176. package/dist/backend/llvm/nullable-unions.js +15 -3
  177. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  178. package/dist/backend/llvm/publish.d.ts +18 -1
  179. package/dist/backend/llvm/publish.js +76 -25
  180. package/dist/backend/llvm/publish.js.map +1 -1
  181. package/dist/backend/llvm/publish.test.js +3 -0
  182. package/dist/backend/llvm/publish.test.js.map +1 -1
  183. package/dist/backend/llvm/receivers.js +7 -2
  184. package/dist/backend/llvm/receivers.js.map +1 -1
  185. package/dist/backend/llvm/record-results.d.ts +1 -9
  186. package/dist/backend/llvm/record-results.js +2 -11
  187. package/dist/backend/llvm/record-results.js.map +1 -1
  188. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  189. package/dist/backend/llvm/reference-writes.js +91 -72
  190. package/dist/backend/llvm/reference-writes.js.map +1 -1
  191. package/dist/backend/llvm/regex-matchers.js +161 -14
  192. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  193. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  194. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  195. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  196. package/dist/backend/llvm/running-extrema.js +115 -0
  197. package/dist/backend/llvm/running-extrema.js.map +1 -0
  198. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  199. package/dist/backend/llvm/running-extrema.test.js +89 -0
  200. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  201. package/dist/backend/llvm/shapes.d.ts +79 -21
  202. package/dist/backend/llvm/shapes.js +233 -42
  203. package/dist/backend/llvm/shapes.js.map +1 -1
  204. package/dist/backend/llvm/shapes.test.js +53 -7
  205. package/dist/backend/llvm/shapes.test.js.map +1 -1
  206. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  207. package/dist/backend/llvm/speculative-integers.js +2 -2
  208. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  209. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  210. package/dist/backend/llvm/stack-objects.js +5 -2
  211. package/dist/backend/llvm/stack-objects.js.map +1 -1
  212. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  213. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  214. package/dist/backend/llvm/string-reads.d.ts +15 -0
  215. package/dist/backend/llvm/string-reads.js +128 -0
  216. package/dist/backend/llvm/string-reads.js.map +1 -1
  217. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  218. package/dist/backend/llvm/walk-borrows.js +46 -41
  219. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  220. package/dist/backend/llvm/walkers.d.ts +3 -0
  221. package/dist/backend/llvm/walkers.js +88 -65
  222. package/dist/backend/llvm/walkers.js.map +1 -1
  223. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  224. package/dist/backend/llvm/wasm-modules.js +32 -9
  225. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  226. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  227. package/dist/backend/llvm/wrapping-sums.js +126 -0
  228. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  229. package/dist/backend/mangle.d.ts +3 -0
  230. package/dist/backend/mangle.js +5 -0
  231. package/dist/backend/mangle.js.map +1 -1
  232. package/dist/backend/may-throw.d.ts +8 -10
  233. package/dist/backend/may-throw.js +14 -10
  234. package/dist/backend/may-throw.js.map +1 -1
  235. package/dist/backend/native/contracts.d.ts +27 -4
  236. package/dist/backend/native/executable.js +31 -8
  237. package/dist/backend/native/executable.js.map +1 -1
  238. package/dist/backend/native/library.js +1 -0
  239. package/dist/backend/native/library.js.map +1 -1
  240. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  241. package/dist/backend/native/runtime-inputs.js +1 -0
  242. package/dist/backend/native/runtime-inputs.js.map +1 -1
  243. package/dist/backend/native-codegen.d.ts +11 -6
  244. package/dist/backend/native-codegen.js +36 -9
  245. package/dist/backend/native-codegen.js.map +1 -1
  246. package/dist/backend/native-codegen.test.js +0 -23
  247. package/dist/backend/native-codegen.test.js.map +1 -1
  248. package/dist/backend/native-link-info-core.d.ts +18 -4
  249. package/dist/backend/native-link-info-core.js.map +1 -1
  250. package/dist/backend/optimization.d.ts +2 -2
  251. package/dist/backend/publication.d.ts +12 -1
  252. package/dist/backend/publication.js +37 -14
  253. package/dist/backend/publication.js.map +1 -1
  254. package/dist/backend/publication.test.js +30 -0
  255. package/dist/backend/publication.test.js.map +1 -1
  256. package/dist/backend/result-slots.d.ts +16 -0
  257. package/dist/backend/result-slots.js +23 -0
  258. package/dist/backend/result-slots.js.map +1 -0
  259. package/dist/backend/runtime-abi.d.ts +2 -2
  260. package/dist/backend/runtime-abi.js +2 -2
  261. package/dist/backend/runtime-pack-core.d.ts +2 -1
  262. package/dist/backend/runtime-pack-core.js +2 -1
  263. package/dist/backend/runtime-pack-core.js.map +1 -1
  264. package/dist/backend/runtime-pack-targets.test.js +5 -1
  265. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  266. package/dist/backend/runtime-pack.d.ts +0 -21
  267. package/dist/backend/runtime-pack.js +0 -29
  268. package/dist/backend/runtime-pack.js.map +1 -1
  269. package/dist/backend/runtime-pack.test.js +10 -69
  270. package/dist/backend/runtime-pack.test.js.map +1 -1
  271. package/dist/backend/stack-observations.d.ts +2 -1
  272. package/dist/backend/stack-observations.js +67 -42
  273. package/dist/backend/stack-observations.js.map +1 -1
  274. package/dist/backend/target-diagnostics.js +33 -1
  275. package/dist/backend/target-diagnostics.js.map +1 -1
  276. package/dist/backend/warm-cache.js +4 -0
  277. package/dist/backend/warm-cache.js.map +1 -1
  278. package/dist/cli/command.js +26 -6
  279. package/dist/cli/command.js.map +1 -1
  280. package/dist/cli/usage.d.ts +5 -1
  281. package/dist/cli/usage.js +10 -5
  282. package/dist/cli/usage.js.map +1 -1
  283. package/dist/compat/fetch-profile.js +1 -1
  284. package/dist/compat/fetch-profile.js.map +1 -1
  285. package/dist/contracts/check.js +5 -4
  286. package/dist/contracts/check.js.map +1 -1
  287. package/dist/contracts/int32-elements.js +10 -2
  288. package/dist/contracts/int32-elements.js.map +1 -1
  289. package/dist/coverage/report.d.ts +7 -2
  290. package/dist/coverage/report.js +30 -3
  291. package/dist/coverage/report.js.map +1 -1
  292. package/dist/coverage/verdict-cache.d.ts +1 -0
  293. package/dist/coverage/verdict-cache.js +4 -0
  294. package/dist/coverage/verdict-cache.js.map +1 -1
  295. package/dist/coverage/verdict-semantic.js +4 -0
  296. package/dist/coverage/verdict-semantic.js.map +1 -1
  297. package/dist/diagnostics/diagnostic.d.ts +4 -0
  298. package/dist/diagnostics/diagnostic.js.map +1 -1
  299. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  300. package/dist/diagnostics/dynamic-tier.js +57 -0
  301. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  302. package/dist/diagnostics/envelope.d.ts +5 -1
  303. package/dist/diagnostics/envelope.js +6 -2
  304. package/dist/diagnostics/envelope.js.map +1 -1
  305. package/dist/executable/executable-cache.d.ts +25 -1
  306. package/dist/executable/executable-cache.js +60 -7
  307. package/dist/executable/executable-cache.js.map +1 -1
  308. package/dist/executable/executable-cache.test.js +46 -3
  309. package/dist/executable/executable-cache.test.js.map +1 -1
  310. package/dist/executable/prepare.js +3 -1
  311. package/dist/executable/prepare.js.map +1 -1
  312. package/dist/frontend/analysis.js +1 -0
  313. package/dist/frontend/analysis.js.map +1 -1
  314. package/dist/frontend/decl-projection.d.ts +41 -0
  315. package/dist/frontend/decl-projection.js +854 -0
  316. package/dist/frontend/decl-projection.js.map +1 -0
  317. package/dist/frontend/decl-projection.test.d.ts +1 -0
  318. package/dist/frontend/decl-projection.test.js +30 -0
  319. package/dist/frontend/decl-projection.test.js.map +1 -0
  320. package/dist/frontend/dispose-hook.d.ts +2 -0
  321. package/dist/frontend/dispose-hook.js +14 -0
  322. package/dist/frontend/dispose-hook.js.map +1 -0
  323. package/dist/frontend/dts-paths.d.ts +15 -0
  324. package/dist/frontend/dts-paths.js +25 -0
  325. package/dist/frontend/dts-paths.js.map +1 -1
  326. package/dist/frontend/input-tracker.d.ts +6 -0
  327. package/dist/frontend/input-tracker.js +51 -28
  328. package/dist/frontend/input-tracker.js.map +1 -1
  329. package/dist/frontend/input-tracker.test.js +19 -0
  330. package/dist/frontend/input-tracker.test.js.map +1 -1
  331. package/dist/frontend/jsx-entities.d.ts +4 -0
  332. package/dist/frontend/jsx-entities.js +259 -0
  333. package/dist/frontend/jsx-entities.js.map +1 -0
  334. package/dist/frontend/jsx-source.d.ts +71 -0
  335. package/dist/frontend/jsx-source.js +781 -0
  336. package/dist/frontend/jsx-source.js.map +1 -0
  337. package/dist/frontend/jsx-source.test.d.ts +1 -0
  338. package/dist/frontend/jsx-source.test.js +200 -0
  339. package/dist/frontend/jsx-source.test.js.map +1 -0
  340. package/dist/frontend/literal-values.test.js +8 -9
  341. package/dist/frontend/literal-values.test.js.map +1 -1
  342. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  343. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  344. package/dist/frontend/lowering/array-values.js +103 -4
  345. package/dist/frontend/lowering/array-values.js.map +1 -1
  346. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  347. package/dist/frontend/lowering/binding-analysis.js +2 -2
  348. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  350. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  351. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  353. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  355. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  356. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  357. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  358. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  359. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  361. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  362. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  363. package/dist/frontend/lowering/builtins/crypto.js +136 -5
  364. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  366. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  367. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  368. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  369. package/dist/frontend/lowering/builtins/dates.js +55 -26
  370. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  372. package/dist/frontend/lowering/builtins/dh.js +151 -0
  373. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  374. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  375. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  376. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  377. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  378. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  380. package/dist/frontend/lowering/builtins/errors.js +110 -0
  381. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  382. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  383. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  384. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  385. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  386. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  387. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  388. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  389. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  390. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  391. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  392. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  393. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  394. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  395. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/json.js +2 -1
  397. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  398. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  399. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  400. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  401. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  402. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  403. package/dist/frontend/lowering/builtins/numbers.js +18 -6
  404. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  405. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  406. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  407. package/dist/frontend/lowering/builtins/performance.js +3 -2
  408. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  409. package/dist/frontend/lowering/builtins/process.js +3 -2
  410. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  411. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  412. package/dist/frontend/lowering/builtins/promises.js +91 -4
  413. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  414. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  415. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  416. package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
  417. package/dist/frontend/lowering/builtins/readline.js +58 -9
  418. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/strings.js +13 -5
  420. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  421. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  422. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  423. package/dist/frontend/lowering/builtins/timers.js +1 -1
  424. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  425. package/dist/frontend/lowering/builtins/url.js +28 -4
  426. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/v8.js +2 -1
  428. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  429. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  430. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  431. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  432. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  433. package/dist/frontend/lowering/call-arguments.js +2 -1
  434. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  435. package/dist/frontend/lowering/call-signatures.js +13 -6
  436. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  437. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  438. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  439. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  440. package/dist/frontend/lowering/class-assertions.js +3 -2
  441. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  442. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  443. package/dist/frontend/lowering/class-callbacks.js +82 -12
  444. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  445. package/dist/frontend/lowering/class-construction.d.ts +6 -2
  446. package/dist/frontend/lowering/class-construction.js +25 -16
  447. package/dist/frontend/lowering/class-construction.js.map +1 -1
  448. package/dist/frontend/lowering/class-descriptors.js +1 -1
  449. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  450. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
  451. package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
  452. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  453. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
  454. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  455. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  456. package/dist/frontend/lowering/class-iterables.js +9 -1
  457. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  458. package/dist/frontend/lowering/class-method-mutations.js +35 -9
  459. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  460. package/dist/frontend/lowering/class-method-values.js +1 -1
  461. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  462. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  463. package/dist/frontend/lowering/class-protocols.js +64 -4
  464. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  465. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  466. package/dist/frontend/lowering/class-prototypes.js +67 -5
  467. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  468. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  469. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  470. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  471. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  472. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  473. package/dist/frontend/lowering/class-unions.js +2 -1
  474. package/dist/frontend/lowering/class-unions.js.map +1 -1
  475. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  476. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  477. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  478. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  479. package/dist/frontend/lowering/coercions/structural.js +99 -8
  480. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  481. package/dist/frontend/lowering/coercions/unions.js +8 -7
  482. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  483. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  484. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  485. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  486. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  487. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  488. package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
  489. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  490. package/dist/frontend/lowering/containers/array-concat.js +12 -1
  491. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  492. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  493. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  494. package/dist/frontend/lowering/containers/array-methods.js +21 -5
  495. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  496. package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
  497. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  498. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  499. package/dist/frontend/lowering/containers/bytes.js +131 -29
  500. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  501. package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
  502. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  503. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  504. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  505. package/dist/frontend/lowering/containers/collection-methods.js +15 -9
  506. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  507. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  508. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  509. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  510. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  511. package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
  512. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  513. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  514. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  515. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  516. package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
  517. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  518. package/dist/frontend/lowering/containers/string-replacement.js +45 -20
  519. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  520. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  521. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  522. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  523. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  524. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  525. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  526. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  527. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  528. package/dist/frontend/lowering/dispatch-sites.js +218 -0
  529. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  530. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  531. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  532. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  533. package/dist/frontend/lowering/divergences.js +9 -1
  534. package/dist/frontend/lowering/divergences.js.map +1 -1
  535. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  536. package/dist/frontend/lowering/dyn-streams.js +1 -1
  537. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  538. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  539. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  540. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  541. package/dist/frontend/lowering/error-methods.js +51 -2
  542. package/dist/frontend/lowering/error-methods.js.map +1 -1
  543. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  544. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  545. package/dist/frontend/lowering/expressions/binary.js +81 -5
  546. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  547. package/dist/frontend/lowering/expressions/element-access.js +107 -14
  548. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  549. package/dist/frontend/lowering/expressions/identifiers.js +79 -11
  550. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  551. package/dist/frontend/lowering/expressions/narrowing.js +130 -6
  552. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  553. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  554. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  555. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
  556. package/dist/frontend/lowering/expressions/object-literals.js +164 -56
  557. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  558. package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
  559. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  560. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  561. package/dist/frontend/lowering/expressions/property-access.js +211 -17
  562. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  563. package/dist/frontend/lowering/expressions/relational.js +267 -30
  564. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  565. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  566. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  567. package/dist/frontend/lowering/expressions/updates.js +85 -12
  568. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  569. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  570. package/dist/frontend/lowering/frozen-records.js +322 -0
  571. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  572. package/dist/frontend/lowering/function-returns.js +49 -0
  573. package/dist/frontend/lowering/function-returns.js.map +1 -1
  574. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  575. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  576. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  577. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  578. package/dist/frontend/lowering/generic-functions.js +455 -20
  579. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  580. package/dist/frontend/lowering/intern-tables.js +2 -1
  581. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  582. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  583. package/dist/frontend/lowering/iterable-values.js +297 -0
  584. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  585. package/dist/frontend/lowering/iterator-adapters.js +195 -9
  586. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  587. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  588. package/dist/frontend/lowering/js-class-fields.js +45 -10
  589. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  590. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  591. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  592. package/dist/frontend/lowering/json-require.js +2 -1
  593. package/dist/frontend/lowering/json-require.js.map +1 -1
  594. package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
  595. package/dist/frontend/lowering/key-order-witness.js +790 -25
  596. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  597. package/dist/frontend/lowering/key-order-witness.test.js +466 -10
  598. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  599. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  600. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  601. package/dist/frontend/lowering/lower-assert.js +6 -5
  602. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  603. package/dist/frontend/lowering/lower-async-iteration.js +7 -2
  604. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  605. package/dist/frontend/lowering/lower-calls.d.ts +11 -0
  606. package/dist/frontend/lowering/lower-calls.js +776 -126
  607. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  608. package/dist/frontend/lowering/lower-classes.d.ts +29 -2
  609. package/dist/frontend/lowering/lower-classes.js +581 -46
  610. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  611. package/dist/frontend/lowering/lower-dgram.js +6 -3
  612. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  613. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  614. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  615. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  616. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  617. package/dist/frontend/lowering/lower-exprs.js +126 -13
  618. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  619. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  620. package/dist/frontend/lowering/lower-functions.js +387 -72
  621. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  622. package/dist/frontend/lowering/lower-generators.js +41 -31
  623. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  624. package/dist/frontend/lowering/lower-global-value.js +6 -3
  625. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  626. package/dist/frontend/lowering/lower-inspect.js +28 -12
  627. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  628. package/dist/frontend/lowering/lower-mixins.js +2 -1
  629. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  630. package/dist/frontend/lowering/lower-mock.js +2 -1
  631. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  632. package/dist/frontend/lowering/lower-modules.js +47 -5
  633. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  634. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  635. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  636. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  637. package/dist/frontend/lowering/lower-namespaces.js +9 -4
  638. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  639. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  640. package/dist/frontend/lowering/lower-server.js +239 -61
  641. package/dist/frontend/lowering/lower-server.js.map +1 -1
  642. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  643. package/dist/frontend/lowering/lower-stdlib.js +42 -10
  644. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  645. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  646. package/dist/frontend/lowering/lower-stmts.js +622 -68
  647. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  648. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  649. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  650. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  651. package/dist/frontend/lowering/lower-stream.js +2055 -318
  652. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  653. package/dist/frontend/lowering/lower-timers.js +4 -3
  654. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  655. package/dist/frontend/lowering/lowerer.d.ts +197 -29
  656. package/dist/frontend/lowering/lowerer.js +862 -84
  657. package/dist/frontend/lowering/lowerer.js.map +1 -1
  658. package/dist/frontend/lowering/lowerer.test.js +21 -9
  659. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  660. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  661. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  662. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  663. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  664. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  665. package/dist/frontend/lowering/native-ffi.js +1 -1
  666. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  667. package/dist/frontend/lowering/new-target.d.ts +12 -0
  668. package/dist/frontend/lowering/new-target.js +280 -0
  669. package/dist/frontend/lowering/new-target.js.map +1 -0
  670. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  671. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  672. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  673. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  674. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  675. package/dist/frontend/lowering/private-brands.js +66 -15
  676. package/dist/frontend/lowering/private-brands.js.map +1 -1
  677. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  678. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  679. package/dist/frontend/lowering/require-initialization.js +2 -1
  680. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  681. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  682. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  683. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  684. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  685. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  686. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  687. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  688. package/dist/frontend/lowering/site-dependencies.js +84 -0
  689. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  690. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  691. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  692. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  693. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  694. package/dist/frontend/lowering/stable-names.js +35 -0
  695. package/dist/frontend/lowering/stable-names.js.map +1 -0
  696. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  697. package/dist/frontend/lowering/static-typeof.js +42 -3
  698. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  699. package/dist/frontend/lowering/strict-equality.js +2 -1
  700. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  701. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  702. package/dist/frontend/lowering/structural-positions.js +108 -0
  703. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  704. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  705. package/dist/frontend/lowering/surfaces.js +60 -32
  706. package/dist/frontend/lowering/surfaces.js.map +1 -1
  707. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  708. package/dist/frontend/lowering/undefined-index.js +82 -0
  709. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  710. package/dist/frontend/lowering/var-hoisting.js +66 -16
  711. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  712. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  713. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  714. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  715. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  716. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  717. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  718. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  719. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  720. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  721. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  722. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  723. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  724. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  725. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  726. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  727. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  728. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  729. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  730. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  731. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  732. package/dist/frontend/npm-static-type-exports.js +261 -0
  733. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  734. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  735. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  736. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  737. package/dist/frontend/npm-static-umd.d.ts +6 -0
  738. package/dist/frontend/npm-static-umd.js +203 -0
  739. package/dist/frontend/npm-static-umd.js.map +1 -0
  740. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  741. package/dist/frontend/npm-static-umd.test.js +105 -0
  742. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  743. package/dist/frontend/npm-static.d.ts +8 -0
  744. package/dist/frontend/npm-static.js +51 -22
  745. package/dist/frontend/npm-static.js.map +1 -1
  746. package/dist/frontend/package-shims.d.ts +3 -0
  747. package/dist/frontend/package-shims.js +71 -8
  748. package/dist/frontend/package-shims.js.map +1 -1
  749. package/dist/frontend/pipeline.js +18 -10
  750. package/dist/frontend/pipeline.js.map +1 -1
  751. package/dist/frontend/process-fork.d.ts +25 -0
  752. package/dist/frontend/process-fork.js +2 -0
  753. package/dist/frontend/process-fork.js.map +1 -0
  754. package/dist/frontend/program.d.ts +21 -1
  755. package/dist/frontend/program.js +586 -74
  756. package/dist/frontend/program.js.map +1 -1
  757. package/dist/frontend/program.test.js +44 -4
  758. package/dist/frontend/program.test.js.map +1 -1
  759. package/dist/frontend/services.d.ts +6 -0
  760. package/dist/frontend/services.js +18 -0
  761. package/dist/frontend/services.js.map +1 -1
  762. package/dist/frontend/token-equivalence.d.ts +3 -0
  763. package/dist/frontend/token-equivalence.js +409 -0
  764. package/dist/frontend/token-equivalence.js.map +1 -0
  765. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  766. package/dist/frontend/token-equivalence.test.js +67 -0
  767. package/dist/frontend/token-equivalence.test.js.map +1 -0
  768. package/dist/frontend/ts7/ast-node.d.ts +43 -7
  769. package/dist/frontend/ts7/ast-node.js +1176 -129
  770. package/dist/frontend/ts7/ast-node.js.map +1 -1
  771. package/dist/frontend/ts7/ast-node.test.js +84 -0
  772. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  773. package/dist/frontend/ts7/ast-wire.d.ts +29 -3
  774. package/dist/frontend/ts7/ast-wire.js +144 -31
  775. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  776. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  777. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  778. package/dist/frontend/ts7/ast.d.ts +23 -2
  779. package/dist/frontend/ts7/ast.js +143 -2
  780. package/dist/frontend/ts7/ast.js.map +1 -1
  781. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  782. package/dist/frontend/ts7/checker-backend.js +2 -2
  783. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  784. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  785. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  786. package/dist/frontend/ts7/checker.d.ts +17 -1
  787. package/dist/frontend/ts7/checker.js +82 -1
  788. package/dist/frontend/ts7/checker.js.map +1 -1
  789. package/dist/frontend/ts7/checker.test.js +9 -6
  790. package/dist/frontend/ts7/checker.test.js.map +1 -1
  791. package/dist/frontend/ts7/enums.d.ts +3 -3
  792. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  793. package/dist/frontend/ts7/enums.generated.js +21 -0
  794. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  795. package/dist/frontend/ts7/enums.js +19 -0
  796. package/dist/frontend/ts7/enums.js.map +1 -1
  797. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  798. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  799. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  800. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  801. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  802. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  803. package/dist/frontend/ts7/program-host.d.ts +7 -0
  804. package/dist/frontend/ts7/program-host.js +30 -4
  805. package/dist/frontend/ts7/program-host.js.map +1 -1
  806. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  807. package/dist/frontend/ts7/semantic-checker.js +25 -20
  808. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  809. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  810. package/dist/frontend/ts7/semantic-json.js +146 -0
  811. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  812. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  813. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  814. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  815. package/dist/frontend/ts7/semantic-model.js +67 -19
  816. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  817. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  818. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  819. package/dist/frontend/ts7/session.d.ts +14 -1
  820. package/dist/frontend/ts7/session.js +23 -1
  821. package/dist/frontend/ts7/session.js.map +1 -1
  822. package/dist/frontend/tsc-codes.d.ts +1 -1
  823. package/dist/frontend/tsc-codes.js +7 -0
  824. package/dist/frontend/tsc-codes.js.map +1 -1
  825. package/dist/frontend/type-mapper.d.ts +51 -7
  826. package/dist/frontend/type-mapper.js +456 -43
  827. package/dist/frontend/type-mapper.js.map +1 -1
  828. package/dist/frontend/type-mapper.test.js +1 -1
  829. package/dist/frontend/type-mapper.test.js.map +1 -1
  830. package/dist/frontend-process-args.d.ts +4 -0
  831. package/dist/frontend-process-args.js +52 -0
  832. package/dist/frontend-process-args.js.map +1 -0
  833. package/dist/frontend-process-args.test.d.ts +1 -0
  834. package/dist/frontend-process-args.test.js +47 -0
  835. package/dist/frontend-process-args.test.js.map +1 -0
  836. package/dist/frontend-process.d.ts +1 -0
  837. package/dist/frontend-process.js +23 -0
  838. package/dist/frontend-process.js.map +1 -0
  839. package/dist/heap-collection.d.ts +16 -0
  840. package/dist/heap-collection.js +42 -0
  841. package/dist/heap-collection.js.map +1 -0
  842. package/dist/heap-collection.test.d.ts +1 -0
  843. package/dist/heap-collection.test.js +59 -0
  844. package/dist/heap-collection.test.js.map +1 -0
  845. package/dist/heap-pressure.d.ts +2 -0
  846. package/dist/heap-pressure.js +12 -0
  847. package/dist/heap-pressure.js.map +1 -0
  848. package/dist/index.d.ts +2 -0
  849. package/dist/index.js +435 -89
  850. package/dist/index.js.map +1 -1
  851. package/dist/ir/analysis.js +5 -3
  852. package/dist/ir/analysis.js.map +1 -1
  853. package/dist/ir/array-length-stability.d.ts +4 -0
  854. package/dist/ir/array-length-stability.js +26 -6
  855. package/dist/ir/array-length-stability.js.map +1 -1
  856. package/dist/ir/array-length-stability.test.js +49 -0
  857. package/dist/ir/array-length-stability.test.js.map +1 -1
  858. package/dist/ir/builtin-effects.d.ts +7 -0
  859. package/dist/ir/builtin-effects.js +80 -0
  860. package/dist/ir/builtin-effects.js.map +1 -1
  861. package/dist/ir/builtin-signatures.d.ts +7 -1
  862. package/dist/ir/builtin-signatures.js +303 -21
  863. package/dist/ir/builtin-signatures.js.map +1 -1
  864. package/dist/ir/callback-specialization.d.ts +2 -1
  865. package/dist/ir/callback-specialization.js +23 -18
  866. package/dist/ir/callback-specialization.js.map +1 -1
  867. package/dist/ir/char-unit-locals.d.ts +19 -0
  868. package/dist/ir/char-unit-locals.js +185 -0
  869. package/dist/ir/char-unit-locals.js.map +1 -0
  870. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  871. package/dist/ir/char-unit-locals.test.js +94 -0
  872. package/dist/ir/char-unit-locals.test.js.map +1 -0
  873. package/dist/ir/final-fields.d.ts +3 -1
  874. package/dist/ir/final-fields.js +15 -17
  875. package/dist/ir/final-fields.js.map +1 -1
  876. package/dist/ir/function-references.d.ts +2 -0
  877. package/dist/ir/function-references.js +2 -0
  878. package/dist/ir/function-references.js.map +1 -1
  879. package/dist/ir/function-references.test.js +5 -0
  880. package/dist/ir/function-references.test.js.map +1 -1
  881. package/dist/ir/initializer-bindings.d.ts +2 -1
  882. package/dist/ir/initializer-bindings.js +27 -20
  883. package/dist/ir/initializer-bindings.js.map +1 -1
  884. package/dist/ir/int32-arrays.d.ts +108 -0
  885. package/dist/ir/int32-arrays.js +831 -0
  886. package/dist/ir/int32-arrays.js.map +1 -0
  887. package/dist/ir/int32-slots.d.ts +36 -6
  888. package/dist/ir/int32-slots.js +370 -171
  889. package/dist/ir/int32-slots.js.map +1 -1
  890. package/dist/ir/int32-slots.test.js +3 -1
  891. package/dist/ir/int32-slots.test.js.map +1 -1
  892. package/dist/ir/integer-loop-facts.d.ts +9 -4
  893. package/dist/ir/integer-loop-facts.js +93 -18
  894. package/dist/ir/integer-loop-facts.js.map +1 -1
  895. package/dist/ir/integer-loops.d.ts +49 -0
  896. package/dist/ir/integer-loops.js +202 -40
  897. package/dist/ir/integer-loops.js.map +1 -1
  898. package/dist/ir/integer-loops.test.js +211 -1
  899. package/dist/ir/integer-loops.test.js.map +1 -1
  900. package/dist/ir/integer-ranges.d.ts +5 -0
  901. package/dist/ir/integer-ranges.js +125 -12
  902. package/dist/ir/integer-ranges.js.map +1 -1
  903. package/dist/ir/integer-ranges.test.js +94 -0
  904. package/dist/ir/integer-ranges.test.js.map +1 -1
  905. package/dist/ir/ir.d.ts +87 -9
  906. package/dist/ir/ir.js +61 -2
  907. package/dist/ir/ir.js.map +1 -1
  908. package/dist/ir/ir.test.js +21 -1
  909. package/dist/ir/ir.test.js.map +1 -1
  910. package/dist/ir/js-ic.d.ts +19 -2
  911. package/dist/ir/js-ic.js +95 -11
  912. package/dist/ir/js-ic.js.map +1 -1
  913. package/dist/ir/js-ic.test.js +188 -0
  914. package/dist/ir/js-ic.test.js.map +1 -1
  915. package/dist/ir/node-index.d.ts +57 -0
  916. package/dist/ir/node-index.js +215 -0
  917. package/dist/ir/node-index.js.map +1 -0
  918. package/dist/ir/paired-while-loops.d.ts +25 -0
  919. package/dist/ir/paired-while-loops.js +335 -0
  920. package/dist/ir/paired-while-loops.js.map +1 -0
  921. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  922. package/dist/ir/paired-while-loops.test.js +163 -0
  923. package/dist/ir/paired-while-loops.test.js.map +1 -0
  924. package/dist/ir/parameter-versions.d.ts +25 -0
  925. package/dist/ir/parameter-versions.js +300 -0
  926. package/dist/ir/parameter-versions.js.map +1 -0
  927. package/dist/ir/runtime-features.d.ts +60 -15
  928. package/dist/ir/runtime-features.js +276 -35
  929. package/dist/ir/runtime-features.js.map +1 -1
  930. package/dist/ir/serialize.d.ts +12 -2
  931. package/dist/ir/serialize.js +16 -3
  932. package/dist/ir/serialize.js.map +1 -1
  933. package/dist/ir/serialize.test.js +17 -0
  934. package/dist/ir/serialize.test.js.map +1 -1
  935. package/dist/ir/tiers.js +1 -0
  936. package/dist/ir/tiers.js.map +1 -1
  937. package/dist/ir/traverse.d.ts +2 -0
  938. package/dist/ir/traverse.js +29 -5
  939. package/dist/ir/traverse.js.map +1 -1
  940. package/dist/ir/validate.js +171 -45
  941. package/dist/ir/validate.js.map +1 -1
  942. package/dist/library/ir-policy.js +12 -0
  943. package/dist/library/ir-policy.js.map +1 -1
  944. package/dist/library/library-cache.d.ts +2 -0
  945. package/dist/library/library-cache.js.map +1 -1
  946. package/dist/library/prepare.js +2 -0
  947. package/dist/library/prepare.js.map +1 -1
  948. package/dist/native/cache.d.ts +6 -1
  949. package/dist/native/cache.js +28 -5
  950. package/dist/native/cache.js.map +1 -1
  951. package/dist/native/cache.test.js +16 -2
  952. package/dist/native/cache.test.js.map +1 -1
  953. package/dist/native/cli.js +26 -1
  954. package/dist/native/cli.js.map +1 -1
  955. package/dist/native/compiler.js +8 -6
  956. package/dist/native/compiler.js.map +1 -1
  957. package/dist/native/executable-cache.d.ts +1 -1
  958. package/dist/native/executable-cache.js +2 -2
  959. package/dist/native/executable-cache.js.map +1 -1
  960. package/dist/native/prepare.d.ts +3 -1
  961. package/dist/native/prepare.js +123 -31
  962. package/dist/native/prepare.js.map +1 -1
  963. package/dist/native/prepare.test.js +78 -18
  964. package/dist/native/prepare.test.js.map +1 -1
  965. package/dist/native/sanitizer.test.js +6 -1
  966. package/dist/native/sanitizer.test.js.map +1 -1
  967. package/dist/native/text-file.d.ts +13 -3
  968. package/dist/native/text-file.js +63 -9
  969. package/dist/native/text-file.js.map +1 -1
  970. package/dist/native/text-file.test.d.ts +1 -0
  971. package/dist/native/text-file.test.js +49 -0
  972. package/dist/native/text-file.test.js.map +1 -0
  973. package/dist/native/toolchain.js +4 -4
  974. package/dist/native/toolchain.js.map +1 -1
  975. package/dist/native/toolchain.test.js +3 -3
  976. package/dist/native/toolchain.test.js.map +1 -1
  977. package/dist/startup-cache.d.ts +1 -0
  978. package/dist/startup-cache.js +1 -0
  979. package/dist/startup-cache.js.map +1 -1
  980. package/dist/text-parts.d.ts +7 -0
  981. package/dist/text-parts.js +44 -0
  982. package/dist/text-parts.js.map +1 -1
  983. package/dist/text-parts.test.d.ts +1 -0
  984. package/dist/text-parts.test.js +46 -0
  985. package/dist/text-parts.test.js.map +1 -0
  986. package/dist/timing.d.ts +9 -2
  987. package/dist/timing.js +7 -4
  988. package/dist/timing.js.map +1 -1
  989. package/dist/wasm/translate.d.ts +4 -0
  990. package/dist/wasm/translate.js +2 -2
  991. package/dist/wasm/translate.js.map +1 -1
  992. package/package.json +21 -21
  993. package/shims/chalk/v5.ts +688 -0
  994. package/shims/hono-node-server/v2.ts +645 -0
  995. package/shims/hot-shots/client.ts +1126 -0
  996. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  997. package/shims/hot-shots/v8.ts +8 -0
  998. package/shims/undici/core/client.ts +4 -4
  999. package/surface-manifest.json +44 -52
@@ -1,3 +1,5 @@
1
+ import { keyedHelperName } from "./stable-names.js";
2
+ import { perKeyOrder } from "./key-order-witness.js";
1
3
  import { isForwardedTupleSpread, lowerForwardingApply } from "./typed-arguments.js";
2
4
  import { guardNullProto, nullProtoRecordShape } from "./null-prototype.js";
3
5
  import { lowerDynStreamMemberCall } from "./dyn-streams.js";
@@ -28,9 +30,10 @@ import { lowerClassSymbolMethodCall } from "./symbol-methods.js";
28
30
  import { lowerReadlineDisposeCall } from "./builtins/readline.js";
29
31
  import { errorToStringCall } from "./error-methods.js";
30
32
  import { lowerClassPrototypeAssign, lowerClassPrototypeDescriptors } from "./class-prototypes.js";
31
- import { BYTES_ELEMENT_NAME, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
33
+ import { BYTES_ELEMENT_NAME, BYTES_U8, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, shapeKeyOrders, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
32
34
  import { lowerProtocolMethodCall } from "./class-protocol-dispatch.js";
33
35
  import { isJsSourceFile, locOf, requireSpecOf } from "../program.js";
36
+ import { isPackageShimFile, isShimIntrinsicName } from "../package-shims.js";
34
37
  import { lowerJsonRequireCall } from "./json-require.js";
35
38
  import { lowerAssertInstanceCall } from "./assert-instances.js";
36
39
  import { isGenericCallableMemberType, isOverloadedCallableMemberType, typeKey, } from "../type-mapper.js";
@@ -51,7 +54,7 @@ import { createRequireSpecOf } from "./builtins/module-bindings.js";
51
54
  import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, } from "./builtins/child-process-methods.js";
52
55
  import { lowerCreateRequireCall, lowerImportMetaResolveCall, lowerRequireResolveCall, } from "./builtins/module-resolution.js";
53
56
  import { isWebCryptoReceiver, lowerCipherMethodCall, lowerCryptoGetRandomValues, lowerCryptoHashMethodCall, lowerPromisifiedCryptoCall, } from "./builtins/crypto.js";
54
- import { lowerErrorIsErrorCall } from "./builtins/errors.js";
57
+ import { lowerErrorCaptureStackTraceCall, lowerErrorIsErrorCall } from "./builtins/errors.js";
55
58
  import { lowerPromisifiedDnsCall } from "./lower-dgram.js";
56
59
  import { lowerDisposableStackUseCall } from "./builtins/disposable-stack.js";
57
60
  import { lowerDirentMethodCall, lowerFileHandleMethodCall, lowerDirMethodCall, lowerWatcherMethodCall, } from "./builtins/filesystem.js";
@@ -59,7 +62,7 @@ import { fencePerfEntryKeyWalk, isPerfEntryType, lowerHistogramMethodCall, lower
59
62
  import { lowerProcStreamMethodCall, lowerProcessBuiltinModuleNamespace, } from "./builtins/process.js";
60
63
  import { recordMayKeepSource, throughRecordSource } from "./record-sources.js";
61
64
  import { lowerReflectCall } from "./builtins/reflection.js";
62
- import { lowerAbsenceProbe, v8CalleeText, lowerOptionalNumber, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, } from "./lower-exprs.js";
65
+ import { lowerAbsenceProbe, v8CalleeText, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, primitiveCtorClosure, } from "./lower-exprs.js";
63
66
  import { isSafeToDiscard } from "./expressions/evaluation-safety.js";
64
67
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
65
68
  import { lowerChildMethodValue, lowerChildPropertyCall } from "./handle-properties.js";
@@ -71,6 +74,7 @@ import { EMITTER_API_MEMBERS, exactClassOfReceiver, exactInstanceClassOf, findGe
71
74
  import { classCallbackCall, isClassCallback } from "./class-callbacks.js";
72
75
  import { emitterRooted, lowerEmitterMethodCall } from "./lower-event-emitter.js";
73
76
  import { eventTargetApiMethod, lowerEventTargetMethodCall } from "./lower-event-target.js";
77
+ import { dateRootOf, isDatePrototypeMethod, lowerInheritedDateMethodCall, } from "./builtins/date-classes.js";
74
78
  import { lowerConsoleInstanceCall, lowerConsoleMethodCall, lowerConsoleOutput, } from "./lower-console.js";
75
79
  import { STREAM_API_MEMBERS, STREAM_OPERATORS, lowerStreamMethodCall, lowerStreamStaticCall, streamSidesOf, } from "./lower-stream.js";
76
80
  import { ambientNsRootOf, ambientUndefReadType, ambientUndefVarRootOf, ambientUndefinedFnSymbolOf, contextualUndefReadType, fenceEarlyAliasUse, fenceEarlyNsMemberRef, nsMemberIdentOf, nsUndefRead, } from "./lower-namespaces.js";
@@ -80,6 +84,7 @@ import { defaultAfterUndefined, lowerOptionalArgument, lowerStaticallyUndefinedA
80
84
  import { fenceSymbolFieldCopy } from "./symbol-fields.js";
81
85
  import { lowerClassDataDescriptor, lowerClassDescriptorRead } from "./class-descriptors.js";
82
86
  import { lowerClassFieldDefine, lowerClassIntegrity } from "./class-attributes.js";
87
+ import { freezableRecordType, lowerNativeFreeze } from "./frozen-records.js";
83
88
  import { classStaticDataFor } from "./class-static-data.js";
84
89
  import { lowerUrlFactory } from "./lower-url.js";
85
90
  import { nullishValueUnitOf } from "./binding-analysis.js";
@@ -91,8 +96,59 @@ import { maybePromiseReturnStmt, promiseArmedUnionOf } from "./maybe-promise.js"
91
96
  import { requireObjLitGenericReceiver, objLitGenericFnNodeOf, objLitGenericFnInfoOf, genericCallInstance, } from "./generic-functions.js";
92
97
  import { codeGenerationCalleeOf, lowerCodeGenerationCall } from "./code-generation.js";
93
98
  const ZLIB_STREAM_METHODS = new Set(["flush", "params", "close", "reset"]);
99
+ /** `Object.defineProperty(target, ...)`, `Object.defineProperties`,
100
+ * `Reflect.defineProperty`, and `target.__defineGetter__/__defineSetter__`
101
+ * over a target that may hold an Error can install an accessor over an
102
+ * error's `name` or `message` (error-methods.ts). */
103
+ function noteErrorAccessorReflection(lowerer, expr) {
104
+ const callee = expr.expression;
105
+ if (!ts.isPropertyAccessExpression(callee))
106
+ return;
107
+ const member = callee.name.text;
108
+ const target = member === "defineProperty" || member === "defineProperties"
109
+ ? expr.arguments.nodes[0]
110
+ : member === "__defineGetter__" || member === "__defineSetter__"
111
+ ? callee.expression
112
+ : undefined;
113
+ if (!target)
114
+ return;
115
+ const error = lowerer.checker.resolveName("Error", ts.SymbolFlags.Type, target, false);
116
+ const errorType = error ? lowerer.checker.getDeclaredTypeOfSymbol(error) : null;
117
+ if (mayHoldError(lowerer, lowerer.checker.getTypeAtLocation(target), errorType))
118
+ lowerer.errorAccessorReflection = locOf(expr);
119
+ }
120
+ /** An untyped or generic type, a type Error is assignable to (`object`,
121
+ * `{}`, `Object`, `{ message?: string }`), or
122
+ * an Error-shaped type with both `name` and `message`, alone or in a
123
+ * union or intersection. */
124
+ function mayHoldError(lowerer, type, errorType) {
125
+ if (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Instantiable))
126
+ return true;
127
+ if (type.flags & (ts.TypeFlags.Union | ts.TypeFlags.Intersection))
128
+ return ts.constituentTypes(type).some((part) => mayHoldError(lowerer, part, errorType));
129
+ return ((lowerer.checker.getPropertyOfType(type, "message") !== undefined &&
130
+ lowerer.checker.getPropertyOfType(type, "name") !== undefined) ||
131
+ (errorType !== null && lowerer.checker.isTypeAssignableTo(errorType, type)));
132
+ }
133
+ /** The `f` of a `(0, f)` callee (a numeric left operand, so dropping it
134
+ * changes only the call's receiver), or null. */
135
+ function receiverlessCalleeOf(callee) {
136
+ let e = callee;
137
+ while (ts.isParenthesizedExpression(e))
138
+ e = e.expression;
139
+ if (!ts.isBinaryExpression(e) ||
140
+ e.operatorToken.kind !== ts.SyntaxKind.CommaToken ||
141
+ !ts.isNumericLiteral(e.left))
142
+ return null;
143
+ let right = e.right;
144
+ while (ts.isParenthesizedExpression(right))
145
+ right = right.expression;
146
+ return right;
147
+ }
94
148
  export function lowerCall(lowerer, expr) {
95
149
  const loc = locOf(expr);
150
+ if (lowerer.errorAccessorReflection === null)
151
+ noteErrorAccessorReflection(lowerer, expr);
96
152
  // Object's checker return type is `any`. Claim known object inputs
97
153
  // before generic checked-dynamic dispatch tries to load the constructor.
98
154
  if (ts.isIdentifier(expr.expression) &&
@@ -111,6 +167,17 @@ export function lowerCall(lowerer, expr) {
111
167
  const json = lowerJsonRequireCall(lowerer, expr);
112
168
  if (json)
113
169
  return json;
170
+ // `(0, ns.member)(...)` over a builtin module (tsc's and esbuild's call
171
+ // without a receiver): Node's module functions do not read `this`, so it
172
+ // is the member call.
173
+ {
174
+ const member = receiverlessCalleeOf(expr.expression);
175
+ if (member !== null && ts.isPropertyAccessExpression(member)) {
176
+ const builtin = lowerer.lowerNamespaceBuiltinCall(expr, member);
177
+ if (builtin)
178
+ return builtin;
179
+ }
180
+ }
114
181
  // eval(...) and Function(...): Node's EvalError under
115
182
  // --disallow-code-generation-from-strings (code-generation.ts).
116
183
  {
@@ -118,6 +185,13 @@ export function lowerCall(lowerer, expr) {
118
185
  if (codeGeneration !== null)
119
186
  return lowerCodeGenerationCall(lowerer, expr, codeGeneration);
120
187
  }
188
+ // A package shim's runtime intrinsic (a bodiless `declare function`
189
+ // named scriptcUnixDgram* in a shipped shim): a direct runtime call.
190
+ if (ts.isIdentifier(expr.expression) && isShimIntrinsicName(expr.expression.text)) {
191
+ const intrinsic = lowerShimIntrinsicCall(lowerer, expr, expr.expression, loc);
192
+ if (intrinsic)
193
+ return intrinsic;
194
+ }
121
195
  // Inline require() of a program module (cjs-inline-require.ts): a
122
196
  // member call over its export table resolves like a binding's member
123
197
  // call after the module's %init at this position; the require itself
@@ -739,10 +813,9 @@ export function lowerCall(lowerer, expr) {
739
813
  // excludes shadowed names. parseInt's omitted radix completes
740
814
  // to 0 — the spec's "undefined" (base 10 with the 0x hex escape);
741
815
  // parseFloat lowers the STRING form only (Node would ToString other
742
- // values — no static story); isNaN/isFinite's arguments are
743
- // checker-pinned (or checked) to number, where the global's ToNumber
744
- // coercion is the identity and the tests are Number.isNaN /
745
- // Number.isFinite exactly (ms's `isFinite(val)` guard).
816
+ // values — no static story); isNaN/isFinite apply the global's
817
+ // ToNumber to any argument, then test like Number.isNaN /
818
+ // Number.isFinite.
746
819
  if ((expr.expression.text === "parseInt" ||
747
820
  expr.expression.text === "isNaN" ||
748
821
  expr.expression.text === "parseFloat" ||
@@ -841,15 +914,11 @@ export function lowerCall(lowerer, expr) {
841
914
  }
842
915
  if (islFn && expr.arguments.nodes.length === islFn.args.length) {
843
916
  // The static forms above already took the exactly-typed argument
844
- // (a string for parseFloat, a number for isFinite): name the
845
- // argument type that refused the call, so the message states the
846
- // condition rather than reading as if the global itself were
847
- // unsupported.
917
+ // (a string for parseFloat): name the argument type that refused
918
+ // the call, so the message states the condition rather than
919
+ // reading as if the global itself were unsupported.
848
920
  const argText = loweredArgumentText(lowerer, expr.arguments.nodes[0]);
849
- const exact = expr.expression.text === "isFinite" ? "number" : "string";
850
- lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, exact === "string"
851
- ? "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)"
852
- : "only a number argument compiles statically: narrow the argument to a number first");
921
+ lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)");
853
922
  }
854
923
  }
855
924
  // A TYPE-GUARD call on a catch binding (`isErrnoException(err)` —
@@ -1237,9 +1306,10 @@ export function lowerCall(lowerer, expr) {
1237
1306
  lowerer.fenceStaticReadableStreamMember(expr.expression, "call") ??
1238
1307
  lowerDisposableStackUseCall(lowerer, expr, expr.expression) ??
1239
1308
  lowerer.lowerStdlibMethodCall(expr, expr.expression) ??
1240
- // crypto.getRandomValues on the WebCrypto global (untyped in
1241
- // fallback builds, so before the dyn receiver path) or webcrypto.
1242
- lowerWebCryptoGetRandomValues(lowerer, expr, expr.expression) ??
1309
+ // crypto.getRandomValues / randomUUID on the WebCrypto global
1310
+ // (untyped in fallback builds, so before the dyn receiver path) or
1311
+ // webcrypto.
1312
+ lowerWebCryptoMethodCall(lowerer, expr, expr.expression) ??
1243
1313
  // Dyn receivers (JSON.parse-derived `unknown`/`any` values) —
1244
1314
  lowerDynReceiverMethodCall(lowerer, expr, expr.expression) ??
1245
1315
  // Narrowing filters (inferred predicates, filter(Boolean)) claim
@@ -1248,6 +1318,7 @@ export function lowerCall(lowerer, expr) {
1248
1318
  lowerer.lowerFilterNarrowCall(expr, expr.expression) ??
1249
1319
  lowerArrayIsArrayCall(lowerer, expr, expr.expression) ??
1250
1320
  lowerErrorIsErrorCall(lowerer, expr, expr.expression) ??
1321
+ lowerErrorCaptureStackTraceCall(lowerer, expr, expr.expression) ??
1251
1322
  lowerBigIntMethodCall(lowerer, expr, expr.expression) ??
1252
1323
  lowerSymbolStaticCall(lowerer, expr, expr.expression) ??
1253
1324
  lowerSymbolMethodCall(lowerer, expr, expr.expression) ??
@@ -1306,7 +1377,17 @@ export function lowerCall(lowerer, expr) {
1306
1377
  }
1307
1378
  const accessorTarget = lowerer.fieldTarget(expr.expression);
1308
1379
  if (accessorTarget?.container === "accessor") {
1309
- const callee = lowerer.fieldGetExpr(accessorTarget, locOf(expr.expression), expr.expression);
1380
+ let callee = lowerer.fieldGetExpr(accessorTarget, locOf(expr.expression), expr.expression);
1381
+ // A getter returning a callable class instance (chalk's
1382
+ // `chalk.red("x")`): call through its `%call` field.
1383
+ if (callee.type.kind === "object") {
1384
+ const direct = callableInstanceStringCall(lowerer, expr, callee, locOf(expr));
1385
+ if (direct)
1386
+ return direct;
1387
+ callee = lowerer.hybridCallUnwrap(callee);
1388
+ if (callee.type.kind === "func")
1389
+ return lowerCallThroughValue(lowerer, expr, callee, locOf(expr));
1390
+ }
1310
1391
  if (callee.type.kind === "func") {
1311
1392
  const args = completeFuncValueArgs(lowerer, expr, callee.type, locOf(expr));
1312
1393
  return { kind: "callValue", callee, args, type: callee.type.ret, loc: locOf(expr) };
@@ -1523,8 +1604,47 @@ export function lowerCall(lowerer, expr) {
1523
1604
  // a non-func IR type was already rejected while lowering the callee.
1524
1605
  // HYBRID (function-with-properties) values call through their %call slot.
1525
1606
  let callee = lowerer.lowerExpr(expr.expression);
1526
- if (callee.type.kind === "record")
1607
+ {
1608
+ const direct = callableInstanceStringCall(lowerer, expr, callee, loc);
1609
+ if (direct)
1610
+ return direct;
1611
+ }
1612
+ if (callee.type.kind === "record" || callee.type.kind === "object")
1527
1613
  callee = lowerer.hybridCallUnwrap(callee);
1614
+ return lowerCallThroughValue(lowerer, expr, callee, loc);
1615
+ }
1616
+ /** A callable class instance called with one string: its `%call1` method
1617
+ * when the class has one (the chalk shim's typed fast path), skipping the
1618
+ * variadic closure's checked-dynamic arguments. */
1619
+ function callableInstanceStringCall(lowerer, expr, callee, loc) {
1620
+ if (callee.type.kind !== "object" || expr.arguments.nodes.length !== 1)
1621
+ return null;
1622
+ const arg = expr.arguments.nodes[0];
1623
+ if (ts.isSpreadElement(arg))
1624
+ return null;
1625
+ const info = lowerer.classes.get(callee.type.className);
1626
+ if (info === undefined || !info.fields.has("%call") || !lowerer.findMethodOn(info, "%call1"))
1627
+ return null;
1628
+ const value = lowerer.lowerExpr(arg);
1629
+ if (value.type.kind === "string")
1630
+ return lowerer.accessorCall(callee.type.className, "%call1", callee, [value], STRING, loc);
1631
+ // Any other argument (a number behind a cast): the variadic closure,
1632
+ // through the checked-dynamic call as lowerCallThroughValue would.
1633
+ const closure = lowerer.hybridCallUnwrap(callee);
1634
+ if (closure.type.kind !== "func")
1635
+ return null;
1636
+ return {
1637
+ kind: "dynCall",
1638
+ callee: { kind: "dynFrom", value: closure, type: DYN, loc },
1639
+ calleeName: ts.isIdentifier(expr.expression) ? expr.expression.text : "value",
1640
+ args: [lowerer.coerceToExpected(value, DYN)],
1641
+ type: DYN,
1642
+ loc,
1643
+ };
1644
+ }
1645
+ /** A call through an evaluated callee value: checked-dynamic callees,
1646
+ * function unions, typed-rest and runtime-arity closures. */
1647
+ function lowerCallThroughValue(lowerer, expr, callee, loc) {
1528
1648
  // A CHECKED-DYNAMIC callee — `fn(a, b)` where fn is an implicit-any
1529
1649
  // JS binding (the mustCall body's `fn(...args)`), a dyn capture, or a
1530
1650
  // keyed read off a dyn value: the dynCall boundary. Arguments convert
@@ -1703,7 +1823,7 @@ function lowerOptionalNumberDefault(lowerer, value, dflt, loc) {
1703
1823
  const key = `number.optionalDefault:${widened.unionId}:${dflt}`;
1704
1824
  let helper = lowerer.valueHelpers.get(key);
1705
1825
  if (!helper) {
1706
- helper = `%number.optionalDefault.${lowerer.valueHelpers.size}`;
1826
+ helper = keyedHelperName(lowerer, "%number.optionalDefault", key);
1707
1827
  lowerer.valueHelpers.set(key, helper);
1708
1828
  const input = varRef("value.0", widened, loc);
1709
1829
  lowerer.liftedFns.push({
@@ -1804,7 +1924,7 @@ function primitiveConversionHandler(lowerer, node, inner) {
1804
1924
  const key = `then.${name}:${typeKey(inner)}`;
1805
1925
  let fnName = lowerer.arrHofHelpers.get(key);
1806
1926
  if (fnName === undefined) {
1807
- fnName = `%then.${name}.${lowerer.arrHofHelpers.size}`;
1927
+ fnName = keyedHelperName(lowerer, `%then.${name}`, key);
1808
1928
  lowerer.arrHofHelpers.set(key, fnName);
1809
1929
  const value = varRef("v.0", inner, loc);
1810
1930
  let body;
@@ -1918,6 +2038,20 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
1918
2038
  return { kind: "libCall", fn: "bigint.parse", args: [arg], type: BIGINT_T, loc };
1919
2039
  if (arg.type.kind === "f64")
1920
2040
  return { kind: "libCall", fn: "bigint.fromF64", args: [arg], type: BIGINT_T, loc };
2041
+ // Byte storage converts through ToPrimitive, which BigInt then parses: a
2042
+ // typed array's text is its elements joined with "," (one element reads
2043
+ // as that element, none as 0n, several throw the SyntaxError for the
2044
+ // joined text), a Buffer's is its UTF-8 decoding and a DataView's is
2045
+ // "[object DataView]". The runtime value tells them apart, as for String.
2046
+ if (arg.type.kind === "bytes") {
2047
+ const text = {
2048
+ kind: "toString",
2049
+ operand: { kind: "dynFrom", value: arg, type: DYN, loc },
2050
+ type: STRING,
2051
+ loc,
2052
+ };
2053
+ return { kind: "libCall", fn: "bigint.parse", args: [text], type: BIGINT_T, loc };
2054
+ }
1921
2055
  if (arg.type.kind === "bool") {
1922
2056
  return {
1923
2057
  kind: "ternary",
@@ -1953,12 +2087,13 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
1953
2087
  arm.kind === "string" ||
1954
2088
  arm.kind === "f64" ||
1955
2089
  arm.kind === "bool" ||
2090
+ arm.kind === "bytes" ||
1956
2091
  isUnitType(arm)))
1957
2092
  return null;
1958
2093
  const key = `bigint.scalar:${unionId}`;
1959
2094
  let helper = lowerer.valueHelpers.get(key);
1960
2095
  if (!helper) {
1961
- helper = `%bigint.scalar.${lowerer.valueHelpers.size}`;
2096
+ helper = keyedHelperName(lowerer, "%bigint.scalar", key);
1962
2097
  lowerer.valueHelpers.set(key, helper);
1963
2098
  const value = varRef("value.0", arg.type, loc);
1964
2099
  const body = [];
@@ -2647,6 +2782,12 @@ function lowerStringPrototypeCall(lowerer, call, access) {
2647
2782
  const receiver = lowerer.ensureString(receiverValue, receiverNode);
2648
2783
  return lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => receiver, call.arguments.nodes.slice(1));
2649
2784
  }
2785
+ /** ToNumber of a union of strings, numbers, booleans, null and undefined, as
2786
+ * `Number(value)` converts it; null for other types. Unary `+` takes it too:
2787
+ * the two conversions differ only for BigInt, which such unions don't hold. */
2788
+ export function lowerPrimitiveUnionNumber(lowerer, arg, node, loc) {
2789
+ return (lowerOptionalStringNumber(lowerer, arg, loc) ?? lowerScalarUnionNumber(lowerer, arg, node, loc));
2790
+ }
2650
2791
  function lowerScalarUnionNumber(lowerer, arg, node, loc) {
2651
2792
  if (arg.type.kind !== "union" ||
2652
2793
  !lowerer.unions
@@ -2656,7 +2797,7 @@ function lowerScalarUnionNumber(lowerer, arg, node, loc) {
2656
2797
  const key = `number.scalar:${arg.type.unionId}`;
2657
2798
  let helper = lowerer.valueHelpers.get(key);
2658
2799
  if (!helper) {
2659
- helper = `%number.scalar.${lowerer.valueHelpers.size}`;
2800
+ helper = keyedHelperName(lowerer, "%number.scalar", key);
2660
2801
  lowerer.valueHelpers.set(key, helper);
2661
2802
  const value = varRef("value.0", arg.type, loc);
2662
2803
  const nan = {
@@ -2697,7 +2838,7 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
2697
2838
  const key = `${label}.optionalString:${arg.type.unionId}`;
2698
2839
  let helper = lowerer.valueHelpers.get(key);
2699
2840
  if (!helper) {
2700
- helper = `%${label}.optionalString.${lowerer.valueHelpers.size}`;
2841
+ helper = keyedHelperName(lowerer, `%${label}.optionalString`, key);
2701
2842
  lowerer.valueHelpers.set(key, helper);
2702
2843
  const value = varRef("value.0", arg.type, loc);
2703
2844
  lowerer.liftedFns.push({
@@ -2984,6 +3125,15 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
2984
3125
  // 'unknown' slot does.
2985
3126
  if (checkerUntyped && DYN_HANDLE_KINDS.has(recv.type.kind))
2986
3127
  recv = lowerer.coerceToExpected(recv, DYN);
3128
+ // A typed array whose checker type collapsed to `any` (a JS binding
3129
+ // referenced in its own initializer's inference — hono's etag digest
3130
+ // `const nextChunk = new Uint8Array(new ArrayBuffer(f(chunk)))` beside
3131
+ // `chunk = nextChunk`) still lowered to its native bytes. The typed
3132
+ // lowerings key on the checker type and decline it, so it boxes by
3133
+ // reference (the box shares the native storage, so writes through the
3134
+ // call stay visible) and the call dispatches on the runtime kind.
3135
+ if (checkerUntyped && recv.type.kind === "bytes")
3136
+ recv = lowerer.coerceToExpected(recv, DYN);
2987
3137
  // The last-resort retry (boxTypedTemporary — every other lowering
2988
3138
  // already declined): a checker-`any` receiver whose value is a FRESH
2989
3139
  // typed result of an earlier step in the chain (`out.split("\n")`
@@ -3103,11 +3253,25 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3103
3253
  if (access.name.text === "flatMap")
3104
3254
  return lowerDynArrayFlatMapCall(lowerer, call, access, recv);
3105
3255
  // String methods claim only names NO other dyn-representable kind's
3106
- // prototype declares (Array carries includes/indexOf/slice too): for
3107
- // these, "the receiver is a string, or the call throws V8's TypeError"
3108
- // IS Node's semantics for every possible dyn value. Shared names would
3109
- // need a receiver-kind dispatch — they keep the fence.
3256
+ // prototype declares (Array carries includes/indexOf/slice too), so no
3257
+ // other kind inherits them. Shared names would need a receiver-kind
3258
+ // dispatch — they keep the fence.
3110
3259
  if (DYN_STRING_ONLY_METHODS.has(access.name.text) && !ownCallable) {
3260
+ // A checked-dynamic object can still carry its OWN member of that
3261
+ // name: zod's schemas assign `trim`, `toLowerCase` and `startsWith`
3262
+ // in their constructors (`z.string().trim().min(1)`), an object's
3263
+ // prototype can define `trim`, and a JavaScript module object can
3264
+ // assign `repeat` in a function body (`common.repeat(" ", n)`, an
3265
+ // object-typed receiver the member is missing from). An untyped
3266
+ // receiver, or a member the checker cannot type, dispatches on the
3267
+ // receiver's runtime kind: a string runs the string lowering, anything
3268
+ // else calls its member as Node does.
3269
+ if ((checkerUntyped ||
3270
+ (lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
3271
+ !call.questionDotToken &&
3272
+ !access.questionDotToken &&
3273
+ !call.arguments.nodes.some(ts.isSpreadElement))
3274
+ return lowerStringOrMemberCall(lowerer, call, access, recv);
3111
3275
  const checked = () => dynStringReceiver(lowerer, recv, access);
3112
3276
  return (lowerRegexMethodCall(lowerer, call, access, checked) ??
3113
3277
  lowerStringMethodCall(lowerer, call, access, checked));
@@ -3127,7 +3291,12 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3127
3291
  }
3128
3292
  // The argument is a radix for bigint and an encoding for Buffer.
3129
3293
  // Preserve its runtime value so receiver dispatch can choose correctly.
3130
- if (access.name.text === "toString" && call.arguments.nodes.length <= 1) {
3294
+ // An authored own `toString` member (zod's `errorUtil.toString`, which
3295
+ // answers string | undefined) is an ordinary method call instead.
3296
+ if (access.name.text === "toString" &&
3297
+ call.arguments.nodes.length <= 1 &&
3298
+ !ownCallable &&
3299
+ !(checkerUntyped && jsAssignsOwnToString(lowerer, access.expression))) {
3131
3300
  const argument = call.arguments.nodes[0];
3132
3301
  return {
3133
3302
  kind: "libCall",
@@ -3229,11 +3398,17 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3229
3398
  // The same holds when only the MEMBER is checker-untyped: TypeScript
3230
3399
  // importing chalk's JavaScript source types the default export as a
3231
3400
  // plain function, so `chalk.bold` reads as `any` on a typed receiver.
3401
+ const ownToString = access.name.text === "toString" &&
3402
+ checkerUntyped &&
3403
+ jsAssignsOwnToString(lowerer, access.expression);
3232
3404
  const stringOnlyName = (checkerUntyped ||
3233
3405
  (lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
3234
3406
  !ownCallable &&
3235
3407
  DYN_STRING_PROTO_ONLY_NAMES.has(access.name.text);
3236
- if (DYN_PROTO_METHOD_NAMES.has(access.name.text) && !ownCallable && !stringOnlyName)
3408
+ if (DYN_PROTO_METHOD_NAMES.has(access.name.text) &&
3409
+ !ownCallable &&
3410
+ !ownToString &&
3411
+ !stringOnlyName)
3237
3412
  return null;
3238
3413
  // Optional forms (`obj.cb?.()`, `obj?.cb()`) belong to the chain
3239
3414
  // machinery's short-circuit semantics — not modeled here yet.
@@ -3294,6 +3469,79 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3294
3469
  loc,
3295
3470
  };
3296
3471
  }
3472
+ /** `value.name(...args)` on a dyn receiver that may be a string or an
3473
+ * object: a string runs the String.prototype lowering, any other value
3474
+ * calls its member. The member is read before the arguments are
3475
+ * evaluated, and the arguments are evaluated once for either branch. */
3476
+ function lowerStringOrMemberCall(lowerer, call, access, recv) {
3477
+ const loc = locOf(call);
3478
+ const receiverLocal = lowerer.declareHiddenLocal("%dynCallReceiver", DYN);
3479
+ const receiver = varRef(receiverLocal.id, DYN, loc);
3480
+ const isString = { kind: "dynTest", test: "string", value: receiver, type: BOOL, loc };
3481
+ const calleeLocal = lowerer.declareHiddenLocal("%dynCallCallee", DYN);
3482
+ const callee = varRef(calleeLocal.id, DYN, loc);
3483
+ const stmts = [
3484
+ { kind: "varDecl", localId: receiverLocal.id, init: recv, loc },
3485
+ {
3486
+ kind: "varDecl",
3487
+ localId: calleeLocal.id,
3488
+ init: {
3489
+ kind: "ternary",
3490
+ cond: isString,
3491
+ then: dynUndefinedExpr(loc),
3492
+ else_: {
3493
+ kind: "dynKeyGet",
3494
+ key: { kind: "strLit", value: access.name.text, type: STRING, loc: locOf(access) },
3495
+ value: receiver,
3496
+ type: DYN,
3497
+ loc: locOf(access),
3498
+ },
3499
+ type: DYN,
3500
+ loc,
3501
+ },
3502
+ loc,
3503
+ },
3504
+ ];
3505
+ const args = call.arguments.nodes.map((node) => {
3506
+ const value = lowerer.lowerExpr(node);
3507
+ const local = lowerer.declareHiddenLocal("%dynCallArg", value.type);
3508
+ stmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
3509
+ return { node, value: varRef(local.id, value.type, value.loc) };
3510
+ });
3511
+ // String.prototype methods ignore arguments past the ones they read.
3512
+ const arity = DYN_STRING_ONLY_ARITY[access.name.text] ?? call.arguments.nodes.length;
3513
+ const stringReceiver = () => ({ kind: "dynCheck", value: receiver, type: STRING, loc });
3514
+ const lowerString = () => (call.arguments.nodes.length <= arity
3515
+ ? lowerRegexMethodCall(lowerer, call, access, stringReceiver)
3516
+ : null) ??
3517
+ lowerStringMethodCall(lowerer, call, access, stringReceiver, call.arguments.nodes.slice(0, arity));
3518
+ const stringCall = lowerer.withExpressionOverrides(args, lowerString);
3519
+ const memberCall = {
3520
+ kind: "dynCall",
3521
+ callee,
3522
+ receiver,
3523
+ calleeName: ts.getTextOfNode(access),
3524
+ args: args.map((arg) => lowerer.coerceToExpected(arg.value, DYN)),
3525
+ type: DYN,
3526
+ loc,
3527
+ };
3528
+ return {
3529
+ kind: "seqExpr",
3530
+ stmts,
3531
+ result: {
3532
+ kind: "ternary",
3533
+ cond: isString,
3534
+ then: stringCall
3535
+ ? lowerer.coerceToExpected(stringCall, DYN)
3536
+ : nodeThrowExpr(0, "SC1090", `method calls like '${ts.getTextOfNode(access)}' on a string are not supported yet [SC1090 at ${ts.getSourceFileOfNode(call).fileName}:${ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(call), ts.tokenStartOfNode(call)).line + 1}]`, DYN, loc),
3537
+ else_: memberCall,
3538
+ type: DYN,
3539
+ loc,
3540
+ },
3541
+ type: DYN,
3542
+ loc,
3543
+ };
3544
+ }
3297
3545
  /** Prototype method names of the checked-dynamic tree-representable kinds (String, Array,
3298
3546
  * Object, Function, Number prototypes): a dyn receiver call on one of
3299
3547
  * these could be a REAL method on a real value, which a stored-member
@@ -3421,6 +3669,7 @@ const DYN_DISPATCH_METHODS = new Set([
3421
3669
  "shift",
3422
3670
  "unshift",
3423
3671
  "slice",
3672
+ "splice",
3424
3673
  "at",
3425
3674
  "indexOf",
3426
3675
  "lastIndexOf",
@@ -3455,6 +3704,12 @@ const DYN_DISPATCH_METHODS = new Set([
3455
3704
  "prependOnceListener",
3456
3705
  "listeners",
3457
3706
  "listenerCount",
3707
+ // The rest of EventEmitter.prototype, which compiled emitters answer
3708
+ // through the class dispatch (class-dynamic-dispatch.ts).
3709
+ "rawListeners",
3710
+ "eventNames",
3711
+ "setMaxListeners",
3712
+ "getMaxListeners",
3458
3713
  "write",
3459
3714
  "end",
3460
3715
  "destroy",
@@ -3556,6 +3811,9 @@ const DYN_DISPATCH_METHODS = new Set([
3556
3811
  "additionalHeaders",
3557
3812
  "altsvc",
3558
3813
  "origin",
3814
+ // FinalizationRegistry's methods (scr_finalization_registry_new).
3815
+ "register",
3816
+ "unregister",
3559
3817
  // Worker and MessagePort methods use the owning context's handle adapter.
3560
3818
  "postMessage",
3561
3819
  "terminate",
@@ -3567,6 +3825,15 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3567
3825
  if ((!DYN_DISPATCH_METHODS.has(method) && !isJsSourceFile(ts.getSourceFileOfNode(call))) ||
3568
3826
  lowerer.chainBlocked(call, access))
3569
3827
  return null;
3828
+ // readable.compose lowers its stages from their syntax, so it needs the
3829
+ // stream's class: a stream a JavaScript function returns untyped has none.
3830
+ if (method === "compose") {
3831
+ const recvT = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
3832
+ if (recvT?.kind === "object" &&
3833
+ streamSidesOf(lowerer, lowerer.classes.get(recvT.className)) !== null) {
3834
+ lowerer.noLowering("readable.compose on a stream held as a checked-dynamic value", call, "type the stream where it comes from, such as a JSDoc @returns {Readable} on the function that returns it");
3835
+ }
3836
+ }
3570
3837
  if (call.arguments.nodes.some((arg) => ts.isSpreadElement(arg))) {
3571
3838
  const loc = locOf(call);
3572
3839
  const local = lowerer.declareHiddenLocal("%spreadReceiver", DYN);
@@ -3664,7 +3931,19 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3664
3931
  }
3665
3932
  }
3666
3933
  }
3934
+ // `String`, `Number` or `Boolean` as the callback of an array method
3935
+ // (`values.map(String)` over an unknown array): the method calls it with
3936
+ // each element, whatever its type, and cannot observe which function
3937
+ // value it received, so it gets the constructor's form that converts any
3938
+ // argument rather than the string-input form typed code stores.
3939
+ const arrayCallbackReceiver = ARRAY_CALLBACK_METHODS.has(method) &&
3940
+ lowerer.checker.isArrayType(lowerer.typeOf(access.expression));
3667
3941
  const args = call.arguments.nodes.map((arg, i) => {
3942
+ const primitive = i === 0 && arrayCallbackReceiver && ts.isIdentifier(arg)
3943
+ ? stdlibGlobalNameOf(lowerer, arg)
3944
+ : null;
3945
+ if (primitive === "String" || primitive === "Number" || primitive === "Boolean")
3946
+ return lowerer.coerceInto(arg, primitiveCtorClosure(lowerer, primitive, locOf(arg), true), DYN);
3668
3947
  if (i === 0 && predicate)
3669
3948
  return lowerer.coerceInto(arg, predicate, DYN);
3670
3949
  const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, arg);
@@ -3682,6 +3961,20 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3682
3961
  loc: locOf(call),
3683
3962
  };
3684
3963
  }
3964
+ /** Array.prototype methods whose first argument is a callback they call
3965
+ * with the elements. */
3966
+ const ARRAY_CALLBACK_METHODS = new Set([
3967
+ "map",
3968
+ "filter",
3969
+ "forEach",
3970
+ "some",
3971
+ "every",
3972
+ "find",
3973
+ "findIndex",
3974
+ "findLast",
3975
+ "findLastIndex",
3976
+ "flatMap",
3977
+ ]);
3685
3978
  /** Every String.prototype method name a typed or dyn string lowering
3686
3979
  * answers. */
3687
3980
  function isStringMethodName(name) {
@@ -3692,6 +3985,28 @@ function isStringMethodName(name) {
3692
3985
  name === "normalize" ||
3693
3986
  name === "lastIndexOf");
3694
3987
  }
3988
+ /** How many arguments each DYN_STRING_ONLY_METHODS method reads. */
3989
+ const DYN_STRING_ONLY_ARITY = {
3990
+ charCodeAt: 1,
3991
+ charAt: 1,
3992
+ startsWith: 2,
3993
+ endsWith: 2,
3994
+ substring: 2,
3995
+ repeat: 1,
3996
+ trim: 0,
3997
+ trimStart: 0,
3998
+ trimEnd: 0,
3999
+ split: 2,
4000
+ padStart: 2,
4001
+ padEnd: 2,
4002
+ toLowerCase: 0,
4003
+ toUpperCase: 0,
4004
+ replace: 2,
4005
+ replaceAll: 2,
4006
+ match: 1,
4007
+ matchAll: 1,
4008
+ search: 1,
4009
+ };
3695
4010
  /** STR_METHODS ∪ the regex-form names, MINUS everything Array (or any
3696
4011
  * other dyn kind's prototype) also declares. */
3697
4012
  const DYN_STRING_ONLY_METHODS = new Set([
@@ -4013,7 +4328,7 @@ function lowerDefaultToStringCall(lowerer, call, access) {
4013
4328
  const key = `objToStr:${typeKey(recv.type)}${missing ? `:${missing}` : ""}`;
4014
4329
  let helper = lowerer.valueHelpers.get(key);
4015
4330
  if (!helper) {
4016
- helper = `%obj.tostr.${lowerer.valueHelpers.size}`;
4331
+ helper = keyedHelperName(lowerer, "%obj.tostr", key);
4017
4332
  lowerer.valueHelpers.set(key, helper);
4018
4333
  const o = varRef("o.0", recv.type, loc);
4019
4334
  lowerer.liftedFns.push({
@@ -4625,7 +4940,7 @@ function loweredTemplateStrings(lowerer, expr, cooked, loc, raw) {
4625
4940
  const site = lowerer.globalsList.length;
4626
4941
  const globalId = `%g.templateStrings.${site}`;
4627
4942
  const readyId = `%g.templateStringsReady.${site}`;
4628
- getter = `%templateStrings.get.${lowerer.valueHelpers.size}`;
4943
+ getter = keyedHelperName(lowerer, "%templateStrings.get", key);
4629
4944
  lowerer.valueHelpers.set(key, getter);
4630
4945
  lowerer.globalsList.push({ id: globalId, name: "%templateStrings", type, mutable: true }, { id: readyId, name: "%templateStringsReady", type: BOOL, mutable: true });
4631
4946
  lowerer.liftedFns.push({
@@ -4794,7 +5109,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4794
5109
  // IS the spec's identity/thrower/no-op substitution for all three
4795
5110
  // members. An argument expression, when present, is undefined/null
4796
5111
  // by construction — nothing to evaluate.
4797
- const fnName = `%fn${lowerer.lambdaCounter++}_${member}pass`;
5112
+ const fnName = lowerer.closureName(loc, `_${member}pass`);
4798
5113
  const funcType = { kind: "func", params: [promT], ret: promT };
4799
5114
  const fnCtx = newFnCtx(true, null, funcType, inner);
4800
5115
  fnCtx.isAsync = true;
@@ -4876,7 +5191,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4876
5191
  // Evaluate both callback expressions before the wrapper runs, in source order.
4877
5192
  const fulfilled = fulfilledAbsent ? null : boxHandler(fulfilledNode, true);
4878
5193
  const rejected = rejectedAbsent ? null : boxHandler(rejectedNode, false);
4879
- const fnName = `%fn${lowerer.lambdaCounter++}_then2`;
5194
+ const fnName = lowerer.closureName(loc, "_then2");
4880
5195
  const paramTypes = [
4881
5196
  promT,
4882
5197
  ...(fulfilled ? [fulfilled.value.type] : []),
@@ -5095,7 +5410,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5095
5410
  lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers receiving '${lowerer.fmt(v.type)}' values through an untyped handler (the settled value cannot cross the checked-dynamic tree boundary)`);
5096
5411
  };
5097
5412
  const resultT = { kind: "promise", inner: DYN };
5098
- const fnName = `%fn${lowerer.lambdaCounter++}_then`;
5413
+ const fnName = lowerer.closureName(loc, "_then");
5099
5414
  const funcType = {
5100
5415
  kind: "func",
5101
5416
  params: [promT, DYN],
@@ -5173,12 +5488,24 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5173
5488
  !(param.kind === "dyn" && (inner.kind === "void" || lowerer.dynConvertible(inner)))) {
5174
5489
  lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers whose parameter is not the settled value's type (expected '${lowerer.fmt(inner)}', got '${lowerer.fmt(param)}')`);
5175
5490
  }
5176
- const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
5491
+ let resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
5492
+ // JavaScript whose declared result type has no mapping (zod's
5493
+ // `Promise.all(items).then((r) => ParseStatus.mergeArray(status, r))`,
5494
+ // typed by a .d.ts union): the handler's value settles the promise as
5495
+ // a checked-dynamic value, checked where it is used.
5496
+ if (resultT?.kind !== "promise" &&
5497
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
5498
+ cb.type.kind === "func" &&
5499
+ cb.type.ret.kind !== "promise" &&
5500
+ cb.type.ret.kind !== "void" &&
5501
+ (cb.type.ret.kind === "dyn" || lowerer.dynConvertible(cb.type.ret))) {
5502
+ resultT = { kind: "promise", inner: DYN };
5503
+ }
5177
5504
  if (resultT?.kind !== "promise") {
5178
5505
  lowerer.noLowering("then with this handler's result type", call, "the combined result must be a representable promise");
5179
5506
  }
5180
5507
  const R = resultT.inner;
5181
- const fnName = `%fn${lowerer.lambdaCounter++}_then`;
5508
+ const fnName = lowerer.closureName(loc, "_then");
5182
5509
  const funcType = {
5183
5510
  kind: "func",
5184
5511
  params: [promT, cb.type],
@@ -5282,7 +5609,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5282
5609
  if (cb.type.kind !== "func" || cb.type.params.length !== 0 || cb.type.ret.kind !== "void") {
5283
5610
  lowerer.unsupported("SC1090", call.arguments.nodes[0], "finally callbacks with parameters or a return value (use () => { ... })");
5284
5611
  }
5285
- const fnName = `%fn${lowerer.lambdaCounter++}_finally`;
5612
+ const fnName = lowerer.closureName(loc, "_finally");
5286
5613
  const funcType = {
5287
5614
  kind: "func",
5288
5615
  params: [promT, cb.type],
@@ -5378,7 +5705,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5378
5705
  }
5379
5706
  if (cb.type.kind === "dyn") {
5380
5707
  const resultT = { kind: "promise", inner: DYN };
5381
- const fnName = `%fn${lowerer.lambdaCounter++}_catchdyn`;
5708
+ const fnName = lowerer.closureName(loc, "_catchdyn");
5382
5709
  const funcType = {
5383
5710
  kind: "func",
5384
5711
  params: [promT, DYN],
@@ -5495,7 +5822,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5495
5822
  "own type, or annotate the handler `(): undefined =>` for the T | undefined result");
5496
5823
  }
5497
5824
  const R = resultT.inner;
5498
- const fnName = `%fn${lowerer.lambdaCounter++}_catch`;
5825
+ const fnName = lowerer.closureName(loc, "_catch");
5499
5826
  const funcType = { kind: "func", params: [promT], ret: resultT };
5500
5827
  const fnCtx = newFnCtx(true, null, funcType, R);
5501
5828
  fnCtx.isAsync = true;
@@ -5648,6 +5975,13 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5648
5975
  const narrowed = outElem !== null && !typeEquals(outElem, elem);
5649
5976
  if (!narrowed && !isBooleanArg)
5650
5977
  return null;
5978
+ // A written predicate (`(p): p is Cat => ...`, a guard function value)
5979
+ // proves nothing at run time: the generic array HOF path filters the
5980
+ // receiver's elements and converts the kept ones checked
5981
+ // (filterResultElem).
5982
+ if (!isBooleanArg &&
5983
+ ((!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) || argNode.type))
5984
+ return null;
5651
5985
  const annotateEscape = "keep the receiver's element type instead — annotate the callback's return ': boolean' " +
5652
5986
  "(the checker then skips the predicate) or annotate the result with the receiver's own " +
5653
5987
  "element type — and narrow the elements after";
@@ -5657,6 +5991,10 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5657
5991
  lowerer.badType(call, callT); // defensive: a narrowed non-union receiver
5658
5992
  }
5659
5993
  tag = lowerer.armTag(elem.unionId, outElem);
5994
+ // Several kept arms: the generic path converts the kept elements to
5995
+ // the narrower union (filterResultElem).
5996
+ if (tag < 0 && !isBooleanArg)
5997
+ return null;
5660
5998
  if (tag < 0) {
5661
5999
  lowerer.unsupported("SC1090", call, `'.filter' narrowing '${lowerer.fmt(elem)}' elements to the multi-arm '${lowerer.fmt(outElem)}' ` +
5662
6000
  `(only a SINGLE arm re-tags — ${annotateEscape})`);
@@ -5673,17 +6011,8 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5673
6011
  const helper = filterNarrowHelper(lowerer, "truthy", elem, outElem ?? elem, tag, loc);
5674
6012
  return { kind: "call", callee: helper, args: [receiver], type: arrayOf(outElem ?? elem), loc };
5675
6013
  }
5676
- // Inferred type predicate: inline function literal, NO return
5677
- // annotation (a written one is an unchecked assertion), and the
5678
- // checker reports a predicate over parameter 0.
5679
- if (!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) {
5680
- lowerer.unsupported("SC1090", argNode, `narrowing '.filter' through a callback VALUE ` +
5681
- `(only an inline callback whose predicate the checker inferred can re-tag — ${annotateEscape})`);
5682
- }
5683
- if (argNode.type) {
5684
- lowerer.unsupported("SC1090", argNode, `narrowing '.filter' with a hand-written type predicate ` +
5685
- `(a written 'x is T' is an unchecked assertion nothing validates at runtime — ${annotateEscape})`);
5686
- }
6014
+ // An inferred type predicate: an inline function literal with no return
6015
+ // annotation, over parameter 0 (written predicates returned above).
5687
6016
  // The receiver evaluates FIRST, in the enclosing function, like JS.
5688
6017
  const receiver = lowerer.lowerExpr(access.expression);
5689
6018
  const fnArg = lowerer.lowerExpr(argNode);
@@ -5713,7 +6042,7 @@ function filterNarrowHelper(lowerer, test, elem, outElem, tag, loc) {
5713
6042
  const existing = lowerer.arrHofHelpers.get(key);
5714
6043
  if (existing)
5715
6044
  return existing;
5716
- const name = `%arr.filterNarrow.${lowerer.arrHofHelpers.size}`;
6045
+ const name = keyedHelperName(lowerer, "%arr.filterNarrow", key);
5717
6046
  lowerer.arrHofHelpers.set(key, name);
5718
6047
  const arrT = arrayOf(elem);
5719
6048
  const outT = arrayOf(outElem);
@@ -5935,7 +6264,7 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5935
6264
  const key = `obj.keys:${argIr.shapeId}:${typeKey(resultT)}`;
5936
6265
  let helper = lowerer.arrHofHelpers.get(key);
5937
6266
  if (!helper) {
5938
- helper = `%obj.keys.${lowerer.arrHofHelpers.size}`;
6267
+ helper = keyedHelperName(lowerer, "%obj.keys", key);
5939
6268
  const ref = { kind: "varRef", localId: "r.0", type: argIr, loc };
5940
6269
  const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
5941
6270
  lowerer.arrHofHelpers.set(key, helper);
@@ -5961,8 +6290,10 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5961
6290
  loc,
5962
6291
  },
5963
6292
  ];
5964
- const order = current.declaredOrder ?? current.fields.map((f) => f.name);
5965
- for (const name of order) {
6293
+ // One walk per key order (see perKeyOrder).
6294
+ const orders = shapeKeyOrders(current);
6295
+ const walks = orders.map(() => []);
6296
+ for (const [k, name] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
5966
6297
  const f = current.fields.find((x) => x.name === name);
5967
6298
  const pushStmt = {
5968
6299
  kind: "exprStmt",
@@ -5979,10 +6310,11 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5979
6310
  // Fields that can be absent push behind their presence test (the
5980
6311
  // key exists exactly when Object.keys would list it).
5981
6312
  const present = lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc);
5982
- body.push(present.kind === "recordHas"
6313
+ walks[k].push(present.kind === "recordHas"
5983
6314
  ? { kind: "if", cond: present, then: [pushStmt], else_: null, loc }
5984
6315
  : pushStmt);
5985
6316
  }
6317
+ body.push(...perKeyOrder(current, ref, walks, loc));
5986
6318
  body.push({ kind: "return", value: outRef, loc });
5987
6319
  fn.body = body;
5988
6320
  };
@@ -5998,12 +6330,12 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5998
6330
  * (a key is own exactly when Object.keys would list it — the two share
5999
6331
  * the test), everything else true. Unmatched keys probe the overflow
6000
6332
  * map when present, so explicit undefined values remain own keys. */
6001
- function recordHasOwnHelper(lowerer, shapeId, loc) {
6333
+ export function recordHasOwnHelper(lowerer, shapeId, loc) {
6002
6334
  const key = `obj.hasOwn:${shapeId}`;
6003
6335
  const existing = lowerer.arrHofHelpers.get(key);
6004
6336
  if (existing)
6005
6337
  return existing;
6006
- const helper = `%obj.hasOwn.${lowerer.arrHofHelpers.size}`;
6338
+ const helper = keyedHelperName(lowerer, "%obj.hasOwn", key);
6007
6339
  lowerer.arrHofHelpers.set(key, helper);
6008
6340
  const shape = lowerer.shapes.get(shapeId);
6009
6341
  const recT = { kind: "record", shapeId };
@@ -6081,7 +6413,7 @@ function classAssignHelper(lowerer, className, srcShapeId, loc) {
6081
6413
  const existing = lowerer.arrHofHelpers.get(key);
6082
6414
  if (existing)
6083
6415
  return existing;
6084
- const helper = `%obj.assignClass.${lowerer.arrHofHelpers.size}`;
6416
+ const helper = keyedHelperName(lowerer, "%obj.assignClass", key);
6085
6417
  lowerer.arrHofHelpers.set(key, helper);
6086
6418
  const sShape = lowerer.shapes.get(srcShapeId);
6087
6419
  const oT = { kind: "object", className };
@@ -6142,7 +6474,7 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
6142
6474
  const existing = lowerer.arrHofHelpers.get(key);
6143
6475
  if (existing)
6144
6476
  return existing;
6145
- const helper = `%obj.assign.${lowerer.arrHofHelpers.size}`;
6477
+ const helper = keyedHelperName(lowerer, "%obj.assign", key);
6146
6478
  lowerer.arrHofHelpers.set(key, helper);
6147
6479
  const sShape = lowerer.shapes.get(srcShapeId);
6148
6480
  const tShape = lowerer.shapes.get(targetShapeId);
@@ -6323,6 +6655,33 @@ function lowerObjectStaticCall(lowerer, call, access) {
6323
6655
  if (!lowerer.isStdlibGlobal(access.expression, "Object"))
6324
6656
  return null;
6325
6657
  const member = access.name.text;
6658
+ // `Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")` (Effect's
6659
+ // isStackTraceLimitWritable): Error's own writable, enumerable,
6660
+ // configurable data property holding the current limit. The interned
6661
+ // Error value models no other statics (builtinGlobalValueAt).
6662
+ const [first, second] = call.arguments.nodes;
6663
+ if (member === "getOwnPropertyDescriptor" &&
6664
+ call.arguments.nodes.length === 2 &&
6665
+ lowerer.isStdlibGlobal(first, "Error") &&
6666
+ ts.isStringLiteralLike(second) &&
6667
+ second.text === "stackTraceLimit") {
6668
+ const loc = locOf(call);
6669
+ const dyn = (value) => ({ kind: "dynFrom", value, type: DYN, loc });
6670
+ const yes = dyn({ kind: "boolLit", value: true, type: BOOL, loc });
6671
+ const limit = { kind: "libCall", fn: "error.stackLimitGet", args: [], type: F64, loc };
6672
+ return {
6673
+ kind: "dynObjLit",
6674
+ fields: [
6675
+ { key: { kind: "strLit", value: "value", type: STRING, loc }, value: dyn(limit) },
6676
+ ...["writable", "enumerable", "configurable"].map((key) => ({
6677
+ key: { kind: "strLit", value: key, type: STRING, loc },
6678
+ value: yes,
6679
+ })),
6680
+ ],
6681
+ type: DYN,
6682
+ loc,
6683
+ };
6684
+ }
6326
6685
  if ((member === "getOwnPropertyNames" ||
6327
6686
  member === "getOwnPropertySymbols" ||
6328
6687
  member === "getOwnPropertyDescriptors") &&
@@ -6677,6 +7036,11 @@ function lowerObjectStaticCall(lowerer, call, access) {
6677
7036
  const target = lowerer.lowerExpr(call.arguments.nodes[0]);
6678
7037
  const rawSource = lowerer.lowerExpr(call.arguments.nodes[1]);
6679
7038
  fenceSymbolFieldCopy(lowerer, call.arguments.nodes[1], rawSource.type);
7039
+ let targetNode = call.arguments.nodes[0];
7040
+ while (ts.isParenthesizedExpression(targetNode))
7041
+ targetNode = targetNode.expression;
7042
+ if (ts.isObjectLiteralExpression(targetNode))
7043
+ fenceClassCopyIntoFreshObject(lowerer, call, call.arguments.nodes[1], rawSource);
6680
7044
  const source = lowerer.coerceToExpected(rawSource, DYN);
6681
7045
  if (target.type.kind === "dyn" && source.type.kind === "dyn") {
6682
7046
  return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc };
@@ -6815,19 +7179,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
6815
7179
  const srcNode = spread ? argNode.expression : argNode;
6816
7180
  const rawSource = lowerer.lowerExpr(srcNode);
6817
7181
  fenceSymbolFieldCopy(lowerer, srcNode, rawSource.type, spread);
6818
- // A class instance copied into a fresh object
6819
- // (`Object.assign({}, instance)`): the result is a plain
6820
- // object holding the instance's own fields, never an
6821
- // instance, so a result the checker types as the class has
6822
- // no representation (the checked cast would throw).
6823
- if (rawSource.type.kind === "object" &&
6824
- freshLiteralTarget &&
6825
- !ts.isExpressionStatement(call.parent)) {
6826
- const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
6827
- if (resultT !== null && resultT.kind === "object") {
6828
- lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
6829
- }
6830
- }
7182
+ if (freshLiteralTarget)
7183
+ fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource);
6831
7184
  const src = lowerer.coerceToExpected(rawSource, DYN);
6832
7185
  if (src.type.kind !== "dyn") {
6833
7186
  ok = false;
@@ -6944,6 +7297,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
6944
7297
  ...(fnName !== null ? { fnName } : {}),
6945
7298
  };
6946
7299
  }
7300
+ // A class value (`Object.defineProperty(Definition, "name", { value })`)
7301
+ // boxes to its constructor function, whose own-property table holds the
7302
+ // definition for every alias of the class.
7303
+ if (target?.type.kind === "classval" && lowerer.dynConvertible(target.type)) {
7304
+ target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments.nodes[0]) };
7305
+ }
6947
7306
  const descriptorPrimitive = member === "getOwnPropertyDescriptor" &&
6948
7307
  target &&
6949
7308
  (target.type.kind === "bool" || target.type.kind === "f64" || target.type.kind === "string");
@@ -7049,6 +7408,25 @@ function lowerObjectStaticCall(lowerer, call, access) {
7049
7408
  loc,
7050
7409
  };
7051
7410
  }
7411
+ const fnIntegrity = functionIntegrity(lowerer, member, value, call.arguments.nodes[0], locOf(call));
7412
+ if (fnIntegrity)
7413
+ return fnIntegrity;
7414
+ // A Map or Set has no own properties: freeze, seal and preventExtensions
7415
+ // all only make it not extensible.
7416
+ if (value.type.kind === "map" || value.type.kind === "set") {
7417
+ if (member === "preventExtensions" || member === "seal")
7418
+ return lowerNativeFreeze(lowerer, "collection.preventExtensions", value, locOf(call));
7419
+ const extensible = {
7420
+ kind: "libCall",
7421
+ fn: "collection.isExtensible",
7422
+ args: [value],
7423
+ type: BOOL,
7424
+ loc: locOf(call),
7425
+ };
7426
+ return member === "isExtensible"
7427
+ ? extensible
7428
+ : { kind: "unary", op: "!", operand: extensible, type: BOOL, loc: locOf(call) };
7429
+ }
7052
7430
  if (member === "preventExtensions" || member === "seal") {
7053
7431
  const integrity = lowerClassIntegrity(lowerer, call, member, value);
7054
7432
  if (integrity)
@@ -7085,10 +7463,42 @@ function lowerObjectStaticCall(lowerer, call, access) {
7085
7463
  // the argument — no alias exists, so the frozen bit is unobservable
7086
7464
  // (writes through the Readonly<T> result are compile errors, and no
7087
7465
  // other reference can write). Primitives pass through per ES2015.
7088
- // Aliased objects keep a fence: a later write through the original
7089
- // reference would need the runtime frozen bit (strict mode throws).
7466
+ // Aliased records get the frozen bit of their rc word (frozen-records.ts);
7467
+ // other aliased objects keep a fence: a later write through the original
7468
+ // reference would need a runtime frozen bit (strict mode throws).
7090
7469
  if (member === "isFrozen" && call.arguments.nodes.length === 1) {
7091
- const value = lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN);
7470
+ const argNode = call.arguments.nodes[0];
7471
+ const probedKind = tryLowerExpression(lowerer, argNode)?.type.kind;
7472
+ if (probedKind === "record" ||
7473
+ probedKind === "array" ||
7474
+ probedKind === "map" ||
7475
+ probedKind === "set") {
7476
+ const native = lowerer.lowerExpr(argNode);
7477
+ const loc = locOf(call);
7478
+ if (native.type.kind === "record" || native.type.kind === "array")
7479
+ return {
7480
+ kind: "libCall",
7481
+ fn: native.type.kind === "record" ? "record.isFrozen" : "array.isFrozen",
7482
+ args: [native],
7483
+ type: BOOL,
7484
+ loc,
7485
+ };
7486
+ if (native.type.kind === "map" || native.type.kind === "set")
7487
+ return {
7488
+ kind: "unary",
7489
+ op: "!",
7490
+ operand: {
7491
+ kind: "libCall",
7492
+ fn: "collection.isExtensible",
7493
+ args: [native],
7494
+ type: BOOL,
7495
+ loc,
7496
+ },
7497
+ type: BOOL,
7498
+ loc,
7499
+ };
7500
+ }
7501
+ const value = lowerer.lowerExprExpecting(argNode, DYN);
7092
7502
  return { kind: "libCall", fn: "dyn.isFrozen", args: [value], type: BOOL, loc: locOf(call) };
7093
7503
  }
7094
7504
  if (member === "freeze") {
@@ -7126,9 +7536,18 @@ function lowerObjectStaticCall(lowerer, call, access) {
7126
7536
  arm.kind === "string" ||
7127
7537
  arm.kind === "symbol"))
7128
7538
  return value;
7539
+ const fnIntegrity = functionIntegrity(lowerer, "freeze", value, argNode, locOf(call));
7540
+ if (fnIntegrity)
7541
+ return fnIntegrity;
7129
7542
  const integrity = lowerClassIntegrity(lowerer, call, "freeze", value);
7130
7543
  if (integrity)
7131
7544
  return integrity;
7545
+ if (freezableRecordType(lowerer, value.type))
7546
+ return lowerNativeFreeze(lowerer, "record.freeze", value, locOf(call));
7547
+ if (value.type.kind === "array")
7548
+ return lowerNativeFreeze(lowerer, "array.freeze", value, locOf(call));
7549
+ if (value.type.kind === "map" || value.type.kind === "set")
7550
+ return lowerNativeFreeze(lowerer, "collection.preventExtensions", value, locOf(call));
7132
7551
  lowerer.noLowering("Object.freeze of a possibly-aliased value", call, "freeze of a FRESH object/array literal (and of primitives) compiles — frozen-ness is unobservable there; an aliased target's later writes would need the runtime frozen bit");
7133
7552
  }
7134
7553
  // `Object.hasOwn(r, k)` over a RECORD receiver: a record's own-key set
@@ -7296,10 +7715,14 @@ function lowerObjectStaticCall(lowerer, call, access) {
7296
7715
  const isJsUnion = probed?.type.kind === "union" &&
7297
7716
  isJsSourceFile(ts.getSourceFileOfNode(call)) &&
7298
7717
  lowerer.dynConvertible(probed.type);
7718
+ // An array walks its live view: the present indices, then its numeric
7719
+ // and named properties.
7720
+ const isArray = probed?.type.kind === "array" && lowerer.dynConvertible(probed.type);
7299
7721
  if (isDyn ||
7300
7722
  isPrimitive ||
7301
7723
  isFunction ||
7302
7724
  isJsUnion ||
7725
+ isArray ||
7303
7726
  (probed && isDynTypedRefType(probed.type))) {
7304
7727
  const fn = member === "keys"
7305
7728
  ? "dyn.objKeys"
@@ -7308,7 +7731,13 @@ function lowerObjectStaticCall(lowerer, call, access) {
7308
7731
  : "dyn.objEntries";
7309
7732
  let v = lowerer.lowerExpr(argNode);
7310
7733
  if (v.type.kind !== "dyn")
7311
- v = { kind: "dynFrom", value: v, type: DYN, loc: locOf(call) };
7734
+ v = {
7735
+ kind: "dynFrom",
7736
+ value: v,
7737
+ ...(isArray ? { liveRef: true } : {}),
7738
+ type: DYN,
7739
+ loc: locOf(call),
7740
+ };
7312
7741
  // In TypeScript the keys come back as a native string[] and the
7313
7742
  // entries as a native [string, any][]: the checker keeps every later
7314
7743
  // write to the arrays well typed. JavaScript may store anything into
@@ -7445,7 +7874,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
7445
7874
  const key = `obj.${member}:${argIr.shapeId}:${typeKey(resultT)}`;
7446
7875
  let helper = lowerer.arrHofHelpers.get(key);
7447
7876
  if (!helper) {
7448
- helper = `%obj.${member}.${lowerer.arrHofHelpers.size}`;
7877
+ helper = keyedHelperName(lowerer, `%obj.${member}`, key);
7449
7878
  const recT = argIr;
7450
7879
  const ref = { kind: "varRef", localId: "r.0", type: recT, loc };
7451
7880
  const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
@@ -7471,8 +7900,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
7471
7900
  loc,
7472
7901
  },
7473
7902
  ];
7474
- const order = current.declaredOrder ?? current.fields.map((f) => f.name);
7475
- for (const name of order) {
7903
+ // One walk per key order (see perKeyOrder).
7904
+ const orders = shapeKeyOrders(current);
7905
+ const walks = orders.map(() => []);
7906
+ for (const [k, name] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
7476
7907
  const f = current.fields.find((x) => x.name === name);
7477
7908
  const raw = {
7478
7909
  kind: "recordGet",
@@ -7627,8 +8058,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
7627
8058
  loc,
7628
8059
  };
7629
8060
  }
7630
- body.push(stmt);
8061
+ walks[k].push(stmt);
7631
8062
  }
8063
+ body.push(...perKeyOrder(current, ref, walks, loc));
7632
8064
  body.push({ kind: "return", value: outRef, loc });
7633
8065
  fn.body = body;
7634
8066
  };
@@ -7863,7 +8295,17 @@ export function lowerRecordFieldCall(lowerer, call, access) {
7863
8295
  // A HYBRID (function-with-properties) field is callable through its
7864
8296
  // reserved %call slot — `colors.blue("x")` where blue also carries
7865
8297
  // `.bold` (the chalk shape).
7866
- if (callee.type.kind === "record")
8298
+ if (callee.type.kind === "object" && !init) {
8299
+ const direct = callableInstanceStringCall(lowerer, call, callee, loc);
8300
+ if (direct)
8301
+ return direct;
8302
+ // Other argument counts call the %call closure through its value, as
8303
+ // a call on the builder itself does (`theme.error("a", "b")`).
8304
+ const closure = lowerer.hybridCallUnwrap(callee);
8305
+ if (closure !== callee)
8306
+ return lowerCallThroughValue(lowerer, call, closure, loc);
8307
+ }
8308
+ if (callee.type.kind === "record" || callee.type.kind === "object")
7867
8309
  callee = lowerer.hybridCallUnwrap(callee);
7868
8310
  // Inferred JavaScript option records can retain checked callables in
7869
8311
  // fields even when the checker only describes those members as any.
@@ -8008,7 +8450,7 @@ function lowerInlineArrowBind(lowerer, call, access) {
8008
8450
  const length = firstDefault < 0 ? arrow.parameters.nodes.length : firstDefault;
8009
8451
  const key = `arrow.bind:${typeKey(type)}:${length}`;
8010
8452
  const existing = lowerer.arrHofHelpers.get(key);
8011
- const name = existing ?? `%arrow.bind.${lowerer.arrHofHelpers.size}`;
8453
+ const name = existing ?? keyedHelperName(lowerer, "%arrow.bind", key);
8012
8454
  if (!existing) {
8013
8455
  lowerer.arrHofHelpers.set(key, name);
8014
8456
  lowerer.freshClosureAdapters.add(name);
@@ -8439,7 +8881,9 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8439
8881
  // so both guards would pass an emitter-named call).
8440
8882
  if (info &&
8441
8883
  !found &&
8442
- (STREAM_API_MEMBERS.has(access.name.text) || STREAM_OPERATORS.has(access.name.text)) &&
8884
+ (STREAM_API_MEMBERS.has(access.name.text) ||
8885
+ STREAM_OPERATORS.has(access.name.text) ||
8886
+ access.name.text === "compose") &&
8443
8887
  streamSidesOf(lowerer, info) !== null) {
8444
8888
  const stream = lowerStreamMethodCall(lowerer, call, access, info);
8445
8889
  if (stream)
@@ -8462,6 +8906,10 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8462
8906
  if (info && !found && eventTargetApiMethod(info, access.name.text)) {
8463
8907
  return lowerEventTargetMethodCall(lowerer, call, access, info, lowerReceiver());
8464
8908
  }
8909
+ // The Date methods a class declared `extends Date` does not declare.
8910
+ if (info && !found && dateRootOf(info) && isDatePrototypeMethod(access.name.text)) {
8911
+ return lowerInheritedDateMethodCall(lowerer, call, access.name.text, info, lowerReceiver());
8912
+ }
8465
8913
  // GENERIC methods (own type parameters) never enter the methods table:
8466
8914
  // they monomorphize per call site and dispatch statically
8467
8915
  // (lowerClassGenericMethodCall has the exactness rules).
@@ -8636,7 +9084,23 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8636
9084
  type: found.sig.ret,
8637
9085
  loc,
8638
9086
  };
8639
- const result = classCallbackCall(lowerer, value, method, call.arguments.nodes, fallback, loc, ts.getTextOfNode(access));
9087
+ // The declaring class's original value, built with the observed slot.
9088
+ // An override below (a virtual call) keeps the dynamic call: a slot
9089
+ // reassigned to an ancestor's method must not reach the override. So do
9090
+ // methods declared in unchecked JavaScript, whose results are inferred,
9091
+ // and calls with a spread argument: the dynamic call drains the spread
9092
+ // through the iterator's current `next`, which may be a replacement.
9093
+ const declarerFile = found.declarer.decl ? ts.getSourceFileOfNode(found.declarer.decl) : null;
9094
+ const original = virtual ||
9095
+ call.arguments.nodes.some(ts.isSpreadElement) ||
9096
+ !declarerFile ||
9097
+ (isJsSourceFile(declarerFile) && !lowerer.checkedJsFile(declarerFile))
9098
+ ? undefined
9099
+ : {
9100
+ originalId: () => found.declarer.prototypeOriginals?.get(method),
9101
+ directCall: () => fallback,
9102
+ };
9103
+ const result = classCallbackCall(lowerer, value, method, call.arguments.nodes, fallback, loc, ts.getTextOfNode(access), original);
8640
9104
  return {
8641
9105
  kind: "seqExpr",
8642
9106
  stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],
@@ -8820,7 +9284,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
8820
9284
  const receiverRef = varRef(receiverLocal.id, receiverT, loc);
8821
9285
  let helper = lowerer.unionCallHelpers.get(key);
8822
9286
  if (!helper) {
8823
- helper = `%union.call.${lowerer.unionCallHelpers.size}`;
9287
+ helper = keyedHelperName(lowerer, "%union.call", key);
8824
9288
  lowerer.unionCallHelpers.set(key, helper);
8825
9289
  const receiverRef = varRef("this.0", receiverT, loc);
8826
9290
  const branch = (plan) => {
@@ -8900,7 +9364,7 @@ function unionObjectMethodHelper(lowerer, sourceCall, receiverT, method, plans,
8900
9364
  const existing = lowerer.unionCallHelpers.get(key);
8901
9365
  if (existing)
8902
9366
  return existing;
8903
- const name = `%union.call.${lowerer.unionCallHelpers.size}`;
9367
+ const name = keyedHelperName(lowerer, "%union.call", key);
8904
9368
  lowerer.unionCallHelpers.set(key, name);
8905
9369
  // A probe that catches a refusal while the body lowers must not leave
8906
9370
  // the name registered for a helper that was never emitted.
@@ -9005,15 +9469,17 @@ function loweredArgumentText(lowerer, arg) {
9005
9469
  * fences; null when the argument shape has no static form (the caller
9006
9470
  * reports the SC2012 refusal). */
9007
9471
  export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
9008
- if (name === "parseInt" || name === "isNaN") {
9472
+ if (name === "parseInt" || name === "isNaN" || name === "isFinite") {
9009
9473
  const maxArgs = name === "parseInt" ? 2 : 1;
9010
9474
  if (args.length < 1 || args.length > maxArgs) {
9011
9475
  lowerer.noLowering(`${name} with ${args.length} argument${args.length === 1 ? "" : "s"}`, call);
9012
9476
  }
9013
- if (name === "isNaN") {
9014
- // The global's ToNumber turns a missing value into NaN.
9477
+ if (name === "isNaN" || name === "isFinite") {
9478
+ // The global's ToNumber turns a missing value into NaN, converts
9479
+ // strings, booleans and null, and calls valueOf/toString on objects.
9015
9480
  const x = lowerToNumberArgument(lowerer, args[0]);
9016
- return { kind: "libCall", fn: "num.isNaN", args: [x], type: BOOL, loc };
9481
+ const fn = name === "isNaN" ? "num.isNaN" : "number.isFinite";
9482
+ return { kind: "libCall", fn, args: [x], type: BOOL, loc };
9017
9483
  }
9018
9484
  const radix = args[1]
9019
9485
  ? lowerer.lowerExprExpecting(args[1], F64)
@@ -9050,7 +9516,7 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
9050
9516
  const key = `parseInt.optional:${unionT.unionId}`;
9051
9517
  let helper = lowerer.valueHelpers.get(key);
9052
9518
  if (!helper) {
9053
- helper = `%parseInt.optional.${lowerer.valueHelpers.size}`;
9519
+ helper = keyedHelperName(lowerer, "%parseInt.optional", key);
9054
9520
  lowerer.valueHelpers.set(key, helper);
9055
9521
  const value = { kind: "varRef", localId: "value.0", type: unionT, loc };
9056
9522
  const radixRef = { kind: "varRef", localId: "radix.0", type: F64, loc };
@@ -9139,27 +9605,32 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
9139
9605
  : lowerer.lowerExprExpecting(args[0], STRING);
9140
9606
  return { kind: "libCall", fn: "num.parseInt", args: [s, radix], type: F64, loc };
9141
9607
  }
9142
- // STATIC parseFloat/isFinite over exactly-typed arguments —
9143
- // parseInt's siblings (num.parseFloat is ECMA 19.2.4's decimal-
9144
- // literal prefix parse in scr_string.c; a number-typed isFinite IS
9145
- // Number.isFinite — the global's ToNumber coercion is the identity
9146
- // there, ms's `isFinite(val)` guard). Other argument types retain
9147
- // their native coercion checks or the SC2012 refusal. The probe never
9148
- // emits — lowering is IR construction.
9149
- if ((name === "parseFloat" || name === "isFinite") && args.length === 1) {
9150
- if (name === "parseFloat") {
9151
- const optional = optionalCallValue(lowerer, args[0]);
9152
- if (optional) {
9153
- const parsed = lowerOptionalStringNumber(lowerer, optional, loc, "num.parseFloat", "parseFloat");
9154
- if (parsed)
9155
- return parsed;
9156
- }
9608
+ // parseFloat takes one argument; Node ignores the rest after evaluating
9609
+ // them (`parseFloat(text, 10)`). Literal and identifier extras have
9610
+ // nothing to evaluate.
9611
+ if (name === "parseFloat" &&
9612
+ args.length > 1 &&
9613
+ args
9614
+ .slice(1)
9615
+ .every((arg) => ts.isNumericLiteral(arg) || ts.isStringLiteral(arg) || ts.isIdentifier(arg)))
9616
+ return lowerStaticNumberGlobal(lowerer, name, call, args.slice(0, 1), loc);
9617
+ // STATIC parseFloat over string arguments — parseInt's sibling
9618
+ // (num.parseFloat is ECMA 19.2.4's decimal-literal prefix parse in
9619
+ // scr_string.c). Other argument types retain their native coercion
9620
+ // checks or the SC2012 refusal. The probe never emits — lowering is IR
9621
+ // construction.
9622
+ if (name === "parseFloat" && args.length === 1) {
9623
+ const optional = optionalCallValue(lowerer, args[0]);
9624
+ if (optional) {
9625
+ const parsed = lowerOptionalStringNumber(lowerer, optional, loc, "num.parseFloat", "parseFloat");
9626
+ if (parsed)
9627
+ return parsed;
9157
9628
  }
9158
9629
  const probed = tryLowerExpression(lowerer, args[0]);
9159
- if (name === "parseFloat" && probed?.type.kind === "string") {
9630
+ if (probed?.type.kind === "string") {
9160
9631
  return { kind: "libCall", fn: "num.parseFloat", args: [probed], type: F64, loc };
9161
9632
  }
9162
- if (name === "parseFloat" && probed?.type.kind === "dyn") {
9633
+ if (probed?.type.kind === "dyn") {
9163
9634
  return {
9164
9635
  kind: "libCall",
9165
9636
  fn: "num.parseFloat",
@@ -9168,29 +9639,38 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
9168
9639
  loc,
9169
9640
  };
9170
9641
  }
9171
- if (name === "isFinite" && probed?.type.kind === "f64") {
9172
- return { kind: "libCall", fn: "number.isFinite", args: [probed], type: BOOL, loc };
9173
- }
9174
- // A number the checker trusts but storage may hold missing (an
9175
- // out-of-range read): the global's ToNumber makes undefined NaN.
9176
- if (name === "isFinite" &&
9177
- probed?.type.kind === "union" &&
9178
- lowerer.armTag(probed.type.unionId, UNDEFINED_T) >= 0 &&
9179
- lowerer.stripUndefinedArm(probed.type).kind === "f64") {
9180
- const x = lowerOptionalNumber(lowerer, probed, loc, args[0]);
9181
- return { kind: "libCall", fn: "number.isFinite", args: [x], type: BOOL, loc };
9182
- }
9183
9642
  }
9184
9643
  return null;
9185
9644
  }
9186
- /** `crypto.getRandomValues(view)` on the WebCrypto global or webcrypto. */
9187
- function lowerWebCryptoGetRandomValues(lowerer, call, access) {
9188
- if (access.name.text !== "getRandomValues" ||
9645
+ /** `crypto.getRandomValues(view)` and `crypto.randomUUID()` on the
9646
+ * WebCrypto global or webcrypto. Other argument counts (JavaScript only)
9647
+ * invoke the dynamic object's method, which ignores extra arguments and
9648
+ * throws Node's missing-argument TypeError. */
9649
+ function lowerWebCryptoMethodCall(lowerer, call, access) {
9650
+ const member = access.name.text;
9651
+ if ((member !== "getRandomValues" && member !== "randomUUID") ||
9189
9652
  call.questionDotToken ||
9190
9653
  access.questionDotToken ||
9191
9654
  !isWebCryptoReceiver(lowerer, access.expression))
9192
9655
  return null;
9193
- return lowerCryptoGetRandomValues(lowerer, call);
9656
+ const args = call.arguments.nodes;
9657
+ if (member === "getRandomValues" && args.length === 1) {
9658
+ return lowerCryptoGetRandomValues(lowerer, call);
9659
+ }
9660
+ if (member === "randomUUID" && args.length === 0) {
9661
+ return { kind: "libCall", fn: "crypto.randomUUID", args: [], type: STRING, loc: locOf(call) };
9662
+ }
9663
+ if (args.some(ts.isSpreadElement))
9664
+ return null;
9665
+ return {
9666
+ kind: "dynInvoke",
9667
+ recv: lowerer.lowerExprExpecting(access.expression, DYN),
9668
+ method: member,
9669
+ calleeName: v8CalleeText(access),
9670
+ args: args.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
9671
+ type: DYN,
9672
+ loc: locOf(call),
9673
+ };
9194
9674
  }
9195
9675
  /** A then handler's promise-armed result (`.then(() => cached ?? load())`
9196
9676
  * typed `T | Promise<T>`, or a `Promise<void> | void` callback's result):
@@ -9293,4 +9773,174 @@ function lowerObjectAssignOntoError(lowerer, call) {
9293
9773
  loc,
9294
9774
  };
9295
9775
  }
9776
+ /** `Object.freeze(fn)` and the other integrity operations on a function
9777
+ * value: the function's checked-dynamic face holds its own properties (the
9778
+ * ones a program assigns, `name`, `length`, `prototype`) and their
9779
+ * integrity state, which the runtime keeps on its property table. The
9780
+ * mutators answer the function itself; the queries answer from the table.
9781
+ * Null for other values. */
9782
+ function functionIntegrity(lowerer, member, value, node, loc) {
9783
+ if (value.type.kind !== "func" || !lowerer.dynConvertible(value.type))
9784
+ return null;
9785
+ const operations = {
9786
+ freeze: "dyn.freeze",
9787
+ seal: "dyn.seal",
9788
+ preventExtensions: "dyn.preventExtensions",
9789
+ isSealed: "dyn.isSealed",
9790
+ isExtensible: "dyn.isExtensible",
9791
+ };
9792
+ if (!(member in operations))
9793
+ return null;
9794
+ const fn = operations[member];
9795
+ // The first operation on a function creates its property table, whose
9796
+ // `name` comes from the box: give the box the function's JS name, as a
9797
+ // closure flowing into any checked-dynamic slot gets.
9798
+ const name = jsFuncNameOf(node, lowerer);
9799
+ const boxed = (e) => {
9800
+ const box = lowerer.coerceToExpected(e, DYN);
9801
+ return box.kind === "dynFrom" && name !== null ? { ...box, fnName: name } : box;
9802
+ };
9803
+ if (fn === "dyn.isSealed" || fn === "dyn.isExtensible") {
9804
+ return { kind: "libCall", fn, args: [boxed(value)], type: BOOL, loc };
9805
+ }
9806
+ const held = lowerer.declareHiddenLocal("%integrityFn", value.type);
9807
+ const ref = () => ({ kind: "varRef", localId: held.id, type: value.type, loc });
9808
+ return {
9809
+ kind: "seqExpr",
9810
+ stmts: [
9811
+ { kind: "varDecl", localId: held.id, init: value, loc },
9812
+ {
9813
+ kind: "exprStmt",
9814
+ expr: { kind: "libCall", fn, args: [boxed(ref())], type: DYN, loc },
9815
+ loc,
9816
+ },
9817
+ ],
9818
+ result: ref(),
9819
+ type: value.type,
9820
+ loc,
9821
+ };
9822
+ }
9823
+ /** A class instance copied into a fresh object (`Object.assign({},
9824
+ * instance)`): the result is a plain object holding the instance's own
9825
+ * fields, never an instance, so a result the checker types as the class has
9826
+ * no representation (the checked cast would throw). */
9827
+ function fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource) {
9828
+ if (rawSource.type.kind !== "object" || ts.isExpressionStatement(call.parent))
9829
+ return;
9830
+ const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
9831
+ if (resultT === null || resultT.kind !== "object")
9832
+ return;
9833
+ lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
9834
+ }
9835
+ /** True when an untyped JavaScript receiver names a binding whose declaring
9836
+ * file assigns it an own `toString` (the TypeScript namespace downlevel
9837
+ * `errorUtil.toString = (message) => ...` in zod): its calls answer what
9838
+ * that function returns, not Object.prototype.toString's string. */
9839
+ function jsAssignsOwnToString(lowerer, receiver) {
9840
+ if (!ts.isIdentifier(receiver))
9841
+ return false;
9842
+ const decl = bindingDeclaration(lowerer, receiver);
9843
+ if (decl === undefined)
9844
+ return false;
9845
+ const sf = ts.getSourceFileOfNode(decl);
9846
+ if (!isJsSourceFile(sf))
9847
+ return false;
9848
+ let targets = lowerer.ownToStringTargets.get(sf);
9849
+ if (targets === undefined) {
9850
+ targets = ownToStringTargets(lowerer, sf);
9851
+ lowerer.ownToStringTargets.set(sf, targets);
9852
+ }
9853
+ return targets.has(decl);
9854
+ }
9855
+ const unparenthesized = (e) => {
9856
+ let out = e;
9857
+ while (ts.isParenthesizedExpression(out))
9858
+ out = out.expression;
9859
+ return out;
9860
+ };
9861
+ /** The declaration of the binding an identifier names, through imports. */
9862
+ function bindingDeclaration(lowerer, id) {
9863
+ let sym = lowerer.checker.getSymbolAtLocation(id);
9864
+ if (sym !== undefined && (sym.flags & ts.SymbolFlags.Alias) !== 0)
9865
+ sym = lowerer.checker.getAliasedSymbol(sym);
9866
+ return sym?.valueDeclaration ?? sym?.declarations?.[0];
9867
+ }
9868
+ /** The declarations of the bindings a file's assignments `x.toString = ...`
9869
+ * (or `x["toString"] = ...`) give an own `toString`. An assignment through
9870
+ * the parameter of an immediately called function counts for the binding
9871
+ * the call passes (`(function (ns) { ns.toString = f; })(ns || (ns = {}))`). */
9872
+ function ownToStringTargets(lowerer, sf) {
9873
+ const targets = new Set();
9874
+ const visit = (node) => {
9875
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
9876
+ const left = unparenthesized(node.left);
9877
+ const named = (ts.isPropertyAccessExpression(left) && left.name.text === "toString") ||
9878
+ (ts.isElementAccessExpression(left) &&
9879
+ ts.isStringLiteralLike(left.argumentExpression) &&
9880
+ left.argumentExpression.text === "toString");
9881
+ const target = named
9882
+ ? unparenthesized(left.expression)
9883
+ : undefined;
9884
+ if (target !== undefined && ts.isIdentifier(target)) {
9885
+ const decl = bindingDeclaration(lowerer, target);
9886
+ if (decl !== undefined) {
9887
+ targets.add(decl);
9888
+ const passed = iifeArgumentDeclaration(lowerer, decl);
9889
+ if (passed !== undefined)
9890
+ targets.add(passed);
9891
+ }
9892
+ }
9893
+ }
9894
+ ts.forEachChild(node, visit);
9895
+ };
9896
+ visit(sf);
9897
+ return targets;
9898
+ }
9899
+ /** For a parameter of an immediately called function, the declaration of
9900
+ * the binding its argument names: `x`, `x || (x = {})` or `(x = {})`. */
9901
+ function iifeArgumentDeclaration(lowerer, param) {
9902
+ if (!ts.isParameter(param))
9903
+ return undefined;
9904
+ const fn = param.parent;
9905
+ if (!ts.isFunctionExpression(fn) && !ts.isArrowFunction(fn))
9906
+ return undefined;
9907
+ let callee = fn;
9908
+ while (ts.isParenthesizedExpression(callee.parent))
9909
+ callee = callee.parent;
9910
+ const call = callee.parent;
9911
+ if (!ts.isCallExpression(call) || call.expression !== callee)
9912
+ return undefined;
9913
+ const index = fn.parameters.nodes.indexOf(param);
9914
+ let arg = index < 0 ? undefined : call.arguments.nodes[index];
9915
+ if (arg === undefined)
9916
+ return undefined;
9917
+ arg = unparenthesized(arg);
9918
+ if (ts.isBinaryExpression(arg) && arg.operatorToken.kind === ts.SyntaxKind.BarBarToken)
9919
+ arg = unparenthesized(arg.left);
9920
+ if (ts.isBinaryExpression(arg) && arg.operatorToken.kind === ts.SyntaxKind.EqualsToken)
9921
+ arg = unparenthesized(arg.left);
9922
+ return ts.isIdentifier(arg) ? bindingDeclaration(lowerer, arg) : undefined;
9923
+ }
9924
+ /** The runtime calls package shims declare as bodiless functions. */
9925
+ const SHIM_INTRINSICS = new Map([
9926
+ ["scriptcUnixDgramSocket", { fn: "dgram.unixSocket", args: [], ret: F64 }],
9927
+ ["scriptcUnixDgramConnect", { fn: "dgram.unixConnect", args: [F64, STRING], ret: F64 }],
9928
+ ["scriptcUnixDgramSend", { fn: "dgram.unixSend", args: [F64, BYTES_U8], ret: F64 }],
9929
+ ["scriptcUnixDgramClose", { fn: "dgram.unixClose", args: [F64], ret: F64 }],
9930
+ ["scriptcResponseLight", { fn: "fetch.responseLight", args: [DYN], ret: arrayOf(STRING) }],
9931
+ ]);
9932
+ function lowerShimIntrinsicCall(lowerer, expr, callee, loc) {
9933
+ const intrinsic = SHIM_INTRINSICS.get(callee.text);
9934
+ if (intrinsic === undefined)
9935
+ return null;
9936
+ const decl = lowerer.checker.getSymbolAtLocation(callee)?.valueDeclaration;
9937
+ if (decl === undefined ||
9938
+ !ts.isFunctionDeclaration(decl) ||
9939
+ decl.body ||
9940
+ !isPackageShimFile(ts.getSourceFileOfNode(decl).fileName) ||
9941
+ expr.arguments.nodes.length !== intrinsic.args.length)
9942
+ return null;
9943
+ const args = expr.arguments.nodes.map((arg, i) => lowerer.lowerExprExpecting(arg, intrinsic.args[i]));
9944
+ return { kind: "libCall", fn: intrinsic.fn, args, type: intrinsic.ret, loc };
9945
+ }
9296
9946
  //# sourceMappingURL=lower-calls.js.map