@scriptc/compiler 0.4.0 → 0.4.2

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 (866) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +617 -83
  2. package/dist/backend/cycle-analysis.d.ts +2 -1
  3. package/dist/backend/cycle-analysis.js +4 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-mutability.d.ts +2 -1
  6. package/dist/backend/cycle-mutability.js +2 -2
  7. package/dist/backend/cycle-mutability.js.map +1 -1
  8. package/dist/backend/executable-features.js +10 -0
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +2 -1
  11. package/dist/backend/immutability.js +2 -2
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/library-pack.js +7 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/link-plan-core.d.ts +2 -0
  16. package/dist/backend/link-plan-core.js +2 -0
  17. package/dist/backend/link-plan-core.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +1 -0
  19. package/dist/backend/link-plan.js +1 -0
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/alloc.d.ts +7 -3
  22. package/dist/backend/llvm/alloc.js +7 -4
  23. package/dist/backend/llvm/alloc.js.map +1 -1
  24. package/dist/backend/llvm/array-search.js +4 -1
  25. package/dist/backend/llvm/array-search.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
  27. package/dist/backend/llvm/bytes-loop-versions.js +115 -19
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/classes.d.ts +99 -2
  32. package/dist/backend/llvm/classes.js +436 -57
  33. package/dist/backend/llvm/classes.js.map +1 -1
  34. package/dist/backend/llvm/classes.test.js +235 -16
  35. package/dist/backend/llvm/classes.test.js.map +1 -1
  36. package/dist/backend/llvm/common.d.ts +21 -5
  37. package/dist/backend/llvm/common.js +50 -5
  38. package/dist/backend/llvm/common.js.map +1 -1
  39. package/dist/backend/llvm/constant-callbacks.js +8 -4
  40. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  41. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  42. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  43. package/dist/backend/llvm/counted-loops.d.ts +4 -1
  44. package/dist/backend/llvm/counted-loops.js +62 -23
  45. package/dist/backend/llvm/counted-loops.js.map +1 -1
  46. package/dist/backend/llvm/dense-array-access.d.ts +3 -1
  47. package/dist/backend/llvm/dense-array-access.js +61 -38
  48. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  49. package/dist/backend/llvm/dense-array-access.test.js +4 -0
  50. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  51. package/dist/backend/llvm/dense-array-loops.d.ts +19 -16
  52. package/dist/backend/llvm/dense-array-loops.js +49 -13
  53. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  54. package/dist/backend/llvm/dense-array-loops.test.js +50 -14
  55. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  56. package/dist/backend/llvm/dyn.d.ts +34 -1
  57. package/dist/backend/llvm/dyn.js +393 -14
  58. package/dist/backend/llvm/dyn.js.map +1 -1
  59. package/dist/backend/llvm/emit-function.js +27 -8
  60. package/dist/backend/llvm/emit-function.js.map +1 -1
  61. package/dist/backend/llvm/emit-module.js +67 -39
  62. package/dist/backend/llvm/emit-module.js.map +1 -1
  63. package/dist/backend/llvm/emit-statements.d.ts +3 -25
  64. package/dist/backend/llvm/emit-statements.js +414 -37
  65. package/dist/backend/llvm/emit-statements.js.map +1 -1
  66. package/dist/backend/llvm/emitter.d.ts +159 -22
  67. package/dist/backend/llvm/emitter.js +573 -89
  68. package/dist/backend/llvm/emitter.js.map +1 -1
  69. package/dist/backend/llvm/expr-async.js +19 -0
  70. package/dist/backend/llvm/expr-async.js.map +1 -1
  71. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  72. package/dist/backend/llvm/expr-bytes.js +110 -40
  73. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  74. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  75. package/dist/backend/llvm/expr-calls.js +51 -26
  76. package/dist/backend/llvm/expr-calls.js.map +1 -1
  77. package/dist/backend/llvm/expr-containers.js +27 -14
  78. package/dist/backend/llvm/expr-containers.js.map +1 -1
  79. package/dist/backend/llvm/expr-control.js +2 -3
  80. package/dist/backend/llvm/expr-control.js.map +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +95 -5
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.js +29 -11
  84. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  85. package/dist/backend/llvm/expr-primitives.test.js +55 -0
  86. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  87. package/dist/backend/llvm/expr-stream-bridges.js +48 -20
  88. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  89. package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
  90. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  91. package/dist/backend/llvm/integer-clones.js +3 -3
  92. package/dist/backend/llvm/integer-clones.js.map +1 -1
  93. package/dist/backend/llvm/js-ic.d.ts +18 -0
  94. package/dist/backend/llvm/js-ic.js +712 -0
  95. package/dist/backend/llvm/js-ic.js.map +1 -0
  96. package/dist/backend/llvm/jsval.js +139 -11
  97. package/dist/backend/llvm/jsval.js.map +1 -1
  98. package/dist/backend/llvm/lib-dispatch.js +10 -0
  99. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  100. package/dist/backend/llvm/lib-filesystem.js +61 -0
  101. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  102. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  103. package/dist/backend/llvm/lib-http2.js +20 -17
  104. package/dist/backend/llvm/lib-http2.js.map +1 -1
  105. package/dist/backend/llvm/lib-process.js +69 -17
  106. package/dist/backend/llvm/lib-process.js.map +1 -1
  107. package/dist/backend/llvm/lib-shared.js +75 -1
  108. package/dist/backend/llvm/lib-shared.js.map +1 -1
  109. package/dist/backend/llvm/lib-stream.js +65 -28
  110. package/dist/backend/llvm/lib-stream.js.map +1 -1
  111. package/dist/backend/llvm/lib-tls.js +23 -0
  112. package/dist/backend/llvm/lib-tls.js.map +1 -1
  113. package/dist/backend/llvm/local-array-reads.js +91 -61
  114. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  115. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  116. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  117. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  118. package/dist/backend/llvm/map-number-lookup.js +43 -7
  119. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  120. package/dist/backend/llvm/narrow-guards.js +64 -0
  121. package/dist/backend/llvm/narrow-guards.js.map +1 -1
  122. package/dist/backend/llvm/publish.d.ts +11 -1
  123. package/dist/backend/llvm/publish.js +80 -22
  124. package/dist/backend/llvm/publish.js.map +1 -1
  125. package/dist/backend/llvm/publish.test.js +3 -0
  126. package/dist/backend/llvm/publish.test.js.map +1 -1
  127. package/dist/backend/llvm/receivers.js +1 -1
  128. package/dist/backend/llvm/receivers.js.map +1 -1
  129. package/dist/backend/llvm/reference-writes.js +2 -0
  130. package/dist/backend/llvm/reference-writes.js.map +1 -1
  131. package/dist/backend/llvm/regex-matchers.js +161 -14
  132. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  133. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  134. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  135. package/dist/backend/llvm/regions.js +2 -2
  136. package/dist/backend/llvm/regions.js.map +1 -1
  137. package/dist/backend/llvm/regions.test.js +7 -1
  138. package/dist/backend/llvm/regions.test.js.map +1 -1
  139. package/dist/backend/llvm/shapes.d.ts +17 -9
  140. package/dist/backend/llvm/shapes.js +21 -17
  141. package/dist/backend/llvm/shapes.js.map +1 -1
  142. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  143. package/dist/backend/llvm/speculative-integers.js +94 -6
  144. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  145. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  146. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  147. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  148. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  149. package/dist/backend/llvm/string-reads.d.ts +4 -1
  150. package/dist/backend/llvm/string-reads.js +88 -4
  151. package/dist/backend/llvm/string-reads.js.map +1 -1
  152. package/dist/backend/llvm/thread-slots.test.js +5 -4
  153. package/dist/backend/llvm/thread-slots.test.js.map +1 -1
  154. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  155. package/dist/backend/llvm/wasm-modules.js +32 -9
  156. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  157. package/dist/backend/mangle.d.ts +8 -0
  158. package/dist/backend/mangle.js +12 -0
  159. package/dist/backend/mangle.js.map +1 -1
  160. package/dist/backend/native/contracts.d.ts +40 -2
  161. package/dist/backend/native/executable.js +40 -7
  162. package/dist/backend/native/executable.js.map +1 -1
  163. package/dist/backend/native/library.js +3 -1
  164. package/dist/backend/native/library.js.map +1 -1
  165. package/dist/backend/native-codegen.d.ts +17 -6
  166. package/dist/backend/native-codegen.js +55 -9
  167. package/dist/backend/native-codegen.js.map +1 -1
  168. package/dist/backend/native-codegen.test.js +18 -14
  169. package/dist/backend/native-codegen.test.js.map +1 -1
  170. package/dist/backend/native-link-info-core.d.ts +30 -2
  171. package/dist/backend/native-link-info-core.js.map +1 -1
  172. package/dist/backend/native-profile.d.ts +32 -0
  173. package/dist/backend/native-profile.js +39 -0
  174. package/dist/backend/native-profile.js.map +1 -0
  175. package/dist/backend/native-profile.test.d.ts +1 -0
  176. package/dist/backend/native-profile.test.js +58 -0
  177. package/dist/backend/native-profile.test.js.map +1 -0
  178. package/dist/backend/native-tools.d.ts +14 -0
  179. package/dist/backend/native-tools.js +13 -0
  180. package/dist/backend/native-tools.js.map +1 -1
  181. package/dist/backend/optimization.d.ts +2 -2
  182. package/dist/backend/runtime-abi.d.ts +2 -2
  183. package/dist/backend/runtime-abi.js +2 -2
  184. package/dist/backend/runtime-pack-core.d.ts +4 -0
  185. package/dist/backend/runtime-pack-core.js +4 -0
  186. package/dist/backend/runtime-pack-core.js.map +1 -1
  187. package/dist/backend/runtime-pack-targets.test.js +7 -1
  188. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  189. package/dist/backend/runtime-pack.d.ts +0 -21
  190. package/dist/backend/runtime-pack.js +0 -29
  191. package/dist/backend/runtime-pack.js.map +1 -1
  192. package/dist/backend/runtime-pack.test.js +12 -69
  193. package/dist/backend/runtime-pack.test.js.map +1 -1
  194. package/dist/backend/target-diagnostics.js +38 -1
  195. package/dist/backend/target-diagnostics.js.map +1 -1
  196. package/dist/backend/warm-cache.js +6 -0
  197. package/dist/backend/warm-cache.js.map +1 -1
  198. package/dist/cli/command.js +89 -7
  199. package/dist/cli/command.js.map +1 -1
  200. package/dist/cli/host.d.ts +3 -0
  201. package/dist/cli/output-options.d.ts +2 -0
  202. package/dist/cli/output-options.js +9 -0
  203. package/dist/cli/output-options.js.map +1 -1
  204. package/dist/cli/usage.d.ts +15 -1
  205. package/dist/cli/usage.js +30 -2
  206. package/dist/cli/usage.js.map +1 -1
  207. package/dist/compile-types.d.ts +9 -0
  208. package/dist/contracts/check.js +2 -3
  209. package/dist/contracts/check.js.map +1 -1
  210. package/dist/coverage/report.d.ts +7 -2
  211. package/dist/coverage/report.js +18 -0
  212. package/dist/coverage/report.js.map +1 -1
  213. package/dist/coverage/verdict-cache.d.ts +1 -0
  214. package/dist/coverage/verdict-cache.js +4 -0
  215. package/dist/coverage/verdict-cache.js.map +1 -1
  216. package/dist/coverage/verdict-semantic.js +4 -0
  217. package/dist/coverage/verdict-semantic.js.map +1 -1
  218. package/dist/diagnostics/diagnostic.js.map +1 -1
  219. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  220. package/dist/diagnostics/dynamic-tier.js +57 -0
  221. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  222. package/dist/diagnostics/envelope.d.ts +2 -1
  223. package/dist/diagnostics/envelope.js +5 -2
  224. package/dist/diagnostics/envelope.js.map +1 -1
  225. package/dist/executable/executable-cache.d.ts +32 -0
  226. package/dist/executable/executable-cache.js +65 -7
  227. package/dist/executable/executable-cache.js.map +1 -1
  228. package/dist/executable/executable-cache.test.js +50 -3
  229. package/dist/executable/executable-cache.test.js.map +1 -1
  230. package/dist/executable/prepare.js +3 -1
  231. package/dist/executable/prepare.js.map +1 -1
  232. package/dist/frontend/analysis.js +1 -0
  233. package/dist/frontend/analysis.js.map +1 -1
  234. package/dist/frontend/arguments-usage.d.ts +8 -0
  235. package/dist/frontend/arguments-usage.js +98 -0
  236. package/dist/frontend/arguments-usage.js.map +1 -1
  237. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  238. package/dist/frontend/arguments-usage.test.js +32 -0
  239. package/dist/frontend/arguments-usage.test.js.map +1 -0
  240. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  241. package/dist/frontend/builtin-package-aliases.js +133 -0
  242. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  243. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  244. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  245. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  246. package/dist/frontend/dispose-hook.d.ts +2 -0
  247. package/dist/frontend/dispose-hook.js +14 -0
  248. package/dist/frontend/dispose-hook.js.map +1 -0
  249. package/dist/frontend/dts-paths.d.ts +4 -0
  250. package/dist/frontend/dts-paths.js +9 -1
  251. package/dist/frontend/dts-paths.js.map +1 -1
  252. package/dist/frontend/jsx-entities.d.ts +4 -0
  253. package/dist/frontend/jsx-entities.js +259 -0
  254. package/dist/frontend/jsx-entities.js.map +1 -0
  255. package/dist/frontend/jsx-source.d.ts +71 -0
  256. package/dist/frontend/jsx-source.js +781 -0
  257. package/dist/frontend/jsx-source.js.map +1 -0
  258. package/dist/frontend/jsx-source.test.d.ts +1 -0
  259. package/dist/frontend/jsx-source.test.js +200 -0
  260. package/dist/frontend/jsx-source.test.js.map +1 -0
  261. package/dist/frontend/literal-values.test.js +8 -9
  262. package/dist/frontend/literal-values.test.js.map +1 -1
  263. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  264. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  265. package/dist/frontend/lowering/array-values.js +3 -2
  266. package/dist/frontend/lowering/array-values.js.map +1 -1
  267. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  268. package/dist/frontend/lowering/binding-analysis.js +2 -2
  269. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  270. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  271. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  272. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  273. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  274. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
  276. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
  277. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
  279. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  281. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  283. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  284. package/dist/frontend/lowering/builtins/crypto.d.ts +7 -2
  285. package/dist/frontend/lowering/builtins/crypto.js +63 -4
  286. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  288. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  289. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  290. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  291. package/dist/frontend/lowering/builtins/dates.js +55 -26
  292. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  294. package/dist/frontend/lowering/builtins/dh.js +151 -0
  295. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  296. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  297. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  298. package/dist/frontend/lowering/builtins/ecdh.d.ts +21 -0
  299. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  300. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  301. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  302. package/dist/frontend/lowering/builtins/errors.js +110 -0
  303. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  304. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  305. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  306. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  307. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  308. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  309. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  310. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  311. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  312. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  313. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  314. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  315. package/dist/frontend/lowering/builtins/json.js +54 -1
  316. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  317. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  318. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  319. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  321. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  322. package/dist/frontend/lowering/builtins/numbers.js +9 -5
  323. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  324. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  325. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  326. package/dist/frontend/lowering/builtins/performance.js +3 -2
  327. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/process.d.ts +9 -0
  329. package/dist/frontend/lowering/builtins/process.js +47 -2
  330. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  331. package/dist/frontend/lowering/builtins/promises.js +3 -2
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
  334. package/dist/frontend/lowering/builtins/promisify-callback.js +23 -4
  335. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
  337. package/dist/frontend/lowering/builtins/readline.js +23 -6
  338. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  339. package/dist/frontend/lowering/builtins/reflection.js +26 -0
  340. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  341. package/dist/frontend/lowering/builtins/strings.js +13 -5
  342. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  343. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  344. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  345. package/dist/frontend/lowering/builtins/timers.js +6 -2
  346. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  348. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  349. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  350. package/dist/frontend/lowering/builtins/url.js +4 -3
  351. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/v8.js +2 -1
  353. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  355. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  356. package/dist/frontend/lowering/call-arguments.js +2 -1
  357. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  358. package/dist/frontend/lowering/call-signatures.d.ts +4 -0
  359. package/dist/frontend/lowering/call-signatures.js +137 -13
  360. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  361. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  362. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  363. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  364. package/dist/frontend/lowering/cjs-exports-object.js +34 -1
  365. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  366. package/dist/frontend/lowering/class-assertions.js +3 -2
  367. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  368. package/dist/frontend/lowering/class-construction.d.ts +2 -1
  369. package/dist/frontend/lowering/class-construction.js +8 -13
  370. package/dist/frontend/lowering/class-construction.js.map +1 -1
  371. package/dist/frontend/lowering/class-descriptors.js +1 -1
  372. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  373. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
  374. package/dist/frontend/lowering/class-dynamic-dispatch.js +577 -152
  375. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  376. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
  377. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  378. package/dist/frontend/lowering/class-method-mutations.js +3 -0
  379. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  380. package/dist/frontend/lowering/class-method-values.js +1 -1
  381. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  382. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  383. package/dist/frontend/lowering/class-protocols.js +117 -7
  384. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  385. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  386. package/dist/frontend/lowering/class-prototypes.js +42 -4
  387. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  388. package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
  389. package/dist/frontend/lowering/class-to-primitive.js +31 -8
  390. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  391. package/dist/frontend/lowering/class-unions.js +2 -1
  392. package/dist/frontend/lowering/class-unions.js.map +1 -1
  393. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  394. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  395. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  396. package/dist/frontend/lowering/coercions/function-adapters.js +105 -75
  397. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  398. package/dist/frontend/lowering/coercions/structural.js +8 -7
  399. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  400. package/dist/frontend/lowering/coercions/unions.js +8 -7
  401. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  402. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  403. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  404. package/dist/frontend/lowering/containers/array-callbacks.d.ts +15 -0
  405. package/dist/frontend/lowering/containers/array-callbacks.js +36 -32
  406. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  407. package/dist/frontend/lowering/containers/array-concat.js +2 -1
  408. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  409. package/dist/frontend/lowering/containers/array-construction.js +32 -4
  410. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  411. package/dist/frontend/lowering/containers/array-methods.js +11 -5
  412. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  413. package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
  414. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  415. package/dist/frontend/lowering/containers/bytes.d.ts +10 -1
  416. package/dist/frontend/lowering/containers/bytes.js +601 -24
  417. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  418. package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
  419. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  420. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  421. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  422. package/dist/frontend/lowering/containers/collection-methods.js +80 -10
  423. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  424. package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
  425. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  426. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  427. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  428. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  429. package/dist/frontend/lowering/containers/string-and-regexp.js +85 -22
  430. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  431. package/dist/frontend/lowering/containers/string-replacement.js +2 -1
  432. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  433. package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
  434. package/dist/frontend/lowering/cycle-initialization.js +177 -39
  435. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  436. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  437. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  438. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  439. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  440. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  441. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  442. package/dist/frontend/lowering/dispatch-sites.js +204 -0
  443. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  444. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  445. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  446. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  447. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  448. package/dist/frontend/lowering/dyn-streams.js +1 -1
  449. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  450. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  451. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  452. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  453. package/dist/frontend/lowering/error-methods.js +4 -0
  454. package/dist/frontend/lowering/error-methods.js.map +1 -1
  455. package/dist/frontend/lowering/expressions/array-literals.js +48 -13
  456. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  457. package/dist/frontend/lowering/expressions/binary.js +124 -8
  458. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  459. package/dist/frontend/lowering/expressions/element-access.js +30 -7
  460. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  461. package/dist/frontend/lowering/expressions/identifiers.js +46 -7
  462. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  463. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
  464. package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
  465. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  466. package/dist/frontend/lowering/expressions/narrowing.js +52 -7
  467. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  468. package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
  469. package/dist/frontend/lowering/expressions/object-literals.js +75 -7
  470. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  471. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  472. package/dist/frontend/lowering/expressions/optional-chains.js +17 -8
  473. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  474. package/dist/frontend/lowering/expressions/property-access.d.ts +5 -4
  475. package/dist/frontend/lowering/expressions/property-access.js +351 -16
  476. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  477. package/dist/frontend/lowering/expressions/relational.js +112 -9
  478. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  479. package/dist/frontend/lowering/expressions/typeof.js +13 -0
  480. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  481. package/dist/frontend/lowering/expressions/updates.js +64 -10
  482. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  483. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  484. package/dist/frontend/lowering/generator-delegation.js +191 -1
  485. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  486. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  487. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  488. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  489. package/dist/frontend/lowering/generic-functions.d.ts +46 -1
  490. package/dist/frontend/lowering/generic-functions.js +660 -73
  491. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  492. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  493. package/dist/frontend/lowering/handle-properties.js +281 -0
  494. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  495. package/dist/frontend/lowering/intern-tables.js +2 -1
  496. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  497. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  498. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  499. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  500. package/dist/frontend/lowering/iterator-adapters.js +9 -8
  501. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  502. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  503. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  504. package/dist/frontend/lowering/json-require.js +2 -1
  505. package/dist/frontend/lowering/json-require.js.map +1 -1
  506. package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
  507. package/dist/frontend/lowering/key-order-witness.js +21 -4
  508. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  509. package/dist/frontend/lowering/key-order-witness.test.js +38 -2
  510. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  511. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  512. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  513. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  514. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  515. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  516. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  517. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  518. package/dist/frontend/lowering/lower-assert.js +6 -5
  519. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  520. package/dist/frontend/lowering/lower-async-iteration.js +3 -1
  521. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  522. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  523. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  524. package/dist/frontend/lowering/lower-calls.d.ts +4 -0
  525. package/dist/frontend/lowering/lower-calls.js +504 -97
  526. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  527. package/dist/frontend/lowering/lower-classes.d.ts +22 -0
  528. package/dist/frontend/lowering/lower-classes.js +339 -32
  529. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  530. package/dist/frontend/lowering/lower-dgram.js +65 -15
  531. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  532. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  533. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  534. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  535. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  536. package/dist/frontend/lowering/lower-exprs.js +148 -12
  537. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  538. package/dist/frontend/lowering/lower-functions.js +308 -72
  539. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  540. package/dist/frontend/lowering/lower-generators.js +10 -4
  541. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  542. package/dist/frontend/lowering/lower-inspect.js +578 -16
  543. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  544. package/dist/frontend/lowering/lower-mixins.js +2 -1
  545. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  546. package/dist/frontend/lowering/lower-mock.js +2 -1
  547. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  548. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  549. package/dist/frontend/lowering/lower-modules.js +227 -72
  550. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  551. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  552. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  553. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  554. package/dist/frontend/lowering/lower-namespaces.js +24 -3
  555. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  556. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  557. package/dist/frontend/lowering/lower-server.js +263 -60
  558. package/dist/frontend/lowering/lower-server.js.map +1 -1
  559. package/dist/frontend/lowering/lower-stdlib.js +39 -18
  560. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  561. package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
  562. package/dist/frontend/lowering/lower-stmts.js +584 -69
  563. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  564. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  565. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  566. package/dist/frontend/lowering/lower-stream.js +575 -165
  567. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  568. package/dist/frontend/lowering/lower-timers.js +21 -4
  569. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  570. package/dist/frontend/lowering/lowerer.d.ts +151 -30
  571. package/dist/frontend/lowering/lowerer.js +725 -84
  572. package/dist/frontend/lowering/lowerer.js.map +1 -1
  573. package/dist/frontend/lowering/lowerer.test.js +21 -9
  574. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  575. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  576. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  577. package/dist/frontend/lowering/native-ffi.js +1 -1
  578. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  579. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  580. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  581. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  582. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  583. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  584. package/dist/frontend/lowering/private-brands.js +66 -15
  585. package/dist/frontend/lowering/private-brands.js.map +1 -1
  586. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  587. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  588. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  589. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  590. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  591. package/dist/frontend/lowering/require-initialization.js +2 -1
  592. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  593. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  594. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  595. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  596. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  597. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  598. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  599. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  600. package/dist/frontend/lowering/site-dependencies.js +84 -0
  601. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  602. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  603. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  604. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  605. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  606. package/dist/frontend/lowering/stable-names.js +35 -0
  607. package/dist/frontend/lowering/stable-names.js.map +1 -0
  608. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  609. package/dist/frontend/lowering/static-typeof.js +172 -0
  610. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  611. package/dist/frontend/lowering/strict-equality.js +2 -1
  612. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  613. package/dist/frontend/lowering/string-index-bounds.js +3 -2
  614. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  615. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  616. package/dist/frontend/lowering/structural-positions.js +108 -0
  617. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  618. package/dist/frontend/lowering/surfaces.js +72 -30
  619. package/dist/frontend/lowering/surfaces.js.map +1 -1
  620. package/dist/frontend/lowering/thenables.d.ts +16 -0
  621. package/dist/frontend/lowering/thenables.js +124 -0
  622. package/dist/frontend/lowering/thenables.js.map +1 -0
  623. package/dist/frontend/lowering/var-hoisting.js +37 -3
  624. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  625. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  626. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  627. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  628. package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
  629. package/dist/frontend/npm-static-bundled-chunks.js +173 -2
  630. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  631. package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
  632. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  633. package/dist/frontend/npm-static-bundled-esm.js +224 -4
  634. package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
  635. package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
  636. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
  637. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  638. package/dist/frontend/npm-static-enum-iife.js +280 -0
  639. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  640. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  641. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  642. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  643. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  644. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  645. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  646. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  647. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  648. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  649. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  650. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  651. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  652. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  653. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  654. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  655. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  656. package/dist/frontend/npm-static-type-exports.js +261 -0
  657. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  658. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  659. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  660. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  661. package/dist/frontend/npm-static-umd.d.ts +6 -0
  662. package/dist/frontend/npm-static-umd.js +203 -0
  663. package/dist/frontend/npm-static-umd.js.map +1 -0
  664. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  665. package/dist/frontend/npm-static-umd.test.js +105 -0
  666. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  667. package/dist/frontend/npm-static.d.ts +16 -0
  668. package/dist/frontend/npm-static.js +93 -3
  669. package/dist/frontend/npm-static.js.map +1 -1
  670. package/dist/frontend/npm.js +13 -0
  671. package/dist/frontend/npm.js.map +1 -1
  672. package/dist/frontend/package-shims.d.ts +47 -0
  673. package/dist/frontend/package-shims.js +300 -0
  674. package/dist/frontend/package-shims.js.map +1 -0
  675. package/dist/frontend/pipeline.js +67 -1
  676. package/dist/frontend/pipeline.js.map +1 -1
  677. package/dist/frontend/program.d.ts +21 -0
  678. package/dist/frontend/program.js +174 -14
  679. package/dist/frontend/program.js.map +1 -1
  680. package/dist/frontend/program.test.js +1 -1
  681. package/dist/frontend/program.test.js.map +1 -1
  682. package/dist/frontend/resolve.js +13 -0
  683. package/dist/frontend/resolve.js.map +1 -1
  684. package/dist/frontend/services.d.ts +12 -0
  685. package/dist/frontend/services.js +37 -0
  686. package/dist/frontend/services.js.map +1 -1
  687. package/dist/frontend/ts7/ast-node.d.ts +21 -7
  688. package/dist/frontend/ts7/ast-node.js +131 -29
  689. package/dist/frontend/ts7/ast-node.js.map +1 -1
  690. package/dist/frontend/ts7/ast-node.test.js +60 -0
  691. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  692. package/dist/frontend/ts7/ast-wire.d.ts +27 -2
  693. package/dist/frontend/ts7/ast-wire.js +124 -21
  694. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  695. package/dist/frontend/ts7/ast.d.ts +23 -2
  696. package/dist/frontend/ts7/ast.js +143 -2
  697. package/dist/frontend/ts7/ast.js.map +1 -1
  698. package/dist/frontend/ts7/checker.d.ts +13 -1
  699. package/dist/frontend/ts7/checker.js +75 -1
  700. package/dist/frontend/ts7/checker.js.map +1 -1
  701. package/dist/frontend/ts7/checker.test.js +9 -6
  702. package/dist/frontend/ts7/checker.test.js.map +1 -1
  703. package/dist/frontend/ts7/enums.d.ts +3 -3
  704. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  705. package/dist/frontend/ts7/enums.generated.js +21 -0
  706. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  707. package/dist/frontend/ts7/enums.js +19 -0
  708. package/dist/frontend/ts7/enums.js.map +1 -1
  709. package/dist/frontend/ts7/program-host.d.ts +6 -5
  710. package/dist/frontend/ts7/program-host.js +12 -2
  711. package/dist/frontend/ts7/program-host.js.map +1 -1
  712. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  713. package/dist/frontend/ts7/semantic-checker.js +25 -20
  714. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  715. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  716. package/dist/frontend/ts7/semantic-json.js +146 -0
  717. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  718. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  719. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  720. package/dist/frontend/ts7/semantic-model.d.ts +18 -0
  721. package/dist/frontend/ts7/semantic-model.js +90 -16
  722. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  723. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  724. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  725. package/dist/frontend/ts7/session.d.ts +19 -4
  726. package/dist/frontend/ts7/session.js +1 -1
  727. package/dist/frontend/ts7/session.js.map +1 -1
  728. package/dist/frontend/tsc-codes.d.ts +1 -1
  729. package/dist/frontend/tsc-codes.js +7 -0
  730. package/dist/frontend/tsc-codes.js.map +1 -1
  731. package/dist/frontend/type-mapper.d.ts +38 -6
  732. package/dist/frontend/type-mapper.js +466 -47
  733. package/dist/frontend/type-mapper.js.map +1 -1
  734. package/dist/frontend/type-mapper.test.js +1 -1
  735. package/dist/frontend/type-mapper.test.js.map +1 -1
  736. package/dist/frontend-process-args.d.ts +4 -0
  737. package/dist/frontend-process-args.js +52 -0
  738. package/dist/frontend-process-args.js.map +1 -0
  739. package/dist/frontend-process-args.test.d.ts +1 -0
  740. package/dist/frontend-process-args.test.js +47 -0
  741. package/dist/frontend-process-args.test.js.map +1 -0
  742. package/dist/frontend-process.d.ts +1 -0
  743. package/dist/frontend-process.js +23 -0
  744. package/dist/frontend-process.js.map +1 -0
  745. package/dist/heap-collection.d.ts +16 -0
  746. package/dist/heap-collection.js +42 -0
  747. package/dist/heap-collection.js.map +1 -0
  748. package/dist/heap-collection.test.d.ts +1 -0
  749. package/dist/heap-collection.test.js +59 -0
  750. package/dist/heap-collection.test.js.map +1 -0
  751. package/dist/heap-pressure.d.ts +2 -0
  752. package/dist/heap-pressure.js +12 -0
  753. package/dist/heap-pressure.js.map +1 -0
  754. package/dist/index.d.ts +8 -0
  755. package/dist/index.js +453 -85
  756. package/dist/index.js.map +1 -1
  757. package/dist/ir/array-length-stability.d.ts +3 -2
  758. package/dist/ir/array-length-stability.js +22 -2
  759. package/dist/ir/array-length-stability.js.map +1 -1
  760. package/dist/ir/array-length-stability.test.js +47 -1
  761. package/dist/ir/array-length-stability.test.js.map +1 -1
  762. package/dist/ir/builtin-effects.js +41 -0
  763. package/dist/ir/builtin-effects.js.map +1 -1
  764. package/dist/ir/builtin-signatures.d.ts +5 -1
  765. package/dist/ir/builtin-signatures.js +187 -16
  766. package/dist/ir/builtin-signatures.js.map +1 -1
  767. package/dist/ir/final-fields.d.ts +2 -1
  768. package/dist/ir/final-fields.js +2 -2
  769. package/dist/ir/final-fields.js.map +1 -1
  770. package/dist/ir/function-references.test.js +2 -0
  771. package/dist/ir/function-references.test.js.map +1 -1
  772. package/dist/ir/int32-slots.d.ts +13 -5
  773. package/dist/ir/int32-slots.js +112 -115
  774. package/dist/ir/int32-slots.js.map +1 -1
  775. package/dist/ir/int32-slots.test.js +3 -1
  776. package/dist/ir/int32-slots.test.js.map +1 -1
  777. package/dist/ir/integer-loop-facts.d.ts +14 -4
  778. package/dist/ir/integer-loop-facts.js +172 -32
  779. package/dist/ir/integer-loop-facts.js.map +1 -1
  780. package/dist/ir/integer-loops.d.ts +49 -0
  781. package/dist/ir/integer-loops.js +193 -39
  782. package/dist/ir/integer-loops.js.map +1 -1
  783. package/dist/ir/integer-loops.test.js +201 -1
  784. package/dist/ir/integer-loops.test.js.map +1 -1
  785. package/dist/ir/integer-ranges.d.ts +10 -1
  786. package/dist/ir/integer-ranges.js +122 -25
  787. package/dist/ir/integer-ranges.js.map +1 -1
  788. package/dist/ir/integer-ranges.test.js +255 -1
  789. package/dist/ir/integer-ranges.test.js.map +1 -1
  790. package/dist/ir/ir.d.ts +17 -2
  791. package/dist/ir/ir.js +11 -1
  792. package/dist/ir/ir.js.map +1 -1
  793. package/dist/ir/js-ic.d.ts +52 -0
  794. package/dist/ir/js-ic.js +199 -0
  795. package/dist/ir/js-ic.js.map +1 -0
  796. package/dist/ir/js-ic.test.d.ts +1 -0
  797. package/dist/ir/js-ic.test.js +148 -0
  798. package/dist/ir/js-ic.test.js.map +1 -0
  799. package/dist/ir/jsval.js +38 -4
  800. package/dist/ir/jsval.js.map +1 -1
  801. package/dist/ir/runtime-features.d.ts +64 -5
  802. package/dist/ir/runtime-features.js +358 -101
  803. package/dist/ir/runtime-features.js.map +1 -1
  804. package/dist/ir/tiers.js +1 -0
  805. package/dist/ir/tiers.js.map +1 -1
  806. package/dist/ir/traverse.d.ts +2 -0
  807. package/dist/ir/traverse.js +124 -70
  808. package/dist/ir/traverse.js.map +1 -1
  809. package/dist/ir/validate.js +77 -24
  810. package/dist/ir/validate.js.map +1 -1
  811. package/dist/ir/validate.test.js +15 -2
  812. package/dist/ir/validate.test.js.map +1 -1
  813. package/dist/library/ir-policy.js +11 -0
  814. package/dist/library/ir-policy.js.map +1 -1
  815. package/dist/library/library-cache.d.ts +2 -0
  816. package/dist/library/library-cache.js.map +1 -1
  817. package/dist/library/prepare.js +2 -0
  818. package/dist/library/prepare.js.map +1 -1
  819. package/dist/native/cli.js +22 -0
  820. package/dist/native/cli.js.map +1 -1
  821. package/dist/native/compiler.js +33 -4
  822. package/dist/native/compiler.js.map +1 -1
  823. package/dist/native/executable-cache.js +3 -0
  824. package/dist/native/executable-cache.js.map +1 -1
  825. package/dist/native/prepare.js +8 -1
  826. package/dist/native/prepare.js.map +1 -1
  827. package/dist/native/sanitizer.test.js +10 -0
  828. package/dist/native/sanitizer.test.js.map +1 -1
  829. package/dist/startup-cache.d.ts +1 -0
  830. package/dist/startup-cache.js +1 -0
  831. package/dist/startup-cache.js.map +1 -1
  832. package/dist/text-parts.d.ts +7 -0
  833. package/dist/text-parts.js +44 -0
  834. package/dist/text-parts.js.map +1 -1
  835. package/dist/text-parts.test.d.ts +1 -0
  836. package/dist/text-parts.test.js +46 -0
  837. package/dist/text-parts.test.js.map +1 -0
  838. package/dist/timing.d.ts +9 -2
  839. package/dist/timing.js +7 -4
  840. package/dist/timing.js.map +1 -1
  841. package/dist/wasm/translate.d.ts +4 -0
  842. package/dist/wasm/translate.js +2 -2
  843. package/dist/wasm/translate.js.map +1 -1
  844. package/package.json +22 -21
  845. package/shims/fs-extra/core/api.ts +1192 -0
  846. package/shims/fs-extra/index.ts +9 -0
  847. package/shims/undici/core/agent.ts +163 -0
  848. package/shims/undici/core/api.ts +93 -0
  849. package/shims/undici/core/client.ts +1304 -0
  850. package/shims/undici/core/connector.ts +157 -0
  851. package/shims/undici/core/diagnostics-types.ts +68 -0
  852. package/shims/undici/core/diagnostics.ts +16 -0
  853. package/shims/undici/core/dispatcher.ts +574 -0
  854. package/shims/undici/core/errors-v5.ts +22 -0
  855. package/shims/undici/core/errors-v7.ts +25 -0
  856. package/shims/undici/core/errors.ts +255 -0
  857. package/shims/undici/core/fetch.ts +635 -0
  858. package/shims/undici/core/pool.ts +280 -0
  859. package/shims/undici/core/readable.ts +268 -0
  860. package/shims/undici/core/request.ts +313 -0
  861. package/shims/undici/core/timers.ts +80 -0
  862. package/shims/undici/core/types.ts +167 -0
  863. package/shims/undici/core/util.ts +67 -0
  864. package/shims/undici/v5.ts +119 -0
  865. package/shims/undici/v7.ts +119 -0
  866. package/surface-manifest.json +20 -52
