@scriptc/compiler 0.3.6 → 0.4.0

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 (1218) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +682 -50
  2. package/ambient/scriptc.d.ts +134 -0
  3. package/dist/backend/cycle-analysis.d.ts +1 -1
  4. package/dist/backend/cycle-analysis.js +1 -0
  5. package/dist/backend/cycle-analysis.js.map +1 -1
  6. package/dist/backend/cycle-analysis.test.js +13 -1
  7. package/dist/backend/cycle-analysis.test.js.map +1 -1
  8. package/dist/backend/cycle-mutability.js +16 -5
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +13 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.test.js +1 -1
  13. package/dist/backend/library-pack.js +6 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +41 -4
  16. package/dist/backend/llvm/alloc.js +138 -7
  17. package/dist/backend/llvm/alloc.js.map +1 -1
  18. package/dist/backend/llvm/alloc.test.js +30 -1
  19. package/dist/backend/llvm/alloc.test.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.test.js +1 -1
  21. package/dist/backend/llvm/array-search.test.js +1 -1
  22. package/dist/backend/llvm/blocks.d.ts +8 -0
  23. package/dist/backend/llvm/blocks.js +43 -1
  24. package/dist/backend/llvm/blocks.js.map +1 -1
  25. package/dist/backend/llvm/blocks.test.js +22 -1
  26. package/dist/backend/llvm/blocks.test.js.map +1 -1
  27. package/dist/backend/llvm/byte-numbers.js +15 -5
  28. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  29. package/dist/backend/llvm/bytes-alias.d.ts +14 -0
  30. package/dist/backend/llvm/bytes-alias.js +20 -0
  31. package/dist/backend/llvm/bytes-alias.js.map +1 -0
  32. package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
  33. package/dist/backend/llvm/bytes-loop-versions.js +506 -0
  34. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
  35. package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
  36. package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
  37. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
  38. package/dist/backend/llvm/call-lifetimes.js +50 -1
  39. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  40. package/dist/backend/llvm/call-lifetimes.test.js +34 -0
  41. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  42. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  43. package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
  44. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  45. package/dist/backend/llvm/classes.d.ts +11 -0
  46. package/dist/backend/llvm/classes.js +71 -14
  47. package/dist/backend/llvm/classes.js.map +1 -1
  48. package/dist/backend/llvm/classes.test.js +58 -8
  49. package/dist/backend/llvm/classes.test.js.map +1 -1
  50. package/dist/backend/llvm/common.js +1 -0
  51. package/dist/backend/llvm/common.js.map +1 -1
  52. package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
  53. package/dist/backend/llvm/constant-callbacks.js +55 -12
  54. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  55. package/dist/backend/llvm/constant-callbacks.test.js +88 -1
  56. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  57. package/dist/backend/llvm/counted-loops.d.ts +4 -0
  58. package/dist/backend/llvm/counted-loops.js +37 -0
  59. package/dist/backend/llvm/counted-loops.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.d.ts +12 -3
  61. package/dist/backend/llvm/dense-array-access.js +72 -14
  62. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  63. package/dist/backend/llvm/dense-array-access.test.js +59 -3
  64. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
  66. package/dist/backend/llvm/dense-array-loops.js +162 -0
  67. package/dist/backend/llvm/dense-array-loops.js.map +1 -0
  68. package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
  69. package/dist/backend/llvm/dense-array-loops.test.js +128 -0
  70. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
  71. package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
  72. package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
  73. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
  74. package/dist/backend/llvm/dyn.d.ts +28 -4
  75. package/dist/backend/llvm/dyn.js +293 -178
  76. package/dist/backend/llvm/dyn.js.map +1 -1
  77. package/dist/backend/llvm/emit-function.d.ts +64 -0
  78. package/dist/backend/llvm/emit-function.js +1190 -0
  79. package/dist/backend/llvm/emit-function.js.map +1 -0
  80. package/dist/backend/llvm/emit-module.d.ts +24 -0
  81. package/dist/backend/llvm/emit-module.js +1535 -0
  82. package/dist/backend/llvm/emit-module.js.map +1 -0
  83. package/dist/backend/llvm/emit-statements.d.ts +58 -0
  84. package/dist/backend/llvm/emit-statements.js +1964 -0
  85. package/dist/backend/llvm/emit-statements.js.map +1 -0
  86. package/dist/backend/llvm/emitter.d.ts +547 -283
  87. package/dist/backend/llvm/emitter.js +689 -4643
  88. package/dist/backend/llvm/emitter.js.map +1 -1
  89. package/dist/backend/llvm/emitter.test.js +57 -3
  90. package/dist/backend/llvm/emitter.test.js.map +1 -1
  91. package/dist/backend/llvm/expr-async.js +73 -46
  92. package/dist/backend/llvm/expr-async.js.map +1 -1
  93. package/dist/backend/llvm/expr-async.test.js +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +2 -0
  95. package/dist/backend/llvm/expr-bytes.js +76 -29
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
  98. package/dist/backend/llvm/expr-callbacks.js +48 -11
  99. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  100. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  101. package/dist/backend/llvm/expr-calls.js +71 -53
  102. package/dist/backend/llvm/expr-calls.js.map +1 -1
  103. package/dist/backend/llvm/expr-calls.test.js +1 -1
  104. package/dist/backend/llvm/expr-containers.js +39 -15
  105. package/dist/backend/llvm/expr-containers.js.map +1 -1
  106. package/dist/backend/llvm/expr-control.js +16 -16
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
  109. package/dist/backend/llvm/expr-dynamic.js +67 -62
  110. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  111. package/dist/backend/llvm/expr-primitives.js +121 -25
  112. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  113. package/dist/backend/llvm/expr-primitives.test.js +2 -2
  114. package/dist/backend/llvm/expr-records.d.ts +1 -1
  115. package/dist/backend/llvm/expr-records.js +32 -11
  116. package/dist/backend/llvm/expr-records.js.map +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.js +54 -12
  118. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  119. package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
  120. package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
  121. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  122. package/dist/backend/llvm/int32-abi.test.js +2 -2
  123. package/dist/backend/llvm/integer-clones.test.js +3 -3
  124. package/dist/backend/llvm/integer-remainder.d.ts +34 -13
  125. package/dist/backend/llvm/integer-remainder.js +156 -22
  126. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  127. package/dist/backend/llvm/intern-tables.test.js +1 -1
  128. package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
  129. package/dist/backend/llvm/jsval-encoding.js +20 -0
  130. package/dist/backend/llvm/jsval-encoding.js.map +1 -0
  131. package/dist/backend/llvm/jsval.d.ts +12 -0
  132. package/dist/backend/llvm/jsval.js +488 -0
  133. package/dist/backend/llvm/jsval.js.map +1 -0
  134. package/dist/backend/llvm/lazy-captures.d.ts +12 -2
  135. package/dist/backend/llvm/lazy-captures.js +39 -17
  136. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  137. package/dist/backend/llvm/lib-abi.js +1 -1
  138. package/dist/backend/llvm/lib-abi.js.map +1 -1
  139. package/dist/backend/llvm/lib-connect.js +1 -1
  140. package/dist/backend/llvm/lib-connect.js.map +1 -1
  141. package/dist/backend/llvm/lib-datagram.js +14 -8
  142. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  143. package/dist/backend/llvm/lib-dispatch.js +189 -23
  144. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  145. package/dist/backend/llvm/lib-filesystem.js +42 -13
  146. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  147. package/dist/backend/llvm/lib-http2.js +3 -3
  148. package/dist/backend/llvm/lib-http2.js.map +1 -1
  149. package/dist/backend/llvm/lib-lookup.js +2 -2
  150. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  151. package/dist/backend/llvm/lib-network.js +56 -22
  152. package/dist/backend/llvm/lib-network.js.map +1 -1
  153. package/dist/backend/llvm/lib-process.js +90 -50
  154. package/dist/backend/llvm/lib-process.js.map +1 -1
  155. package/dist/backend/llvm/lib-shared.d.ts +12 -0
  156. package/dist/backend/llvm/lib-shared.js +187 -6
  157. package/dist/backend/llvm/lib-shared.js.map +1 -1
  158. package/dist/backend/llvm/lib-stream.js +46 -16
  159. package/dist/backend/llvm/lib-stream.js.map +1 -1
  160. package/dist/backend/llvm/lib-test.js +43 -7
  161. package/dist/backend/llvm/lib-test.js.map +1 -1
  162. package/dist/backend/llvm/lib-tls.js +4 -9
  163. package/dist/backend/llvm/lib-tls.js.map +1 -1
  164. package/dist/backend/llvm/local-array-reads.js +2 -2
  165. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  166. package/dist/backend/llvm/local-extents.d.ts +19 -0
  167. package/dist/backend/llvm/local-extents.js +169 -0
  168. package/dist/backend/llvm/local-extents.js.map +1 -0
  169. package/dist/backend/llvm/local-extents.test.d.ts +1 -0
  170. package/dist/backend/llvm/local-extents.test.js +92 -0
  171. package/dist/backend/llvm/local-extents.test.js.map +1 -0
  172. package/dist/backend/llvm/local-union-storage.js +7 -7
  173. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  174. package/dist/backend/llvm/local-union-storage.test.js +2 -2
  175. package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
  176. package/dist/backend/llvm/map-number-lookup.js +2 -2
  177. package/dist/backend/llvm/map-number-lookup.test.js +2 -2
  178. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  179. package/dist/backend/llvm/narrow-guards.d.ts +38 -0
  180. package/dist/backend/llvm/narrow-guards.js +151 -0
  181. package/dist/backend/llvm/narrow-guards.js.map +1 -0
  182. package/dist/backend/llvm/nullable-unions.d.ts +64 -6
  183. package/dist/backend/llvm/nullable-unions.js +103 -6
  184. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  185. package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
  186. package/dist/backend/llvm/nullable-unions.test.js +65 -0
  187. package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
  188. package/dist/backend/llvm/publish.d.ts +4 -0
  189. package/dist/backend/llvm/publish.js +14 -2
  190. package/dist/backend/llvm/publish.js.map +1 -1
  191. package/dist/backend/llvm/publish.test.js +1 -1
  192. package/dist/backend/llvm/receivers.d.ts +31 -0
  193. package/dist/backend/llvm/receivers.js +395 -0
  194. package/dist/backend/llvm/receivers.js.map +1 -0
  195. package/dist/backend/llvm/record-results.d.ts +12 -1
  196. package/dist/backend/llvm/record-results.js +64 -4
  197. package/dist/backend/llvm/record-results.js.map +1 -1
  198. package/dist/backend/llvm/reference-effects.js +9 -0
  199. package/dist/backend/llvm/reference-effects.js.map +1 -1
  200. package/dist/backend/llvm/reference-writes.d.ts +4 -0
  201. package/dist/backend/llvm/reference-writes.js +142 -6
  202. package/dist/backend/llvm/reference-writes.js.map +1 -1
  203. package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
  204. package/dist/backend/llvm/reference-writes.test.js +88 -0
  205. package/dist/backend/llvm/reference-writes.test.js.map +1 -0
  206. package/dist/backend/llvm/regex-matchers.d.ts +8 -0
  207. package/dist/backend/llvm/regex-matchers.js +33 -0
  208. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  209. package/dist/backend/llvm/regex-matchers.test.js +23 -1
  210. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  211. package/dist/backend/llvm/regions.d.ts +1 -1
  212. package/dist/backend/llvm/regions.js +9 -6
  213. package/dist/backend/llvm/regions.js.map +1 -1
  214. package/dist/backend/llvm/regions.test.js +1 -1
  215. package/dist/backend/llvm/shapes.d.ts +66 -43
  216. package/dist/backend/llvm/shapes.js +280 -21
  217. package/dist/backend/llvm/shapes.js.map +1 -1
  218. package/dist/backend/llvm/shapes.test.js +37 -3
  219. package/dist/backend/llvm/shapes.test.js.map +1 -1
  220. package/dist/backend/llvm/split-loops.js +2 -2
  221. package/dist/backend/llvm/split-loops.js.map +1 -1
  222. package/dist/backend/llvm/stack-objects.d.ts +26 -6
  223. package/dist/backend/llvm/stack-objects.js +133 -10
  224. package/dist/backend/llvm/stack-objects.js.map +1 -1
  225. package/dist/backend/llvm/stack-objects.test.js +55 -1
  226. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  227. package/dist/backend/llvm/stack-unions.test.js +1 -1
  228. package/dist/backend/llvm/string-construction.test.js +1 -1
  229. package/dist/backend/llvm/string-lifetimes.test.js +15 -14
  230. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  231. package/dist/backend/llvm/string-slices.d.ts +25 -0
  232. package/dist/backend/llvm/string-slices.js +207 -1
  233. package/dist/backend/llvm/string-slices.js.map +1 -1
  234. package/dist/backend/llvm/string-slices.test.js +139 -2
  235. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  236. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  237. package/dist/backend/llvm/thread-slots.d.ts +5 -0
  238. package/dist/backend/llvm/thread-slots.js +142 -0
  239. package/dist/backend/llvm/thread-slots.js.map +1 -0
  240. package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
  241. package/dist/backend/llvm/thread-slots.test.js +110 -0
  242. package/dist/backend/llvm/thread-slots.test.js.map +1 -0
  243. package/dist/backend/llvm/union-repr.d.ts +7 -7
  244. package/dist/backend/llvm/union-repr.js +18 -2
  245. package/dist/backend/llvm/union-repr.js.map +1 -1
  246. package/dist/backend/llvm/union-retype.test.js +17 -3
  247. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  248. package/dist/backend/llvm/walkers.d.ts +2 -2
  249. package/dist/backend/llvm/walkers.js +51 -26
  250. package/dist/backend/llvm/walkers.js.map +1 -1
  251. package/dist/backend/llvm/wasm-modules.d.ts +16 -0
  252. package/dist/backend/llvm/wasm-modules.js +66 -0
  253. package/dist/backend/llvm/wasm-modules.js.map +1 -0
  254. package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
  255. package/dist/backend/llvm/wrapping-sums.js +11 -3
  256. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  257. package/dist/backend/mangle.d.ts +7 -0
  258. package/dist/backend/mangle.js +11 -0
  259. package/dist/backend/mangle.js.map +1 -1
  260. package/dist/backend/may-throw.d.ts +3 -0
  261. package/dist/backend/may-throw.js +4 -2
  262. package/dist/backend/may-throw.js.map +1 -1
  263. package/dist/backend/may-throw.test.js +1 -1
  264. package/dist/backend/native/contracts.d.ts +37 -0
  265. package/dist/backend/native/executable.js +192 -137
  266. package/dist/backend/native/executable.js.map +1 -1
  267. package/dist/backend/native/library.js +1 -0
  268. package/dist/backend/native/library.js.map +1 -1
  269. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  270. package/dist/backend/native/runtime-inputs.js +1 -0
  271. package/dist/backend/native/runtime-inputs.js.map +1 -1
  272. package/dist/backend/native-link-info-core.d.ts +30 -0
  273. package/dist/backend/native-link-info-core.js.map +1 -1
  274. package/dist/backend/publication.test.js +1 -1
  275. package/dist/backend/runtime-pack-core.d.ts +9 -1
  276. package/dist/backend/runtime-pack-core.js +10 -1
  277. package/dist/backend/runtime-pack-core.js.map +1 -1
  278. package/dist/backend/runtime-pack-native.js +1 -1
  279. package/dist/backend/runtime-pack-native.js.map +1 -1
  280. package/dist/backend/runtime-pack-native.test.d.ts +1 -0
  281. package/dist/backend/runtime-pack-native.test.js +31 -0
  282. package/dist/backend/runtime-pack-native.test.js.map +1 -0
  283. package/dist/backend/runtime-pack-targets.test.js +5 -0
  284. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  285. package/dist/backend/runtime-pack.test.js +5 -0
  286. package/dist/backend/runtime-pack.test.js.map +1 -1
  287. package/dist/backend/stack-observations.d.ts +22 -0
  288. package/dist/backend/stack-observations.js +382 -0
  289. package/dist/backend/stack-observations.js.map +1 -0
  290. package/dist/backend/stack-observations.test.d.ts +1 -0
  291. package/dist/backend/stack-observations.test.js +233 -0
  292. package/dist/backend/stack-observations.test.js.map +1 -0
  293. package/dist/backend/target-diagnostics.js +8 -0
  294. package/dist/backend/target-diagnostics.js.map +1 -1
  295. package/dist/backend/target-diagnostics.test.js +1 -1
  296. package/dist/backend/warm-cache.js +5 -0
  297. package/dist/backend/warm-cache.js.map +1 -1
  298. package/dist/backend/young-nursery.d.ts +7 -0
  299. package/dist/backend/young-nursery.js +10 -0
  300. package/dist/backend/young-nursery.js.map +1 -0
  301. package/dist/cli/command.js +44 -4
  302. package/dist/cli/command.js.map +1 -1
  303. package/dist/cli/usage.d.ts +11 -1
  304. package/dist/cli/usage.js +20 -1
  305. package/dist/cli/usage.js.map +1 -1
  306. package/dist/compat/fetch-profile.js +10 -1
  307. package/dist/compat/fetch-profile.js.map +1 -1
  308. package/dist/compile-types.d.ts +13 -0
  309. package/dist/contracts/check.js +24 -6
  310. package/dist/contracts/check.js.map +1 -1
  311. package/dist/contracts/int32-elements.d.ts +115 -0
  312. package/dist/contracts/int32-elements.js +1179 -0
  313. package/dist/contracts/int32-elements.js.map +1 -0
  314. package/dist/coverage/report.d.ts +16 -0
  315. package/dist/coverage/report.js +182 -1
  316. package/dist/coverage/report.js.map +1 -1
  317. package/dist/coverage/surface-manifest.js +16 -3
  318. package/dist/coverage/surface-manifest.js.map +1 -1
  319. package/dist/coverage/verdict-cache.d.ts +2 -0
  320. package/dist/coverage/verdict-cache.js +12 -0
  321. package/dist/coverage/verdict-cache.js.map +1 -1
  322. package/dist/coverage/verdict-cache.test.js +2 -1
  323. package/dist/coverage/verdict-cache.test.js.map +1 -1
  324. package/dist/diagnostics/diagnostic.d.ts +10 -6
  325. package/dist/diagnostics/diagnostic.js +29 -21
  326. package/dist/diagnostics/diagnostic.js.map +1 -1
  327. package/dist/diagnostics/envelope.d.ts +39 -2
  328. package/dist/diagnostics/envelope.js.map +1 -1
  329. package/dist/diagnostics/render.d.ts +7 -0
  330. package/dist/diagnostics/render.js +50 -13
  331. package/dist/diagnostics/render.js.map +1 -1
  332. package/dist/diagnostics/render.test.d.ts +1 -0
  333. package/dist/diagnostics/render.test.js +49 -0
  334. package/dist/diagnostics/render.test.js.map +1 -0
  335. package/dist/executable/executable-cache.d.ts +17 -0
  336. package/dist/executable/executable-cache.js +13 -1
  337. package/dist/executable/executable-cache.js.map +1 -1
  338. package/dist/executable/executable-cache.test.js +7 -1
  339. package/dist/executable/executable-cache.test.js.map +1 -1
  340. package/dist/executable/prepare.js +2 -1
  341. package/dist/executable/prepare.js.map +1 -1
  342. package/dist/frontend/analysis.js +6 -1
  343. package/dist/frontend/analysis.js.map +1 -1
  344. package/dist/frontend/builtin-modules.d.ts +16 -2
  345. package/dist/frontend/builtin-modules.js +40 -7
  346. package/dist/frontend/builtin-modules.js.map +1 -1
  347. package/dist/frontend/cjs-syntax.js +52 -51
  348. package/dist/frontend/cjs-syntax.js.map +1 -1
  349. package/dist/frontend/contract-types.d.ts +3 -0
  350. package/dist/frontend/contract-types.js +36 -7
  351. package/dist/frontend/contract-types.js.map +1 -1
  352. package/dist/frontend/experimental-import.d.ts +5 -1
  353. package/dist/frontend/experimental-import.js +26 -7
  354. package/dist/frontend/experimental-import.js.map +1 -1
  355. package/dist/frontend/fork-target.js +20 -22
  356. package/dist/frontend/fork-target.js.map +1 -1
  357. package/dist/frontend/fork-target.test.js +2 -1
  358. package/dist/frontend/fork-target.test.js.map +1 -1
  359. package/dist/frontend/function-completion.js +6 -6
  360. package/dist/frontend/function-completion.js.map +1 -1
  361. package/dist/frontend/helper-tokens.js +15 -3
  362. package/dist/frontend/helper-tokens.js.map +1 -1
  363. package/dist/frontend/helper-tokens.test.js +7 -1
  364. package/dist/frontend/helper-tokens.test.js.map +1 -1
  365. package/dist/frontend/inferred-js-diagnostics.js +14 -17
  366. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  367. package/dist/frontend/input-tracker.d.ts +3 -0
  368. package/dist/frontend/input-tracker.js +32 -3
  369. package/dist/frontend/input-tracker.js.map +1 -1
  370. package/dist/frontend/lib-contract.js +36 -32
  371. package/dist/frontend/lib-contract.js.map +1 -1
  372. package/dist/frontend/lib-exports.js +3 -3
  373. package/dist/frontend/lib-exports.js.map +1 -1
  374. package/dist/frontend/lowering/array-values.d.ts +8 -3
  375. package/dist/frontend/lowering/array-values.js +60 -11
  376. package/dist/frontend/lowering/array-values.js.map +1 -1
  377. package/dist/frontend/lowering/assert-instances.js +4 -4
  378. package/dist/frontend/lowering/assert-instances.js.map +1 -1
  379. package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
  380. package/dist/frontend/lowering/assertion-identity.js +70 -0
  381. package/dist/frontend/lowering/assertion-identity.js.map +1 -0
  382. package/dist/frontend/lowering/assertion-members.d.ts +28 -0
  383. package/dist/frontend/lowering/assertion-members.js +185 -0
  384. package/dist/frontend/lowering/assertion-members.js.map +1 -0
  385. package/dist/frontend/lowering/binding-analysis.js +27 -20
  386. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  387. package/dist/frontend/lowering/builtin-calls.js +63 -5
  388. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  389. package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
  390. package/dist/frontend/lowering/builtin-function-fences.js +42 -0
  391. package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
  392. package/dist/frontend/lowering/builtins/arguments.js +1 -1
  393. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  394. package/dist/frontend/lowering/builtins/async-context.js +53 -52
  395. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/atomics.js +6 -6
  397. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  398. package/dist/frontend/lowering/builtins/blob.js +8 -6
  399. package/dist/frontend/lowering/builtins/blob.js.map +1 -1
  400. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +23 -0
  401. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +156 -0
  402. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
  403. package/dist/frontend/lowering/builtins/callable-aliases.js +16 -5
  404. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  405. package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
  406. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  407. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
  408. package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
  409. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  410. package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
  411. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  412. package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
  413. package/dist/frontend/lowering/builtins/child-process.js +85 -61
  414. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  415. package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
  416. package/dist/frontend/lowering/builtins/class-values.js +226 -0
  417. package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
  418. package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
  419. package/dist/frontend/lowering/builtins/compression.js +107 -44
  420. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  421. package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
  422. package/dist/frontend/lowering/builtins/constants.js +28 -7
  423. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  424. package/dist/frontend/lowering/builtins/crypto.d.ts +19 -0
  425. package/dist/frontend/lowering/builtins/crypto.js +211 -37
  426. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
  428. package/dist/frontend/lowering/builtins/dates.js +92 -16
  429. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  430. package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
  431. package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
  432. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
  433. package/dist/frontend/lowering/builtins/environment.js +3 -3
  434. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  435. package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
  436. package/dist/frontend/lowering/builtins/errors.js +169 -3
  437. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  438. package/dist/frontend/lowering/builtins/filesystem-calls.js +128 -116
  439. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  440. package/dist/frontend/lowering/builtins/filesystem.js +77 -77
  441. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  442. package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
  443. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  444. package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
  445. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  446. package/dist/frontend/lowering/builtins/ipc.js +45 -8
  447. package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
  448. package/dist/frontend/lowering/builtins/json.js +232 -24
  449. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  450. package/dist/frontend/lowering/builtins/key-object.js +4 -4
  451. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  452. package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
  453. package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
  454. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  455. package/dist/frontend/lowering/builtins/module-calls.js +55 -44
  456. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  457. package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
  458. package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
  459. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  460. package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
  461. package/dist/frontend/lowering/builtins/navigator.js +40 -0
  462. package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
  463. package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
  464. package/dist/frontend/lowering/builtins/net-address.js +156 -0
  465. package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
  466. package/dist/frontend/lowering/builtins/numbers.js +25 -9
  467. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  468. package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
  469. package/dist/frontend/lowering/builtins/operating-system.js +25 -12
  470. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  471. package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
  472. package/dist/frontend/lowering/builtins/performance.js +259 -8
  473. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  474. package/dist/frontend/lowering/builtins/process.d.ts +32 -1
  475. package/dist/frontend/lowering/builtins/process.js +461 -99
  476. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  477. package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
  478. package/dist/frontend/lowering/builtins/promises.js +326 -43
  479. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  480. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +37 -0
  481. package/dist/frontend/lowering/builtins/promisify-callback.js +320 -0
  482. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
  483. package/dist/frontend/lowering/builtins/properties.js +37 -1
  484. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  485. package/dist/frontend/lowering/builtins/querystring.js +14 -14
  486. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  487. package/dist/frontend/lowering/builtins/readline.d.ts +12 -2
  488. package/dist/frontend/lowering/builtins/readline.js +136 -39
  489. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  490. package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
  491. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
  492. package/dist/frontend/lowering/builtins/reflection.js +16 -14
  493. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  494. package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
  495. package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
  496. package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
  497. package/dist/frontend/lowering/builtins/strings.js +101 -12
  498. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  499. package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
  500. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  501. package/dist/frontend/lowering/builtins/timers.js +75 -30
  502. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  503. package/dist/frontend/lowering/builtins/url.d.ts +3 -0
  504. package/dist/frontend/lowering/builtins/url.js +120 -17
  505. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  506. package/dist/frontend/lowering/builtins/util-types.js +20 -4
  507. package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
  508. package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
  509. package/dist/frontend/lowering/builtins/v8.js +105 -0
  510. package/dist/frontend/lowering/builtins/v8.js.map +1 -0
  511. package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
  512. package/dist/frontend/lowering/builtins/webassembly.js +388 -0
  513. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
  514. package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
  515. package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
  516. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
  517. package/dist/frontend/lowering/builtins/workers.d.ts +12 -0
  518. package/dist/frontend/lowering/builtins/workers.js +193 -8
  519. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  520. package/dist/frontend/lowering/call-arguments.js +69 -14
  521. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  522. package/dist/frontend/lowering/call-signatures.d.ts +19 -1
  523. package/dist/frontend/lowering/call-signatures.js +254 -47
  524. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  525. package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
  526. package/dist/frontend/lowering/checked-promise-all.js +1 -1
  527. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  528. package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
  529. package/dist/frontend/lowering/cjs-exports-object.js +528 -0
  530. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
  531. package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
  532. package/dist/frontend/lowering/cjs-inline-require.js +314 -0
  533. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
  534. package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
  535. package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
  536. package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
  537. package/dist/frontend/lowering/class-attributes.d.ts +19 -0
  538. package/dist/frontend/lowering/class-attributes.js +378 -0
  539. package/dist/frontend/lowering/class-attributes.js.map +1 -0
  540. package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
  541. package/dist/frontend/lowering/class-callbacks.js +21 -10
  542. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  543. package/dist/frontend/lowering/class-construction.js +49 -4
  544. package/dist/frontend/lowering/class-construction.js.map +1 -1
  545. package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
  546. package/dist/frontend/lowering/class-descriptors.js +8 -8
  547. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  548. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
  549. package/dist/frontend/lowering/class-dynamic-dispatch.js +1115 -89
  550. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  551. package/dist/frontend/lowering/class-instance-constructor.js +1 -1
  552. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  553. package/dist/frontend/lowering/class-iterables.d.ts +11 -0
  554. package/dist/frontend/lowering/class-iterables.js +31 -0
  555. package/dist/frontend/lowering/class-iterables.js.map +1 -0
  556. package/dist/frontend/lowering/class-method-mutations.js +73 -35
  557. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  558. package/dist/frontend/lowering/class-method-values.js +56 -10
  559. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  560. package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
  561. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  562. package/dist/frontend/lowering/class-protocols.js +25 -44
  563. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  564. package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
  565. package/dist/frontend/lowering/class-prototypes.js +80 -18
  566. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  567. package/dist/frontend/lowering/class-runtime-statics.js +1 -1
  568. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  569. package/dist/frontend/lowering/class-static-data.js +2 -2
  570. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  571. package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
  572. package/dist/frontend/lowering/class-to-primitive.js +261 -0
  573. package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
  574. package/dist/frontend/lowering/class-unions.d.ts +25 -0
  575. package/dist/frontend/lowering/class-unions.js +102 -1
  576. package/dist/frontend/lowering/class-unions.js.map +1 -1
  577. package/dist/frontend/lowering/code-generation.d.ts +14 -0
  578. package/dist/frontend/lowering/code-generation.js +127 -0
  579. package/dist/frontend/lowering/code-generation.js.map +1 -0
  580. package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
  581. package/dist/frontend/lowering/coercions/function-adapters.js +145 -3
  582. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  583. package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
  584. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  585. package/dist/frontend/lowering/coercions/structural.js +35 -3
  586. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  587. package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
  588. package/dist/frontend/lowering/coercions/unions.js +57 -1
  589. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  590. package/dist/frontend/lowering/collection-ingestion.js +2 -2
  591. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  592. package/dist/frontend/lowering/collection-narrowing.js +2 -4
  593. package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
  594. package/dist/frontend/lowering/construction-escapes.js +8 -8
  595. package/dist/frontend/lowering/construction-escapes.js.map +1 -1
  596. package/dist/frontend/lowering/construction-escapes.test.js +4 -4
  597. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
  598. package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
  599. package/dist/frontend/lowering/constructor-returns.js +477 -0
  600. package/dist/frontend/lowering/constructor-returns.js.map +1 -0
  601. package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
  602. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  603. package/dist/frontend/lowering/containers/array-callbacks.d.ts +9 -0
  604. package/dist/frontend/lowering/containers/array-callbacks.js +266 -100
  605. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  606. package/dist/frontend/lowering/containers/array-concat.js +1 -1
  607. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  608. package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
  609. package/dist/frontend/lowering/containers/array-construction.js +51 -13
  610. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  611. package/dist/frontend/lowering/containers/array-from-async.d.ts +6 -5
  612. package/dist/frontend/lowering/containers/array-from-async.js +159 -14
  613. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  614. package/dist/frontend/lowering/containers/array-methods.js +89 -77
  615. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  616. package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
  617. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  618. package/dist/frontend/lowering/containers/bytes.js +161 -101
  619. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  620. package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
  621. package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
  622. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  623. package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
  624. package/dist/frontend/lowering/containers/collection-grouping.js +217 -26
  625. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  626. package/dist/frontend/lowering/containers/collection-methods.js +54 -25
  627. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  628. package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
  629. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
  630. package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
  631. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
  632. package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
  633. package/dist/frontend/lowering/containers/for-of.js +19 -19
  634. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  635. package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
  636. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  637. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
  638. package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
  639. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  640. package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
  641. package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
  642. package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
  643. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
  644. package/dist/frontend/lowering/containers/string-and-regexp.js +419 -30
  645. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  646. package/dist/frontend/lowering/containers/string-replacement.js +1 -1
  647. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  648. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -0
  649. package/dist/frontend/lowering/cycle-initialization.js +39 -0
  650. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  651. package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
  652. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  653. package/dist/frontend/lowering/devirtualize.d.ts +1 -1
  654. package/dist/frontend/lowering/devirtualize.js +27 -7
  655. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  656. package/dist/frontend/lowering/divergences.d.ts +0 -5
  657. package/dist/frontend/lowering/divergences.js +62 -125
  658. package/dist/frontend/lowering/divergences.js.map +1 -1
  659. package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
  660. package/dist/frontend/lowering/dyn-streams.js +257 -0
  661. package/dist/frontend/lowering/dyn-streams.js.map +1 -0
  662. package/dist/frontend/lowering/error-methods.js +4 -1
  663. package/dist/frontend/lowering/error-methods.js.map +1 -1
  664. package/dist/frontend/lowering/error-name-order.d.ts +19 -0
  665. package/dist/frontend/lowering/error-name-order.js +93 -0
  666. package/dist/frontend/lowering/error-name-order.js.map +1 -0
  667. package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
  668. package/dist/frontend/lowering/expressions/array-literals.js +703 -0
  669. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
  670. package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
  671. package/dist/frontend/lowering/expressions/binary.js +2483 -0
  672. package/dist/frontend/lowering/expressions/binary.js.map +1 -0
  673. package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
  674. package/dist/frontend/lowering/expressions/element-access.js +1797 -0
  675. package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
  676. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
  677. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  678. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
  679. package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
  680. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
  681. package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
  682. package/dist/frontend/lowering/expressions/identifiers.js +830 -0
  683. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
  684. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +40 -0
  685. package/dist/frontend/lowering/expressions/keyed-field-targets.js +226 -0
  686. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
  687. package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
  688. package/dist/frontend/lowering/expressions/narrowing.js +1322 -0
  689. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
  690. package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
  691. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  692. package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
  693. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  694. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  695. package/dist/frontend/lowering/expressions/object-literals.js +253 -85
  696. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  697. package/dist/frontend/lowering/expressions/optional-chains.d.ts +2 -1
  698. package/dist/frontend/lowering/expressions/optional-chains.js +91 -14
  699. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  700. package/dist/frontend/lowering/expressions/property-access.d.ts +110 -0
  701. package/dist/frontend/lowering/expressions/property-access.js +3544 -0
  702. package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
  703. package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
  704. package/dist/frontend/lowering/expressions/relational.js +1679 -0
  705. package/dist/frontend/lowering/expressions/relational.js.map +1 -0
  706. package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
  707. package/dist/frontend/lowering/expressions/typeof.js +538 -0
  708. package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
  709. package/dist/frontend/lowering/expressions/union-fields.js +1 -1
  710. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  711. package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
  712. package/dist/frontend/lowering/expressions/updates.js +780 -0
  713. package/dist/frontend/lowering/expressions/updates.js.map +1 -0
  714. package/dist/frontend/lowering/function-context.d.ts +10 -0
  715. package/dist/frontend/lowering/function-context.js +11 -1
  716. package/dist/frontend/lowering/function-context.js.map +1 -1
  717. package/dist/frontend/lowering/function-returns.js +52 -28
  718. package/dist/frontend/lowering/function-returns.js.map +1 -1
  719. package/dist/frontend/lowering/general-streams.d.ts +25 -0
  720. package/dist/frontend/lowering/general-streams.js +108 -0
  721. package/dist/frontend/lowering/general-streams.js.map +1 -0
  722. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
  723. package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
  724. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  725. package/dist/frontend/lowering/generic-functions.d.ts +39 -0
  726. package/dist/frontend/lowering/generic-functions.js +393 -75
  727. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  728. package/dist/frontend/lowering/import-meta.js +2 -2
  729. package/dist/frontend/lowering/import-meta.js.map +1 -1
  730. package/dist/frontend/lowering/intern-tables.js +10 -9
  731. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  732. package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
  733. package/dist/frontend/lowering/iterator-adapters.js +331 -3
  734. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  735. package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
  736. package/dist/frontend/lowering/js-class-fields.js +170 -0
  737. package/dist/frontend/lowering/js-class-fields.js.map +1 -0
  738. package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
  739. package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
  740. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
  741. package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
  742. package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
  743. package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
  744. package/dist/frontend/lowering/json-require.d.ts +22 -0
  745. package/dist/frontend/lowering/json-require.js +131 -0
  746. package/dist/frontend/lowering/json-require.js.map +1 -0
  747. package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
  748. package/dist/frontend/lowering/key-order-witness.js +641 -0
  749. package/dist/frontend/lowering/key-order-witness.js.map +1 -0
  750. package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
  751. package/dist/frontend/lowering/key-order-witness.test.js +239 -0
  752. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
  753. package/dist/frontend/lowering/lifetime-regions.js +7 -7
  754. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  755. package/dist/frontend/lowering/lower-assert.js +61 -60
  756. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  757. package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
  758. package/dist/frontend/lowering/lower-async-iteration.js +34 -6
  759. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  760. package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
  761. package/dist/frontend/lowering/lower-builtin-values.js +32 -3
  762. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  763. package/dist/frontend/lowering/lower-calls.js +1239 -442
  764. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  765. package/dist/frontend/lowering/lower-classes.d.ts +50 -3
  766. package/dist/frontend/lowering/lower-classes.js +1473 -468
  767. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  768. package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
  769. package/dist/frontend/lowering/lower-comptime.js +111 -13
  770. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  771. package/dist/frontend/lowering/lower-console.js +13 -11
  772. package/dist/frontend/lowering/lower-console.js.map +1 -1
  773. package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
  774. package/dist/frontend/lowering/lower-dgram.js +179 -8
  775. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  776. package/dist/frontend/lowering/lower-enums.js +113 -14
  777. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  778. package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
  779. package/dist/frontend/lowering/lower-event-emitter.js +258 -70
  780. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  781. package/dist/frontend/lowering/lower-event-target.js +2 -2
  782. package/dist/frontend/lowering/lower-event-target.js.map +1 -1
  783. package/dist/frontend/lowering/lower-expando.js +17 -13
  784. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  785. package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
  786. package/dist/frontend/lowering/lower-exprs.js +1481 -12489
  787. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  788. package/dist/frontend/lowering/lower-functions.js +68 -22
  789. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  790. package/dist/frontend/lowering/lower-generators.d.ts +6 -0
  791. package/dist/frontend/lowering/lower-generators.js +29 -16
  792. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  793. package/dist/frontend/lowering/lower-global-value.js +5 -1
  794. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  795. package/dist/frontend/lowering/lower-inspect.js +331 -96
  796. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  797. package/dist/frontend/lowering/lower-mixins.js +23 -20
  798. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  799. package/dist/frontend/lowering/lower-mock.d.ts +8 -1
  800. package/dist/frontend/lowering/lower-mock.js +185 -18
  801. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  802. package/dist/frontend/lowering/lower-modules.js +267 -61
  803. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  804. package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
  805. package/dist/frontend/lowering/lower-namespaces.js +45 -33
  806. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  807. package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
  808. package/dist/frontend/lowering/lower-node-module.js +147 -14
  809. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  810. package/dist/frontend/lowering/lower-server.d.ts +6 -6
  811. package/dist/frontend/lowering/lower-server.js +488 -100
  812. package/dist/frontend/lowering/lower-server.js.map +1 -1
  813. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  814. package/dist/frontend/lowering/lower-stdlib.js +151 -109
  815. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  816. package/dist/frontend/lowering/lower-stmts.d.ts +28 -2
  817. package/dist/frontend/lowering/lower-stmts.js +1541 -391
  818. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  819. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  820. package/dist/frontend/lowering/lower-stream.js +398 -56
  821. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  822. package/dist/frontend/lowering/lower-test.d.ts +3 -0
  823. package/dist/frontend/lowering/lower-test.js +437 -62
  824. package/dist/frontend/lowering/lower-test.js.map +1 -1
  825. package/dist/frontend/lowering/lower-timers.js +80 -32
  826. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  827. package/dist/frontend/lowering/lower-url.js +1 -1
  828. package/dist/frontend/lowering/lower-url.js.map +1 -1
  829. package/dist/frontend/lowering/lowerer.d.ts +399 -26
  830. package/dist/frontend/lowering/lowerer.js +1910 -305
  831. package/dist/frontend/lowering/lowerer.js.map +1 -1
  832. package/dist/frontend/lowering/lowerer.test.js +10 -4
  833. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  834. package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
  835. package/dist/frontend/lowering/maybe-promise.js +249 -0
  836. package/dist/frontend/lowering/maybe-promise.js.map +1 -0
  837. package/dist/frontend/lowering/module-member-this.d.ts +3 -0
  838. package/dist/frontend/lowering/module-member-this.js +262 -0
  839. package/dist/frontend/lowering/module-member-this.js.map +1 -0
  840. package/dist/frontend/lowering/module-namespace-elements.js +1 -1
  841. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  842. package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
  843. package/dist/frontend/lowering/nan-coded-reads.js +45 -32
  844. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  845. package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
  846. package/dist/frontend/lowering/narrowing-stability.js +104 -32
  847. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  848. package/dist/frontend/lowering/native-ffi.js +11 -11
  849. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  850. package/dist/frontend/lowering/object-factory-new.js +6 -8
  851. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  852. package/dist/frontend/lowering/private-brands.d.ts +46 -0
  853. package/dist/frontend/lowering/private-brands.js +265 -0
  854. package/dist/frontend/lowering/private-brands.js.map +1 -0
  855. package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
  856. package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
  857. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
  858. package/dist/frontend/lowering/require-initialization.d.ts +32 -0
  859. package/dist/frontend/lowering/require-initialization.js +246 -0
  860. package/dist/frontend/lowering/require-initialization.js.map +1 -0
  861. package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
  862. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  863. package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
  864. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  865. package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
  866. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  867. package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
  868. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  869. package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
  870. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
  871. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
  872. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  873. package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
  874. package/dist/frontend/lowering/runtime-optional-records.js +205 -32
  875. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  876. package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
  877. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
  878. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  879. package/dist/frontend/lowering/split-consumers.js +4 -4
  880. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  881. package/dist/frontend/lowering/static-function-names.d.ts +28 -0
  882. package/dist/frontend/lowering/static-function-names.js +212 -0
  883. package/dist/frontend/lowering/static-function-names.js.map +1 -0
  884. package/dist/frontend/lowering/static-this.js +6 -6
  885. package/dist/frontend/lowering/static-this.js.map +1 -1
  886. package/dist/frontend/lowering/strict-mode.d.ts +5 -0
  887. package/dist/frontend/lowering/strict-mode.js +31 -0
  888. package/dist/frontend/lowering/strict-mode.js.map +1 -0
  889. package/dist/frontend/lowering/string-index-bounds.js +10 -10
  890. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  891. package/dist/frontend/lowering/string-index.d.ts +12 -0
  892. package/dist/frontend/lowering/string-index.js +72 -1
  893. package/dist/frontend/lowering/string-index.js.map +1 -1
  894. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  895. package/dist/frontend/lowering/surfaces.js +252 -41
  896. package/dist/frontend/lowering/surfaces.js.map +1 -1
  897. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  898. package/dist/frontend/lowering/symbol-fields.js +204 -36
  899. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  900. package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
  901. package/dist/frontend/lowering/symbol-methods.js +24 -6
  902. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  903. package/dist/frontend/lowering/thread-slots.d.ts +13 -0
  904. package/dist/frontend/lowering/thread-slots.js +208 -0
  905. package/dist/frontend/lowering/thread-slots.js.map +1 -0
  906. package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
  907. package/dist/frontend/lowering/typed-arguments.js +472 -0
  908. package/dist/frontend/lowering/typed-arguments.js.map +1 -0
  909. package/dist/frontend/lowering/union-retag.d.ts +8 -0
  910. package/dist/frontend/lowering/union-retag.js +27 -0
  911. package/dist/frontend/lowering/union-retag.js.map +1 -1
  912. package/dist/frontend/lowering/union-retag.test.js +24 -1
  913. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  914. package/dist/frontend/lowering/var-hoisting.js +6 -6
  915. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  916. package/dist/frontend/lowering/width-lift.d.ts +4 -0
  917. package/dist/frontend/mock-shapes.js +13 -6
  918. package/dist/frontend/mock-shapes.js.map +1 -1
  919. package/dist/frontend/module-source-candidates.js +1 -1
  920. package/dist/frontend/module-source-candidates.js.map +1 -1
  921. package/dist/frontend/module-source-candidates.test.js +2 -1
  922. package/dist/frontend/module-source-candidates.test.js.map +1 -1
  923. package/dist/frontend/module-syntax.js +8 -8
  924. package/dist/frontend/module-syntax.js.map +1 -1
  925. package/dist/frontend/npm-static-bundled-chunks.d.ts +51 -0
  926. package/dist/frontend/npm-static-bundled-chunks.js +810 -0
  927. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
  928. package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
  929. package/dist/frontend/npm-static-bundled-chunks.test.js +287 -0
  930. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
  931. package/dist/frontend/npm-static-bundled-cjs.js +24 -23
  932. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  933. package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
  934. package/dist/frontend/npm-static-bundled-esm.js +768 -0
  935. package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
  936. package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
  937. package/dist/frontend/npm-static-bundled-esm.test.js +207 -0
  938. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
  939. package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
  940. package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
  941. package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
  942. package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
  943. package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
  944. package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
  945. package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
  946. package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
  947. package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
  948. package/dist/frontend/npm-static-declaration-syntax.js +102 -101
  949. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  950. package/dist/frontend/npm-static-prune.js +36 -24
  951. package/dist/frontend/npm-static-prune.js.map +1 -1
  952. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
  953. package/dist/frontend/npm-static-rewrite-host.js +14 -3
  954. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  955. package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
  956. package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
  957. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  958. package/dist/frontend/npm-static-subtyping.js +7 -9
  959. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  960. package/dist/frontend/npm-static.d.ts +17 -1
  961. package/dist/frontend/npm-static.js +167 -16
  962. package/dist/frontend/npm-static.js.map +1 -1
  963. package/dist/frontend/npm-static.test.js +22 -1
  964. package/dist/frontend/npm-static.test.js.map +1 -1
  965. package/dist/frontend/pipeline.js +164 -26
  966. package/dist/frontend/pipeline.js.map +1 -1
  967. package/dist/frontend/pipeline.test.js +22 -1
  968. package/dist/frontend/pipeline.test.js.map +1 -1
  969. package/dist/frontend/program-analysis.d.ts +6 -1
  970. package/dist/frontend/program-analysis.js +7 -0
  971. package/dist/frontend/program-analysis.js.map +1 -1
  972. package/dist/frontend/program.d.ts +92 -2
  973. package/dist/frontend/program.js +1557 -255
  974. package/dist/frontend/program.js.map +1 -1
  975. package/dist/frontend/program.test.js +76 -6
  976. package/dist/frontend/program.test.js.map +1 -1
  977. package/dist/frontend/resolve.js +36 -2
  978. package/dist/frontend/resolve.js.map +1 -1
  979. package/dist/frontend/resolve.test.js +49 -0
  980. package/dist/frontend/resolve.test.js.map +1 -1
  981. package/dist/frontend/services.d.ts +20 -1
  982. package/dist/frontend/services.js +40 -3
  983. package/dist/frontend/services.js.map +1 -1
  984. package/dist/frontend/services.test.js +2 -1
  985. package/dist/frontend/services.test.js.map +1 -1
  986. package/dist/frontend/threads-import.js +1 -1
  987. package/dist/frontend/threads-import.js.map +1 -1
  988. package/dist/frontend/tier-analysis.d.ts +71 -0
  989. package/dist/frontend/tier-analysis.js +522 -0
  990. package/dist/frontend/tier-analysis.js.map +1 -0
  991. package/dist/frontend/ts7/api-conformance.d.ts +234 -0
  992. package/dist/frontend/ts7/api-conformance.js +7 -0
  993. package/dist/frontend/ts7/api-conformance.js.map +1 -0
  994. package/dist/frontend/ts7/ast-guards.generated.js +2 -1
  995. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
  996. package/dist/frontend/ts7/ast-node.d.ts +47 -25
  997. package/dist/frontend/ts7/ast-node.js +64 -18
  998. package/dist/frontend/ts7/ast-node.js.map +1 -1
  999. package/dist/frontend/ts7/ast-node.test.js +36 -12
  1000. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  1001. package/dist/frontend/ts7/ast-types.d.ts +10 -3
  1002. package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
  1003. package/dist/frontend/ts7/ast.d.ts +1 -0
  1004. package/dist/frontend/ts7/ast.js +3 -2
  1005. package/dist/frontend/ts7/ast.js.map +1 -1
  1006. package/dist/frontend/ts7/checker-backend.d.ts +23 -0
  1007. package/dist/frontend/ts7/checker-backend.js +88 -0
  1008. package/dist/frontend/ts7/checker-backend.js.map +1 -0
  1009. package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
  1010. package/dist/frontend/ts7/checker-backend.test.js +63 -0
  1011. package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
  1012. package/dist/frontend/ts7/checker-cache.d.ts +0 -3
  1013. package/dist/frontend/ts7/checker-cache.js +0 -6
  1014. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  1015. package/dist/frontend/ts7/checker.d.ts +18 -11
  1016. package/dist/frontend/ts7/checker.js +42 -55
  1017. package/dist/frontend/ts7/checker.js.map +1 -1
  1018. package/dist/frontend/ts7/checker.test.js +10 -7
  1019. package/dist/frontend/ts7/checker.test.js.map +1 -1
  1020. package/dist/frontend/ts7/diagnostic.d.ts +19 -0
  1021. package/dist/frontend/ts7/diagnostic.js +22 -0
  1022. package/dist/frontend/ts7/diagnostic.js.map +1 -0
  1023. package/dist/frontend/ts7/node-functions.d.ts +8 -0
  1024. package/dist/frontend/ts7/node-functions.js +18 -0
  1025. package/dist/frontend/ts7/node-functions.js.map +1 -0
  1026. package/dist/frontend/ts7/program-host.d.ts +5 -1
  1027. package/dist/frontend/ts7/program-host.js +12 -0
  1028. package/dist/frontend/ts7/program-host.js.map +1 -1
  1029. package/dist/frontend/ts7/rpc-api.d.ts +5 -1
  1030. package/dist/frontend/ts7/rpc-api.js +8 -1
  1031. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  1032. package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
  1033. package/dist/frontend/ts7/semantic-checker.js +26 -8
  1034. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  1035. package/dist/frontend/ts7/semantic-checker.test.js +12 -9
  1036. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  1037. package/dist/frontend/ts7/semantic-model.d.ts +54 -24
  1038. package/dist/frontend/ts7/semantic-model.js +88 -16
  1039. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  1040. package/dist/frontend/ts7/semantic-model.test.js +4 -4
  1041. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  1042. package/dist/frontend/ts7/semantic-types.d.ts +7 -3
  1043. package/dist/frontend/ts7/semantic-types.js +1 -1
  1044. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  1045. package/dist/frontend/ts7/session.d.ts +11 -11
  1046. package/dist/frontend/ts7/session.js +8 -5
  1047. package/dist/frontend/ts7/session.js.map +1 -1
  1048. package/dist/frontend/ts7/session.test.js +9 -5
  1049. package/dist/frontend/ts7/session.test.js.map +1 -1
  1050. package/dist/frontend/ts7/source-parser.d.ts +6 -2
  1051. package/dist/frontend/ts7/source-parser.js +24 -3
  1052. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1053. package/dist/frontend/ts7/source-parser.test.js +38 -17
  1054. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1055. package/dist/frontend/type-mapper.d.ts +122 -2
  1056. package/dist/frontend/type-mapper.js +2545 -719
  1057. package/dist/frontend/type-mapper.js.map +1 -1
  1058. package/dist/frontend/type-only-imports.d.ts +28 -0
  1059. package/dist/frontend/type-only-imports.js +122 -0
  1060. package/dist/frontend/type-only-imports.js.map +1 -0
  1061. package/dist/frontend/worker-target.js +8 -8
  1062. package/dist/frontend/worker-target.js.map +1 -1
  1063. package/dist/index.d.ts +3 -1
  1064. package/dist/index.js +29 -2
  1065. package/dist/index.js.map +1 -1
  1066. package/dist/ir/analysis.js +4 -2
  1067. package/dist/ir/analysis.js.map +1 -1
  1068. package/dist/ir/api.d.ts +1 -1
  1069. package/dist/ir/api.js +1 -1
  1070. package/dist/ir/api.js.map +1 -1
  1071. package/dist/ir/array-length-stability.d.ts +30 -0
  1072. package/dist/ir/array-length-stability.js +236 -0
  1073. package/dist/ir/array-length-stability.js.map +1 -0
  1074. package/dist/ir/array-length-stability.test.d.ts +1 -0
  1075. package/dist/ir/array-length-stability.test.js +113 -0
  1076. package/dist/ir/array-length-stability.test.js.map +1 -0
  1077. package/dist/ir/build.d.ts +2 -2
  1078. package/dist/ir/build.js +1 -1
  1079. package/dist/ir/build.js.map +1 -1
  1080. package/dist/ir/builtin-effects.js +103 -0
  1081. package/dist/ir/builtin-effects.js.map +1 -1
  1082. package/dist/ir/builtin-signatures.d.ts +1 -1
  1083. package/dist/ir/builtin-signatures.js +494 -25
  1084. package/dist/ir/builtin-signatures.js.map +1 -1
  1085. package/dist/ir/byte-numbers.js +3 -0
  1086. package/dist/ir/byte-numbers.js.map +1 -1
  1087. package/dist/ir/callback-specialization.d.ts +37 -0
  1088. package/dist/ir/callback-specialization.js +459 -0
  1089. package/dist/ir/callback-specialization.js.map +1 -0
  1090. package/dist/ir/callback-specialization.test.d.ts +1 -0
  1091. package/dist/ir/callback-specialization.test.js +208 -0
  1092. package/dist/ir/callback-specialization.test.js.map +1 -0
  1093. package/dist/ir/capture-values.d.ts +0 -1
  1094. package/dist/ir/capture-values.js +51 -40
  1095. package/dist/ir/capture-values.js.map +1 -1
  1096. package/dist/ir/constant-globals.test.js +1 -1
  1097. package/dist/ir/constant-tables.test.js +1 -1
  1098. package/dist/ir/field-values.test.js +1 -1
  1099. package/dist/ir/final-fields.test.js +1 -1
  1100. package/dist/ir/function-references.test.js +9 -1
  1101. package/dist/ir/function-references.test.js.map +1 -1
  1102. package/dist/ir/init-only-globals.test.js +1 -1
  1103. package/dist/ir/initializer-bindings.test.js +1 -1
  1104. package/dist/ir/int32-slots.d.ts +14 -0
  1105. package/dist/ir/int32-slots.js +97 -14
  1106. package/dist/ir/int32-slots.js.map +1 -1
  1107. package/dist/ir/int32-slots.test.js +1 -1
  1108. package/dist/ir/integer-loop-facts.d.ts +2 -0
  1109. package/dist/ir/integer-loop-facts.js +24 -3
  1110. package/dist/ir/integer-loop-facts.js.map +1 -1
  1111. package/dist/ir/integer-loops.d.ts +1 -1
  1112. package/dist/ir/integer-loops.js +39 -9
  1113. package/dist/ir/integer-loops.js.map +1 -1
  1114. package/dist/ir/integer-loops.test.js +104 -0
  1115. package/dist/ir/integer-loops.test.js.map +1 -1
  1116. package/dist/ir/integer-ranges.d.ts +3 -0
  1117. package/dist/ir/integer-ranges.js +3 -1
  1118. package/dist/ir/integer-ranges.js.map +1 -1
  1119. package/dist/ir/integer-ranges.test.js +82 -1
  1120. package/dist/ir/integer-ranges.test.js.map +1 -1
  1121. package/dist/ir/intrinsic-signatures.js +6 -0
  1122. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1123. package/dist/ir/ir.d.ts +221 -58
  1124. package/dist/ir/ir.js +119 -12
  1125. package/dist/ir/ir.js.map +1 -1
  1126. package/dist/ir/ir.test.js +10 -0
  1127. package/dist/ir/ir.test.js.map +1 -1
  1128. package/dist/ir/jsval.d.ts +8 -0
  1129. package/dist/ir/jsval.js +365 -0
  1130. package/dist/ir/jsval.js.map +1 -0
  1131. package/dist/ir/jsval.test.d.ts +1 -0
  1132. package/dist/ir/jsval.test.js +239 -0
  1133. package/dist/ir/jsval.test.js.map +1 -0
  1134. package/dist/ir/runtime-features.d.ts +148 -33
  1135. package/dist/ir/runtime-features.js +629 -386
  1136. package/dist/ir/runtime-features.js.map +1 -1
  1137. package/dist/ir/scalar-records.test.js +1 -1
  1138. package/dist/ir/self-captures.d.ts +33 -0
  1139. package/dist/ir/self-captures.js +245 -0
  1140. package/dist/ir/self-captures.js.map +1 -0
  1141. package/dist/ir/self-captures.test.d.ts +1 -0
  1142. package/dist/ir/self-captures.test.js +135 -0
  1143. package/dist/ir/self-captures.test.js.map +1 -0
  1144. package/dist/ir/serialize.d.ts +1 -1
  1145. package/dist/ir/serialize.js +7 -4
  1146. package/dist/ir/serialize.js.map +1 -1
  1147. package/dist/ir/tiers.d.ts +26 -0
  1148. package/dist/ir/tiers.js +101 -0
  1149. package/dist/ir/tiers.js.map +1 -0
  1150. package/dist/ir/tiers.test.d.ts +1 -0
  1151. package/dist/ir/tiers.test.js +140 -0
  1152. package/dist/ir/tiers.test.js.map +1 -0
  1153. package/dist/ir/traverse.js +103 -94
  1154. package/dist/ir/traverse.js.map +1 -1
  1155. package/dist/ir/traverse.test.js +33 -30
  1156. package/dist/ir/traverse.test.js.map +1 -1
  1157. package/dist/ir/unshare.js +65 -3
  1158. package/dist/ir/unshare.js.map +1 -1
  1159. package/dist/ir/unshare.test.js +1 -1
  1160. package/dist/ir/validate.js +175 -68
  1161. package/dist/ir/validate.js.map +1 -1
  1162. package/dist/ir/validate.test.js +26 -9
  1163. package/dist/ir/validate.test.js.map +1 -1
  1164. package/dist/library/fence-eval.test.js +1 -1
  1165. package/dist/library/int-infer.test.js +4 -4
  1166. package/dist/library/ir-policy.js +13 -0
  1167. package/dist/library/ir-policy.js.map +1 -1
  1168. package/dist/library/library-cache.d.ts +1 -0
  1169. package/dist/library/library-cache.js.map +1 -1
  1170. package/dist/library/library-cache.test.js +5 -5
  1171. package/dist/library/library-profile.d.ts +4 -4
  1172. package/dist/library/library-profile.js +35 -7
  1173. package/dist/library/library-profile.js.map +1 -1
  1174. package/dist/library/prepare.js +13 -1
  1175. package/dist/library/prepare.js.map +1 -1
  1176. package/dist/native/cli.js +5 -0
  1177. package/dist/native/cli.js.map +1 -1
  1178. package/dist/native/compiler.js +2 -2
  1179. package/dist/native/compiler.js.map +1 -1
  1180. package/dist/native/compiler.test.js +2 -2
  1181. package/dist/native/prepare.js +7 -0
  1182. package/dist/native/prepare.js.map +1 -1
  1183. package/dist/native/sanitizer.test.js +12 -0
  1184. package/dist/native/sanitizer.test.js.map +1 -1
  1185. package/dist/native/toolchain.d.ts +2 -0
  1186. package/dist/native/toolchain.js +10 -1
  1187. package/dist/native/toolchain.js.map +1 -1
  1188. package/dist/native/toolchain.test.js +39 -1
  1189. package/dist/native/toolchain.test.js.map +1 -1
  1190. package/dist/startup-cache.d.ts +1 -0
  1191. package/dist/startup-cache.js +1 -0
  1192. package/dist/startup-cache.js.map +1 -1
  1193. package/dist/wasm/base64.d.ts +5 -0
  1194. package/dist/wasm/base64.js +62 -0
  1195. package/dist/wasm/base64.js.map +1 -0
  1196. package/dist/wasm/binary.d.ts +36 -0
  1197. package/dist/wasm/binary.js +1976 -0
  1198. package/dist/wasm/binary.js.map +1 -0
  1199. package/dist/wasm/binary.test.d.ts +1 -0
  1200. package/dist/wasm/binary.test.js +190 -0
  1201. package/dist/wasm/binary.test.js.map +1 -0
  1202. package/dist/wasm/discover.d.ts +38 -0
  1203. package/dist/wasm/discover.js +377 -0
  1204. package/dist/wasm/discover.js.map +1 -0
  1205. package/dist/wasm/discover.test.d.ts +1 -0
  1206. package/dist/wasm/discover.test.js +24 -0
  1207. package/dist/wasm/discover.test.js.map +1 -0
  1208. package/dist/wasm/module.d.ts +151 -0
  1209. package/dist/wasm/module.js +575 -0
  1210. package/dist/wasm/module.js.map +1 -0
  1211. package/dist/wasm/translate.d.ts +48 -0
  1212. package/dist/wasm/translate.js +2129 -0
  1213. package/dist/wasm/translate.js.map +1 -0
  1214. package/dist/wasm/translate.test.d.ts +1 -0
  1215. package/dist/wasm/translate.test.js +207 -0
  1216. package/dist/wasm/translate.test.js.map +1 -0
  1217. package/package.json +21 -20
  1218. package/surface-manifest.json +303 -19
