@scriptc/compiler 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +397 -37
  2. package/dist/backend/cycle-analysis.d.ts +4 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +21 -9
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +473 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +258 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  58. package/dist/backend/llvm/dense-array-access.js +222 -52
  59. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  61. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  63. package/dist/backend/llvm/dense-array-loops.js +194 -5
  64. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  66. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  67. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  68. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn.d.ts +26 -0
  70. package/dist/backend/llvm/dyn.js +352 -61
  71. package/dist/backend/llvm/dyn.js.map +1 -1
  72. package/dist/backend/llvm/emit-function.js +11 -20
  73. package/dist/backend/llvm/emit-function.js.map +1 -1
  74. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  75. package/dist/backend/llvm/emit-journal.js +170 -0
  76. package/dist/backend/llvm/emit-journal.js.map +1 -0
  77. package/dist/backend/llvm/emit-module.js +195 -27
  78. package/dist/backend/llvm/emit-module.js.map +1 -1
  79. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  80. package/dist/backend/llvm/emit-statements.js +268 -84
  81. package/dist/backend/llvm/emit-statements.js.map +1 -1
  82. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  83. package/dist/backend/llvm/emitter-state.js +14 -0
  84. package/dist/backend/llvm/emitter-state.js.map +1 -0
  85. package/dist/backend/llvm/emitter.d.ts +176 -37
  86. package/dist/backend/llvm/emitter.js +724 -85
  87. package/dist/backend/llvm/emitter.js.map +1 -1
  88. package/dist/backend/llvm/emitter.test.js +54 -5
  89. package/dist/backend/llvm/emitter.test.js.map +1 -1
  90. package/dist/backend/llvm/expr-bytes.js +34 -12
  91. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  92. package/dist/backend/llvm/expr-callbacks.js +47 -0
  93. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  94. package/dist/backend/llvm/expr-calls.js +28 -14
  95. package/dist/backend/llvm/expr-calls.js.map +1 -1
  96. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  97. package/dist/backend/llvm/expr-containers.js +129 -37
  98. package/dist/backend/llvm/expr-containers.js.map +1 -1
  99. package/dist/backend/llvm/expr-context.d.ts +14 -0
  100. package/dist/backend/llvm/expr-dynamic.js +18 -11
  101. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +100 -28
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  105. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  106. package/dist/backend/llvm/expr-records.d.ts +12 -0
  107. package/dist/backend/llvm/expr-records.js +106 -0
  108. package/dist/backend/llvm/expr-records.js.map +1 -1
  109. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  110. package/dist/backend/llvm/expr-stream-bridges.js +194 -65
  111. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  115. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  118. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  119. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  120. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  121. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  122. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  123. package/dist/backend/llvm/integer-values.d.ts +20 -1
  124. package/dist/backend/llvm/integer-values.js +71 -0
  125. package/dist/backend/llvm/integer-values.js.map +1 -1
  126. package/dist/backend/llvm/js-ic.d.ts +1 -1
  127. package/dist/backend/llvm/js-ic.js +1 -1
  128. package/dist/backend/llvm/js-ic.js.map +1 -1
  129. package/dist/backend/llvm/key-orders.d.ts +7 -0
  130. package/dist/backend/llvm/key-orders.js +33 -0
  131. package/dist/backend/llvm/key-orders.js.map +1 -0
  132. package/dist/backend/llvm/lib-connect.js +4 -0
  133. package/dist/backend/llvm/lib-connect.js.map +1 -1
  134. package/dist/backend/llvm/lib-datagram.js +11 -0
  135. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  136. package/dist/backend/llvm/lib-dispatch.js +80 -2
  137. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  138. package/dist/backend/llvm/lib-filesystem.js +4 -4
  139. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  140. package/dist/backend/llvm/lib-http2.js +4 -0
  141. package/dist/backend/llvm/lib-http2.js.map +1 -1
  142. package/dist/backend/llvm/lib-lookup.js +16 -6
  143. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  144. package/dist/backend/llvm/lib-shared.js +73 -2
  145. package/dist/backend/llvm/lib-shared.js.map +1 -1
  146. package/dist/backend/llvm/lib-stream.js +35 -5
  147. package/dist/backend/llvm/lib-stream.js.map +1 -1
  148. package/dist/backend/llvm/local-array-reads.js +115 -19
  149. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  150. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  151. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  152. package/dist/backend/llvm/loop-state.d.ts +33 -0
  153. package/dist/backend/llvm/loop-state.js +42 -0
  154. package/dist/backend/llvm/loop-state.js.map +1 -0
  155. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  156. package/dist/backend/llvm/map-number-lookup.js +91 -31
  157. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  158. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  159. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  160. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  161. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  162. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  163. package/dist/backend/llvm/nullable-unions.js +15 -3
  164. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  165. package/dist/backend/llvm/publish.d.ts +10 -0
  166. package/dist/backend/llvm/publish.js +12 -0
  167. package/dist/backend/llvm/publish.js.map +1 -1
  168. package/dist/backend/llvm/receivers.js +6 -1
  169. package/dist/backend/llvm/receivers.js.map +1 -1
  170. package/dist/backend/llvm/record-results.d.ts +1 -9
  171. package/dist/backend/llvm/record-results.js +2 -11
  172. package/dist/backend/llvm/record-results.js.map +1 -1
  173. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  174. package/dist/backend/llvm/reference-writes.js +89 -72
  175. package/dist/backend/llvm/reference-writes.js.map +1 -1
  176. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  177. package/dist/backend/llvm/running-extrema.js +115 -0
  178. package/dist/backend/llvm/running-extrema.js.map +1 -0
  179. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  180. package/dist/backend/llvm/running-extrema.test.js +89 -0
  181. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  182. package/dist/backend/llvm/shapes.d.ts +71 -15
  183. package/dist/backend/llvm/shapes.js +222 -33
  184. package/dist/backend/llvm/shapes.js.map +1 -1
  185. package/dist/backend/llvm/shapes.test.js +53 -7
  186. package/dist/backend/llvm/shapes.test.js.map +1 -1
  187. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  188. package/dist/backend/llvm/speculative-integers.js +2 -2
  189. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  190. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  191. package/dist/backend/llvm/stack-objects.js +5 -2
  192. package/dist/backend/llvm/stack-objects.js.map +1 -1
  193. package/dist/backend/llvm/string-reads.d.ts +12 -0
  194. package/dist/backend/llvm/string-reads.js +44 -0
  195. package/dist/backend/llvm/string-reads.js.map +1 -1
  196. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  197. package/dist/backend/llvm/walk-borrows.js +46 -41
  198. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  199. package/dist/backend/llvm/walkers.d.ts +3 -0
  200. package/dist/backend/llvm/walkers.js +88 -65
  201. package/dist/backend/llvm/walkers.js.map +1 -1
  202. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  203. package/dist/backend/llvm/wrapping-sums.js +126 -0
  204. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  205. package/dist/backend/may-throw.d.ts +8 -10
  206. package/dist/backend/may-throw.js +14 -10
  207. package/dist/backend/may-throw.js.map +1 -1
  208. package/dist/backend/native/contracts.d.ts +5 -0
  209. package/dist/backend/native/executable.js +7 -0
  210. package/dist/backend/native/executable.js.map +1 -1
  211. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  212. package/dist/backend/native/runtime-inputs.js +1 -0
  213. package/dist/backend/native/runtime-inputs.js.map +1 -1
  214. package/dist/backend/native-link-info-core.d.ts +4 -0
  215. package/dist/backend/native-link-info-core.js.map +1 -1
  216. package/dist/backend/publication.d.ts +12 -1
  217. package/dist/backend/publication.js +37 -14
  218. package/dist/backend/publication.js.map +1 -1
  219. package/dist/backend/publication.test.js +30 -0
  220. package/dist/backend/publication.test.js.map +1 -1
  221. package/dist/backend/result-slots.d.ts +16 -0
  222. package/dist/backend/result-slots.js +23 -0
  223. package/dist/backend/result-slots.js.map +1 -0
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +1 -0
  227. package/dist/backend/runtime-pack-core.js +1 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +2 -1
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.test.js +2 -1
  232. package/dist/backend/runtime-pack.test.js.map +1 -1
  233. package/dist/backend/stack-observations.d.ts +2 -1
  234. package/dist/backend/stack-observations.js +67 -42
  235. package/dist/backend/stack-observations.js.map +1 -1
  236. package/dist/backend/target-diagnostics.js +5 -3
  237. package/dist/backend/target-diagnostics.js.map +1 -1
  238. package/dist/backend/warm-cache.js +1 -0
  239. package/dist/backend/warm-cache.js.map +1 -1
  240. package/dist/cli/usage.d.ts +1 -1
  241. package/dist/cli/usage.js +3 -3
  242. package/dist/compat/fetch-profile.js +1 -1
  243. package/dist/compat/fetch-profile.js.map +1 -1
  244. package/dist/contracts/check.js +4 -3
  245. package/dist/contracts/check.js.map +1 -1
  246. package/dist/contracts/int32-elements.js +10 -2
  247. package/dist/contracts/int32-elements.js.map +1 -1
  248. package/dist/coverage/report.js +12 -3
  249. package/dist/coverage/report.js.map +1 -1
  250. package/dist/diagnostics/diagnostic.d.ts +4 -0
  251. package/dist/diagnostics/diagnostic.js.map +1 -1
  252. package/dist/diagnostics/envelope.d.ts +3 -0
  253. package/dist/diagnostics/envelope.js +1 -0
  254. package/dist/diagnostics/envelope.js.map +1 -1
  255. package/dist/executable/executable-cache.d.ts +2 -0
  256. package/dist/executable/executable-cache.js +1 -0
  257. package/dist/executable/executable-cache.js.map +1 -1
  258. package/dist/executable/executable-cache.test.js +1 -0
  259. package/dist/executable/executable-cache.test.js.map +1 -1
  260. package/dist/frontend/decl-projection.d.ts +41 -0
  261. package/dist/frontend/decl-projection.js +854 -0
  262. package/dist/frontend/decl-projection.js.map +1 -0
  263. package/dist/frontend/decl-projection.test.d.ts +1 -0
  264. package/dist/frontend/decl-projection.test.js +30 -0
  265. package/dist/frontend/decl-projection.test.js.map +1 -0
  266. package/dist/frontend/dts-paths.d.ts +15 -0
  267. package/dist/frontend/dts-paths.js +25 -0
  268. package/dist/frontend/dts-paths.js.map +1 -1
  269. package/dist/frontend/input-tracker.d.ts +6 -0
  270. package/dist/frontend/input-tracker.js +51 -28
  271. package/dist/frontend/input-tracker.js.map +1 -1
  272. package/dist/frontend/input-tracker.test.js +19 -0
  273. package/dist/frontend/input-tracker.test.js.map +1 -1
  274. package/dist/frontend/lowering/array-values.js +100 -2
  275. package/dist/frontend/lowering/array-values.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  277. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  279. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/crypto.js +84 -9
  281. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  283. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  284. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  285. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  286. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  288. package/dist/frontend/lowering/builtins/promises.js +88 -2
  289. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  290. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  291. package/dist/frontend/lowering/builtins/readline.js +35 -3
  292. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/url.js +24 -1
  294. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  295. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  296. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  297. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  298. package/dist/frontend/lowering/class-callbacks.js +82 -12
  299. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  300. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  301. package/dist/frontend/lowering/class-construction.js +17 -3
  302. package/dist/frontend/lowering/class-construction.js.map +1 -1
  303. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +39 -2
  304. package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -108
  305. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  306. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  307. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  308. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  309. package/dist/frontend/lowering/class-iterables.js +9 -1
  310. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  311. package/dist/frontend/lowering/class-method-mutations.js +32 -9
  312. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  313. package/dist/frontend/lowering/class-prototypes.js +31 -2
  314. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  315. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  316. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  317. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  318. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  319. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  320. package/dist/frontend/lowering/coercions/structural.js +91 -1
  321. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  322. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  323. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  324. package/dist/frontend/lowering/containers/array-callbacks.js +338 -18
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  327. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  328. package/dist/frontend/lowering/containers/array-methods.js +15 -0
  329. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  330. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  331. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  332. package/dist/frontend/lowering/containers/bytes.js +2 -1
  333. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  334. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  335. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  336. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  337. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  338. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  339. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  340. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  341. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  342. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  343. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  344. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  345. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  346. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  347. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  348. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  349. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  350. package/dist/frontend/lowering/divergences.js +9 -1
  351. package/dist/frontend/lowering/divergences.js.map +1 -1
  352. package/dist/frontend/lowering/error-methods.js +47 -2
  353. package/dist/frontend/lowering/error-methods.js.map +1 -1
  354. package/dist/frontend/lowering/expressions/array-literals.js +47 -0
  355. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  356. package/dist/frontend/lowering/expressions/binary.js +36 -2
  357. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  358. package/dist/frontend/lowering/expressions/element-access.js +90 -13
  359. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  360. package/dist/frontend/lowering/expressions/identifiers.js +33 -4
  361. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  362. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  363. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  364. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  365. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  366. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  367. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  368. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  369. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  370. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  371. package/dist/frontend/lowering/expressions/property-access.js +113 -11
  372. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  373. package/dist/frontend/lowering/expressions/relational.js +212 -33
  374. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  375. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  376. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  377. package/dist/frontend/lowering/expressions/updates.js +22 -3
  378. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  379. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  380. package/dist/frontend/lowering/frozen-records.js +322 -0
  381. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  382. package/dist/frontend/lowering/function-returns.js +49 -0
  383. package/dist/frontend/lowering/function-returns.js.map +1 -1
  384. package/dist/frontend/lowering/generic-functions.js +7 -2
  385. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  386. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  387. package/dist/frontend/lowering/iterable-values.js +297 -0
  388. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  389. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  390. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  391. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  392. package/dist/frontend/lowering/js-class-fields.js +45 -10
  393. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  394. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  395. package/dist/frontend/lowering/key-order-witness.js +770 -22
  396. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  397. package/dist/frontend/lowering/key-order-witness.test.js +428 -8
  398. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  399. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  400. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  401. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  402. package/dist/frontend/lowering/lower-calls.js +443 -41
  403. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  404. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  405. package/dist/frontend/lowering/lower-classes.js +302 -22
  406. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  407. package/dist/frontend/lowering/lower-dgram.js +3 -1
  408. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  409. package/dist/frontend/lowering/lower-exprs.js +10 -2
  410. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  411. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  412. package/dist/frontend/lowering/lower-functions.js +83 -0
  413. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  414. package/dist/frontend/lowering/lower-generators.js +41 -31
  415. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  416. package/dist/frontend/lowering/lower-global-value.js +6 -3
  417. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  418. package/dist/frontend/lowering/lower-inspect.js +18 -6
  419. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  420. package/dist/frontend/lowering/lower-modules.js +32 -0
  421. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  422. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  423. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  424. package/dist/frontend/lowering/lower-server.js +2 -2
  425. package/dist/frontend/lowering/lower-server.js.map +1 -1
  426. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  427. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  428. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  429. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  430. package/dist/frontend/lowering/lower-stmts.js +454 -48
  431. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  432. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  433. package/dist/frontend/lowering/lower-stream.js +1483 -156
  434. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  435. package/dist/frontend/lowering/lowerer.d.ts +77 -6
  436. package/dist/frontend/lowering/lowerer.js +313 -29
  437. package/dist/frontend/lowering/lowerer.js.map +1 -1
  438. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  439. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  440. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  441. package/dist/frontend/lowering/new-target.d.ts +12 -0
  442. package/dist/frontend/lowering/new-target.js +280 -0
  443. package/dist/frontend/lowering/new-target.js.map +1 -0
  444. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  445. package/dist/frontend/lowering/surfaces.js +18 -6
  446. package/dist/frontend/lowering/surfaces.js.map +1 -1
  447. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  448. package/dist/frontend/lowering/undefined-index.js +82 -0
  449. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  450. package/dist/frontend/lowering/var-hoisting.js +29 -13
  451. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  452. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  453. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  454. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  455. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  456. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  457. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  458. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  459. package/dist/frontend/npm-static.js +4 -20
  460. package/dist/frontend/npm-static.js.map +1 -1
  461. package/dist/frontend/package-shims.d.ts +3 -0
  462. package/dist/frontend/package-shims.js +71 -8
  463. package/dist/frontend/package-shims.js.map +1 -1
  464. package/dist/frontend/pipeline.js +18 -10
  465. package/dist/frontend/pipeline.js.map +1 -1
  466. package/dist/frontend/process-fork.d.ts +25 -0
  467. package/dist/frontend/process-fork.js +2 -0
  468. package/dist/frontend/process-fork.js.map +1 -0
  469. package/dist/frontend/program.d.ts +8 -1
  470. package/dist/frontend/program.js +484 -69
  471. package/dist/frontend/program.js.map +1 -1
  472. package/dist/frontend/program.test.js +43 -3
  473. package/dist/frontend/program.test.js.map +1 -1
  474. package/dist/frontend/token-equivalence.d.ts +3 -0
  475. package/dist/frontend/token-equivalence.js +409 -0
  476. package/dist/frontend/token-equivalence.js.map +1 -0
  477. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  478. package/dist/frontend/token-equivalence.test.js +67 -0
  479. package/dist/frontend/token-equivalence.test.js.map +1 -0
  480. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  481. package/dist/frontend/ts7/ast-node.js +1048 -103
  482. package/dist/frontend/ts7/ast-node.js.map +1 -1
  483. package/dist/frontend/ts7/ast-node.test.js +24 -0
  484. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  485. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  486. package/dist/frontend/ts7/ast-wire.js +34 -24
  487. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  488. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  489. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  490. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  491. package/dist/frontend/ts7/checker-backend.js +2 -2
  492. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  493. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  494. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  495. package/dist/frontend/ts7/checker.d.ts +4 -0
  496. package/dist/frontend/ts7/checker.js +7 -0
  497. package/dist/frontend/ts7/checker.js.map +1 -1
  498. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  499. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  500. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  501. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  502. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  503. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  504. package/dist/frontend/ts7/program-host.d.ts +7 -0
  505. package/dist/frontend/ts7/program-host.js +25 -2
  506. package/dist/frontend/ts7/program-host.js.map +1 -1
  507. package/dist/frontend/ts7/session.d.ts +14 -1
  508. package/dist/frontend/ts7/session.js +22 -0
  509. package/dist/frontend/ts7/session.js.map +1 -1
  510. package/dist/frontend/type-mapper.d.ts +13 -1
  511. package/dist/frontend/type-mapper.js +191 -11
  512. package/dist/frontend/type-mapper.js.map +1 -1
  513. package/dist/index.d.ts +0 -5
  514. package/dist/index.js +34 -4
  515. package/dist/index.js.map +1 -1
  516. package/dist/ir/analysis.js +5 -3
  517. package/dist/ir/analysis.js.map +1 -1
  518. package/dist/ir/array-length-stability.d.ts +4 -0
  519. package/dist/ir/array-length-stability.js +19 -6
  520. package/dist/ir/array-length-stability.js.map +1 -1
  521. package/dist/ir/array-length-stability.test.js +24 -0
  522. package/dist/ir/array-length-stability.test.js.map +1 -1
  523. package/dist/ir/builtin-effects.d.ts +7 -0
  524. package/dist/ir/builtin-effects.js +52 -0
  525. package/dist/ir/builtin-effects.js.map +1 -1
  526. package/dist/ir/builtin-signatures.d.ts +6 -4
  527. package/dist/ir/builtin-signatures.js +166 -13
  528. package/dist/ir/builtin-signatures.js.map +1 -1
  529. package/dist/ir/callback-specialization.d.ts +2 -1
  530. package/dist/ir/callback-specialization.js +23 -18
  531. package/dist/ir/callback-specialization.js.map +1 -1
  532. package/dist/ir/char-unit-locals.d.ts +19 -0
  533. package/dist/ir/char-unit-locals.js +185 -0
  534. package/dist/ir/char-unit-locals.js.map +1 -0
  535. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  536. package/dist/ir/char-unit-locals.test.js +94 -0
  537. package/dist/ir/char-unit-locals.test.js.map +1 -0
  538. package/dist/ir/final-fields.d.ts +2 -1
  539. package/dist/ir/final-fields.js +14 -16
  540. package/dist/ir/final-fields.js.map +1 -1
  541. package/dist/ir/function-references.d.ts +2 -0
  542. package/dist/ir/function-references.js +2 -0
  543. package/dist/ir/function-references.js.map +1 -1
  544. package/dist/ir/function-references.test.js +3 -0
  545. package/dist/ir/function-references.test.js.map +1 -1
  546. package/dist/ir/initializer-bindings.d.ts +2 -1
  547. package/dist/ir/initializer-bindings.js +27 -20
  548. package/dist/ir/initializer-bindings.js.map +1 -1
  549. package/dist/ir/int32-arrays.d.ts +108 -0
  550. package/dist/ir/int32-arrays.js +831 -0
  551. package/dist/ir/int32-arrays.js.map +1 -0
  552. package/dist/ir/int32-slots.d.ts +24 -2
  553. package/dist/ir/int32-slots.js +259 -57
  554. package/dist/ir/int32-slots.js.map +1 -1
  555. package/dist/ir/integer-loops.d.ts +3 -3
  556. package/dist/ir/integer-loops.js +14 -6
  557. package/dist/ir/integer-loops.js.map +1 -1
  558. package/dist/ir/integer-loops.test.js +10 -0
  559. package/dist/ir/integer-loops.test.js.map +1 -1
  560. package/dist/ir/integer-ranges.d.ts +5 -0
  561. package/dist/ir/integer-ranges.js +125 -12
  562. package/dist/ir/integer-ranges.js.map +1 -1
  563. package/dist/ir/integer-ranges.test.js +30 -0
  564. package/dist/ir/integer-ranges.test.js.map +1 -1
  565. package/dist/ir/ir.d.ts +70 -7
  566. package/dist/ir/ir.js +58 -1
  567. package/dist/ir/ir.js.map +1 -1
  568. package/dist/ir/ir.test.js +21 -1
  569. package/dist/ir/ir.test.js.map +1 -1
  570. package/dist/ir/js-ic.d.ts +19 -2
  571. package/dist/ir/js-ic.js +95 -11
  572. package/dist/ir/js-ic.js.map +1 -1
  573. package/dist/ir/js-ic.test.js +188 -0
  574. package/dist/ir/js-ic.test.js.map +1 -1
  575. package/dist/ir/node-index.d.ts +57 -0
  576. package/dist/ir/node-index.js +215 -0
  577. package/dist/ir/node-index.js.map +1 -0
  578. package/dist/ir/paired-while-loops.d.ts +25 -0
  579. package/dist/ir/paired-while-loops.js +335 -0
  580. package/dist/ir/paired-while-loops.js.map +1 -0
  581. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  582. package/dist/ir/paired-while-loops.test.js +163 -0
  583. package/dist/ir/paired-while-loops.test.js.map +1 -0
  584. package/dist/ir/parameter-versions.d.ts +25 -0
  585. package/dist/ir/parameter-versions.js +300 -0
  586. package/dist/ir/parameter-versions.js.map +1 -0
  587. package/dist/ir/runtime-features.d.ts +34 -13
  588. package/dist/ir/runtime-features.js +152 -38
  589. package/dist/ir/runtime-features.js.map +1 -1
  590. package/dist/ir/serialize.d.ts +12 -2
  591. package/dist/ir/serialize.js +16 -3
  592. package/dist/ir/serialize.js.map +1 -1
  593. package/dist/ir/serialize.test.js +17 -0
  594. package/dist/ir/serialize.test.js.map +1 -1
  595. package/dist/ir/traverse.js +18 -6
  596. package/dist/ir/traverse.js.map +1 -1
  597. package/dist/ir/validate.js +122 -36
  598. package/dist/ir/validate.js.map +1 -1
  599. package/dist/library/ir-policy.js +2 -0
  600. package/dist/library/ir-policy.js.map +1 -1
  601. package/dist/native/cache.d.ts +6 -1
  602. package/dist/native/cache.js +28 -5
  603. package/dist/native/cache.js.map +1 -1
  604. package/dist/native/cache.test.js +16 -2
  605. package/dist/native/cache.test.js.map +1 -1
  606. package/dist/native/cli.js +21 -1
  607. package/dist/native/cli.js.map +1 -1
  608. package/dist/native/compiler.js +8 -6
  609. package/dist/native/compiler.js.map +1 -1
  610. package/dist/native/executable-cache.d.ts +1 -1
  611. package/dist/native/executable-cache.js +2 -2
  612. package/dist/native/executable-cache.js.map +1 -1
  613. package/dist/native/prepare.d.ts +3 -1
  614. package/dist/native/prepare.js +119 -31
  615. package/dist/native/prepare.js.map +1 -1
  616. package/dist/native/prepare.test.js +78 -18
  617. package/dist/native/prepare.test.js.map +1 -1
  618. package/dist/native/sanitizer.test.js +2 -0
  619. package/dist/native/sanitizer.test.js.map +1 -1
  620. package/dist/native/text-file.d.ts +13 -3
  621. package/dist/native/text-file.js +63 -9
  622. package/dist/native/text-file.js.map +1 -1
  623. package/dist/native/text-file.test.d.ts +1 -0
  624. package/dist/native/text-file.test.js +49 -0
  625. package/dist/native/text-file.test.js.map +1 -0
  626. package/dist/native/toolchain.js +4 -4
  627. package/dist/native/toolchain.js.map +1 -1
  628. package/dist/native/toolchain.test.js +3 -3
  629. package/dist/native/toolchain.test.js.map +1 -1
  630. package/package.json +21 -21
  631. package/shims/chalk/v5.ts +688 -0
  632. package/shims/hono-node-server/v2.ts +645 -0
  633. package/shims/hot-shots/client.ts +1126 -0
  634. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  635. package/shims/hot-shots/v8.ts +8 -0
  636. package/surface-manifest.json +26 -4