@@ -1,8 +1,11 @@
1
1
  import { primitiveConstructorOr } from "./lower-exprs.js";
2
+ import { InternalCompilerError } from "../../errors.js";
2
3
  import { dynUndefinedExpr, helperLoc, nodeThrowExpr, varRef } from "../../ir/build.js";
3
4
  import { constructedValue } from "./constructor-returns.js";
4
5
  import { eventTargetApiMembers, eventTargetInheritedMember } from "./lower-event-target.js";
5
- import { BOOL, DYN, F64, DYN_CLASS_PROPERTIES as PROPERTY_BAG, STRING, VOID, canConvertToDyn, canDynCheckTo, isClassOwnEnumerableFieldName, isDynTypedRefType, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
6
+ import { DATE_PROTOTYPE_METHOD_NAMES, DATE_TIME_FIELD, dateInheritedMember, dateRootOf, programDeclaresDateClass, } from "./builtins/date-classes.js";
7
+ import { dateValueMethod } from "./builtins/dates.js";
8
+ import { BOOL, DATE_T, DYN, F64, DYN_CLASS_PROPERTIES as PROPERTY_BAG, STRING, VOID, canConvertToDyn, canDynCheckTo, isClassOwnEnumerableFieldName, isDynTypedRefType, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
6
9
  import { streamTypedRefEligible } from "../../ir/analysis.js";
7
10
  import { everyStmtList, transformExpr, transformStmtList } from "../../ir/traverse.js";
8
11
  import { PoisonError } from "./lowerer.js";
@@ -22,7 +25,8 @@ import { isClassCallback } from "./class-callbacks.js";
22
25
  import { CaughtValueDispatch } from "./caught-value-dispatch.js";
23
26
  import { refreshDescriptorGuards } from "./class-descriptors.js";
24
27
  import { ClassConstructionDispatch } from "./class-construction.js";
25
- import { emitterRooted } from "./lower-event-emitter.js";
28
+ import { DispatchSites } from "./dispatch-sites.js";
29
+ import { emitterRooted, lowerDynamicEmitterEmit, lowerDynamicEmitterOn, } from "./lower-event-emitter.js";
26
30
  import { protocolArm, protocolFieldArm } from "./class-protocol-dispatch.js";
27
31
  import { STREAM_OPERATORS } from "./lower-stream.js";
28
32
  import { deletedPropertyNames, fixedFieldFamily } from "./js-class-fields.js";
@@ -50,6 +54,25 @@ const EMITTER_METHODS = new Set([
50
54
  "off",
51
55
  "removeListener",
52
56
  ]);
57
+ /** The rest of EventEmitter.prototype, answered through an untyped value
58
+ * on emitters that are not streams (streams keep their own surface). */
59
+ const EMITTER_INTROSPECTION_METHODS = new Set([
60
+ "listenerCount",
61
+ "eventNames",
62
+ "removeAllListeners",
63
+ "listeners",
64
+ "rawListeners",
65
+ "setMaxListeners",
66
+ "getMaxListeners",
67
+ ]);
68
+ /** True when the class is or extends one of the runtime stream classes. */
69
+ function streamRooted(info) {
70
+ for (let c = info; c; c = c.base) {
71
+ if (c.builtinStream !== undefined)
72
+ return true;
73
+ }
74
+ return false;
75
+ }
53
76
  const STREAM_BOOL_PROPERTIES = new Set([
54
77
  "readable",
55
78
  "readableEnded",
@@ -128,7 +151,7 @@ const KEY_CALLS = new Map([
128
151
  ["dyn.keyDeleteComputed", "value"],
129
152
  ["dyn.keySetComputed", "value"],
130
153
  ]);
131
- function toPrimitiveHint(expr) {
154
+ export function toPrimitiveHint(expr) {
132
155
  if (expr.kind === "toString")
133
156
  return expr.operand.type.kind === "dyn" ? "string" : null;
134
157
  if (expr.kind === "dynKeyGet")
@@ -176,6 +199,7 @@ function isPrimitive(value, loc) {
176
199
  }
177
200
  export function classInstanceOf(lowerer, value, info, loc, classValue) {
178
201
  const name = `%dyn.class.${classValue ? "valueInstanceof" : "instanceof"}:${info.def.name}`;
202
+ lowerer.shareHelper(name);
179
203
  const params = [
180
204
  { localId: "value", name: "value", type: DYN },
181
205
  ...(classValue ? [{ localId: "class", name: "class", type: classValue.type }] : []),
@@ -185,6 +209,32 @@ export function classInstanceOf(lowerer, value, info, loc, classValue) {
185
209
  const prototype = classPrototypeData(lowerer, info, loc, classValue ? varRef("class", classValue.type, loc) : undefined);
186
210
  const body = prototype
187
211
  ? [
212
+ // In a program that declares a class extending Date, a Date can
213
+ // meet a class test (`date instanceof Moment`): its prototype
214
+ // chain holds no class prototype.
215
+ ...(programDeclaresDateClass(lowerer)
216
+ ? [
217
+ {
218
+ kind: "if",
219
+ cond: {
220
+ kind: "libCall",
221
+ fn: "dyn.nativeDateHandleIs",
222
+ args: [varRef("value", DYN, loc)],
223
+ type: BOOL,
224
+ loc,
225
+ },
226
+ then: [
227
+ {
228
+ kind: "return",
229
+ value: { kind: "boolLit", value: false, type: BOOL, loc },
230
+ loc,
231
+ },
232
+ ],
233
+ else_: null,
234
+ loc,
235
+ },
236
+ ]
237
+ : []),
188
238
  { kind: "varDecl", localId: "candidate", init: varRef("value", DYN, loc), loc },
189
239
  {
190
240
  kind: "while",
@@ -273,9 +323,106 @@ function readOnlyBagBody(body, orEmpty = false) {
273
323
  }
274
324
  return body;
275
325
  }
326
+ /** `value` with the class branch's checked receiver (`p.0` as a dynamic
327
+ * value, possibly cast to the branch's class) replaced by `receiver`, the
328
+ * typed receiver of a per-class helper. */
329
+ function withTypedReceiver(value, receiver) {
330
+ const checked = (e) => e.kind === "dynCheck" && e.value.kind === "varRef" && e.value.localId === "p.0";
331
+ return transformExpr(value, {
332
+ stmt: (stmt) => stmt,
333
+ expr: (expr) => (expr.kind === "downcast" &&
334
+ checked(expr.value) &&
335
+ expr.type.kind === "object" &&
336
+ receiver.type.kind === "object" &&
337
+ expr.type.className === receiver.type.className) ||
338
+ checked(expr)
339
+ ? receiver
340
+ : expr,
341
+ });
342
+ }
343
+ /** Re-adds the classes of `set` after the first `from` in a fixed order:
344
+ * the program's classes by name, then the classes the runtime implements by
345
+ * name. The dispatch helpers add each class's branch in front of the
346
+ * earlier ones, so a runtime class's branch, which answers its methods for
347
+ * instances of the program's subclasses too, is tested before the
348
+ * subclasses' own branches. */
349
+ function sortAdded(lowerer, set, from) {
350
+ const runtime = (name) => {
351
+ const info = lowerer.classes.get(name);
352
+ return !!(info &&
353
+ (info.def.runtime || info.builtinEmitter || info.builtinStream || info.builtinError));
354
+ };
355
+ const added = [...set]
356
+ .slice(from)
357
+ .sort((left, right) => Number(runtime(left)) - Number(runtime(right)) ||
358
+ (left < right ? -1 : left > right ? 1 : 0));
359
+ for (const name of added)
360
+ set.delete(name);
361
+ for (const name of added)
362
+ set.add(name);
363
+ }
364
+ function receiverIndex(lowerer, plans) {
365
+ const methods = new Map();
366
+ const members = new Map();
367
+ const rooted = [];
368
+ const add = (table, name, position) => {
369
+ const positions = table.get(name);
370
+ if (positions === undefined)
371
+ table.set(name, [position]);
372
+ else if (positions[positions.length - 1] !== position)
373
+ positions.push(position);
374
+ };
375
+ plans.forEach(({ info }, position) => {
376
+ if (emitterRooted(lowerer, info) ||
377
+ info.builtinStream !== undefined ||
378
+ eventTargetApiMembers(info) !== null ||
379
+ dateRootOf(info) !== null) {
380
+ rooted.push(position);
381
+ return;
382
+ }
383
+ for (let c = info; c; c = c.base) {
384
+ for (const name of c.methods.keys()) {
385
+ add(methods, name, position);
386
+ // A `get:`/`set:` key is an accessor of the property after the
387
+ // prefix, or a method whose quoted name has that prefix; the test
388
+ // looks up both.
389
+ add(members, name, position);
390
+ if (name.startsWith("get:") || name.startsWith("set:"))
391
+ add(members, name.slice(4), position);
392
+ }
393
+ if (c.genericMethods)
394
+ for (const name of c.genericMethods.keys()) {
395
+ add(methods, name, position);
396
+ add(members, name, position);
397
+ }
398
+ }
399
+ for (const name of info.fields.keys())
400
+ add(members, name, position);
401
+ });
402
+ for (const table of [methods, members])
403
+ for (const positions of table.values())
404
+ positions.sort((a, b) => a - b);
405
+ return { plans, methods, members, rooted };
406
+ }
407
+ /** The ascending union of two ascending position lists. */
408
+ function mergePositions(left, right) {
409
+ const out = [];
410
+ let i = 0;
411
+ let j = 0;
412
+ while (i < left.length || j < right.length) {
413
+ const next = j >= right.length || (i < left.length && left[i] <= right[j]) ? left[i++] : right[j++];
414
+ if (out[out.length - 1] !== next)
415
+ out.push(next);
416
+ }
417
+ return out;
418
+ }
419
+ /** SCRIPTC_CHECK_DISPATCH_CANDIDATES=1 checks every indexed receiver selection
420
+ * against a test of every receiver. */
421
+ const CHECK_CANDIDATES = process.env["SCRIPTC_CHECK_DISPATCH_CANDIDATES"] === "1";
276
422
  export function classPropertiesHelper(lowerer, loc, readOnly = false) {
277
423
  const name = readOnly ? READ_PROPERTIES : "%dyn.class.properties";
278
- const existing = lowerer.liftedFns.find((fn) => fn.name === name);
424
+ lowerer.shareHelper(name);
425
+ const existing = lowerer.liftedFnNamed(name);
279
426
  if (existing)
280
427
  return existing;
281
428
  const helper = {
@@ -309,6 +456,8 @@ export function classPropertiesHelper(lowerer, loc, readOnly = false) {
309
456
  * than that table, so a miss rechecks the instance itself. */
310
457
  export function classForInHasKey(lowerer, value, key, loc) {
311
458
  const name = "%dyn.class.forInHasKey";
459
+ lowerer.shareHelper(name);
460
+ lowerer.shareHelper("%dyn.class.forInBagHas");
312
461
  if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
313
462
  // The read-only table: a recheck never creates an instance's table, which
314
463
  // is undefined while the instance has no own dynamic properties.
@@ -568,6 +717,8 @@ export class ClassDynamicDispatch {
568
717
  generatorDispatch = new GeneratorDynamicDispatch();
569
718
  caughtDispatch = new CaughtValueDispatch();
570
719
  constructionDispatch = new ClassConstructionDispatch();
720
+ /** What each function's body holds for this pass and its sub-passes. */
721
+ sites = new DispatchSites();
571
722
  /** Property names a delete can remove (null: any name), for the field
572
723
  * creation tracking decision. */
573
724
  deletedNames;
@@ -589,6 +740,9 @@ export class ClassDynamicDispatch {
589
740
  /** Per-class prototype selection for new property bags (bagPrototypeHelper). */
590
741
  bagPrototypeHelpers = new Map();
591
742
  readPropertyBags = [];
743
+ /** Read-only bags of exactly one class (exactPropertyBag), by class and
744
+ * whether an absent bag reads as a fresh empty object. */
745
+ exactPropertyBags = new Map();
592
746
  generated = new Set();
593
747
  /** Protocol dispatch helpers and callee reads whose receivers normalize. */
594
748
  protocols = [];
@@ -625,16 +779,18 @@ export class ClassDynamicDispatch {
625
779
  first.value.callee === this.normalization?.name)
626
780
  fn.body.shift();
627
781
  }
628
- let changed = this.caughtDispatch.process(lowerer, functions);
782
+ let changed = this.caughtDispatch.process(lowerer, functions, this.sites);
629
783
  changed = refreshErrorMethodDispatch(lowerer, functions) || changed;
630
784
  changed = refreshClassMethodValueSelections(lowerer) || changed;
631
785
  changed = refreshErrorPropertyDispatch(lowerer, functions) || changed;
632
- changed = this.generatorDispatch.process(lowerer, functions, this.generated) || changed;
633
- changed = this.constructionDispatch.process(lowerer, functions) || changed;
786
+ changed =
787
+ this.generatorDispatch.process(lowerer, functions, this.generated, this.sites) || changed;
788
+ changed = this.constructionDispatch.process(lowerer, functions, this.sites) || changed;
634
789
  const seenTypes = new Set();
635
790
  const rewrite = new Set();
636
791
  const toPrimitiveSites = new Set();
637
792
  const hasKeySites = new Set();
793
+ const caughtSites = new Set();
638
794
  const discover = (type) => {
639
795
  const key = typeKey(type);
640
796
  if (seenTypes.has(key))
@@ -661,83 +817,30 @@ export class ClassDynamicDispatch {
661
817
  else if (type.kind === "promise")
662
818
  discover(type.inner);
663
819
  };
664
- for (const fn of functions)
665
- everyStmtList(fn.body, {
666
- stmt: (statement) => {
667
- // Field-creation instrumentation can box a base-constructor receiver
668
- // even when only its derived instances otherwise cross the boundary.
669
- if (statement.kind === "fieldSet" &&
670
- lowerer.classes.get(statement.className)?.def.tracksOwnFields &&
671
- isClassOwnEnumerableFieldName(statement.field))
672
- discover(statement.obj.type);
673
- return true;
674
- },
675
- expr: (expr) => {
676
- if (expr.kind === "jsonStringify" ||
677
- (expr.kind === "libCall" &&
678
- (expr.fn === "json.stringifyValue" || expr.fn === "json.stringifyReplacer"))) {
679
- this.serializesClasses = true;
680
- }
681
- if (toPrimitiveHint(expr) !== null ||
682
- (expr.kind === "libCall" && (expr.fn === "dyn.valueOf" || expr.fn === "dyn.toString")))
683
- toPrimitiveSites.add(fn);
684
- switch (expr.kind) {
685
- case "dynFrom":
686
- discover(expr.value.type);
687
- break;
688
- case "fieldIncDec":
689
- if (lowerer.classes.get(expr.className)?.def.tracksOwnFields &&
690
- isClassOwnEnumerableFieldName(expr.field))
691
- discover(expr.obj.type);
692
- break;
693
- case "call":
694
- if ((expr.callee === "%dyn.class.properties" ||
695
- expr.callee === "%dyn.class.readProperties") &&
696
- expr.args[0]?.kind === "dynFrom" &&
697
- isDynTypedRefType(expr.args[0].value.type))
698
- rewrite.add(fn);
699
- break;
700
- case "dynHasKey":
701
- hasKeySites.add(fn);
702
- break;
703
- case "dynKeyGet":
704
- case "dynInvoke":
705
- rewrite.add(fn);
706
- break;
707
- case "dynCheck":
708
- if (isDynTypedRefType(expr.type))
709
- rewrite.add(fn);
710
- // A dynamic function checked into a native function type
711
- // receives its arguments as dynamic values: class instances
712
- // passed to it cross the boundary when it is called (a JS
713
- // `list.map((rec) => rec.match(x))` callback with an untyped
714
- // parameter).
715
- if (expr.type.kind === "func")
716
- expr.type.params.forEach(discover);
717
- break;
718
- case "libCall":
719
- if (expr.fn === "bytes.construct" ||
720
- expr.fn === "dyn.keySet" ||
721
- expr.fn === "dyn.keySetComputed" ||
722
- expr.fn === "dyn.iterator" ||
723
- expr.fn === "dyn.arrayFromIterator" ||
724
- expr.fn === "dyn.toString" ||
725
- expr.fn === "dyn.stringConstructor" ||
726
- expr.fn === "dyn.forInKeys" ||
727
- expr.fn === "dyn.forInKeyStrings" ||
728
- expr.fn === "dyn.hasKeyComputed" ||
729
- expr.fn === "dyn.hasOwnComputed" ||
730
- expr.fn === "dyn.propertyIsEnumerableComputed" ||
731
- expr.fn === "dyn.defineProperty" ||
732
- expr.fn === "dyn.getPrototype" ||
733
- expr.fn === "dyn.reflectGet" ||
734
- expr.fn === "dyn.reflectSet")
735
- rewrite.add(fn);
736
- break;
737
- }
738
- return true;
739
- },
740
- });
820
+ const boxedBefore = this.boxed.size;
821
+ const boxedConstructorsBefore = this.boxedConstructors.size;
822
+ for (const fn of functions) {
823
+ const found = this.sites.of(fn);
824
+ // A class starts tracking its own fields during this pass.
825
+ for (const { type, fieldClass } of found.boxing)
826
+ if (fieldClass === undefined || lowerer.classes.get(fieldClass)?.def.tracksOwnFields)
827
+ discover(type);
828
+ if (found.serializes)
829
+ this.serializesClasses = true;
830
+ if (found.conversions)
831
+ toPrimitiveSites.add(fn);
832
+ if (found.dispatches)
833
+ rewrite.add(fn);
834
+ if (found.keyTests)
835
+ hasKeySites.add(fn);
836
+ if (found.caughtClassTests)
837
+ caughtSites.add(fn);
838
+ }
839
+ // The classes this pass found join the tables in a fixed order, not in
840
+ // the order the scan met them.
841
+ sortAdded(lowerer, this.boxed, boxedBefore);
842
+ sortAdded(lowerer, this.boxedConstructors, boxedConstructorsBefore);
843
+ changed = this.caughtDispatch.dynamicPayloads(lowerer, caughtSites, this.boxed) || changed;
741
844
  if (this.boxed.size === 0 && rewrite.size === 0)
742
845
  return changed;
743
846
  const converting = this.convertingHints(lowerer);
@@ -879,7 +982,7 @@ export class ClassDynamicDispatch {
879
982
  const loc = this.propertyBag.loc;
880
983
  const method = classMethodValue(lowerer, info.decl, info, "toJSON", loc);
881
984
  const prototype = method ? classPrototypeData(lowerer, info, loc) : null;
882
- const helper = lowerer.liftedFns.find((fn) => fn.name === info.def.prototypeDataHelper);
985
+ const helper = lowerer.liftedFnNamed(info.def.prototypeDataHelper);
883
986
  const init = helper?.body[0];
884
987
  if (!info.prototypeReflectionReady &&
885
988
  method &&
@@ -1079,15 +1182,36 @@ export class ClassDynamicDispatch {
1079
1182
  }
1080
1183
  refreshDescriptorGuards(lowerer);
1081
1184
  const byMethod = new Map();
1185
+ // A query asks every receiver about one name, and the program's dispatch
1186
+ // sites ask about thousands: index the receivers by name once per list.
1187
+ let index = null;
1188
+ const indexOf = (plans) => index?.plans === plans ? index : (index = receiverIndex(lowerer, plans));
1189
+ /** The receivers of `plans` that can answer `name`, in list order: those
1190
+ * `table` lists under it and the rooted ones. Emit-override
1191
+ * specializations (`emit:<event>`) join a class's methods while bodies
1192
+ * lower, so they keep every receiver. */
1193
+ const receiversFor = (plans, name, table) => {
1194
+ if (name.startsWith("emit:"))
1195
+ return plans;
1196
+ const found = indexOf(plans);
1197
+ const positions = (table === "methods" ? found.methods : found.members).get(name);
1198
+ return mergePositions(positions ?? [], found.rooted).map((position) => plans[position]);
1199
+ };
1082
1200
  const candidates = (method) => {
1083
1201
  const found = byMethod.get(method);
1084
1202
  if (found)
1085
1203
  return found;
1086
- const matching = this.propertyReceivers(lowerer, true).flatMap(({ info }) => {
1204
+ const plans = this.propertyReceivers(lowerer, true);
1205
+ const test = ({ info }) => {
1087
1206
  if (!info || info.fields.has(method) || info.builtinError)
1088
1207
  return [];
1089
1208
  if (emitterRooted(lowerer, info) && EMITTER_METHODS.has(method))
1090
1209
  return [info];
1210
+ if (emitterRooted(lowerer, info) &&
1211
+ !streamRooted(info) &&
1212
+ EMITTER_INTROSPECTION_METHODS.has(method) &&
1213
+ !findMethodOn(lowerer, info, method))
1214
+ return [info];
1091
1215
  if (info.builtinStream) {
1092
1216
  return STREAM_METHODS.has(method) ||
1093
1217
  (STREAM_OPERATORS.has(method) && info.builtinStream !== "w")
@@ -1097,10 +1221,25 @@ export class ClassDynamicDispatch {
1097
1221
  return findMethodOn(lowerer, info, method) || findGenericMethodOn(lowerer, info, method)
1098
1222
  ? [info]
1099
1223
  : [];
1100
- });
1224
+ };
1225
+ const matching = receiversFor(plans, method, "methods").flatMap(test);
1226
+ if (CHECK_CANDIDATES) {
1227
+ const every = plans.flatMap(test);
1228
+ if (every.length !== matching.length || every.some((info, i) => info !== matching[i]))
1229
+ throw new InternalCompilerError(`indexed candidates for ${method} differ`);
1230
+ }
1101
1231
  byMethod.set(method, matching);
1102
1232
  return matching;
1103
1233
  };
1234
+ const candidateSets = new Map();
1235
+ const candidateSet = (method) => {
1236
+ let set = candidateSets.get(method);
1237
+ if (!set) {
1238
+ set = new Set(candidates(method));
1239
+ candidateSets.set(method, set);
1240
+ }
1241
+ return set;
1242
+ };
1104
1243
  for (const fn of functions) {
1105
1244
  // Discovery already visits every expression. Preserve bodies without
1106
1245
  // dispatch sites instead of rebuilding their entire typed IR tree on
@@ -2044,14 +2183,14 @@ export class ClassDynamicDispatch {
2044
2183
  : expr.kind === "dynInvoke"
2045
2184
  ? expr
2046
2185
  : null;
2047
- const staticCandidates = invoke &&
2048
- [...this.boxedConstructors].some((name) => {
2049
- const info = lowerer.classes.get(name);
2050
- return info && findStaticOn(lowerer, info, invoke.method)?.method;
2051
- });
2186
+ // Static methods matter only for methods no instance answers.
2187
+ const staticCandidates = (method) => [...this.boxedConstructors].some((name) => {
2188
+ const info = lowerer.classes.get(name);
2189
+ return info && findStaticOn(lowerer, info, method)?.method;
2190
+ });
2052
2191
  if (!invoke ||
2053
2192
  (candidates(invoke.method).length === 0 &&
2054
- !staticCandidates &&
2193
+ !staticCandidates(invoke.method) &&
2055
2194
  !(invoke.method === "toString" && lowerer.classes.has("%Error"))))
2056
2195
  return expr;
2057
2196
  const key = JSON.stringify([
@@ -2316,17 +2455,41 @@ export class ClassDynamicDispatch {
2316
2455
  });
2317
2456
  changed = true;
2318
2457
  }
2319
- for (const plan of this.propertyReceivers(lowerer, true)) {
2458
+ // Compute the candidates where the first plan would have, so the
2459
+ // memoized set is the same whichever plans are already answered.
2460
+ const plans = this.propertyReceivers(lowerer, true);
2461
+ const matching = plans.length ? candidateSet(dispatch.source.method) : null;
2462
+ for (const plan of plans) {
2320
2463
  const { info } = plan;
2321
- if (!candidates(dispatch.source.method).includes(info) || dispatch.classes.has(plan.key))
2464
+ if (dispatch.classes.has(plan.key) || !matching.has(info))
2322
2465
  continue;
2323
2466
  dispatch.classes.add(plan.key);
2324
2467
  const loc = dispatch.source.loc;
2325
- const value = varRef("p.0", DYN, loc);
2326
2468
  const { receiver, condition } = this.propertyReceiver(plan, loc);
2327
2469
  if (isClassCallback(lowerer, info, dispatch.source.method)) {
2328
2470
  const prototypeMethod = observedPrototypeMethod(lowerer, info, dispatch.source.method, loc, receiver);
2329
- const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
2471
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
2472
+ const methodKey = {
2473
+ kind: "strLit",
2474
+ value: dispatch.source.method,
2475
+ type: STRING,
2476
+ loc,
2477
+ };
2478
+ const bagHas = {
2479
+ kind: "libCall",
2480
+ fn: "dyn.hasKey",
2481
+ args: [bag, methodKey],
2482
+ type: BOOL,
2483
+ loc,
2484
+ };
2485
+ // An observed prototype slot answers through the bag when the bag
2486
+ // holds the name (own or through its prototype). A bag read as a
2487
+ // fresh empty object (an instance with no own dynamic properties
2488
+ // whose bag initializer predates the class's prototype data) does
2489
+ // not, so the method then comes from the class's prototype data.
2490
+ const prototype = prototypeMethod
2491
+ ? classPrototypeData(lowerer, info, loc, receiver)
2492
+ : null;
2330
2493
  dispatch.callback.body.unshift({
2331
2494
  kind: "if",
2332
2495
  cond: condition,
@@ -2335,18 +2498,7 @@ export class ClassDynamicDispatch {
2335
2498
  kind: "return",
2336
2499
  value: {
2337
2500
  kind: "ternary",
2338
- cond: prototypeMethod
2339
- ? { kind: "boolLit", value: true, type: BOOL, loc }
2340
- : {
2341
- kind: "libCall",
2342
- fn: "dyn.hasKey",
2343
- args: [
2344
- bag,
2345
- { kind: "strLit", value: dispatch.source.method, type: STRING, loc },
2346
- ],
2347
- type: BOOL,
2348
- loc,
2349
- },
2501
+ cond: prototype ? { kind: "boolLit", value: true, type: BOOL, loc } : bagHas,
2350
2502
  then: {
2351
2503
  kind: "dynObjLit",
2352
2504
  fields: [
@@ -2354,8 +2506,17 @@ export class ClassDynamicDispatch {
2354
2506
  key: { kind: "strLit", value: "value", type: STRING, loc },
2355
2507
  value: {
2356
2508
  kind: "dynKeyGet",
2357
- value: bag,
2358
- key: { kind: "strLit", value: dispatch.source.method, type: STRING, loc },
2509
+ value: prototype
2510
+ ? {
2511
+ kind: "ternary",
2512
+ cond: bagHas,
2513
+ then: bag,
2514
+ else_: prototype,
2515
+ type: DYN,
2516
+ loc,
2517
+ }
2518
+ : bag,
2519
+ key: methodKey,
2359
2520
  type: DYN,
2360
2521
  loc,
2361
2522
  },
@@ -2462,7 +2623,7 @@ export class ClassDynamicDispatch {
2462
2623
  for (const plan of this.propertyReceivers(lowerer)) {
2463
2624
  if (plan.info !== plan.capsule ||
2464
2625
  dispatch.classes.has(plan.key) ||
2465
- (!dispatch.field && !candidates(dispatch.method).includes(plan.info)))
2626
+ (!dispatch.field && !candidateSet(dispatch.method).has(plan.info)))
2466
2627
  continue;
2467
2628
  dispatch.classes.add(plan.key);
2468
2629
  const loc = dispatch.fn.loc;
@@ -2545,28 +2706,52 @@ export class ClassDynamicDispatch {
2545
2706
  });
2546
2707
  changed = true;
2547
2708
  }
2548
- for (const plan of this.propertyReceivers(lowerer, true)) {
2709
+ // Only the receivers that declare or hold the name, and the rooted
2710
+ // ones, can pass the test, except for names it decides on every
2711
+ // receiver. Fields added while bodies lower (the property bag and the
2712
+ // attribute words) have compiler names, which take every receiver.
2713
+ const plans = this.propertyReceivers(lowerer, true);
2714
+ const anyReceiver = !isClassOwnEnumerableFieldName(dispatch.name) ||
2715
+ dispatch.name === "constructor" ||
2716
+ dispatch.name === "stack";
2717
+ const skips = (plan) => !isClassOwnEnumerableFieldName(dispatch.name) ||
2718
+ (!(plan.info.builtinStream !== undefined && streamProperty(dispatch.name)) &&
2719
+ !eventTargetInheritedMember(plan.info, dispatch.name) &&
2720
+ !dateInheritedMember(lowerer, plan.info, dispatch.name) &&
2721
+ !findMethodOn(lowerer, plan.info, dispatch.name) &&
2722
+ !findGenericMethodOn(lowerer, plan.info, dispatch.name) &&
2723
+ dispatch.name !== "constructor" &&
2724
+ !plan.info.fields.has(dispatch.name) &&
2725
+ !(dispatch.name === "stack" && lowerer.isSubclassOf(plan.info.def.name, "%Error")) &&
2726
+ !findMethodOn(lowerer, plan.info, `get:${dispatch.name}`) &&
2727
+ !findMethodOn(lowerer, plan.info, `set:${dispatch.name}`));
2728
+ const selected = anyReceiver ? plans : receiversFor(plans, dispatch.name, "members");
2729
+ if (CHECK_CANDIDATES &&
2730
+ plans.some((plan) => !dispatch.classes.has(plan.key) && !skips(plan) && !selected.includes(plan)))
2731
+ throw new InternalCompilerError(`indexed receivers for ${dispatch.name} differ`);
2732
+ for (const plan of selected) {
2549
2733
  const { info } = plan;
2550
- if (!isClassOwnEnumerableFieldName(dispatch.name) ||
2551
- (!(info.builtinStream !== undefined && streamProperty(dispatch.name)) &&
2552
- !eventTargetInheritedMember(info, dispatch.name) &&
2553
- !findMethodOn(lowerer, info, dispatch.name) &&
2554
- !findGenericMethodOn(lowerer, info, dispatch.name) &&
2555
- dispatch.name !== "constructor" &&
2556
- !info.fields.has(dispatch.name) &&
2557
- !(dispatch.name === "stack" && lowerer.isSubclassOf(info.def.name, "%Error")) &&
2558
- !findMethodOn(lowerer, info, `get:${dispatch.name}`) &&
2559
- !findMethodOn(lowerer, info, `set:${dispatch.name}`)))
2560
- continue;
2734
+ // Classes answered in an earlier pass skip the member lookups.
2561
2735
  if (dispatch.classes.has(plan.key))
2562
2736
  continue;
2737
+ if (skips(plan))
2738
+ continue;
2563
2739
  dispatch.classes.add(plan.key);
2564
2740
  const loc = dispatch.fn.loc;
2565
2741
  const { receiver, condition } = this.propertyReceiver(plan, loc);
2742
+ // The branch checks its receiver once: each use of the checked
2743
+ // receiver would repeat the check.
2744
+ const local = `receiver.${dispatch.fn.locals.length}`;
2745
+ dispatch.fn.locals.push({
2746
+ id: local,
2747
+ name: "receiver",
2748
+ type: receiver.type,
2749
+ mutable: false,
2750
+ });
2566
2751
  const before = lowerer.diags.length;
2567
2752
  let branch;
2568
2753
  try {
2569
- branch = this.propertyBody(lowerer, dispatch, info, receiver);
2754
+ branch = this.propertyBody(lowerer, dispatch, info, varRef(local, receiver.type, loc));
2570
2755
  }
2571
2756
  catch (error) {
2572
2757
  if (!(error instanceof PoisonError) || !info.decl)
@@ -2579,7 +2764,7 @@ export class ClassDynamicDispatch {
2579
2764
  dispatch.fn.body.unshift({
2580
2765
  kind: "if",
2581
2766
  cond: condition,
2582
- then: branch,
2767
+ then: [{ kind: "varDecl", localId: local, init: receiver, loc }, ...branch],
2583
2768
  else_: null,
2584
2769
  loc,
2585
2770
  });
@@ -2655,7 +2840,8 @@ export class ClassDynamicDispatch {
2655
2840
  },
2656
2841
  ];
2657
2842
  if (((info.builtinStream !== undefined && streamProperty(name)) ||
2658
- eventTargetInheritedMember(info, name)) &&
2843
+ eventTargetInheritedMember(info, name) ||
2844
+ dateInheritedMember(lowerer, info, name)) &&
2659
2845
  dispatch.probe)
2660
2846
  return [
2661
2847
  {
@@ -2671,7 +2857,7 @@ export class ClassDynamicDispatch {
2671
2857
  const prototypeMethod = !info.fields.has(name) && observedPrototypeMethod(lowerer, info, name, loc, receiver);
2672
2858
  if (info.fields.has(name) || (dispatch.probe === "in" && !prototypeMethod)) {
2673
2859
  if (info.fields.has(name) && info.def.tracksOwnFields) {
2674
- const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
2860
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
2675
2861
  const symbol = symbolMemberKey(lowerer, info, name, loc);
2676
2862
  const fn = dispatch.probe === "in"
2677
2863
  ? "dyn.hasKey"
@@ -2696,7 +2882,7 @@ export class ClassDynamicDispatch {
2696
2882
  { kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc },
2697
2883
  ];
2698
2884
  }
2699
- const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
2885
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
2700
2886
  const symbol = name.startsWith("sym:") || name.startsWith("%symbol:");
2701
2887
  const fn = dispatch.probe === "in"
2702
2888
  ? "dyn.hasKey"
@@ -2762,9 +2948,8 @@ export class ClassDynamicDispatch {
2762
2948
  }
2763
2949
  const branches = [];
2764
2950
  if (!dispatch.write && !dispatch.reflect && !info.def.tracksOwnFields) {
2765
- const value = varRef("p.0", DYN, loc);
2766
2951
  const key = varRef("p.key", DYN, loc);
2767
- const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
2952
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
2768
2953
  branches.push({
2769
2954
  kind: "if",
2770
2955
  cond: {
@@ -2866,6 +3051,10 @@ export class ClassDynamicDispatch {
2866
3051
  if (inherited)
2867
3052
  for (const name of inherited)
2868
3053
  names.add(name);
3054
+ if (dateRootOf(info))
3055
+ for (const name of DATE_PROTOTYPE_METHOD_NAMES)
3056
+ if (dateInheritedMember(lowerer, info, name))
3057
+ names.add(name);
2869
3058
  for (let owner = info; owner; owner = owner.base) {
2870
3059
  const methodNames = [...owner.methods.keys()];
2871
3060
  if (owner.genericMethods)
@@ -3105,7 +3294,7 @@ export class ClassDynamicDispatch {
3105
3294
  * each class branch as small as the storing form. */
3106
3295
  readBagHas(lowerer, fn, bag, key, loc) {
3107
3296
  const name = fn === "dyn.hasKey" ? "%dyn.class.bagHas" : "%dyn.class.bagHasComputed";
3108
- let helper = lowerer.liftedFns.find((item) => item.name === name);
3297
+ let helper = lowerer.liftedFnNamed(name);
3109
3298
  if (!helper) {
3110
3299
  const keyType = fn === "dyn.hasKey" ? STRING : DYN;
3111
3300
  const value = varRef("p.0", DYN, loc);
@@ -3498,6 +3687,66 @@ export class ClassDynamicDispatch {
3498
3687
  ];
3499
3688
  return { kind: "if", cond: condition, then: body, else_: null, loc };
3500
3689
  }
3690
+ // Date.prototype[Symbol.toPrimitive] takes "default" as "string", and a
3691
+ // class declared `extends Date` inherits Date's toString and valueOf,
3692
+ // which answer primitives from the time value.
3693
+ const dateRoot = dateRootOf(info);
3694
+ if (dateRoot) {
3695
+ const dateOrder = hint === "number" ? ["valueOf", "toString"] : ["toString", "valueOf"];
3696
+ const { receiver } = this.propertyReceiver(plan, loc);
3697
+ const body = [];
3698
+ for (const method of dateOrder) {
3699
+ if (!conversionMethod(lowerer, info, method)) {
3700
+ const time = {
3701
+ kind: "fieldGet",
3702
+ obj: upcastTo(lowerer, receiver, dateRoot.def.name),
3703
+ className: dateRoot.def.name,
3704
+ field: DATE_TIME_FIELD,
3705
+ type: DATE_T,
3706
+ loc,
3707
+ };
3708
+ body.push({
3709
+ kind: "return",
3710
+ value: lowerer.coerceToExpected(dateValueMethod(method, time, loc), DYN),
3711
+ loc,
3712
+ });
3713
+ break;
3714
+ }
3715
+ const result = `%toPrimitive.${method}.${helper.locals.length}`;
3716
+ helper.locals.push({ id: result, name: method, type: DYN, mutable: false });
3717
+ body.push({
3718
+ kind: "varDecl",
3719
+ localId: result,
3720
+ init: {
3721
+ kind: "call",
3722
+ callee: this.toPrimitiveCall(lowerer, plan, method, 0, loc),
3723
+ args: [varRef("p.0", DYN, loc)],
3724
+ type: DYN,
3725
+ loc,
3726
+ },
3727
+ loc,
3728
+ }, {
3729
+ kind: "if",
3730
+ cond: isPrimitive(varRef(result, DYN, loc), loc),
3731
+ then: [{ kind: "return", value: varRef(result, DYN, loc), loc }],
3732
+ else_: null,
3733
+ loc,
3734
+ });
3735
+ }
3736
+ if (body.at(-1)?.kind !== "return")
3737
+ body.push({
3738
+ kind: "return",
3739
+ value: nodeThrowExpr(1, "", "Cannot convert object to primitive value", DYN, loc),
3740
+ loc,
3741
+ });
3742
+ return {
3743
+ kind: "if",
3744
+ cond: this.propertyReceiver(plan, loc).condition,
3745
+ then: body,
3746
+ else_: null,
3747
+ loc,
3748
+ };
3749
+ }
3501
3750
  const order = hint === "string" ? ["toString", "valueOf"] : ["valueOf", "toString"];
3502
3751
  if (!order.some((method) => conversionMethod(lowerer, info, method)))
3503
3752
  return null;
@@ -3665,7 +3914,7 @@ export class ClassDynamicDispatch {
3665
3914
  readPropertyBagOrEmpty(lowerer, receiver, loc) {
3666
3915
  // One call per read site: large JS programs have a branch per class and
3667
3916
  // property, so the absent-bag handling lives in the shared helper.
3668
- let helper = lowerer.liftedFns.find((fn) => fn.name === READ_PROPERTIES_OR_EMPTY);
3917
+ let helper = lowerer.liftedFnNamed(READ_PROPERTIES_OR_EMPTY);
3669
3918
  if (!helper) {
3670
3919
  // Settled by finalize; until then, the read-only bag's own dispatch.
3671
3920
  helper = {
@@ -3752,6 +4001,86 @@ export class ClassDynamicDispatch {
3752
4001
  lowerer.liftedFns.push(helper);
3753
4002
  return helper;
3754
4003
  }
4004
+ /** The read-only bag a class branch reads for its receiver: the
4005
+ * receiver's own field when the branch selected the receiver's exact
4006
+ * class, otherwise the dispatch over every class (readPropertyBag, or
4007
+ * readPropertyBagOrEmpty with `orEmpty`). */
4008
+ branchPropertyBag(lowerer, info, receiver, orEmpty, loc) {
4009
+ const helper = this.exactPropertyBag(lowerer, info, receiver, orEmpty, loc);
4010
+ if (helper)
4011
+ return { kind: "call", callee: helper.name, args: [receiver], type: DYN, loc };
4012
+ return orEmpty
4013
+ ? this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc)
4014
+ : this.readPropertyBag(lowerer, receiver, loc);
4015
+ }
4016
+ /** `%class.branchProperties[OrEmpty]:<class>(receiver)`: the read-only bag of
4017
+ * an instance of exactly `info`. A class branch of the dispatch helpers
4018
+ * selects a canonical receiver (normalizeDispatches gives an instance its
4019
+ * actual class's capsule), so its branch for `info` sees only instances
4020
+ * of `info`; instances of its subclasses take their own branches. Such a
4021
+ * receiver needs neither the dispatch over every class nor a boxed copy of
4022
+ * itself. Null
4023
+ * when `receiver` is not typed as `info`, when a runtime or builtin class
4024
+ * in the family keeps its own property contract, or before the class has
4025
+ * a bag. */
4026
+ exactPropertyBag(lowerer, info, receiver, orEmpty, loc) {
4027
+ const type = receiver.type;
4028
+ if (type.kind !== "object" || type.className !== info.def.name)
4029
+ return null;
4030
+ for (let current = info; current; current = current.base)
4031
+ if (current.def.runtime ||
4032
+ current.builtinEmitter ||
4033
+ current.builtinStream ||
4034
+ current.builtinError)
4035
+ return null;
4036
+ const key = `${type.className}:${orEmpty}`;
4037
+ const existing = this.exactPropertyBags.get(key);
4038
+ if (existing)
4039
+ return existing;
4040
+ const initializers = this.bagInitializers.get(type.className);
4041
+ if (!initializers)
4042
+ return null;
4043
+ const self = varRef("p.0", type, loc);
4044
+ const bag = {
4045
+ kind: "fieldGet",
4046
+ obj: self,
4047
+ className: type.className,
4048
+ field: PROPERTY_BAG,
4049
+ type: DYN,
4050
+ loc,
4051
+ };
4052
+ const initialize = {
4053
+ ...initializers[0],
4054
+ obj: self,
4055
+ value: withTypedReceiver(initializers[0].value, self),
4056
+ loc,
4057
+ };
4058
+ const helper = {
4059
+ name: `%class.branchProperties${orEmpty ? "OrEmpty" : ""}:${type.className}`,
4060
+ params: [{ localId: "p.0", name: "value", type }],
4061
+ returnType: DYN,
4062
+ locals: [{ id: "p.0", name: "value", type, mutable: false }],
4063
+ loc,
4064
+ body: [
4065
+ {
4066
+ kind: "if",
4067
+ cond: { kind: "dynTest", test: "undefined", value: bag, type: BOOL, loc },
4068
+ then: [initialize],
4069
+ else_: null,
4070
+ loc,
4071
+ },
4072
+ { kind: "return", value: bag, loc },
4073
+ ],
4074
+ };
4075
+ // Initializers gain their prototype as subclasses become constructible;
4076
+ // finalize then turns the lazy store into the read's result.
4077
+ initializers.push(initialize);
4078
+ this.exactPropertyBags.set(key, helper);
4079
+ this.readPropertyBags.push({ helper, initialize, orEmpty });
4080
+ this.generated.add(helper);
4081
+ lowerer.liftedFns.push(helper);
4082
+ return helper;
4083
+ }
3755
4084
  /** The prototype a new property bag of `current` (or of the subclass the
3756
4085
  * receiver is) starts from, or null when `current` has no prototype data.
3757
4086
  * A class with constructible subclasses that have prototype data selects
@@ -3826,9 +4155,13 @@ export class ClassDynamicDispatch {
3826
4155
  * prototype-backed bag is produced for this read only. A published object
3827
4156
  * cannot take the store, and Node's reads never write. */
3828
4157
  finalize(lowerer) {
3829
- for (const { helper, initialize } of this.readPropertyBags) {
4158
+ // Each table serves every site that reaches it.
4159
+ if (lowerer)
4160
+ for (const fn of this.generated)
4161
+ lowerer.shareHelper(fn);
4162
+ for (const { helper, initialize, orEmpty } of this.readPropertyBags) {
3830
4163
  const absent = helper.body[0];
3831
- if (isEmptyBag(initialize.value))
4164
+ if (isEmptyBag(initialize.value) && !orEmpty)
3832
4165
  helper.body.shift();
3833
4166
  else if (absent?.kind === "if")
3834
4167
  absent.then = [{ kind: "return", value: initialize.value, loc: initialize.loc }];
@@ -3997,21 +4330,43 @@ export class ClassDynamicDispatch {
3997
4330
  };
3998
4331
  add(root);
3999
4332
  }
4333
+ /** propertyReceivers results by mode, with the class graph they were
4334
+ * computed from: the boxed classes, the registered classes, the subclass
4335
+ * links and the constructed classes only grow, so equal counts and the
4336
+ * same capsules give the same plans. */
4337
+ receiverPlans = new Map();
4000
4338
  /** A capsule retains its static type, while its object may be a subclass.
4001
4339
  * Preorder insertion lets later branches test the most derived layout first. */
4002
4340
  propertyReceivers(lowerer, streams = false, normalize = true) {
4341
+ const mode = `${streams}:${normalize}`;
4342
+ const revision = `${this.boxed.size}:${lowerer.classes.size}:${lowerer.subclassLinks}:${lowerer.constructedClassCount()}`;
4343
+ const cached = this.receiverPlans.get(mode);
4344
+ if (cached?.revision === revision) {
4345
+ let i = 0;
4346
+ let same = true;
4347
+ for (const name of this.boxed)
4348
+ if (lowerer.classes.get(name) !== cached.capsules[i++])
4349
+ same = false;
4350
+ if (same)
4351
+ return cached.plans;
4352
+ }
4353
+ const capsules = [];
4003
4354
  const plans = [];
4004
4355
  const seen = new Set();
4005
4356
  for (const name of this.boxed) {
4006
4357
  const capsule = lowerer.classes.get(name);
4358
+ capsules.push(capsule);
4007
4359
  if (!capsule ||
4008
4360
  ((capsule.builtinEmitter || capsule.builtinStream) && !streams) ||
4009
4361
  capsule.builtinError)
4010
4362
  continue;
4011
4363
  const canonical = normalize && !capsule.builtinStream && !capsule.builtinEmitter;
4012
4364
  const visit = (info) => {
4013
- if ((!canonical || !seen.has(info.def.name)) &&
4014
- (info === capsule || lowerer.classCanBeConstructed(info))) {
4365
+ // A seen class was visited with its whole subtree, and a canonical
4366
+ // visit adds no plan for a seen class.
4367
+ if (canonical && seen.has(info.def.name))
4368
+ return;
4369
+ if (info === capsule || lowerer.classCanBeConstructed(info)) {
4015
4370
  seen.add(info.def.name);
4016
4371
  plans.push({
4017
4372
  info,
@@ -4024,6 +4379,7 @@ export class ClassDynamicDispatch {
4024
4379
  };
4025
4380
  visit(capsule);
4026
4381
  }
4382
+ this.receiverPlans.set(mode, { revision, capsules, plans });
4027
4383
  return plans;
4028
4384
  }
4029
4385
  propertyReceiver(plan, loc) {
@@ -4204,9 +4560,11 @@ export class ClassDynamicDispatch {
4204
4560
  propertyBody(lowerer, dispatch, info, receiver) {
4205
4561
  const { name, write } = dispatch;
4206
4562
  const loc = dispatch.fn.loc;
4207
- // The inherited EventTarget/Event members of a subclass instance: the
4208
- // runtime's capsule view answers the accessors and method values.
4209
- if (eventTargetInheritedMember(info, name)) {
4563
+ // The inherited EventTarget/Event members of a subclass instance, and
4564
+ // the inherited Date methods of an instance of a class declared
4565
+ // `extends Date`: the runtime's capsule view answers the accessors and
4566
+ // method values.
4567
+ if (eventTargetInheritedMember(info, name) || dateInheritedMember(lowerer, info, name)) {
4210
4568
  const key = { kind: "strLit", value: name, type: STRING, loc };
4211
4569
  if (!write)
4212
4570
  return [
@@ -4348,7 +4706,7 @@ export class ClassDynamicDispatch {
4348
4706
  },
4349
4707
  {
4350
4708
  kind: "if",
4351
- cond: this.readBagHas(lowerer, "dyn.hasKey", this.readPropertyBag(lowerer, receiver, loc), key, loc),
4709
+ cond: this.readBagHas(lowerer, "dyn.hasKey", this.branchPropertyBag(lowerer, info, receiver, false, loc), key, loc),
4352
4710
  then: [store],
4353
4711
  else_: null,
4354
4712
  loc,
@@ -4360,7 +4718,7 @@ export class ClassDynamicDispatch {
4360
4718
  { kind: "return", value: null, loc },
4361
4719
  ];
4362
4720
  }
4363
- const bag = this.readPropertyBag(lowerer, receiver, loc);
4721
+ const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc);
4364
4722
  return [
4365
4723
  {
4366
4724
  kind: "return",
@@ -4418,7 +4776,7 @@ export class ClassDynamicDispatch {
4418
4776
  !info.classDecorators) {
4419
4777
  this.constructors.set(info.def.name, info);
4420
4778
  const cls = lowerer.coerceToExpected(classValueRef(lowerer, info, info.decl), DYN);
4421
- const bag = this.readPropertyBag(lowerer, receiver, loc);
4779
+ const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc);
4422
4780
  const key = { kind: "strLit", value: name, type: STRING, loc };
4423
4781
  return [
4424
4782
  {
@@ -4489,7 +4847,7 @@ export class ClassDynamicDispatch {
4489
4847
  if (symbol || (isClassOwnEnumerableFieldName(name) && !name.startsWith("sym:"))) {
4490
4848
  const prototypeMethod = observedPrototypeMethod(lowerer, info, name, loc, receiver);
4491
4849
  // Selecting the method must not give the object own storage.
4492
- const bag = this.readPropertyBag(lowerer, receiver, loc);
4850
+ const bag = this.branchPropertyBag(lowerer, info, receiver, false, loc);
4493
4851
  const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
4494
4852
  body.push({
4495
4853
  kind: "if",
@@ -4550,7 +4908,7 @@ export class ClassDynamicDispatch {
4550
4908
  }
4551
4909
  if (!field && !accessor) {
4552
4910
  const instance = lowerer.coerceToExpected(receiver, DYN);
4553
- const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc);
4911
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
4554
4912
  const key = { kind: "strLit", value: name, type: STRING, loc };
4555
4913
  const own = {
4556
4914
  kind: "libCall",
@@ -4598,7 +4956,7 @@ export class ClassDynamicDispatch {
4598
4956
  if (boxed.kind === "dynFrom" && mutable(boxed.value.type))
4599
4957
  boxed.liveRef = true;
4600
4958
  if (accessor) {
4601
- const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
4959
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
4602
4960
  const key = { kind: "strLit", value: name, type: STRING, loc };
4603
4961
  return [
4604
4962
  {
@@ -4625,7 +4983,7 @@ export class ClassDynamicDispatch {
4625
4983
  }
4626
4984
  if (field && info.def.tracksOwnFields) {
4627
4985
  const instance = lowerer.coerceToExpected(receiver, DYN);
4628
- const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc);
4986
+ const bag = this.branchPropertyBag(lowerer, info, receiver, true, loc);
4629
4987
  const symbol = symbolMemberKey(lowerer, info, name, loc);
4630
4988
  const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
4631
4989
  return [
@@ -4730,6 +5088,50 @@ export class ClassDynamicDispatch {
4730
5088
  };
4731
5089
  return [store, { kind: "return", value: null, loc }];
4732
5090
  }
5091
+ /** EventEmitter.prototype's introspection and bookkeeping members on an
5092
+ * emitter seen through an untyped value: Node's results over the native
5093
+ * listener registry. */
5094
+ emitterIntrospection(lowerer, dispatch, receiver) {
5095
+ const { method, loc } = dispatch.source;
5096
+ const incoming = dispatch.source.args.map((_, i) => varRef(`p.${i + 1}`, DYN, loc));
5097
+ const ret = (value) => [
5098
+ { kind: "return", value: lowerer.coerceToExpected(value, DYN), loc },
5099
+ ];
5100
+ const call = (fn, args, type) => ({
5101
+ kind: "libCall",
5102
+ fn,
5103
+ args: [receiver, ...args],
5104
+ type,
5105
+ loc,
5106
+ });
5107
+ // Node indexes _events with the argument itself: an omitted name is
5108
+ // the key "undefined".
5109
+ const eventName = () => incoming.length
5110
+ ? lowerer.coerceToExpected(incoming[0], STRING)
5111
+ : { kind: "strLit", value: "undefined", type: STRING, loc };
5112
+ switch (method) {
5113
+ case "listenerCount":
5114
+ return ret(incoming.length >= 2
5115
+ ? call("emitter.countDyn", [eventName(), incoming[1]], F64)
5116
+ : call("emitter.count", [eventName()], F64));
5117
+ case "eventNames":
5118
+ return ret(call("emitter.names", [], { kind: "array", elem: STRING }));
5119
+ case "removeAllListeners":
5120
+ return ret(incoming.length
5121
+ ? call("emitter.removeAll", [eventName(), { kind: "boolLit", value: false, type: BOOL, loc }], receiver.type)
5122
+ : call("emitter.removeAll", [
5123
+ { kind: "strLit", value: "", type: STRING, loc },
5124
+ { kind: "boolLit", value: true, type: BOOL, loc },
5125
+ ], receiver.type));
5126
+ case "listeners":
5127
+ case "rawListeners":
5128
+ return ret(call("emitter.listenersDyn", [eventName()], DYN));
5129
+ case "setMaxListeners":
5130
+ return ret(call("emitter.setMaxChk", [incoming[0] ?? dynUndefinedExpr(loc)], receiver.type));
5131
+ default:
5132
+ return ret(call("emitter.getMax", [], F64));
5133
+ }
5134
+ }
4733
5135
  methodBody(lowerer, dispatch, info, receiver) {
4734
5136
  const { method, loc } = dispatch.source;
4735
5137
  const fence = () => [
@@ -4740,6 +5142,12 @@ export class ClassDynamicDispatch {
4740
5142
  loc,
4741
5143
  },
4742
5144
  ];
5145
+ if (emitterRooted(lowerer, info) &&
5146
+ !streamRooted(info) &&
5147
+ EMITTER_INTROSPECTION_METHODS.has(method) &&
5148
+ !findMethodOn(lowerer, info, method)) {
5149
+ return this.emitterIntrospection(lowerer, dispatch, receiver);
5150
+ }
4743
5151
  if (info.builtinStream ||
4744
5152
  (emitterRooted(lowerer, info) &&
4745
5153
  EMITTER_METHODS.has(method) &&
@@ -4759,10 +5167,14 @@ export class ClassDynamicDispatch {
4759
5167
  if (method === "emit") {
4760
5168
  if (!incoming.length)
4761
5169
  return fence();
4762
- return ret({
5170
+ const event = lowerer.coerceToExpected(incoming[0], STRING);
5171
+ const bridged = streamRooted(info)
5172
+ ? null
5173
+ : lowerDynamicEmitterEmit(lowerer, receiver, event, incoming.slice(1), loc);
5174
+ return ret(bridged ?? {
4763
5175
  kind: "libCall",
4764
- fn: "emitter.emitFlex",
4765
- args: [receiver, lowerer.coerceToExpected(incoming[0], STRING), ...incoming.slice(1)],
5176
+ fn: "emitter.emitAny",
5177
+ args: [receiver, event, ...incoming.slice(1)],
4766
5178
  type: BOOL,
4767
5179
  loc,
4768
5180
  });
@@ -4772,6 +5184,11 @@ export class ClassDynamicDispatch {
4772
5184
  return fence();
4773
5185
  const event = lowerer.coerceToExpected(incoming[0], STRING);
4774
5186
  const cb = incoming[1];
5187
+ const bridged = registering && !streamRooted(info)
5188
+ ? lowerDynamicEmitterOn(lowerer, receiver, event, cb, method === "once" || method === "prependOnceListener", method.startsWith("prepend"), loc)
5189
+ : null;
5190
+ if (bridged)
5191
+ return ret(bridged);
4775
5192
  return [
4776
5193
  {
4777
5194
  kind: "exprStmt",
@@ -4783,7 +5200,7 @@ export class ClassDynamicDispatch {
4783
5200
  fn: registering
4784
5201
  ? info.builtinStream
4785
5202
  ? "stream.onDyn"
4786
- : "emitter.onFlex"
5203
+ : "emitter.onAny"
4787
5204
  : "emitter.offDyn",
4788
5205
  args: [
4789
5206
  receiver,
@@ -4909,7 +5326,15 @@ export class ClassDynamicDispatch {
4909
5326
  if (methodInfo) {
4910
5327
  owner = methodInfo.declarer;
4911
5328
  params = methodInfo.sig.params;
4912
- result = methodInfo.sig.ret;
5329
+ // An untyped async method's `dyn` result is its promise's payload; the
5330
+ // call answers the promise. An async generator method answers its
5331
+ // generator object, which its signature already returns.
5332
+ result =
5333
+ methodInfo.sig.async === true &&
5334
+ !methodInfo.sig.gen &&
5335
+ methodInfo.sig.ret.kind !== "promise"
5336
+ ? { kind: "promise", inner: methodInfo.sig.ret }
5337
+ : methodInfo.sig.ret;
4913
5338
  callee = `%${owner.def.name}.${method}`;
4914
5339
  virtual = lowerer.overrideBelow(owner, method) || methodInfo.sig.abstract === true;
4915
5340
  }