@@ -1,13 +1,16 @@
1
- import { dynUndefinedExpr, varRef } from "../../ir/build.js";
1
+ import { primitiveConstructorOr } from "./lower-exprs.js";
2
+ import { dynUndefinedExpr, helperLoc, nodeThrowExpr, varRef } from "../../ir/build.js";
3
+ import { constructedValue } from "./constructor-returns.js";
2
4
  import { eventTargetApiMembers, eventTargetInheritedMember } from "./lower-event-target.js";
3
5
  import { BOOL, DYN, F64, DYN_CLASS_PROPERTIES as PROPERTY_BAG, STRING, VOID, canConvertToDyn, canDynCheckTo, isClassOwnEnumerableFieldName, isDynTypedRefType, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
4
6
  import { streamTypedRefEligible } from "../../ir/analysis.js";
5
7
  import { everyStmtList, transformExpr, transformStmtList } from "../../ir/traverse.js";
6
8
  import { PoisonError } from "./lowerer.js";
7
- import { implicitDefaultInstance } from "./generic-functions.js";
9
+ import { erasedGenericInstance, implicitDefaultInstance } from "./generic-functions.js";
8
10
  import {} from "./call-signatures.js";
9
11
  import { accessorCall, classValueRef, findGenericMethodOn, findGenericStaticOn, findMethodOn, findStaticOn, genericOverrideBelow, upcastTo, } from "./lower-classes.js";
10
- import { classPrototypeData, hasClassPrototypeData, reflectClassPrototype, } from "./class-prototypes.js";
12
+ import { classPrototypeData, hasClassPrototypeData, observedPrototypeMethod, reflectClassPrototype, } from "./class-prototypes.js";
13
+ import { perEvaluationPrivateNames } from "./private-brands.js";
11
14
  import { errorPropertyRead, errorPropertyWrite, errorToStringCall, errorToStringMethod, refreshErrorPropertyDispatch, refreshErrorMethodDispatch, } from "./error-methods.js";
12
15
  import { GeneratorDynamicDispatch } from "./generator-dynamic-dispatch.js";
13
16
  import { classMethodValue, reflectedClassStaticMethodValue, refreshClassMethodValueSelections, } from "./class-method-values.js";
@@ -22,6 +25,7 @@ import { ClassConstructionDispatch } from "./class-construction.js";
22
25
  import { emitterRooted } from "./lower-event-emitter.js";
23
26
  import { protocolArm, protocolFieldArm } from "./class-protocol-dispatch.js";
24
27
  import { STREAM_OPERATORS } from "./lower-stream.js";
28
+ import { deletedPropertyNames, fixedFieldFamily } from "./js-class-fields.js";
25
29
  const STREAM_METHODS = new Set([
26
30
  "on",
27
31
  "addListener",
@@ -96,6 +100,80 @@ function symbolMemberKey(lowerer, info, name, loc) {
96
100
  }
97
101
  return null;
98
102
  }
103
+ const CONVERSION_CALL_PREFIX = "%conversionCall.";
104
+ const TO_PRIMITIVE_PREFIX = "%dyn.class.toPrimitive.";
105
+ /** Operations that convert their dynamic operands with ToPrimitive: `+`
106
+ * and `==` take the default hint, the arithmetic, bitwise, relational and
107
+ * numeric conversions the number hint, and the string conversions the
108
+ * string hint. */
109
+ const DEFAULT_HINT_CALLS = new Set(["dyn.abstractEq", "dyn.add"]);
110
+ const NUMBER_HINT_CALLS = new Set([
111
+ "dyn.arithmetic",
112
+ "dyn.bigintConstructor",
113
+ "dyn.bitwise",
114
+ "dyn.compare",
115
+ "dyn.numberConstructor",
116
+ "dyn.toNumberCoerce",
117
+ "dyn.toNumeric",
118
+ ]);
119
+ const STRING_HINT_CALLS = new Set(["dyn.stringConstructor", "dyn.toStringCoerce"]);
120
+ /** Operations whose second operand is a property key, converted with the
121
+ * string hint when the receiver admits a key: `in` needs an object,
122
+ * propertyIsEnumerable converts before checking its receiver, and the
123
+ * others need a receiver other than null and undefined. */
124
+ const KEY_CALLS = new Map([
125
+ ["dyn.hasKeyComputed", "object"],
126
+ ["dyn.propertyIsEnumerableComputed", "any"],
127
+ ["dyn.hasOwnComputed", "value"],
128
+ ["dyn.keyDeleteComputed", "value"],
129
+ ["dyn.keySetComputed", "value"],
130
+ ]);
131
+ function toPrimitiveHint(expr) {
132
+ if (expr.kind === "toString")
133
+ return expr.operand.type.kind === "dyn" ? "string" : null;
134
+ if (expr.kind === "dynKeyGet")
135
+ return expr.key.type.kind === "dyn" ? "string" : null;
136
+ if (expr.kind !== "libCall")
137
+ return null;
138
+ if (DEFAULT_HINT_CALLS.has(expr.fn))
139
+ return "default";
140
+ if (NUMBER_HINT_CALLS.has(expr.fn))
141
+ return "number";
142
+ if (STRING_HINT_CALLS.has(expr.fn) || KEY_CALLS.has(expr.fn))
143
+ return "string";
144
+ return null;
145
+ }
146
+ /** An operand that needs no conversion: already passed through a
147
+ * conversion helper (loose equality converts conditionally), or boxed from
148
+ * a statically primitive value. */
149
+ function isConversion(expr) {
150
+ if (expr.kind === "ternary")
151
+ return isConversion(expr.then);
152
+ if (expr.kind === "dynFrom")
153
+ return PRIMITIVE_KINDS.has(expr.value.type.kind);
154
+ return expr.kind === "call" && expr.callee.startsWith(TO_PRIMITIVE_PREFIX);
155
+ }
156
+ const PRIMITIVE_KINDS = new Set([
157
+ "f64",
158
+ "string",
159
+ "bool",
160
+ "bigint",
161
+ "symbol",
162
+ "undefinedT",
163
+ "nullT",
164
+ ]);
165
+ /** A declared conversion method, own or inherited. */
166
+ function conversionMethod(lowerer, info, method) {
167
+ if (info.fields.has(method))
168
+ return false;
169
+ const found = findMethodOn(lowerer, info, method);
170
+ return !!found && !found.declarer.builtinError;
171
+ }
172
+ function isPrimitive(value, loc) {
173
+ return ["number", "string", "boolean", "undefined", "null", "bigint", "symbol"]
174
+ .map((test) => ({ kind: "dynTest", test, value, type: BOOL, loc }))
175
+ .reduce((a, b) => ({ kind: "logical", op: "||", left: a, right: b, type: BOOL, loc }));
176
+ }
99
177
  export function classInstanceOf(lowerer, value, info, loc, classValue) {
100
178
  const name = `%dyn.class.${classValue ? "valueInstanceof" : "instanceof"}:${info.def.name}`;
101
179
  const params = [
@@ -490,6 +568,9 @@ export class ClassDynamicDispatch {
490
568
  generatorDispatch = new GeneratorDynamicDispatch();
491
569
  caughtDispatch = new CaughtValueDispatch();
492
570
  constructionDispatch = new ClassConstructionDispatch();
571
+ /** Property names a delete can remove (null: any name), for the field
572
+ * creation tracking decision. */
573
+ deletedNames;
493
574
  boxed = new Set();
494
575
  boxedConstructors = new Set();
495
576
  dispatches = new Map();
@@ -505,6 +586,8 @@ export class ClassDynamicDispatch {
505
586
  bagClasses = new Set();
506
587
  bagInitializers = new Map();
507
588
  typedPropertyBags = new Map();
589
+ /** Per-class prototype selection for new property bags (bagPrototypeHelper). */
590
+ bagPrototypeHelpers = new Map();
508
591
  readPropertyBags = [];
509
592
  generated = new Set();
510
593
  /** Protocol dispatch helpers and callee reads whose receivers normalize. */
@@ -525,6 +608,13 @@ export class ClassDynamicDispatch {
525
608
  /** The for-in key helpers, by libCall (dyn and native string[] keys). */
526
609
  enumerations = new Map();
527
610
  enumerationClasses = new Set();
611
+ /** OrdinaryToPrimitive over boxed class instances, by hint, and the
612
+ * per-class method calls its arms make. */
613
+ toPrimitives = new Map();
614
+ toPrimitiveCalls = new Map();
615
+ /** `value.valueOf()` and `value.toString()` on a dynamic receiver: a test
616
+ * for boxed instances of classes declaring the method, and the call. */
617
+ conversionCalls = new Map();
528
618
  process(lowerer, functions) {
529
619
  // Dispatch tables grow between worklist waves. Keep their normalization
530
620
  // entry ahead of every newly inserted branch after rebuilding the tables.
@@ -543,6 +633,8 @@ export class ClassDynamicDispatch {
543
633
  changed = this.constructionDispatch.process(lowerer, functions) || changed;
544
634
  const seenTypes = new Set();
545
635
  const rewrite = new Set();
636
+ const toPrimitiveSites = new Set();
637
+ const hasKeySites = new Set();
546
638
  const discover = (type) => {
547
639
  const key = typeKey(type);
548
640
  if (seenTypes.has(key))
@@ -586,6 +678,9 @@ export class ClassDynamicDispatch {
586
678
  (expr.fn === "json.stringifyValue" || expr.fn === "json.stringifyReplacer"))) {
587
679
  this.serializesClasses = true;
588
680
  }
681
+ if (toPrimitiveHint(expr) !== null ||
682
+ (expr.kind === "libCall" && (expr.fn === "dyn.valueOf" || expr.fn === "dyn.toString")))
683
+ toPrimitiveSites.add(fn);
589
684
  switch (expr.kind) {
590
685
  case "dynFrom":
591
686
  discover(expr.value.type);
@@ -602,6 +697,9 @@ export class ClassDynamicDispatch {
602
697
  isDynTypedRefType(expr.args[0].value.type))
603
698
  rewrite.add(fn);
604
699
  break;
700
+ case "dynHasKey":
701
+ hasKeySites.add(fn);
702
+ break;
605
703
  case "dynKeyGet":
606
704
  case "dynInvoke":
607
705
  rewrite.add(fn);
@@ -609,6 +707,13 @@ export class ClassDynamicDispatch {
609
707
  case "dynCheck":
610
708
  if (isDynTypedRefType(expr.type))
611
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);
612
717
  break;
613
718
  case "libCall":
614
719
  if (expr.fn === "bytes.construct" ||
@@ -635,6 +740,15 @@ export class ClassDynamicDispatch {
635
740
  });
636
741
  if (this.boxed.size === 0 && rewrite.size === 0)
637
742
  return changed;
743
+ const converting = this.convertingHints(lowerer);
744
+ const calling = this.calledConversions(lowerer);
745
+ if (converting.size || calling.size)
746
+ for (const fn of toPrimitiveSites)
747
+ rewrite.add(fn);
748
+ const prototypeMembers = this.prototypeMemberNames(lowerer);
749
+ if (prototypeMembers.size)
750
+ for (const fn of hasKeySites)
751
+ rewrite.add(fn);
638
752
  for (const fn of functions) {
639
753
  if (!fn.name.startsWith("%dyn.class.instanceof:") &&
640
754
  !fn.name.startsWith("%dyn.class.valueInstanceof:"))
@@ -884,38 +998,7 @@ export class ClassDynamicDispatch {
884
998
  }
885
999
  const needsPrototype = (current) => hasClassPrototypeData(current) ||
886
1000
  current.subclasses.some((child) => lowerer.classCanBeConstructed(child) && needsPrototype(child));
887
- const prototypeFor = (current, receiver, loc) => {
888
- const currentReceiver = receiver.type.kind === "object" && receiver.type.className !== current.def.name
889
- ? {
890
- kind: "downcast",
891
- value: receiver,
892
- type: { kind: "object", className: current.def.name },
893
- loc,
894
- }
895
- : receiver;
896
- let result = classPrototypeData(lowerer, current, loc, currentReceiver);
897
- for (const child of current.subclasses) {
898
- if (!lowerer.classCanBeConstructed(child))
899
- continue;
900
- const selected = prototypeFor(child, receiver, loc);
901
- if (selected && result)
902
- result = {
903
- kind: "ternary",
904
- cond: {
905
- kind: "instanceOf",
906
- value: receiver,
907
- className: child.def.name,
908
- type: BOOL,
909
- loc,
910
- },
911
- then: selected,
912
- else_: result,
913
- type: DYN,
914
- loc,
915
- };
916
- }
917
- return result;
918
- };
1001
+ const prototypeFor = (current, receiver, loc) => this.bagPrototype(lowerer, current, receiver, loc);
919
1002
  for (const existingInit of this.bagInitializers.get(className) ?? []) {
920
1003
  if (existingInit.value.kind === "dynObjLit" && needsPrototype(info)) {
921
1004
  const prototype = prototypeFor(info, existingInit.obj, existingInit.loc);
@@ -935,7 +1018,7 @@ export class ClassDynamicDispatch {
935
1018
  continue;
936
1019
  this.bagClasses.add(plan.key);
937
1020
  this.ensurePropertyBag(info);
938
- if (info.decl && isJsSourceFile(info.decl.getSourceFile())) {
1021
+ if (info.decl && isJsSourceFile(ts.getSourceFileOfNode(info.decl))) {
939
1022
  let root = info;
940
1023
  while (root.base && !root.base.def.runtime)
941
1024
  root = root.base;
@@ -943,8 +1026,13 @@ export class ClassDynamicDispatch {
943
1026
  current.def.tracksOwnFields = true;
944
1027
  current.subclasses.forEach(track);
945
1028
  };
946
- // Runtime-owned roots keep their dedicated property contracts.
947
- if (!root.base?.def.runtime)
1029
+ // Runtime-owned roots keep their dedicated property contracts. A
1030
+ // family whose fields all exist from construction and are never
1031
+ // deleted keeps a fixed layout, as TypeScript classes do.
1032
+ // null is a result too; undefined means not computed yet.
1033
+ if (this.deletedNames === undefined)
1034
+ this.deletedNames = deletedPropertyNames(lowerer.moduleOrder);
1035
+ if (!root.base?.def.runtime && !fixedFieldFamily(root, this.deletedNames))
948
1036
  track(root);
949
1037
  }
950
1038
  const loc = this.propertyBag.loc;
@@ -1060,6 +1148,54 @@ export class ClassDynamicDispatch {
1060
1148
  fn.body = transformStmtList(fn.body, {
1061
1149
  stmt: (stmt) => stmt,
1062
1150
  expr: (expr) => {
1151
+ if (expr.kind === "dynHasKey" && prototypeMembers.has(expr.key)) {
1152
+ // A class instance's snapshot can carry its class's prototype
1153
+ // data, which holds only the methods the program reads through
1154
+ // the prototype. The computed-key form answers methods and
1155
+ // accessors from the class itself.
1156
+ const loc = expr.loc;
1157
+ const test = {
1158
+ kind: "libCall",
1159
+ fn: "dyn.hasKeyComputed",
1160
+ args: [
1161
+ expr.value,
1162
+ {
1163
+ kind: "dynFrom",
1164
+ value: { kind: "strLit", value: expr.key, type: STRING, loc },
1165
+ type: DYN,
1166
+ loc,
1167
+ },
1168
+ ],
1169
+ type: BOOL,
1170
+ loc,
1171
+ };
1172
+ changed = true;
1173
+ return {
1174
+ kind: "seqExpr",
1175
+ stmts: [],
1176
+ result: expr.negated
1177
+ ? { kind: "unary", op: "!", operand: test, type: BOOL, loc }
1178
+ : test,
1179
+ type: BOOL,
1180
+ loc,
1181
+ };
1182
+ }
1183
+ const called = calling.size ? this.convertMethodCall(lowerer, fn, expr, calling) : null;
1184
+ if (called) {
1185
+ changed = true;
1186
+ return called;
1187
+ }
1188
+ const converted = converting.size
1189
+ ? this.convertOperands(lowerer, fn, expr, converting)
1190
+ : null;
1191
+ if (converted) {
1192
+ changed = true;
1193
+ // A hoisting sequence revisits the operation as its child; a
1194
+ // wrapped operation continues through the rewrites below.
1195
+ if (converted.kind === "seqExpr")
1196
+ return converted;
1197
+ expr = converted;
1198
+ }
1063
1199
  if (expr.kind === "dynCheck" && isDynTypedRefType(expr.type)) {
1064
1200
  const type = expr.type;
1065
1201
  let cast = this.checkedCasts.get(type.className);
@@ -1767,6 +1903,48 @@ export class ClassDynamicDispatch {
1767
1903
  // A read compares the bag with the receiver and then reads it:
1768
1904
  // evaluate it once, so each read retains the receiver once.
1769
1905
  const bagRead = varRef("bag.0", DYN, loc);
1906
+ const bagGet = read
1907
+ ? {
1908
+ kind: "libCall",
1909
+ fn: "dyn.bagGet",
1910
+ args: [bagRead, read.key, varRef("p.0", DYN, loc)],
1911
+ type: DYN,
1912
+ loc,
1913
+ }
1914
+ : null;
1915
+ // A class instance whose class chain declares no member of an
1916
+ // Object.prototype method's name (classes that do answer in
1917
+ // their own branches) inherits it unless an own property
1918
+ // shadows it; a class constructor's static bag reads as before.
1919
+ const instanceRead = read && INHERITED_OBJECT_METHODS.has(name)
1920
+ ? {
1921
+ kind: "ternary",
1922
+ cond: {
1923
+ kind: "dynTest",
1924
+ test: "function",
1925
+ value: varRef("p.0", DYN, loc),
1926
+ type: BOOL,
1927
+ loc,
1928
+ },
1929
+ then: bagGet,
1930
+ else_: {
1931
+ kind: "ternary",
1932
+ cond: this.readBagHas(lowerer, "dyn.hasKey", bagRead, read.key, loc),
1933
+ then: bagGet,
1934
+ else_: {
1935
+ kind: "libCall",
1936
+ fn: "dyn.builtinMethod",
1937
+ args: [{ kind: "strLit", value: "Object", type: STRING, loc }, read.key],
1938
+ type: DYN,
1939
+ loc,
1940
+ },
1941
+ type: DYN,
1942
+ loc,
1943
+ },
1944
+ type: DYN,
1945
+ loc,
1946
+ }
1947
+ : bagGet;
1770
1948
  const fallback = read
1771
1949
  ? {
1772
1950
  kind: "ternary",
@@ -1778,13 +1956,7 @@ export class ClassDynamicDispatch {
1778
1956
  loc,
1779
1957
  },
1780
1958
  then: { ...read, value: bagRead },
1781
- else_: {
1782
- kind: "libCall",
1783
- fn: "dyn.bagGet",
1784
- args: [bagRead, read.key, varRef("p.0", DYN, loc)],
1785
- type: DYN,
1786
- loc,
1787
- },
1959
+ else_: instanceRead,
1788
1960
  type: DYN,
1789
1961
  loc,
1790
1962
  }
@@ -1809,7 +1981,14 @@ export class ClassDynamicDispatch {
1809
1981
  ]
1810
1982
  : [
1811
1983
  { kind: "varDecl", localId: "bag.0", init: bag, loc },
1812
- { kind: "return", value: fallback, loc },
1984
+ {
1985
+ kind: "return",
1986
+ // Primitives answer their wrapper constructors.
1987
+ value: name === "constructor"
1988
+ ? primitiveConstructorOr(lowerer, varRef("p.0", DYN, loc), fallback, loc)
1989
+ : fallback,
1990
+ loc,
1991
+ },
1813
1992
  ],
1814
1993
  loc,
1815
1994
  };
@@ -2146,9 +2325,7 @@ export class ClassDynamicDispatch {
2146
2325
  const value = varRef("p.0", DYN, loc);
2147
2326
  const { receiver, condition } = this.propertyReceiver(plan, loc);
2148
2327
  if (isClassCallback(lowerer, info, dispatch.source.method)) {
2149
- const prototypeMethod = lowerer.prototypeMethodAccesses.has(dispatch.source.method);
2150
- if (prototypeMethod)
2151
- classPrototypeData(lowerer, info, loc);
2328
+ const prototypeMethod = observedPrototypeMethod(lowerer, info, dispatch.source.method, loc, receiver);
2152
2329
  const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
2153
2330
  dispatch.callback.body.unshift({
2154
2331
  kind: "if",
@@ -2221,6 +2398,60 @@ export class ClassDynamicDispatch {
2221
2398
  changed = true;
2222
2399
  }
2223
2400
  }
2401
+ for (const [method, conversion] of this.conversionCalls) {
2402
+ for (const plan of this.propertyReceivers(lowerer)) {
2403
+ if (conversion.classes.has(plan.key))
2404
+ continue;
2405
+ conversion.classes.add(plan.key);
2406
+ if (!conversionMethod(lowerer, plan.info, method))
2407
+ continue;
2408
+ const loc = conversion.call.loc;
2409
+ const { condition } = this.propertyReceiver(plan, loc);
2410
+ const value = varRef("p.0", DYN, loc);
2411
+ const result = {
2412
+ kind: "call",
2413
+ callee: this.toPrimitiveCall(lowerer, plan, method, method === "toString" ? 1 : 0, loc),
2414
+ args: method === "toString" ? [value, varRef("p.1", DYN, loc)] : [value],
2415
+ type: DYN,
2416
+ loc,
2417
+ };
2418
+ conversion.test.body.unshift({
2419
+ kind: "if",
2420
+ cond: condition,
2421
+ then: [{ kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc }],
2422
+ else_: null,
2423
+ loc,
2424
+ });
2425
+ conversion.call.body.unshift({
2426
+ kind: "if",
2427
+ cond: condition,
2428
+ then: [
2429
+ {
2430
+ kind: "return",
2431
+ value: method === "toString"
2432
+ ? { kind: "dynCheck", value: result, type: STRING, loc }
2433
+ : result,
2434
+ loc,
2435
+ },
2436
+ ],
2437
+ else_: null,
2438
+ loc,
2439
+ });
2440
+ changed = true;
2441
+ }
2442
+ }
2443
+ for (const [hint, conversion] of this.toPrimitives) {
2444
+ for (const plan of this.propertyReceivers(lowerer)) {
2445
+ if (conversion.classes.has(plan.key))
2446
+ continue;
2447
+ conversion.classes.add(plan.key);
2448
+ const arm = this.toPrimitiveArm(lowerer, plan, hint, conversion.fn);
2449
+ if (!arm)
2450
+ continue;
2451
+ conversion.fn.body.unshift(arm);
2452
+ changed = true;
2453
+ }
2454
+ }
2224
2455
  for (const dispatch of lowerer.protocolDispatches.values()) {
2225
2456
  if (!this.generated.has(dispatch.fn)) {
2226
2457
  this.generated.add(dispatch.fn);
@@ -2323,6 +2554,7 @@ export class ClassDynamicDispatch {
2323
2554
  !findGenericMethodOn(lowerer, info, dispatch.name) &&
2324
2555
  dispatch.name !== "constructor" &&
2325
2556
  !info.fields.has(dispatch.name) &&
2557
+ !(dispatch.name === "stack" && lowerer.isSubclassOf(info.def.name, "%Error")) &&
2326
2558
  !findMethodOn(lowerer, info, `get:${dispatch.name}`) &&
2327
2559
  !findMethodOn(lowerer, info, `set:${dispatch.name}`)))
2328
2560
  continue;
@@ -2436,7 +2668,7 @@ export class ClassDynamicDispatch {
2436
2668
  return dispatch.reflect
2437
2669
  ? this.reflectPropertyBody(lowerer, { ...dispatch, name }, info, receiver)
2438
2670
  : this.propertyBody(lowerer, { ...dispatch, name }, info, receiver);
2439
- const prototypeMethod = lowerer.prototypeMethodAccesses.has(name);
2671
+ const prototypeMethod = !info.fields.has(name) && observedPrototypeMethod(lowerer, info, name, loc, receiver);
2440
2672
  if (info.fields.has(name) || (dispatch.probe === "in" && !prototypeMethod)) {
2441
2673
  if (info.fields.has(name) && info.def.tracksOwnFields) {
2442
2674
  const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
@@ -2464,8 +2696,6 @@ export class ClassDynamicDispatch {
2464
2696
  { kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc },
2465
2697
  ];
2466
2698
  }
2467
- if (prototypeMethod)
2468
- classPrototypeData(lowerer, info, loc, receiver);
2469
2699
  const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
2470
2700
  const symbol = name.startsWith("sym:") || name.startsWith("%symbol:");
2471
2701
  const fn = dispatch.probe === "in"
@@ -2502,10 +2732,12 @@ export class ClassDynamicDispatch {
2502
2732
  for (const [symbol, name] of info.symbolMethods)
2503
2733
  symbolEntries.push([symbol, name]);
2504
2734
  for (const [symbol, name] of symbolEntries) {
2505
- const declaration = lowerer.checker.valueDeclarationOf(symbol);
2735
+ const declaration = symbol.valueDeclaration;
2736
+ // Module-scope consts and CommonJS key-table properties
2737
+ // (classSymbolKeyOfSymbol) both hold their key in a global.
2506
2738
  if (declaration &&
2507
- ts.isVariableDeclaration(declaration) &&
2508
- ts.isIdentifier(declaration.name)) {
2739
+ ((ts.isVariableDeclaration(declaration) && ts.isIdentifier(declaration.name)) ||
2740
+ ts.isPropertyAssignment(declaration))) {
2509
2741
  const global = lowerer.globalsBySymbol.get(symbol);
2510
2742
  if (global)
2511
2743
  symbols.set(name, lowerer.coerceToExpected(varRef(global.id, global.type, loc), DYN));
@@ -2787,13 +3019,13 @@ export class ClassDynamicDispatch {
2787
3019
  if (!supported || !info.decl)
2788
3020
  continue;
2789
3021
  const cls = classValueRef(lowerer, info, info.decl);
2790
- const result = {
3022
+ const result = constructedValue(lowerer, info, {
2791
3023
  kind: "new",
2792
3024
  className: name,
2793
3025
  args,
2794
3026
  type: { kind: "object", className: name },
2795
3027
  loc,
2796
- };
3028
+ });
2797
3029
  this.constructDispatch.body.unshift({
2798
3030
  kind: "if",
2799
3031
  cond: {
@@ -2814,7 +3046,7 @@ export class ClassDynamicDispatch {
2814
3046
  if (this.staticBagClasses.has(name))
2815
3047
  continue;
2816
3048
  const info = lowerer.classes.get(name);
2817
- if (!info?.decl || !isJsSourceFile(info.decl.getSourceFile()))
3049
+ if (!info?.decl || !isJsSourceFile(ts.getSourceFileOfNode(info.decl)))
2818
3050
  continue;
2819
3051
  const loc = this.staticPropertyBag.loc;
2820
3052
  const bag = classStaticData(lowerer, info, loc);
@@ -2917,6 +3149,519 @@ export class ClassDynamicDispatch {
2917
3149
  this.generated.add(helper);
2918
3150
  return { kind: "call", callee: name, args: [bag, key], type: BOOL, loc };
2919
3151
  }
3152
+ /** The hints for which some boxed class declares a conversion method. A
3153
+ * string conversion calls toString first, so without a declared toString
3154
+ * or Symbol.toPrimitive it answers Object.prototype.toString's
3155
+ * "[object Object]" as before. */
3156
+ convertingHints(lowerer) {
3157
+ const hints = new Set();
3158
+ for (const { info } of this.propertyReceivers(lowerer)) {
3159
+ if (conversionMethod(lowerer, info, "sym:toPrimitive") ||
3160
+ conversionMethod(lowerer, info, "toString")) {
3161
+ hints.add("string");
3162
+ hints.add("number");
3163
+ hints.add("default");
3164
+ }
3165
+ else if (conversionMethod(lowerer, info, "valueOf")) {
3166
+ hints.add("number");
3167
+ hints.add("default");
3168
+ }
3169
+ }
3170
+ return hints;
3171
+ }
3172
+ /** An operation that converts dynamic operands to primitives, with each
3173
+ * operand passed through the hint's conversion helper first. Operations
3174
+ * with two dynamic operands evaluate both before converting the left one,
3175
+ * as JavaScript does. Returns null when `expr` needs no conversion. */
3176
+ convertOperands(lowerer, fn, expr, converting) {
3177
+ const hint = toPrimitiveHint(expr);
3178
+ if (hint === null || !converting.has(hint))
3179
+ return null;
3180
+ const loc = expr.loc;
3181
+ const convert = (value) => ({
3182
+ kind: "call",
3183
+ callee: this.toPrimitiveHelper(lowerer, hint, loc),
3184
+ args: [value],
3185
+ type: DYN,
3186
+ loc,
3187
+ });
3188
+ if (expr.kind === "toString") {
3189
+ if (isConversion(expr.operand))
3190
+ return null;
3191
+ return { ...expr, operand: convert(expr.operand) };
3192
+ }
3193
+ if (expr.kind === "dynKeyGet") {
3194
+ // A computed read converts its key after evaluating the receiver,
3195
+ // unless the receiver is null or undefined.
3196
+ if (expr.key.type.kind !== "dyn" || isConversion(expr.key))
3197
+ return null;
3198
+ const [receiver, key] = this.hoistOperands(fn, [expr.value, expr.key], loc);
3199
+ return {
3200
+ kind: "seqExpr",
3201
+ stmts: receiver.stmts.concat(key.stmts),
3202
+ result: {
3203
+ ...expr,
3204
+ value: receiver.value,
3205
+ key: {
3206
+ kind: "ternary",
3207
+ cond: {
3208
+ kind: "dynTest",
3209
+ test: "nullish",
3210
+ negated: true,
3211
+ value: receiver.value,
3212
+ type: BOOL,
3213
+ loc,
3214
+ },
3215
+ then: convert(key.value),
3216
+ else_: key.value,
3217
+ type: DYN,
3218
+ loc,
3219
+ },
3220
+ },
3221
+ type: expr.type,
3222
+ loc,
3223
+ };
3224
+ }
3225
+ if (expr.kind !== "libCall")
3226
+ return null;
3227
+ const receiverNeeds = KEY_CALLS.get(expr.fn);
3228
+ if (receiverNeeds) {
3229
+ if (expr.args[1]?.type.kind !== "dyn" || isConversion(expr.args[1]))
3230
+ return null;
3231
+ // Every operand is evaluated before the key converts, as in
3232
+ // `obj[key] = value`, where the value is evaluated first.
3233
+ const hoisted = this.hoistOperands(fn, expr.args, loc);
3234
+ const args = hoisted.map((operand) => operand.value);
3235
+ const receiver = args[0];
3236
+ const admits = receiverNeeds === "any"
3237
+ ? null
3238
+ : receiverNeeds === "object"
3239
+ ? { kind: "unary", op: "!", operand: isPrimitive(receiver, loc), type: BOOL, loc }
3240
+ : { kind: "dynTest", test: "nullish", negated: true, value: receiver, type: BOOL, loc };
3241
+ args[1] = admits
3242
+ ? {
3243
+ kind: "ternary",
3244
+ cond: admits,
3245
+ then: convert(args[1]),
3246
+ else_: args[1],
3247
+ type: DYN,
3248
+ loc,
3249
+ }
3250
+ : convert(args[1]);
3251
+ return {
3252
+ kind: "seqExpr",
3253
+ stmts: hoisted.flatMap((operand) => operand.stmts),
3254
+ result: { ...expr, args },
3255
+ type: expr.type,
3256
+ loc,
3257
+ };
3258
+ }
3259
+ const dynamic = expr.args.flatMap((arg, i) => (arg.type.kind === "dyn" ? [i] : []));
3260
+ if (dynamic.some((i) => isConversion(expr.args[i]) && expr.args[i].kind !== "dynFrom"))
3261
+ return null;
3262
+ const operands = dynamic.filter((i) => !isConversion(expr.args[i]));
3263
+ if (operands.length === 0)
3264
+ return null;
3265
+ if (expr.args.length === 1)
3266
+ return { ...expr, args: [convert(expr.args[0])] };
3267
+ // Every operand is evaluated before the first conversion.
3268
+ const hoisted = expr.args.map((arg) => arg.kind === "strLit" || arg.kind === "numLit" || arg.kind === "boolLit"
3269
+ ? { stmts: [], value: arg }
3270
+ : this.hoistOperands(fn, [arg], loc)[0]);
3271
+ const args = hoisted.map((operand) => operand.value);
3272
+ if (expr.fn === "dyn.abstractEq") {
3273
+ // Loose equality converts an object only when the other operand is a
3274
+ // primitive other than null and undefined.
3275
+ if (dynamic.length !== 2)
3276
+ return null;
3277
+ const primitive = (value) => ["number", "string", "boolean", "bigint", "symbol"]
3278
+ .map((test) => ({ kind: "dynTest", test, value, type: BOOL, loc }))
3279
+ .reduce((a, b) => ({ kind: "logical", op: "||", left: a, right: b, type: BOOL, loc }));
3280
+ const [left, right] = [args[0], args[1]];
3281
+ for (const i of operands)
3282
+ args[i] = {
3283
+ kind: "ternary",
3284
+ cond: primitive(i === 0 ? right : left),
3285
+ then: convert(args[i]),
3286
+ else_: args[i],
3287
+ type: DYN,
3288
+ loc,
3289
+ };
3290
+ }
3291
+ else
3292
+ for (const i of operands)
3293
+ args[i] = convert(args[i]);
3294
+ return {
3295
+ kind: "seqExpr",
3296
+ stmts: hoisted.flatMap((operand) => operand.stmts),
3297
+ result: { ...expr, args },
3298
+ type: expr.type,
3299
+ loc,
3300
+ };
3301
+ }
3302
+ /** The method and accessor names of boxed classes whose instances can
3303
+ * carry their class's prototype data. */
3304
+ prototypeMemberNames(lowerer) {
3305
+ const names = new Set();
3306
+ for (const { info } of this.propertyReceivers(lowerer)) {
3307
+ if (!hasClassPrototypeData(info))
3308
+ continue;
3309
+ for (let c = info; c; c = c.base)
3310
+ for (const name of c.methods.keys())
3311
+ names.add(name.startsWith("get:") || name.startsWith("set:") ? name.slice(4) : name);
3312
+ }
3313
+ return names;
3314
+ }
3315
+ /** The methods some boxed class declares among valueOf and toString. */
3316
+ calledConversions(lowerer) {
3317
+ const methods = new Set();
3318
+ for (const { info } of this.propertyReceivers(lowerer)) {
3319
+ if (conversionMethod(lowerer, info, "valueOf"))
3320
+ methods.add("valueOf");
3321
+ if (conversionMethod(lowerer, info, "toString"))
3322
+ methods.add("toString");
3323
+ }
3324
+ return methods;
3325
+ }
3326
+ /** `value.valueOf()` or `value.toString(argument)` on a dynamic receiver:
3327
+ * a boxed instance of a class declaring the method calls it, any other
3328
+ * value keeps the runtime method call. The toString result must be a
3329
+ * string, as for the runtime's own-member call. */
3330
+ convertMethodCall(lowerer, fn, expr, calling) {
3331
+ if (expr.kind !== "libCall" || (expr.fn !== "dyn.valueOf" && expr.fn !== "dyn.toString"))
3332
+ return null;
3333
+ const method = expr.fn === "dyn.valueOf" ? "valueOf" : "toString";
3334
+ const receiver = expr.args[0];
3335
+ if (!calling.has(method))
3336
+ return null;
3337
+ if (receiver.kind === "varRef" && receiver.localId.startsWith(CONVERSION_CALL_PREFIX))
3338
+ return null;
3339
+ const loc = expr.loc;
3340
+ const operands = this.hoistOperands(fn, method === "toString" ? [receiver, expr.args[1]] : [receiver], loc, CONVERSION_CALL_PREFIX);
3341
+ const values = operands.map((operand) => operand.value);
3342
+ const helpers = this.conversionCallHelpers(lowerer, method, loc);
3343
+ return {
3344
+ kind: "seqExpr",
3345
+ stmts: operands.flatMap((operand) => operand.stmts),
3346
+ result: {
3347
+ kind: "ternary",
3348
+ cond: { kind: "call", callee: helpers.test.name, args: [values[0]], type: BOOL, loc },
3349
+ then: { kind: "call", callee: helpers.call.name, args: values, type: expr.type, loc },
3350
+ else_: { ...expr, args: [...values, ...expr.args.slice(values.length)] },
3351
+ type: expr.type,
3352
+ loc,
3353
+ },
3354
+ type: expr.type,
3355
+ loc,
3356
+ };
3357
+ }
3358
+ conversionCallHelpers(lowerer, method, loc) {
3359
+ let helpers = this.conversionCalls.get(method);
3360
+ if (!helpers) {
3361
+ const at = helperLoc(loc);
3362
+ const params = [
3363
+ { localId: "p.0", name: "value", type: DYN },
3364
+ ...(method === "toString" ? [{ localId: "p.1", name: "argument", type: DYN }] : []),
3365
+ ];
3366
+ const locals = params.map((param) => ({
3367
+ id: param.localId,
3368
+ name: param.name,
3369
+ type: param.type,
3370
+ mutable: false,
3371
+ }));
3372
+ const name = { kind: "strLit", value: method, type: STRING, loc: at };
3373
+ const test = {
3374
+ name: `${TO_PRIMITIVE_PREFIX}${method}.test`,
3375
+ params: params.slice(0, 1),
3376
+ locals: locals.slice(0, 1),
3377
+ returnType: BOOL,
3378
+ body: [
3379
+ {
3380
+ kind: "return",
3381
+ value: { kind: "boolLit", value: false, type: BOOL, loc: at },
3382
+ loc: at,
3383
+ },
3384
+ ],
3385
+ loc: at,
3386
+ };
3387
+ const call = {
3388
+ name: `${TO_PRIMITIVE_PREFIX}${method}.call`,
3389
+ params,
3390
+ locals,
3391
+ returnType: method === "toString" ? STRING : DYN,
3392
+ body: [
3393
+ {
3394
+ kind: "return",
3395
+ value: method === "toString"
3396
+ ? {
3397
+ kind: "libCall",
3398
+ fn: "dyn.toString",
3399
+ args: [varRef("p.0", DYN, at), varRef("p.1", DYN, at), name],
3400
+ type: STRING,
3401
+ loc: at,
3402
+ }
3403
+ : {
3404
+ kind: "libCall",
3405
+ fn: "dyn.valueOf",
3406
+ args: [varRef("p.0", DYN, at), name],
3407
+ type: DYN,
3408
+ loc: at,
3409
+ },
3410
+ loc: at,
3411
+ },
3412
+ ],
3413
+ loc: at,
3414
+ };
3415
+ helpers = { test, call, classes: new Set() };
3416
+ this.conversionCalls.set(method, helpers);
3417
+ this.generated.add(test);
3418
+ this.generated.add(call);
3419
+ lowerer.liftedFns.push(test, call);
3420
+ }
3421
+ return helpers;
3422
+ }
3423
+ /** Evaluates each operand into a fresh local, in order. */
3424
+ hoistOperands(fn, operands, loc, prefix = "%toPrimitive.operand.") {
3425
+ return operands.map((operand) => {
3426
+ const id = `${prefix}${fn.locals.length}`;
3427
+ fn.locals.push({ id, name: "operand", type: operand.type, mutable: false });
3428
+ const stmts = [{ kind: "varDecl", localId: id, init: operand, loc }];
3429
+ return { stmts, value: varRef(id, operand.type, loc) };
3430
+ });
3431
+ }
3432
+ /** The conversion helper for `hint`: a boxed class instance answers its
3433
+ * OrdinaryToPrimitive result, any other value is returned unchanged for
3434
+ * the runtime operation to convert. Arms are added per boxed class. */
3435
+ toPrimitiveHelper(lowerer, hint, loc) {
3436
+ let conversion = this.toPrimitives.get(hint);
3437
+ if (!conversion) {
3438
+ const at = helperLoc(loc);
3439
+ const fn = {
3440
+ name: `${TO_PRIMITIVE_PREFIX}${hint}`,
3441
+ params: [{ localId: "p.0", name: "value", type: DYN }],
3442
+ locals: [{ id: "p.0", name: "value", type: DYN, mutable: false }],
3443
+ returnType: DYN,
3444
+ body: [{ kind: "return", value: varRef("p.0", DYN, at), loc: at }],
3445
+ loc: at,
3446
+ };
3447
+ conversion = { fn, classes: new Set() };
3448
+ this.toPrimitives.set(hint, conversion);
3449
+ this.generated.add(fn);
3450
+ lowerer.liftedFns.push(fn);
3451
+ }
3452
+ return conversion.fn.name;
3453
+ }
3454
+ /** OrdinaryToPrimitive for one boxed class: the declared conversion
3455
+ * methods in hint order, each result returned when it is a primitive.
3456
+ * Object.prototype.valueOf answers the object itself and its toString
3457
+ * answers "[object Object]". */
3458
+ toPrimitiveArm(lowerer, plan, hint, helper) {
3459
+ const { info } = plan;
3460
+ const loc = helper.loc;
3461
+ const { condition } = this.propertyReceiver(plan, loc);
3462
+ if (conversionMethod(lowerer, info, "sym:toPrimitive")) {
3463
+ // A Symbol.toPrimitive method decides alone: its result must be a
3464
+ // primitive.
3465
+ const result = `%toPrimitive.exotic.${helper.locals.length}`;
3466
+ helper.locals.push({ id: result, name: "exotic", type: DYN, mutable: false });
3467
+ const hintValue = {
3468
+ kind: "dynFrom",
3469
+ value: { kind: "strLit", value: hint, type: STRING, loc },
3470
+ type: DYN,
3471
+ loc,
3472
+ };
3473
+ const body = [
3474
+ {
3475
+ kind: "varDecl",
3476
+ localId: result,
3477
+ init: {
3478
+ kind: "call",
3479
+ callee: this.toPrimitiveCall(lowerer, plan, "sym:toPrimitive", 1, loc),
3480
+ args: [varRef("p.0", DYN, loc), hintValue],
3481
+ type: DYN,
3482
+ loc,
3483
+ },
3484
+ loc,
3485
+ },
3486
+ {
3487
+ kind: "if",
3488
+ cond: isPrimitive(varRef(result, DYN, loc), loc),
3489
+ then: [{ kind: "return", value: varRef(result, DYN, loc), loc }],
3490
+ else_: null,
3491
+ loc,
3492
+ },
3493
+ {
3494
+ kind: "return",
3495
+ value: nodeThrowExpr(1, "", "Cannot convert object to primitive value", DYN, loc),
3496
+ loc,
3497
+ },
3498
+ ];
3499
+ return { kind: "if", cond: condition, then: body, else_: null, loc };
3500
+ }
3501
+ const order = hint === "string" ? ["toString", "valueOf"] : ["valueOf", "toString"];
3502
+ if (!order.some((method) => conversionMethod(lowerer, info, method)))
3503
+ return null;
3504
+ if (hint === "string" && !conversionMethod(lowerer, info, "toString"))
3505
+ return null;
3506
+ const body = [];
3507
+ let settled = false;
3508
+ for (const method of order) {
3509
+ if (!conversionMethod(lowerer, info, method)) {
3510
+ if (method === "toString") {
3511
+ body.push({
3512
+ kind: "return",
3513
+ value: {
3514
+ kind: "dynFrom",
3515
+ value: { kind: "strLit", value: "[object Object]", type: STRING, loc },
3516
+ type: DYN,
3517
+ loc,
3518
+ },
3519
+ loc,
3520
+ });
3521
+ settled = true;
3522
+ break;
3523
+ }
3524
+ continue;
3525
+ }
3526
+ const result = `%toPrimitive.${method}.${helper.locals.length}`;
3527
+ helper.locals.push({ id: result, name: method, type: DYN, mutable: false });
3528
+ body.push({
3529
+ kind: "varDecl",
3530
+ localId: result,
3531
+ init: {
3532
+ kind: "call",
3533
+ callee: this.toPrimitiveCall(lowerer, plan, method, 0, loc),
3534
+ args: [varRef("p.0", DYN, loc)],
3535
+ type: DYN,
3536
+ loc,
3537
+ },
3538
+ loc,
3539
+ }, {
3540
+ kind: "if",
3541
+ cond: isPrimitive(varRef(result, DYN, loc), loc),
3542
+ then: [{ kind: "return", value: varRef(result, DYN, loc), loc }],
3543
+ else_: null,
3544
+ loc,
3545
+ });
3546
+ }
3547
+ if (!settled)
3548
+ body.push({
3549
+ kind: "return",
3550
+ value: nodeThrowExpr(1, "", "Cannot convert object to primitive value", DYN, loc),
3551
+ loc,
3552
+ });
3553
+ return { kind: "if", cond: condition, then: body, else_: null, loc };
3554
+ }
3555
+ /** A function calling `method` with `arity` arguments on a boxed instance
3556
+ * of `plan`'s class, as a dynamic method call would: an own replacement on
3557
+ * the instance answers first for methods the program can replace. */
3558
+ toPrimitiveCall(lowerer, plan, method, arity, loc) {
3559
+ const key = JSON.stringify([plan.key, method, arity]);
3560
+ const existing = this.toPrimitiveCalls.get(key);
3561
+ if (existing)
3562
+ return existing.name;
3563
+ const { info } = plan;
3564
+ const { receiver } = this.propertyReceiver(plan, loc);
3565
+ const args = Array.from({ length: arity }, (_, i) => varRef(`p.${i + 1}`, DYN, loc));
3566
+ const source = {
3567
+ kind: "dynInvoke",
3568
+ recv: varRef("p.0", DYN, loc),
3569
+ method,
3570
+ calleeName: method === "sym:toPrimitive" ? "value[Symbol.toPrimitive]" : `value.${method}`,
3571
+ args,
3572
+ type: DYN,
3573
+ loc,
3574
+ };
3575
+ const value = varRef("p.0", DYN, loc);
3576
+ let callback = dynUndefinedExpr(loc);
3577
+ if (isClassCallback(lowerer, info, method)) {
3578
+ const prototypeMethod = lowerer.prototypeMethodAccesses.has(method);
3579
+ if (prototypeMethod)
3580
+ classPrototypeData(lowerer, info, loc);
3581
+ const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
3582
+ callback = {
3583
+ kind: "ternary",
3584
+ cond: prototypeMethod
3585
+ ? { kind: "boolLit", value: true, type: BOOL, loc }
3586
+ : {
3587
+ kind: "libCall",
3588
+ fn: "dyn.hasKey",
3589
+ args: [bag, { kind: "strLit", value: method, type: STRING, loc }],
3590
+ type: BOOL,
3591
+ loc,
3592
+ },
3593
+ then: {
3594
+ kind: "dynObjLit",
3595
+ fields: [
3596
+ {
3597
+ key: { kind: "strLit", value: "value", type: STRING, loc },
3598
+ value: {
3599
+ kind: "dynKeyGet",
3600
+ value: bag,
3601
+ key: { kind: "strLit", value: method, type: STRING, loc },
3602
+ type: DYN,
3603
+ loc,
3604
+ },
3605
+ },
3606
+ ],
3607
+ type: DYN,
3608
+ loc,
3609
+ },
3610
+ else_: dynUndefinedExpr(loc),
3611
+ type: DYN,
3612
+ loc,
3613
+ };
3614
+ }
3615
+ const params = [
3616
+ { localId: "p.0", name: "value", type: DYN },
3617
+ ...args.map((_, i) => ({ localId: `p.${i + 1}`, name: `p${i + 1}`, type: DYN })),
3618
+ ];
3619
+ const fn = {
3620
+ name: `${TO_PRIMITIVE_PREFIX}call.${this.toPrimitiveCalls.size}`,
3621
+ params,
3622
+ locals: [
3623
+ ...params.map((param) => ({
3624
+ id: param.localId,
3625
+ name: param.name,
3626
+ type: param.type,
3627
+ mutable: false,
3628
+ })),
3629
+ { id: "p.callback", name: "callback", type: DYN, mutable: false },
3630
+ { id: "p.calleeName", name: "calleeName", type: STRING, mutable: false },
3631
+ ],
3632
+ returnType: DYN,
3633
+ body: [],
3634
+ loc,
3635
+ };
3636
+ const dispatch = { source, fn, callback: fn, classes: new Set() };
3637
+ const before = lowerer.diags.length;
3638
+ let body;
3639
+ try {
3640
+ body = this.methodBody(lowerer, dispatch, info, receiver);
3641
+ }
3642
+ catch (error) {
3643
+ if (!(error instanceof PoisonError) || !info.decl)
3644
+ throw error;
3645
+ const fence = lowerer.deferToRuntimeFence(before, info.decl, { kind: "statement" });
3646
+ if (!fence)
3647
+ throw error;
3648
+ body = [fence];
3649
+ }
3650
+ fn.body = [
3651
+ { kind: "varDecl", localId: "p.callback", init: callback, loc },
3652
+ {
3653
+ kind: "varDecl",
3654
+ localId: "p.calleeName",
3655
+ init: { kind: "strLit", value: source.calleeName, type: STRING, loc },
3656
+ loc,
3657
+ },
3658
+ ...body,
3659
+ ];
3660
+ this.toPrimitiveCalls.set(key, fn);
3661
+ this.generated.add(fn);
3662
+ lowerer.liftedFns.push(fn);
3663
+ return fn.name;
3664
+ }
2920
3665
  readPropertyBagOrEmpty(lowerer, receiver, loc) {
2921
3666
  // One call per read site: large JS programs have a branch per class and
2922
3667
  // property, so the absent-bag handling lives in the shared helper.
@@ -2968,9 +3713,17 @@ export class ClassDynamicDispatch {
2968
3713
  obj: receiver,
2969
3714
  value: transformExpr(initializers[0].value, {
2970
3715
  stmt: (stmt) => stmt,
2971
- expr: (expr) => expr.kind === "dynCheck" && expr.value.kind === "varRef" && expr.value.localId === "p.0"
2972
- ? receiver
2973
- : expr,
3716
+ expr: (expr) => {
3717
+ const checked = (e) => e.kind === "dynCheck" && e.value.kind === "varRef" && e.value.localId === "p.0";
3718
+ // The checked receiver, possibly cast to this class (the prototype
3719
+ // helper's argument), is the typed parameter itself.
3720
+ if (expr.kind === "downcast" &&
3721
+ checked(expr.value) &&
3722
+ expr.type.kind === "object" &&
3723
+ expr.type.className === type.className)
3724
+ return receiver;
3725
+ return checked(expr) ? receiver : expr;
3726
+ },
2974
3727
  }),
2975
3728
  loc,
2976
3729
  };
@@ -2999,6 +3752,74 @@ export class ClassDynamicDispatch {
2999
3752
  lowerer.liftedFns.push(helper);
3000
3753
  return helper;
3001
3754
  }
3755
+ /** The prototype a new property bag of `current` (or of the subclass the
3756
+ * receiver is) starts from, or null when `current` has no prototype data.
3757
+ * A class with constructible subclasses that have prototype data selects
3758
+ * it through its `%class.bagPrototype` helper; any other class reads its
3759
+ * own prototype data. */
3760
+ bagPrototype(lowerer, current, receiver, loc) {
3761
+ const arg = receiver.type.kind === "object" && receiver.type.className !== current.def.name
3762
+ ? {
3763
+ kind: "downcast",
3764
+ value: receiver,
3765
+ type: { kind: "object", className: current.def.name },
3766
+ loc,
3767
+ }
3768
+ : receiver;
3769
+ const helper = this.bagPrototypeHelper(lowerer, current, loc);
3770
+ return helper
3771
+ ? { kind: "call", callee: helper.name, args: [arg], type: DYN, loc }
3772
+ : classPrototypeData(lowerer, current, loc, arg);
3773
+ }
3774
+ /** `%class.bagPrototype:<class>(this)`: the prototype data of the most
3775
+ * derived constructible class `this` is an instance of, tested from the
3776
+ * last subclass to the first and then the class itself. One helper per
3777
+ * class, calling its subclasses' helpers, keeps every property-bag branch
3778
+ * a single call: a whole hierarchy inlined into each branch grows with the
3779
+ * square of its depth. Null when the class has no prototype data, in which
3780
+ * case its subclasses are not tested either, or while no constructible
3781
+ * subclass has any. The body is rebuilt on each use, as classes become
3782
+ * constructible. */
3783
+ bagPrototypeHelper(lowerer, current, loc) {
3784
+ const type = { kind: "object", className: current.def.name };
3785
+ const self = varRef("this", type, loc);
3786
+ const own = classPrototypeData(lowerer, current, loc, self);
3787
+ if (!own)
3788
+ return null;
3789
+ const body = [];
3790
+ const children = current.subclasses.filter((child) => lowerer.classCanBeConstructed(child));
3791
+ for (const child of children.reverse()) {
3792
+ const selected = this.bagPrototype(lowerer, child, self, loc);
3793
+ if (!selected)
3794
+ continue;
3795
+ body.push({
3796
+ kind: "if",
3797
+ cond: { kind: "instanceOf", value: self, className: child.def.name, type: BOOL, loc },
3798
+ then: [{ kind: "return", value: selected, loc }],
3799
+ else_: null,
3800
+ loc,
3801
+ });
3802
+ }
3803
+ let helper = this.bagPrototypeHelpers.get(current.def.name);
3804
+ if (!helper && body.length === 0)
3805
+ return null;
3806
+ body.push({ kind: "return", value: own, loc });
3807
+ if (!helper) {
3808
+ helper = {
3809
+ name: `%class.bagPrototype:${current.def.name}`,
3810
+ params: [{ localId: "this", name: "this", type }],
3811
+ returnType: DYN,
3812
+ locals: [{ id: "this", name: "this", type, mutable: false }],
3813
+ body,
3814
+ loc,
3815
+ };
3816
+ this.bagPrototypeHelpers.set(current.def.name, helper);
3817
+ this.generated.add(helper);
3818
+ lowerer.liftedFns.push(helper);
3819
+ }
3820
+ helper.body = body;
3821
+ return helper;
3822
+ }
3002
3823
  /** Prototype state may appear in a later reachable body, so read-only bags
3003
3824
  * settle only after the dispatch worklist closes. A read never stores: an
3004
3825
  * absent empty bag stays undefined (callers test it), and an absent
@@ -3270,19 +4091,43 @@ export class ClassDynamicDispatch {
3270
4091
  loc,
3271
4092
  };
3272
4093
  if (accessor && info.decl) {
3273
- const method = classMethodValue(lowerer, info.decl, info, member, loc);
3274
- if (method) {
3275
- const call = {
3276
- kind: "libCall",
3277
- fn: "dyn.reflectApply",
3278
- args: [
3279
- lowerer.coerceToExpected(method, DYN),
3280
- actualReceiver,
3281
- { kind: "dynArrLit", elems: write ? [varRef("p.1", DYN, loc)] : [], type: DYN, loc },
3282
- ],
3283
- type: DYN,
3284
- loc,
3285
- };
4094
+ // An accessor whose private names belong to one evaluation runs as
4095
+ // the instance's own evaluation's prototype accessor.
4096
+ const declarer = accessor.declarer;
4097
+ const prototype = perEvaluationPrivateNames(declarer)
4098
+ ? classPrototypeData(lowerer, declarer, loc, upcastTo(lowerer, receiver, declarer.def.name))
4099
+ : null;
4100
+ const method = prototype ? null : classMethodValue(lowerer, info.decl, info, member, loc);
4101
+ if (prototype || method) {
4102
+ const call = prototype
4103
+ ? {
4104
+ kind: "libCall",
4105
+ fn: write ? "dyn.reflectSet" : "dyn.reflectGet",
4106
+ args: [
4107
+ prototype,
4108
+ lowerer.coerceToExpected(key, DYN),
4109
+ ...(write ? [varRef("p.1", DYN, loc)] : []),
4110
+ actualReceiver,
4111
+ ],
4112
+ type: write ? BOOL : DYN,
4113
+ loc,
4114
+ }
4115
+ : {
4116
+ kind: "libCall",
4117
+ fn: "dyn.reflectApply",
4118
+ args: [
4119
+ lowerer.coerceToExpected(method, DYN),
4120
+ actualReceiver,
4121
+ {
4122
+ kind: "dynArrLit",
4123
+ elems: write ? [varRef("p.1", DYN, loc)] : [],
4124
+ type: DYN,
4125
+ loc,
4126
+ },
4127
+ ],
4128
+ type: DYN,
4129
+ loc,
4130
+ };
3286
4131
  return [
3287
4132
  {
3288
4133
  kind: "if",
@@ -3444,6 +4289,99 @@ export class ClassDynamicDispatch {
3444
4289
  },
3445
4290
  ];
3446
4291
  }
4292
+ // An Error's own `stack`: a string is the native error's stack, which
4293
+ // typed reads share; any other value is kept with the instance's own
4294
+ // properties, which a read checks first. A class whose chain declares
4295
+ // a `stack` accessor answers through it (the accessor code below).
4296
+ if (name === "stack" &&
4297
+ !info.fields.has(name) &&
4298
+ lowerer.isSubclassOf(info.def.name, "%Error") &&
4299
+ !findMethodOn(lowerer, info, "get:stack") &&
4300
+ !findMethodOn(lowerer, info, "set:stack")) {
4301
+ const key = { kind: "strLit", value: name, type: STRING, loc };
4302
+ const error = lowerer.upcastTo(receiver, "%Error");
4303
+ if (write) {
4304
+ const helper = classPropertiesHelper(lowerer, loc);
4305
+ this.generated.add(helper);
4306
+ const store = {
4307
+ kind: "exprStmt",
4308
+ expr: {
4309
+ kind: "libCall",
4310
+ fn: "dyn.keySet",
4311
+ args: [
4312
+ {
4313
+ kind: "call",
4314
+ callee: helper.name,
4315
+ args: [lowerer.coerceToExpected(receiver, DYN)],
4316
+ type: DYN,
4317
+ loc,
4318
+ },
4319
+ key,
4320
+ varRef("p.1", DYN, loc),
4321
+ ],
4322
+ type: VOID,
4323
+ loc,
4324
+ },
4325
+ loc,
4326
+ };
4327
+ return [
4328
+ {
4329
+ kind: "if",
4330
+ cond: {
4331
+ kind: "dynTest",
4332
+ test: "string",
4333
+ value: varRef("p.1", DYN, loc),
4334
+ type: BOOL,
4335
+ loc,
4336
+ },
4337
+ then: [
4338
+ {
4339
+ kind: "exprStmt",
4340
+ expr: {
4341
+ kind: "libCall",
4342
+ fn: "error.setStack",
4343
+ args: [error, lowerer.coerceToExpected(varRef("p.1", DYN, loc), STRING)],
4344
+ type: VOID,
4345
+ loc,
4346
+ },
4347
+ loc,
4348
+ },
4349
+ {
4350
+ kind: "if",
4351
+ cond: this.readBagHas(lowerer, "dyn.hasKey", this.readPropertyBag(lowerer, receiver, loc), key, loc),
4352
+ then: [store],
4353
+ else_: null,
4354
+ loc,
4355
+ },
4356
+ ],
4357
+ else_: [store],
4358
+ loc,
4359
+ },
4360
+ { kind: "return", value: null, loc },
4361
+ ];
4362
+ }
4363
+ const bag = this.readPropertyBag(lowerer, receiver, loc);
4364
+ return [
4365
+ {
4366
+ kind: "return",
4367
+ value: {
4368
+ kind: "ternary",
4369
+ cond: this.readBagHas(lowerer, "dyn.hasKey", bag, key, loc),
4370
+ then: {
4371
+ kind: "libCall",
4372
+ fn: "dyn.bagGet",
4373
+ args: [bag, key, lowerer.coerceToExpected(receiver, DYN)],
4374
+ type: DYN,
4375
+ loc,
4376
+ },
4377
+ else_: lowerer.coerceToExpected({ kind: "libCall", fn: "error.stack", args: [error], type: STRING, loc }, DYN),
4378
+ type: DYN,
4379
+ loc,
4380
+ },
4381
+ loc,
4382
+ },
4383
+ ];
4384
+ }
3447
4385
  if ((name === "message" || name === "name") && lowerer.isSubclassOf(info.def.name, "%Error"))
3448
4386
  return write
3449
4387
  ? [
@@ -3549,9 +4487,7 @@ export class ClassDynamicDispatch {
3549
4487
  const body = [];
3550
4488
  const symbol = symbolMemberKey(lowerer, info, name, loc);
3551
4489
  if (symbol || (isClassOwnEnumerableFieldName(name) && !name.startsWith("sym:"))) {
3552
- const prototypeMethod = lowerer.prototypeMethodAccesses.has(name);
3553
- if (prototypeMethod)
3554
- classPrototypeData(lowerer, info, loc, receiver);
4490
+ const prototypeMethod = observedPrototypeMethod(lowerer, info, name, loc, receiver);
3555
4491
  // Selecting the method must not give the object own storage.
3556
4492
  const bag = this.readPropertyBag(lowerer, receiver, loc);
3557
4493
  const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
@@ -3615,19 +4551,40 @@ export class ClassDynamicDispatch {
3615
4551
  if (!field && !accessor) {
3616
4552
  const instance = lowerer.coerceToExpected(receiver, DYN);
3617
4553
  const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc);
3618
- return [
3619
- {
3620
- kind: "return",
3621
- value: {
3622
- kind: "libCall",
3623
- fn: "dyn.bagGet",
3624
- args: [bag, { kind: "strLit", value: name, type: STRING, loc }, instance],
3625
- type: DYN,
4554
+ const key = { kind: "strLit", value: name, type: STRING, loc };
4555
+ const own = {
4556
+ kind: "libCall",
4557
+ fn: "dyn.bagGet",
4558
+ args: [bag, key, instance],
4559
+ type: DYN,
4560
+ loc,
4561
+ };
4562
+ // An Object.prototype method no class in the chain declares: an
4563
+ // own property shadows it, otherwise the read answers the same
4564
+ // interned value `Object.prototype.<name>` reads.
4565
+ if (INHERITED_OBJECT_METHODS.has(name) && !findMethodOn(lowerer, info, name)) {
4566
+ return [
4567
+ {
4568
+ kind: "return",
4569
+ value: {
4570
+ kind: "ternary",
4571
+ cond: this.readBagHas(lowerer, "dyn.hasKey", bag, key, loc),
4572
+ then: own,
4573
+ else_: {
4574
+ kind: "libCall",
4575
+ fn: "dyn.builtinMethod",
4576
+ args: [{ kind: "strLit", value: "Object", type: STRING, loc }, key],
4577
+ type: DYN,
4578
+ loc,
4579
+ },
4580
+ type: DYN,
4581
+ loc,
4582
+ },
3626
4583
  loc,
3627
4584
  },
3628
- loc,
3629
- },
3630
- ];
4585
+ ];
4586
+ }
4587
+ return [{ kind: "return", value: own, loc }];
3631
4588
  }
3632
4589
  const type = field ?? accessor.sig.ret;
3633
4590
  if (!canConvertToDyn(type, getRecord, getUnion))
@@ -3947,6 +4904,8 @@ export class ClassDynamicDispatch {
3947
4904
  let callee;
3948
4905
  let virtual = false;
3949
4906
  let owner;
4907
+ /** Erased instances of subclasses that redeclare a generic method. */
4908
+ const overrides = [];
3950
4909
  if (methodInfo) {
3951
4910
  owner = methodInfo.declarer;
3952
4911
  params = methodInfo.sig.params;
@@ -3969,6 +4928,42 @@ export class ClassDynamicDispatch {
3969
4928
  result = instance.returnType;
3970
4929
  callee = instance.name;
3971
4930
  }
4931
+ else if (generic &&
4932
+ !generic.info.implicitParams &&
4933
+ generic.info.typeParams.length > 0 &&
4934
+ generic.declarer.decl &&
4935
+ !lowerer.overrideBelow(info, method)) {
4936
+ // A generic method called by name runs its erased instance; a
4937
+ // subclass that redeclares it runs its own, selected by the
4938
+ // receiver's runtime class (most derived first).
4939
+ owner = generic.declarer;
4940
+ const instance = erasedGenericInstance(lowerer, generic.declarer.decl, generic.info);
4941
+ params = instance.params;
4942
+ result = instance.returnType;
4943
+ callee = instance.name;
4944
+ if (genericOverrideBelow(info, method)) {
4945
+ const subclasses = [];
4946
+ const collect = (c) => {
4947
+ for (const sub of c.subclasses) {
4948
+ collect(sub);
4949
+ if (sub.genericMethods?.has(method) && lowerer.classCanBeConstructed(sub))
4950
+ subclasses.push(sub);
4951
+ }
4952
+ };
4953
+ collect(info);
4954
+ for (const sub of subclasses) {
4955
+ const own = sub.genericMethods.get(method);
4956
+ if (!sub.decl || own.implicitParams || own.typeParams.length === 0)
4957
+ return fence();
4958
+ const subInstance = erasedGenericInstance(lowerer, sub.decl, own);
4959
+ if (subInstance.params.length !== params.length ||
4960
+ subInstance.params.some((p, i) => !typeEquals(p.type, params[i].type)) ||
4961
+ !typeEquals(subInstance.returnType, result))
4962
+ return fence();
4963
+ overrides.push({ cls: sub, callee: subInstance.name });
4964
+ }
4965
+ }
4966
+ }
3972
4967
  else
3973
4968
  return fence();
3974
4969
  const incoming = dispatch.source.args.map((_, i) => varRef(`p.${i + 1}`, DYN, loc));
@@ -4004,7 +4999,7 @@ export class ClassDynamicDispatch {
4004
4999
  return fence();
4005
5000
  args.push(converted);
4006
5001
  }
4007
- const call = virtual
5002
+ let call = virtual
4008
5003
  ? {
4009
5004
  kind: "virtualCall",
4010
5005
  className: owner.def.name,
@@ -4020,6 +5015,29 @@ export class ClassDynamicDispatch {
4020
5015
  type: result,
4021
5016
  loc,
4022
5017
  };
5018
+ for (const override of overrides.toReversed()) {
5019
+ const subType = { kind: "object", className: override.cls.def.name };
5020
+ call = {
5021
+ kind: "ternary",
5022
+ cond: {
5023
+ kind: "instanceOf",
5024
+ value: receiver,
5025
+ className: override.cls.def.name,
5026
+ type: BOOL,
5027
+ loc,
5028
+ },
5029
+ then: {
5030
+ kind: "call",
5031
+ callee: override.callee,
5032
+ args: [{ kind: "downcast", value: receiver, type: subType, loc }, ...args],
5033
+ type: result,
5034
+ loc,
5035
+ },
5036
+ else_: call,
5037
+ type: result,
5038
+ loc,
5039
+ };
5040
+ }
4023
5041
  let body;
4024
5042
  if (result.kind === "void")
4025
5043
  body = [
@@ -4079,4 +5097,12 @@ export class ClassDynamicDispatch {
4079
5097
  return body;
4080
5098
  }
4081
5099
  }
5100
+ /** Object.prototype methods every class instance inherits unless its class
5101
+ * chain declares them. */
5102
+ const INHERITED_OBJECT_METHODS = new Set([
5103
+ "valueOf",
5104
+ "toString",
5105
+ "hasOwnProperty",
5106
+ "propertyIsEnumerable",
5107
+ ]);
4082
5108
  //# sourceMappingURL=class-dynamic-dispatch.js.map