@@ -13,6 +13,7 @@ export declare function returnsOnlyThis(member: ts.MethodDeclaration): boolean;
13
13
  * claim setters). Used only to narrow a call's result back to the
14
14
  * receiver's class. */
15
15
  export declare function returnsOnlyThisValue(member: ts.MethodDeclaration): boolean;
16
+ export declare function functionLocalClass(decl: ts.ClassLikeDeclaration): boolean;
16
17
  export declare function storedClassValueType(lowerer: Lowerer, expression: ts.Expression, visiting?: Set<import("../ts7/ast-node.js").AstNode>): IrType | null;
17
18
  export interface ClassMethodSignature {
18
19
  params: ParamShape[];
@@ -33,6 +34,10 @@ export interface ClassInfo {
33
34
  prototypeMethodValues?: Map<string, IrExpr>;
34
35
  prototypeReflectionReady?: true;
35
36
  prototypeObservedMethodsReady?: true;
37
+ /** The globals holding each observed method's original prototype value
38
+ * (set when the prototype data is built), by method name. A typed call
39
+ * whose slot still holds that value calls the method natively. */
40
+ prototypeOriginals?: Map<string, string>;
36
41
  prototypeReflectionRefusal?: string;
37
42
  localClass?: {
38
43
  context: FnCtx | null;
@@ -582,8 +587,12 @@ export declare function lowerClassExpressionInfo(lowerer: Lowerer, expr: ts.Clas
582
587
  * mints a class at all: evaluating the expression IS the
583
588
  * ReferenceError, so it lowers to exactly that read — every evaluation
584
589
  * throws identically, which is why the once-evaluated restriction and
585
- * the member fences don't apply. */
586
- export declare function lowerClassExpression(lowerer: Lowerer, expr: ts.ClassLikeDeclaration): IrExpr;
590
+ * the member fences don't apply.
591
+ *
592
+ * `binding` is the local of a function-local class declaration's name,
593
+ * declared without a value; the class value assigns it before the class's
594
+ * static members are defined (see initializeRuntimeStatics). */
595
+ export declare function lowerClassExpression(lowerer: Lowerer, expr: ts.ClassLikeDeclaration, binding?: IrLocal): IrExpr;
587
596
  /** The EXACT class a receiver expression is statically known to BE (not
588
597
  * merely be typed by): the class name itself, or a `const` binding
589
598
  * whose initializer is a class expression / class name. Such receivers
@@ -1,4 +1,5 @@
1
1
  import { DATE_TIME_FIELD, dateRootOf, dateSuperCall, isDatePrototypeMethod, lowerDateSuperMethodCall, } from "./builtins/date-classes.js";
2
+ import { predeclareForwardClass } from "./lower-stmts.js";
2
3
  import { lowerDateStaticCall } from "./builtins/dates.js";
3
4
  import { keyedHelperName } from "./stable-names.js";
4
5
  import { lowerValueReturningConstructorNew } from "./js-dynamic-objects.js";
@@ -46,7 +47,7 @@ import { lowerSearchParamsNew } from "./builtins/url.js";
46
47
  import { lowerTextCodecNew } from "./builtins/text-codecs.js";
47
48
  import { lowerBroadcastChannelNew, lowerMessageChannelNew, lowerWorkerNew, } from "./builtins/workers.js";
48
49
  import { unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
49
- import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, STREAM_COMPLETION_CALLBACK_INDEX, UNDERSCORE_METHODS, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
50
+ import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, STREAM_COMPLETION_CALLBACK_INDEX, UNDERSCORE_METHODS, streamExtraCallbacks, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
50
51
  import { builtinEventTargetBaseOf, eventTargetApiMembers, eventTargetApiMethod, eventTargetRootOf, eventTargetSuperCall, lowerEventTargetMethodCall, } from "./lower-event-target.js";
51
52
  import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
52
53
  import { declSymbolOf } from "./lower-modules.js";
@@ -58,7 +59,7 @@ import { hasLexicalPrivateReference, hasStaticThis, rejectStaticThis } from "./s
58
59
  import { lowerUrlNew } from "./lower-url.js";
59
60
  import { isNativeProxyInitializer, lowerNativeProxy } from "./expressions/native-proxy.js";
60
61
  import { classStaticDataFor } from "./class-static-data.js";
61
- import { construction, constructionPrefix } from "./js-class-fields.js";
62
+ import { accessorInterceptsBase, accessorNames, construction, constructionPrefix, } from "./js-class-fields.js";
62
63
  import { lowerObjectFactoryNew } from "./object-factory-new.js";
63
64
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
64
65
  import { lowerInstanceConstructorNew } from "./class-instance-constructor.js";
@@ -67,6 +68,7 @@ import { constructionEscape } from "./construction-escapes.js";
67
68
  import { checkedClassConstruction, checkedClassConstructionPacked } from "./class-construction.js";
68
69
  import { initializeRuntimeStatics, hasRuntimeStatics } from "./class-runtime-statics.js";
69
70
  import { reflectedClassStaticMethodValue } from "./class-method-values.js";
71
+ import { identifierReadSymbol } from "./surfaces.js";
70
72
  export function returnsOnlyThis(member) {
71
73
  const body = member.body;
72
74
  const last = body?.statements?.nodes.at(-1);
@@ -122,7 +124,7 @@ export function returnsOnlyThisValue(member) {
122
124
  ts.forEachChild(body, visit);
123
125
  return valid;
124
126
  }
125
- function functionLocalClass(decl) {
127
+ export function functionLocalClass(decl) {
126
128
  for (let parent = decl.parent; parent && !ts.isSourceFile(parent); parent = parent.parent) {
127
129
  if (ts.isFunctionLike(parent))
128
130
  return true;
@@ -1693,6 +1695,7 @@ mixin) {
1693
1695
  // receiver-sensitive getters and setters inherited by subclasses.
1694
1696
  const checkedStatics = isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
1695
1697
  ((base && hasRuntimeStatics(base)) ||
1698
+ definedThroughReflection(lowerer, decl) ||
1696
1699
  decl.members.nodes.some((member) => ts.isAccessor(member) &&
1697
1700
  !ts.isPrivateIdentifier(member.name) &&
1698
1701
  member.modifiers?.nodes.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword))) &&
@@ -2007,8 +2010,8 @@ mixin) {
2007
2010
  // state, so an override or shadowing field would split-brain.
2008
2011
  // Underscore methods are the SUPPORTED override form — but only
2009
2012
  // the ones the class's own base consumes (a `_read` on a
2010
- // Transform, or `_writev`/`_construct` anywhere, would be consumed
2011
- // by Node machinery that has no lowering here).
2013
+ // Transform, or `_writev` on a Readable, would be consumed by Node
2014
+ // machinery that has no lowering here).
2012
2015
  if (memberName && ts.isIdentifier(memberName)) {
2013
2016
  const streamBase = (() => {
2014
2017
  for (let c = base; c; c = c.base)
@@ -2021,8 +2024,8 @@ mixin) {
2021
2024
  if (STREAM_API_MEMBERS.has(name) || STREAM_PROP_MEMBERS.has(name)) {
2022
2025
  lowerer.unsupported("SC1090", memberName, `overriding the stream member '${name}' (the runtime owns the stream surface)`);
2023
2026
  }
2024
- if (name === "_writev" || name === "_construct") {
2025
- lowerer.unsupported("SC1090", memberName, `declaring '${name}' on a stream subclass (${name === "_writev" ? "batched writes are" : "deferred construction is"} not lowered — writes deliver one chunk at a time)`);
2027
+ if (name === "_writev" && !streamExtraCallbacks(streamBase.def.name).includes("writev")) {
2028
+ lowerer.unsupported("SC1090", memberName, `declaring '_writev' on a ${streamBase.def.name.slice(1)} subclass (a Readable has no writable side)`);
2026
2029
  }
2027
2030
  const accepted = streamCtorShape(streamBase.def.name).accepted;
2028
2031
  for (const [option, methodName] of UNDERSCORE_METHODS) {
@@ -3167,7 +3170,7 @@ mixin) {
3167
3170
  }
3168
3171
  // A subclass field created before anything can observe the instance
3169
3172
  // keeps its type: super() cannot run code that reads it earlier.
3170
- const baseConstruction = base && ![...methods.keys()].some((m) => m.startsWith("get:") || m.startsWith("set:"))
3173
+ const baseConstruction = base && !accessorInterceptsBase(accessorNames(methods.keys()), base)
3171
3174
  ? construction(base)
3172
3175
  : null;
3173
3176
  const sealedPrefix = baseConstruction
@@ -3195,7 +3198,7 @@ mixin) {
3195
3198
  // An own JS callable shadows its prototype declaration.
3196
3199
  // Keep the method in the prototype and store the assigned
3197
3200
  // value in the instance property bag.
3198
- lowerer.prototypeMethodAccesses.set(name, assign);
3201
+ lowerer.noteMethodAccess(name, assign);
3199
3202
  continue;
3200
3203
  }
3201
3204
  const sym = lowerer.checker.getSymbolAtLocation(assign);
@@ -3272,7 +3275,7 @@ mixin) {
3272
3275
  if (!key && (fields.has(fieldName) || hasAccessor(fieldName)))
3273
3276
  continue;
3274
3277
  if (!key && (methods.has(fieldName) || lowerer.findMethodOn(base, fieldName))) {
3275
- lowerer.prototypeMethodAccesses.set(fieldName, lhs);
3278
+ lowerer.noteMethodAccess(fieldName, lhs);
3276
3279
  continue;
3277
3280
  }
3278
3281
  // A key already declared (own or inherited) makes later
@@ -4429,7 +4432,13 @@ export function classValueRef(lowerer, info, blame) {
4429
4432
  const display = info.def.name.replace(/^%|^%m\d+\./, "");
4430
4433
  fenceDecorationThrows(lowerer, info, blame);
4431
4434
  if (info.localClass && ts.isIdentifier(blame)) {
4432
- const stored = lowerer.resolveLocal(blame);
4435
+ let stored = lowerer.resolveLocal(blame);
4436
+ // A reference from a function hoisted above the class statement.
4437
+ if (!stored) {
4438
+ const symbol = lowerer.resolveValueSymbol(blame);
4439
+ if (symbol && predeclareForwardClass(lowerer, symbol))
4440
+ stored = lowerer.resolveLocal(blame);
4441
+ }
4433
4442
  if (stored)
4434
4443
  return lowerer.coerceToExpected({ kind: "varRef", localId: stored.id, type: stored.type, loc: locOf(blame) }, { kind: "classval", className: info.def.name });
4435
4444
  }
@@ -4917,6 +4926,31 @@ export function lowerClassExpressionInfo(lowerer, expr) {
4917
4926
  }
4918
4927
  return info;
4919
4928
  }
4929
+ /** True when a named class expression's body refers to the class value by
4930
+ * its own name (`class Box { static of() { return new Box(); } }`, a
4931
+ * shorthand property `{ Box }` included); type annotations naming it
4932
+ * (`again(): Box`) do not count. */
4933
+ function classExpressionNamesItself(lowerer, expr) {
4934
+ const name = expr.name;
4935
+ if (!name)
4936
+ return false;
4937
+ const symbol = lowerer.checker.getSymbolAtLocation(name);
4938
+ if (!symbol)
4939
+ return false;
4940
+ let found = false;
4941
+ for (const member of expr.members.nodes) {
4942
+ ts.walkPreorder(member, (n) => {
4943
+ if (found || ts.isTypeNode(n))
4944
+ return "skip";
4945
+ if (ts.isIdentifier(n) && n.text === name.text && identifierReadSymbol(lowerer, n) === symbol)
4946
+ found = true;
4947
+ return undefined;
4948
+ });
4949
+ if (found)
4950
+ return true;
4951
+ }
4952
+ return false;
4953
+ }
4920
4954
  /** `class {…}` in expression position: a class definition bound to no
4921
4955
  * statement — once the static side is a value, the expression IS the
4922
4956
  * definition plus a classRef over it. A DECORATED class expression
@@ -4924,8 +4958,12 @@ export function lowerClassExpressionInfo(lowerer, expr) {
4924
4958
  * mints a class at all: evaluating the expression IS the
4925
4959
  * ReferenceError, so it lowers to exactly that read — every evaluation
4926
4960
  * throws identically, which is why the once-evaluated restriction and
4927
- * the member fences don't apply. */
4928
- export function lowerClassExpression(lowerer, expr) {
4961
+ * the member fences don't apply.
4962
+ *
4963
+ * `binding` is the local of a function-local class declaration's name,
4964
+ * declared without a value; the class value assigns it before the class's
4965
+ * static members are defined (see initializeRuntimeStatics). */
4966
+ export function lowerClassExpression(lowerer, expr, binding) {
4929
4967
  if (decoratorNodesOf(expr).length > 0 ||
4930
4968
  expr.members.nodes.some((m) => decoratorNodesOf(m).length > 0)) {
4931
4969
  if (!isJsSourceFile(ts.getSourceFileOfNode(expr)) && expr.typeParameters === undefined) {
@@ -4939,6 +4977,28 @@ export function lowerClassExpression(lowerer, expr) {
4939
4977
  }
4940
4978
  }
4941
4979
  const info = lowerClassExpressionInfo(lowerer, expr);
4980
+ // A function-local class expression's own name is a binding of its body:
4981
+ // declared before the members lower, so their references to the name
4982
+ // resolve to it. The class value captures it before it is assigned, as
4983
+ // it captures a class declaration's binding.
4984
+ if (!binding &&
4985
+ info.localClass &&
4986
+ ts.isClassExpression(expr) &&
4987
+ expr.name &&
4988
+ classExpressionNamesItself(lowerer, expr)) {
4989
+ const own = lowerer.declareLocal(expr.name, expr.name.text, { kind: "classval", className: info.def.name }, true);
4990
+ const value = lowerClassValue(lowerer, expr, info, own);
4991
+ return {
4992
+ kind: "seqExpr",
4993
+ stmts: [{ kind: "varDecl", localId: own.id, init: null, loc: value.loc }],
4994
+ result: value,
4995
+ type: value.type,
4996
+ loc: value.loc,
4997
+ };
4998
+ }
4999
+ return lowerClassValue(lowerer, expr, info, binding);
5000
+ }
5001
+ function lowerClassValue(lowerer, expr, info, binding) {
4942
5002
  if (!info.localClass &&
4943
5003
  !info.expressionInitializationEmitted &&
4944
5004
  (info.callableBase ||
@@ -4985,7 +5045,7 @@ export function lowerClassExpression(lowerer, expr) {
4985
5045
  const clsRef = { kind: "varRef", localId: clsLocal.id, type: value.type, loc };
4986
5046
  const boxed = { kind: "dynFrom", value: clsRef, type: DYN, loc };
4987
5047
  info.localPrototypeData = true;
4988
- return initializeRuntimeStatics(lowerer, info, {
5048
+ const built = {
4989
5049
  kind: "seqExpr",
4990
5050
  stmts: [
4991
5051
  { kind: "varDecl", localId: baseLocal.id, init: base, loc },
@@ -5018,7 +5078,8 @@ export function lowerClassExpression(lowerer, expr) {
5018
5078
  result: clsRef,
5019
5079
  type: value.type,
5020
5080
  loc,
5021
- });
5081
+ };
5082
+ return initializeRuntimeStatics(lowerer, info, built, binding);
5022
5083
  }
5023
5084
  if (info.localClass?.baseExpression && info.base && value.kind === "classRef") {
5024
5085
  const loc = locOf(expr);
@@ -5033,7 +5094,7 @@ export function lowerClassExpression(lowerer, expr) {
5033
5094
  const clsRef = { kind: "varRef", localId: clsLocal.id, type: value.type, loc };
5034
5095
  const basePrototype = classPrototypeData(lowerer, info.base, loc, baseRef);
5035
5096
  info.localPrototypeData = true;
5036
- return initializeRuntimeStatics(lowerer, info, {
5097
+ const built = {
5037
5098
  kind: "seqExpr",
5038
5099
  stmts: [
5039
5100
  { kind: "varDecl", localId: baseLocal.id, init: base, loc },
@@ -5072,11 +5133,12 @@ export function lowerClassExpression(lowerer, expr) {
5072
5133
  result: clsRef,
5073
5134
  type: value.type,
5074
5135
  loc,
5075
- });
5136
+ };
5137
+ return initializeRuntimeStatics(lowerer, info, built, binding);
5076
5138
  }
5077
5139
  if (!info.localClass)
5078
5140
  return value;
5079
- const classValue = initializeRuntimeStatics(lowerer, info, value.kind === "classRef" ? { ...value, captures: info.localClass.captureSources } : value);
5141
+ const classValue = initializeRuntimeStatics(lowerer, info, value.kind === "classRef" ? { ...value, captures: info.localClass.captureSources } : value, binding);
5080
5142
  // The base resolves statically here, but Node still evaluates the
5081
5143
  // heritage expression each time the class definition runs, first.
5082
5144
  const heritage = heritageWithEffects(expr);
@@ -5418,7 +5480,7 @@ function staticCallOn(lowerer, call, access, info, throughValue) {
5418
5480
  // through-a-VALUE shadowing fence as plain statics.
5419
5481
  const gfound = findGenericStaticOn(lowerer, info, access.name.text);
5420
5482
  if (!gfound)
5421
- return null;
5483
+ return classConstructorCall(lowerer, call, access, info);
5422
5484
  if (throughValue && staticShadowBelow(info, access.name.text)) {
5423
5485
  lowerer.unsupported("SC1090", call, `calling the static member '${access.name.text}' through a class value (a subclass of '${info.def.name.replace(/^%|^%m\d+\./, "")}' redeclares it, so the runtime class decides which declaration answers)`);
5424
5486
  }
@@ -5487,6 +5549,74 @@ function staticCallOn(lowerer, call, access, info, throughValue) {
5487
5549
  const args = lowerer.completeArgs(call.arguments.nodes, found.method.params, loc, call);
5488
5550
  return { kind: "call", callee: fnName, args, type: found.method.ret, loc };
5489
5551
  }
5552
+ /** `C.call(thisArg, ...)` / `C.apply(thisArg, args)` on a program class that
5553
+ * declares no such static: Function.prototype.call/apply invoke the class
5554
+ * constructor without `new`, which throws Node's TypeError "Class
5555
+ * constructor C cannot be invoked without 'new'" after the arguments are
5556
+ * evaluated (and, for apply, after the argument list is read). The boxed
5557
+ * class value's call path throws exactly that. Neither expando statics nor
5558
+ * writes through untyped values can give a class an own `call` or `apply`.
5559
+ * A receiver that may hold a subclass at run time (a class value, `this` in
5560
+ * a static method) needs every subclass to lack such a static too. The
5561
+ * receiver must be one the caller does not evaluate again (a name, `this`,
5562
+ * or a namespace member). Null otherwise. */
5563
+ function classConstructorCall(lowerer, call, access, info) {
5564
+ const name = access.name.text;
5565
+ const receiver = access.expression;
5566
+ if ((name !== "call" && name !== "apply") ||
5567
+ !info.decl ||
5568
+ info.def.runtime ||
5569
+ info.builtinError ||
5570
+ info.builtinEmitter ||
5571
+ info.builtinStream ||
5572
+ info.builtinEventTarget ||
5573
+ info.runtimeStatics?.length ||
5574
+ declaresStaticAbove(info, name) ||
5575
+ (exactClassOfReceiver(lowerer, receiver) !== info &&
5576
+ info.subclasses.some((subclass) => declaresStaticBelow(subclass, name))) ||
5577
+ call.arguments.nodes.some(ts.isSpreadElement) ||
5578
+ !(ts.isIdentifier(receiver) ||
5579
+ receiver.kind === ts.SyntaxKind.ThisKeyword ||
5580
+ (ts.isPropertyAccessExpression(receiver) && nsMemberIdentOf(lowerer, receiver) !== null)))
5581
+ return null;
5582
+ return {
5583
+ kind: "dynInvoke",
5584
+ recv: lowerer.lowerExprExpecting(receiver, DYN),
5585
+ method: name,
5586
+ calleeName: ts.getTextOfNode(access),
5587
+ args: call.arguments.nodes.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
5588
+ type: DYN,
5589
+ loc: locOf(call),
5590
+ };
5591
+ }
5592
+ /** Whether `info`'s declaration has a static member that may be named `name`
5593
+ * (a method, field or accessor of that name, or a computed name), or `info`
5594
+ * has no declaration to tell. */
5595
+ function declaresStatic(info, name) {
5596
+ if (!info.decl)
5597
+ return true;
5598
+ return info.decl.members.nodes.some((member) => member.name !== undefined &&
5599
+ ts.canHaveModifiers(member) &&
5600
+ ts.getModifiers(member)?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword) ===
5601
+ true &&
5602
+ (ts.isComputedPropertyName(member.name) ||
5603
+ ((ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)) &&
5604
+ member.name.text === name)));
5605
+ }
5606
+ /** declaresStatic over `info` and its bases, which it inherits statics from. */
5607
+ function declaresStaticAbove(info, name) {
5608
+ for (let c = info; c; c = c.base)
5609
+ if (declaresStatic(c, name))
5610
+ return true;
5611
+ return false;
5612
+ }
5613
+ /** declaresStatic over `info` and its subclasses, or runtime statics, which a
5614
+ * function-local JavaScript class defines at run time. */
5615
+ function declaresStaticBelow(info, name) {
5616
+ return (declaresStatic(info, name) ||
5617
+ !!info.runtimeStatics?.length ||
5618
+ info.subclasses.some((subclass) => declaresStaticBelow(subclass, name)));
5619
+ }
5490
5620
  /** `C.m(...)` where `m` is a static method that a function-local
5491
5621
  * JavaScript class defines at runtime (a factory's `class extends base`),
5492
5622
  * inherited by `C` through its statically known base chain. When the body
@@ -5874,11 +6004,94 @@ export function inHierarchy(lowerer, info) {
5874
6004
  * dynamically. Abstract re-declarations don't count (they carry no
5875
6005
  * implementation; the concrete ones below them do, via the recursion). */
5876
6006
  export function overrideBelow(lowerer, info, name) {
6007
+ if (info.decl !== null && localOverrideBelow(lowerer, info.decl, name))
6008
+ return true;
5877
6009
  return info.subclasses.some((s) => {
5878
6010
  const m = s.methods.get(name);
5879
6011
  return (m !== undefined && m.abstract !== true) || lowerer.overrideBelow(s, name);
5880
6012
  });
5881
6013
  }
6014
+ /** The class node an `extends` clause names: a class declaration, or the
6015
+ * class expression a variable is initialized with. */
6016
+ function extendedClassNode(lowerer, decl) {
6017
+ const heritage = decl.heritageClauses?.nodes.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types?.nodes[0]?.expression;
6018
+ if (!heritage || !ts.isIdentifier(heritage))
6019
+ return null;
6020
+ let symbol = lowerer.checker.getSymbolAtLocation(heritage);
6021
+ if (symbol && symbol.flags & ts.SymbolFlags.Alias)
6022
+ symbol = lowerer.checker.getAliasedSymbol(symbol);
6023
+ const target = symbol?.valueDeclaration;
6024
+ if (!target)
6025
+ return null;
6026
+ if (ts.isClassDeclaration(target) || ts.isClassExpression(target))
6027
+ return target;
6028
+ if (ts.isVariableDeclaration(target) && target.initializer) {
6029
+ let init = target.initializer;
6030
+ while (ts.isParenthesizedExpression(init))
6031
+ init = init.expression;
6032
+ if (ts.isClassExpression(init))
6033
+ return init;
6034
+ }
6035
+ return null;
6036
+ }
6037
+ /** The function-local classes that extend the class node `base`. Function
6038
+ * bodies lower on demand, after code that may already call methods of a
6039
+ * class their local classes extend, so such a subclass is not yet in its
6040
+ * base's `subclasses` when those calls lower. */
6041
+ function localSubclassesOf(lowerer, base) {
6042
+ let index = lowerer.localSubclassIndex;
6043
+ if (index === null) {
6044
+ index = new Map();
6045
+ const files = lowerer.moduleOrder.length > 0 ? lowerer.moduleOrder : [lowerer.entry];
6046
+ for (const sf of files) {
6047
+ if (!sf.text.includes("extends"))
6048
+ continue;
6049
+ ts.walkPreorder(sf, (node) => {
6050
+ if ((ts.isClassDeclaration(node) || ts.isClassExpression(node)) &&
6051
+ node.heritageClauses !== undefined &&
6052
+ functionLocalClass(node)) {
6053
+ const extended = extendedClassNode(lowerer, node);
6054
+ if (extended) {
6055
+ const list = index.get(extended);
6056
+ if (list)
6057
+ list.push(node);
6058
+ else
6059
+ index.set(extended, [node]);
6060
+ }
6061
+ }
6062
+ return undefined;
6063
+ });
6064
+ }
6065
+ lowerer.localSubclassIndex = index;
6066
+ }
6067
+ return index.get(base) ?? [];
6068
+ }
6069
+ /** True when a function-local class below the class node `base` declares
6070
+ * a concrete instance method or accessor `name` (accessors are keyed
6071
+ * `get:x` and `set:x`). A call on `base`'s class then dispatches on the
6072
+ * receiver; devirtualization turns it back into a direct call when no such
6073
+ * override is reachable. */
6074
+ function localOverrideBelow(lowerer, base, name, visited) {
6075
+ const subclasses = localSubclassesOf(lowerer, base);
6076
+ if (subclasses.length === 0)
6077
+ return false;
6078
+ visited ??= new Set();
6079
+ if (visited.has(base))
6080
+ return false;
6081
+ visited.add(base);
6082
+ const accessor = name.startsWith("get:") ? "get" : name.startsWith("set:") ? "set" : null;
6083
+ const member = accessor ? name.slice(4) : name;
6084
+ return subclasses.some((sub) => sub.members.nodes.some((m) => (accessor === null
6085
+ ? ts.isMethodDeclaration(m)
6086
+ : accessor === "get"
6087
+ ? ts.isGetAccessorDeclaration(m)
6088
+ : ts.isSetAccessorDeclaration(m)) &&
6089
+ m.body !== undefined &&
6090
+ m.name !== undefined &&
6091
+ (ts.isIdentifier(m.name) || ts.isStringLiteral(m.name)) &&
6092
+ m.name.text === member &&
6093
+ !ts.getModifiers(m)?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword)) || localOverrideBelow(lowerer, sub, name, visited));
6094
+ }
5882
6095
  /** The nearest GENERIC-method declaration of `name` at/above `info` —
5883
6096
  * findMethodOn's twin over the genericMethods tables. */
5884
6097
  export function findGenericMethodOn(lowerer, info, name) {
@@ -7571,8 +7784,10 @@ export function superCallStmt(lowerer, info, thisLocal, args, loc) {
7571
7784
  // The SYNTHESIZED constructor of a ctor-less stream subclass:
7572
7785
  // super() with default options (underscore methods still bind; a
7573
7786
  // construction passing options requires a declared constructor —
7574
- // lowerNew fences that). Zero options ⇒ exactly one init stmt.
7575
- return lowerStreamSuperCall(lowerer, info, base, [], thisLocal, loc, info.decl ?? info.ctor)[0];
7787
+ // lowerNew fences that). Zero options ⇒ the init stmt, then the
7788
+ // class's _writev/_construct follow-ups.
7789
+ const stmts = lowerStreamSuperCall(lowerer, info, base, [], thisLocal, loc, info.decl ?? info.ctor);
7790
+ return stmts.length === 1 ? stmts[0] : { kind: "block", body: stmts, loc };
7576
7791
  }
7577
7792
  lowerer.noteSuperConstructorEdge(`%${base.def.name}.constructor`);
7578
7793
  const call = {
@@ -8810,6 +9025,40 @@ export function lowerNew(lowerer, expr) {
8810
9025
  loc,
8811
9026
  };
8812
9027
  }
9028
+ // A FinalizationRegistry construction: register and unregister keep
9029
+ // their bookkeeping, and the cleanup callback never runs, which
9030
+ // ECMAScript allows (scr_finalization_registry_new).
9031
+ if (symbol !== null &&
9032
+ ts.symbolName(symbol) === "FinalizationRegistry" &&
9033
+ lowerer.isStdlibSymbol(symbol)) {
9034
+ const args = expr.arguments?.nodes ?? [];
9035
+ if (args.some(ts.isSpreadElement)) {
9036
+ lowerer.unsupported("SC1090", expr, "FinalizationRegistry construction with spread arguments");
9037
+ }
9038
+ const cleanup = args[0] ? lowerer.lowerExprExpecting(args[0], DYN) : dynUndefinedExpr(loc);
9039
+ const surplus = args.slice(1).map((arg) => lowerer.lowerExpr(arg));
9040
+ const created = {
9041
+ kind: "libCall",
9042
+ fn: "finalizationRegistry.new",
9043
+ args: [cleanup],
9044
+ type: DYN,
9045
+ loc,
9046
+ };
9047
+ if (surplus.length === 0)
9048
+ return created;
9049
+ // Surplus arguments evaluate after the cleanup argument and are ignored.
9050
+ const local = lowerer.declareHiddenLocal("%finalizationCleanup", DYN);
9051
+ return {
9052
+ kind: "seqExpr",
9053
+ stmts: [
9054
+ { kind: "varDecl", localId: local.id, init: cleanup, loc },
9055
+ ...surplus.map((value) => ({ kind: "exprStmt", expr: value, loc })),
9056
+ ],
9057
+ result: { ...created, args: [varRef(local.id, DYN, loc)] },
9058
+ type: DYN,
9059
+ loc,
9060
+ };
9061
+ }
8813
9062
  // `new Set<T>()`: construct + bulk add from supported values,
8814
9063
  // including live collection cursors. Duplicates collapse in insertion order.
8815
9064
  if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Set")) {
@@ -8990,7 +9239,6 @@ export function lowerNew(lowerer, expr) {
8990
9239
  Number: "boxed wrapper objects have no lowering — use the number primitive",
8991
9240
  Boolean: "boxed wrapper objects have no lowering — use the boolean primitive",
8992
9241
  WeakRef: "deref()-after-collect exposes GC timing — genuinely dynamic; hold a strong reference instead",
8993
- FinalizationRegistry: "finalization callbacks expose GC timing — genuinely dynamic; release resources explicitly instead",
8994
9242
  SharedArrayBuffer: "no shared-memory threads exist in a compiled program — Uint8Array is the byte storage",
8995
9243
  ArrayBuffer: "native ArrayBuffer construction supports fixed-length storage; resizable buffers remain unsupported",
8996
9244
  Proxy: "native Proxy construction requires checked-native plain targets and handlers",
@@ -9279,4 +9527,36 @@ function genericFieldFnNodeOf(member) {
9279
9527
  }
9280
9528
  return null;
9281
9529
  }
9530
+ /** Whether a JavaScript class's own binding is the target of
9531
+ * `Object.defineProperty`/`defineProperties` in its file
9532
+ * (`Object.defineProperty(Definition, "name", { value })`): its constructor
9533
+ * then needs a live own-property table. */
9534
+ function definedThroughReflection(lowerer, decl) {
9535
+ const name = decl.name;
9536
+ const sf = ts.getSourceFileOfNode(decl);
9537
+ if (name === undefined || !sf.text.includes("definePropert"))
9538
+ return false;
9539
+ const symbol = lowerer.checker.getSymbolAtLocation(name);
9540
+ if (symbol === undefined)
9541
+ return false;
9542
+ let found = false;
9543
+ ts.walkPreorder(sf, (node) => {
9544
+ if (found)
9545
+ return "stop";
9546
+ if (ts.isCallExpression(node) &&
9547
+ ts.isPropertyAccessExpression(node.expression) &&
9548
+ (node.expression.name.text === "defineProperty" ||
9549
+ node.expression.name.text === "defineProperties") &&
9550
+ lowerer.stdlibGlobalMember(node.expression, "Object") !== null) {
9551
+ const target = node.arguments.nodes[0];
9552
+ if (target !== undefined &&
9553
+ ts.isIdentifier(target) &&
9554
+ target.text === name.text &&
9555
+ lowerer.checker.getSymbolAtLocation(target) === symbol)
9556
+ found = true;
9557
+ }
9558
+ return undefined;
9559
+ });
9560
+ return found;
9561
+ }
9282
9562
  //# sourceMappingURL=lower-classes.js.map