@scriptc/compiler 0.2.6 → 0.2.8

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 (588) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +7 -18
  2. package/dist/backend/cycle-analysis.d.ts +21 -9
  3. package/dist/backend/cycle-analysis.js +139 -67
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +283 -3
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +39 -0
  8. package/dist/backend/cycle-mutability.js +205 -0
  9. package/dist/backend/cycle-mutability.js.map +1 -0
  10. package/dist/backend/link-plan-core.d.ts +2 -1
  11. package/dist/backend/link-plan-core.js +15 -3
  12. package/dist/backend/link-plan-core.js.map +1 -1
  13. package/dist/backend/link-plan.d.ts +2 -1
  14. package/dist/backend/link-plan.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +43 -0
  16. package/dist/backend/llvm/alloc.js +246 -0
  17. package/dist/backend/llvm/alloc.js.map +1 -0
  18. package/dist/backend/llvm/alloc.test.d.ts +1 -0
  19. package/dist/backend/llvm/alloc.test.js +102 -0
  20. package/dist/backend/llvm/alloc.test.js.map +1 -0
  21. package/dist/backend/llvm/blocks.d.ts +9 -0
  22. package/dist/backend/llvm/blocks.js +9 -0
  23. package/dist/backend/llvm/blocks.js.map +1 -1
  24. package/dist/backend/llvm/borrowed-receivers.d.ts +7 -0
  25. package/dist/backend/llvm/borrowed-receivers.js +39 -0
  26. package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
  27. package/dist/backend/llvm/call-lifetimes.d.ts +18 -3
  28. package/dist/backend/llvm/call-lifetimes.js +54 -19
  29. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  30. package/dist/backend/llvm/call-lifetimes.test.js +178 -3
  31. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  32. package/dist/backend/llvm/checked-narrows.d.ts +24 -0
  33. package/dist/backend/llvm/checked-narrows.js +108 -0
  34. package/dist/backend/llvm/checked-narrows.js.map +1 -0
  35. package/dist/backend/llvm/checked-narrows.test.d.ts +1 -0
  36. package/dist/backend/llvm/checked-narrows.test.js +208 -0
  37. package/dist/backend/llvm/checked-narrows.test.js.map +1 -0
  38. package/dist/backend/llvm/classes.d.ts +16 -1
  39. package/dist/backend/llvm/classes.js +60 -49
  40. package/dist/backend/llvm/classes.js.map +1 -1
  41. package/dist/backend/llvm/classes.test.js +68 -6
  42. package/dist/backend/llvm/classes.test.js.map +1 -1
  43. package/dist/backend/llvm/common.d.ts +13 -0
  44. package/dist/backend/llvm/common.js +30 -0
  45. package/dist/backend/llvm/common.js.map +1 -1
  46. package/dist/backend/llvm/constant-callbacks.d.ts +19 -3
  47. package/dist/backend/llvm/constant-callbacks.js +289 -52
  48. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  49. package/dist/backend/llvm/constant-callbacks.test.js +140 -3
  50. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  51. package/dist/backend/llvm/debug-info.d.ts +6 -2
  52. package/dist/backend/llvm/debug-info.js +11 -1
  53. package/dist/backend/llvm/debug-info.js.map +1 -1
  54. package/dist/backend/llvm/dense-array-access.d.ts +29 -0
  55. package/dist/backend/llvm/dense-array-access.js +335 -0
  56. package/dist/backend/llvm/dense-array-access.js.map +1 -0
  57. package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
  58. package/dist/backend/llvm/dense-array-access.test.js +238 -0
  59. package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
  60. package/dist/backend/llvm/dyn.d.ts +38 -0
  61. package/dist/backend/llvm/dyn.js +213 -14
  62. package/dist/backend/llvm/dyn.js.map +1 -1
  63. package/dist/backend/llvm/emitter.d.ts +308 -15
  64. package/dist/backend/llvm/emitter.js +1788 -206
  65. package/dist/backend/llvm/emitter.js.map +1 -1
  66. package/dist/backend/llvm/emitter.test.js +89 -7
  67. package/dist/backend/llvm/emitter.test.js.map +1 -1
  68. package/dist/backend/llvm/expr-async.js +62 -8
  69. package/dist/backend/llvm/expr-async.js.map +1 -1
  70. package/dist/backend/llvm/expr-async.test.d.ts +1 -0
  71. package/dist/backend/llvm/expr-async.test.js +62 -0
  72. package/dist/backend/llvm/expr-async.test.js.map +1 -0
  73. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  74. package/dist/backend/llvm/expr-bytes.js +85 -8
  75. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  76. package/dist/backend/llvm/expr-callbacks.js +29 -21
  77. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  78. package/dist/backend/llvm/expr-calls.d.ts +5 -0
  79. package/dist/backend/llvm/expr-calls.js +118 -15
  80. package/dist/backend/llvm/expr-calls.js.map +1 -1
  81. package/dist/backend/llvm/expr-containers.d.ts +7 -1
  82. package/dist/backend/llvm/expr-containers.js +246 -32
  83. package/dist/backend/llvm/expr-containers.js.map +1 -1
  84. package/dist/backend/llvm/expr-control.js +113 -8
  85. package/dist/backend/llvm/expr-control.js.map +1 -1
  86. package/dist/backend/llvm/expr-dispatch.js +2 -0
  87. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  88. package/dist/backend/llvm/expr-dynamic.js +244 -44
  89. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  90. package/dist/backend/llvm/expr-island.js +3 -8
  91. package/dist/backend/llvm/expr-island.js.map +1 -1
  92. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  93. package/dist/backend/llvm/expr-primitives.js +93 -36
  94. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  95. package/dist/backend/llvm/expr-primitives.test.js +51 -3
  96. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  97. package/dist/backend/llvm/expr-records.js +31 -17
  98. package/dist/backend/llvm/expr-records.js.map +1 -1
  99. package/dist/backend/llvm/expr-stream-bridges.js +96 -29
  100. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  101. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  102. package/dist/backend/llvm/expr-stream-callbacks.js +6 -3
  103. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  104. package/dist/backend/llvm/integer-remainder.d.ts +11 -0
  105. package/dist/backend/llvm/integer-remainder.js +91 -0
  106. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  107. package/dist/backend/llvm/layouts.d.ts +3 -1
  108. package/dist/backend/llvm/layouts.js +3 -2
  109. package/dist/backend/llvm/layouts.js.map +1 -1
  110. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  111. package/dist/backend/llvm/lazy-captures.js +96 -0
  112. package/dist/backend/llvm/lazy-captures.js.map +1 -0
  113. package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
  114. package/dist/backend/llvm/lazy-captures.test.js +78 -0
  115. package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
  116. package/dist/backend/llvm/lib-abi.js +10 -0
  117. package/dist/backend/llvm/lib-abi.js.map +1 -1
  118. package/dist/backend/llvm/lib-filesystem.js +10 -15
  119. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  120. package/dist/backend/llvm/lib-process.js +8 -8
  121. package/dist/backend/llvm/lib-process.js.map +1 -1
  122. package/dist/backend/llvm/lib-shared.js +1 -0
  123. package/dist/backend/llvm/lib-shared.js.map +1 -1
  124. package/dist/backend/llvm/local-array-reads.d.ts +5 -1
  125. package/dist/backend/llvm/local-array-reads.js +147 -26
  126. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  127. package/dist/backend/llvm/local-array-reads.test.js +85 -4
  128. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  129. package/dist/backend/llvm/local-union-storage.d.ts +5 -1
  130. package/dist/backend/llvm/local-union-storage.js +54 -8
  131. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  132. package/dist/backend/llvm/local-union-storage.test.js +94 -6
  133. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  134. package/dist/backend/llvm/map-number-lookup.d.ts +18 -0
  135. package/dist/backend/llvm/map-number-lookup.js +62 -0
  136. package/dist/backend/llvm/map-number-lookup.js.map +1 -0
  137. package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -0
  138. package/dist/backend/llvm/map-read-lifetimes.js +24 -3
  139. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  140. package/dist/backend/llvm/map-read-lifetimes.test.js +39 -20
  141. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  142. package/dist/backend/llvm/nullable-fields.d.ts +28 -0
  143. package/dist/backend/llvm/nullable-fields.js +45 -0
  144. package/dist/backend/llvm/nullable-fields.js.map +1 -0
  145. package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
  146. package/dist/backend/llvm/nullable-fields.test.js +48 -0
  147. package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
  148. package/dist/backend/llvm/nullable-unions.d.ts +68 -0
  149. package/dist/backend/llvm/nullable-unions.js +132 -0
  150. package/dist/backend/llvm/nullable-unions.js.map +1 -0
  151. package/dist/backend/llvm/publish.d.ts +58 -0
  152. package/dist/backend/llvm/publish.js +286 -0
  153. package/dist/backend/llvm/publish.js.map +1 -0
  154. package/dist/backend/llvm/rebound-parameters.d.ts +12 -0
  155. package/dist/backend/llvm/rebound-parameters.js +72 -0
  156. package/dist/backend/llvm/rebound-parameters.js.map +1 -0
  157. package/dist/backend/llvm/rebound-parameters.test.d.ts +1 -0
  158. package/dist/backend/llvm/rebound-parameters.test.js +67 -0
  159. package/dist/backend/llvm/rebound-parameters.test.js.map +1 -0
  160. package/dist/backend/llvm/reference-effects.d.ts +18 -2
  161. package/dist/backend/llvm/reference-effects.js +106 -16
  162. package/dist/backend/llvm/reference-effects.js.map +1 -1
  163. package/dist/backend/llvm/reference-effects.test.js +52 -1
  164. package/dist/backend/llvm/reference-effects.test.js.map +1 -1
  165. package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
  166. package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
  167. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
  168. package/dist/backend/llvm/shapes.d.ts +104 -9
  169. package/dist/backend/llvm/shapes.js +356 -46
  170. package/dist/backend/llvm/shapes.js.map +1 -1
  171. package/dist/backend/llvm/shapes.test.js +139 -5
  172. package/dist/backend/llvm/shapes.test.js.map +1 -1
  173. package/dist/backend/llvm/stack-callbacks.js +2 -3
  174. package/dist/backend/llvm/stack-callbacks.js.map +1 -1
  175. package/dist/backend/llvm/stack-captures.d.ts +3 -1
  176. package/dist/backend/llvm/stack-captures.js +5 -3
  177. package/dist/backend/llvm/stack-captures.js.map +1 -1
  178. package/dist/backend/llvm/stack-unions.test.js +43 -3
  179. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  180. package/dist/backend/llvm/string-construction.d.ts +10 -0
  181. package/dist/backend/llvm/string-construction.js +42 -0
  182. package/dist/backend/llvm/string-construction.js.map +1 -1
  183. package/dist/backend/llvm/string-construction.test.js +1 -1
  184. package/dist/backend/llvm/string-key-hash.d.ts +15 -0
  185. package/dist/backend/llvm/string-key-hash.js +76 -0
  186. package/dist/backend/llvm/string-key-hash.js.map +1 -0
  187. package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
  188. package/dist/backend/llvm/string-key-hash.test.js +45 -0
  189. package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
  190. package/dist/backend/llvm/string-lifetimes.test.js +65 -15
  191. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  192. package/dist/backend/llvm/string-reads.d.ts +7 -0
  193. package/dist/backend/llvm/string-reads.js +76 -0
  194. package/dist/backend/llvm/string-reads.js.map +1 -0
  195. package/dist/backend/llvm/switch-dispatch.js +1 -1
  196. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  197. package/dist/backend/llvm/switch-dispatch.test.js +3 -3
  198. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  199. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -0
  200. package/dist/backend/llvm/test-boxed-unions.js +13 -0
  201. package/dist/backend/llvm/test-boxed-unions.js.map +1 -0
  202. package/dist/backend/llvm/union-repr.d.ts +15 -0
  203. package/dist/backend/llvm/union-repr.js +89 -0
  204. package/dist/backend/llvm/union-repr.js.map +1 -0
  205. package/dist/backend/llvm/virtual-borrows.d.ts +31 -0
  206. package/dist/backend/llvm/virtual-borrows.js +82 -0
  207. package/dist/backend/llvm/virtual-borrows.js.map +1 -0
  208. package/dist/backend/llvm/walk-borrows.d.ts +43 -0
  209. package/dist/backend/llvm/walk-borrows.js +150 -0
  210. package/dist/backend/llvm/walk-borrows.js.map +1 -0
  211. package/dist/backend/llvm/walk-borrows.test.d.ts +1 -0
  212. package/dist/backend/llvm/walk-borrows.test.js +119 -0
  213. package/dist/backend/llvm/walk-borrows.test.js.map +1 -0
  214. package/dist/backend/llvm/walkers.d.ts +5 -1
  215. package/dist/backend/llvm/walkers.js +24 -21
  216. package/dist/backend/llvm/walkers.js.map +1 -1
  217. package/dist/backend/may-throw.d.ts +29 -1
  218. package/dist/backend/may-throw.js +349 -3
  219. package/dist/backend/may-throw.js.map +1 -1
  220. package/dist/backend/may-throw.test.js +114 -2
  221. package/dist/backend/may-throw.test.js.map +1 -1
  222. package/dist/backend/native/cache-warm.d.ts +2 -1
  223. package/dist/backend/native/cache-warm.js.map +1 -1
  224. package/dist/backend/native/contracts.d.ts +3 -2
  225. package/dist/backend/native/contracts.js.map +1 -1
  226. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  227. package/dist/backend/native/runtime-inputs.js +2 -0
  228. package/dist/backend/native/runtime-inputs.js.map +1 -1
  229. package/dist/backend/native-codegen-core.d.ts +7 -4
  230. package/dist/backend/native-codegen-core.js +14 -9
  231. package/dist/backend/native-codegen-core.js.map +1 -1
  232. package/dist/backend/native-codegen.d.ts +9 -0
  233. package/dist/backend/native-codegen.js +53 -2
  234. package/dist/backend/native-codegen.js.map +1 -1
  235. package/dist/backend/native-codegen.test.js +64 -10
  236. package/dist/backend/native-codegen.test.js.map +1 -1
  237. package/dist/backend/native-link-info-core.d.ts +3 -2
  238. package/dist/backend/native-link-info-core.js.map +1 -1
  239. package/dist/backend/native-link-info.d.ts +2 -1
  240. package/dist/backend/native-link-info.js.map +1 -1
  241. package/dist/backend/native-link-info.test.js +2 -2
  242. package/dist/backend/native-link-info.test.js.map +1 -1
  243. package/dist/backend/native-tools.d.ts +5 -1
  244. package/dist/backend/native-tools.js +3 -1
  245. package/dist/backend/native-tools.js.map +1 -1
  246. package/dist/backend/optimization.d.ts +25 -0
  247. package/dist/backend/optimization.js +21 -0
  248. package/dist/backend/optimization.js.map +1 -0
  249. package/dist/backend/optimization.test.d.ts +1 -0
  250. package/dist/backend/optimization.test.js +24 -0
  251. package/dist/backend/optimization.test.js.map +1 -0
  252. package/dist/backend/publication.d.ts +28 -0
  253. package/dist/backend/publication.js +155 -0
  254. package/dist/backend/publication.js.map +1 -0
  255. package/dist/backend/publication.test.d.ts +1 -0
  256. package/dist/backend/publication.test.js +72 -0
  257. package/dist/backend/publication.test.js.map +1 -0
  258. package/dist/backend/runtime-abi.d.ts +2 -2
  259. package/dist/backend/runtime-abi.js +2 -2
  260. package/dist/backend/runtime-pack-core.d.ts +15 -4
  261. package/dist/backend/runtime-pack-core.js +23 -12
  262. package/dist/backend/runtime-pack-core.js.map +1 -1
  263. package/dist/backend/runtime-pack-native.d.ts +7 -3
  264. package/dist/backend/runtime-pack-native.js +0 -3
  265. package/dist/backend/runtime-pack-native.js.map +1 -1
  266. package/dist/backend/runtime-pack-targets.test.js +1 -1
  267. package/dist/backend/runtime-pack.d.ts +20 -2
  268. package/dist/backend/runtime-pack.js +23 -0
  269. package/dist/backend/runtime-pack.js.map +1 -1
  270. package/dist/backend/runtime-pack.test.js +115 -2
  271. package/dist/backend/runtime-pack.test.js.map +1 -1
  272. package/dist/backend/target-diagnostics.test.js +1 -1
  273. package/dist/backend/targets.d.ts +2 -1
  274. package/dist/backend/targets.js +1 -1
  275. package/dist/backend/targets.js.map +1 -1
  276. package/dist/cli/command.js +75 -11
  277. package/dist/cli/command.js.map +1 -1
  278. package/dist/cli/host.d.ts +2 -1
  279. package/dist/cli/usage.d.ts +4 -1
  280. package/dist/cli/usage.js +13 -3
  281. package/dist/cli/usage.js.map +1 -1
  282. package/dist/compile-types.d.ts +17 -5
  283. package/dist/coverage/report.d.ts +25 -2
  284. package/dist/coverage/report.js +161 -33
  285. package/dist/coverage/report.js.map +1 -1
  286. package/dist/coverage/verdict-cache.d.ts +63 -0
  287. package/dist/coverage/verdict-cache.js +193 -0
  288. package/dist/coverage/verdict-cache.js.map +1 -0
  289. package/dist/coverage/verdict-cache.test.d.ts +1 -0
  290. package/dist/coverage/verdict-cache.test.js +52 -0
  291. package/dist/coverage/verdict-cache.test.js.map +1 -0
  292. package/dist/coverage/verdict-semantic.d.ts +2 -0
  293. package/dist/coverage/verdict-semantic.js +24 -0
  294. package/dist/coverage/verdict-semantic.js.map +1 -0
  295. package/dist/coverage/verdict-startup.d.ts +15 -0
  296. package/dist/coverage/verdict-startup.js +66 -0
  297. package/dist/coverage/verdict-startup.js.map +1 -0
  298. package/dist/diagnostics/diagnostic.d.ts +29 -1
  299. package/dist/diagnostics/diagnostic.js +84 -12
  300. package/dist/diagnostics/diagnostic.js.map +1 -1
  301. package/dist/diagnostics/envelope.d.ts +130 -0
  302. package/dist/diagnostics/envelope.js +257 -0
  303. package/dist/diagnostics/envelope.js.map +1 -0
  304. package/dist/diagnostics/envelope.test.d.ts +1 -0
  305. package/dist/diagnostics/envelope.test.js +91 -0
  306. package/dist/diagnostics/envelope.test.js.map +1 -0
  307. package/dist/diagnostics/render.d.ts +3 -0
  308. package/dist/diagnostics/render.js +13 -2
  309. package/dist/diagnostics/render.js.map +1 -1
  310. package/dist/executable/executable-cache.d.ts +2 -2
  311. package/dist/executable/executable-cache.js +7 -4
  312. package/dist/executable/executable-cache.js.map +1 -1
  313. package/dist/executable/executable-cache.test.js +20 -0
  314. package/dist/executable/executable-cache.test.js.map +1 -1
  315. package/dist/executable/prepare.d.ts +4 -0
  316. package/dist/executable/prepare.js +7 -1
  317. package/dist/executable/prepare.js.map +1 -1
  318. package/dist/frontend/analysis.js +1 -0
  319. package/dist/frontend/analysis.js.map +1 -1
  320. package/dist/frontend/lowering/abstract-equality.js +5 -49
  321. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  322. package/dist/frontend/lowering/array-values.d.ts +30 -0
  323. package/dist/frontend/lowering/array-values.js +246 -1
  324. package/dist/frontend/lowering/array-values.js.map +1 -1
  325. package/dist/frontend/lowering/builtins/errors.js +17 -2
  326. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  327. package/dist/frontend/lowering/builtins/numbers.js +29 -1
  328. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  329. package/dist/frontend/lowering/builtins/process.d.ts +10 -17
  330. package/dist/frontend/lowering/builtins/process.js +66 -29
  331. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  332. package/dist/frontend/lowering/builtins/workers.js +4 -2
  333. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  334. package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
  335. package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
  336. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
  337. package/dist/frontend/lowering/class-assertions.d.ts +12 -0
  338. package/dist/frontend/lowering/class-assertions.js +229 -5
  339. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  340. package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
  341. package/dist/frontend/lowering/class-callbacks.js +18 -5
  342. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  343. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
  344. package/dist/frontend/lowering/class-dynamic-dispatch.js +12 -6
  345. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  346. package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
  347. package/dist/frontend/lowering/class-method-mutations.js +472 -0
  348. package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
  349. package/dist/frontend/lowering/class-method-values.js +25 -5
  350. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  351. package/dist/frontend/lowering/class-prototypes.js +8 -2
  352. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  353. package/dist/frontend/lowering/class-unions.d.ts +16 -0
  354. package/dist/frontend/lowering/class-unions.js +127 -0
  355. package/dist/frontend/lowering/class-unions.js.map +1 -0
  356. package/dist/frontend/lowering/coercions/builders.js +8 -1
  357. package/dist/frontend/lowering/coercions/builders.js.map +1 -1
  358. package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
  359. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  360. package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
  361. package/dist/frontend/lowering/coercions/identity.js +26 -0
  362. package/dist/frontend/lowering/coercions/identity.js.map +1 -0
  363. package/dist/frontend/lowering/coercions/state.d.ts +6 -0
  364. package/dist/frontend/lowering/coercions/state.js +2 -0
  365. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  366. package/dist/frontend/lowering/coercions/structural.js +9 -6
  367. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  368. package/dist/frontend/lowering/coercions/unions.d.ts +8 -0
  369. package/dist/frontend/lowering/coercions/unions.js +67 -2
  370. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  371. package/dist/frontend/lowering/collation-repertoire.d.ts +1 -0
  372. package/dist/frontend/lowering/collation-repertoire.js +19 -0
  373. package/dist/frontend/lowering/collation-repertoire.js.map +1 -0
  374. package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
  375. package/dist/frontend/lowering/collection-narrowing.js +31 -0
  376. package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
  377. package/dist/frontend/lowering/construction-escapes.d.ts +38 -0
  378. package/dist/frontend/lowering/construction-escapes.js +146 -0
  379. package/dist/frontend/lowering/construction-escapes.js.map +1 -0
  380. package/dist/frontend/lowering/construction-escapes.test.d.ts +1 -0
  381. package/dist/frontend/lowering/construction-escapes.test.js +150 -0
  382. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -0
  383. package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
  384. package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
  385. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
  386. package/dist/frontend/lowering/containers/array-callbacks.d.ts +1 -1
  387. package/dist/frontend/lowering/containers/array-callbacks.js +416 -65
  388. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
  390. package/dist/frontend/lowering/containers/array-concat.js +130 -0
  391. package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
  392. package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
  393. package/dist/frontend/lowering/containers/array-construction.js +110 -5
  394. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  395. package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
  396. package/dist/frontend/lowering/containers/array-methods.js +274 -144
  397. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/callback-arguments.js +43 -1
  399. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  400. package/dist/frontend/lowering/containers/collection-methods.js +10 -1
  401. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  402. package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +7 -63
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/cycle-initialization.d.ts +46 -0
  407. package/dist/frontend/lowering/cycle-initialization.js +303 -0
  408. package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
  409. package/dist/frontend/lowering/divergences.d.ts +9 -0
  410. package/dist/frontend/lowering/divergences.js +630 -0
  411. package/dist/frontend/lowering/divergences.js.map +1 -0
  412. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
  413. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  414. package/dist/frontend/lowering/expressions/object-literals.js +178 -34
  415. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  416. package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
  417. package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
  418. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  419. package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
  420. package/dist/frontend/lowering/iterator-adapters.js +605 -0
  421. package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
  422. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  423. package/dist/frontend/lowering/lower-array-sort.js +44 -5
  424. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  425. package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
  426. package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
  427. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
  428. package/dist/frontend/lowering/lower-assert.js +7 -0
  429. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  430. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  431. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  432. package/dist/frontend/lowering/lower-calls.d.ts +8 -3
  433. package/dist/frontend/lowering/lower-calls.js +388 -278
  434. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  435. package/dist/frontend/lowering/lower-classes.d.ts +6 -0
  436. package/dist/frontend/lowering/lower-classes.js +117 -65
  437. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  438. package/dist/frontend/lowering/lower-exprs.d.ts +22 -2
  439. package/dist/frontend/lowering/lower-exprs.js +811 -254
  440. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  441. package/dist/frontend/lowering/lower-functions.js +32 -19
  442. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  443. package/dist/frontend/lowering/lower-generators.d.ts +19 -13
  444. package/dist/frontend/lowering/lower-generators.js +67 -44
  445. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  446. package/dist/frontend/lowering/lower-inspect.js +29 -4
  447. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  448. package/dist/frontend/lowering/lower-island.d.ts +1 -1
  449. package/dist/frontend/lowering/lower-island.js +24 -7
  450. package/dist/frontend/lowering/lower-island.js.map +1 -1
  451. package/dist/frontend/lowering/lower-modules.js +100 -3
  452. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  453. package/dist/frontend/lowering/lower-stmts.js +82 -64
  454. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  455. package/dist/frontend/lowering/lowerer.d.ts +115 -2
  456. package/dist/frontend/lowering/lowerer.js +1266 -88
  457. package/dist/frontend/lowering/lowerer.js.map +1 -1
  458. package/dist/frontend/lowering/native-ffi.js +3 -1
  459. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  460. package/dist/frontend/lowering/runtime-optional-bounds.d.ts +19 -0
  461. package/dist/frontend/lowering/runtime-optional-bounds.js +354 -0
  462. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -0
  463. package/dist/frontend/lowering/runtime-optional-bounds.test.d.ts +1 -0
  464. package/dist/frontend/lowering/runtime-optional-bounds.test.js +66 -0
  465. package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -0
  466. package/dist/frontend/lowering/runtime-optional-elements.d.ts +117 -0
  467. package/dist/frontend/lowering/runtime-optional-elements.js +738 -0
  468. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -0
  469. package/dist/frontend/lowering/runtime-optional-guards.d.ts +36 -0
  470. package/dist/frontend/lowering/runtime-optional-guards.js +375 -0
  471. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -0
  472. package/dist/frontend/lowering/runtime-optional-guards.test.d.ts +1 -0
  473. package/dist/frontend/lowering/runtime-optional-guards.test.js +92 -0
  474. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -0
  475. package/dist/frontend/lowering/runtime-optional-ownership.d.ts +63 -0
  476. package/dist/frontend/lowering/runtime-optional-ownership.js +382 -0
  477. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -0
  478. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +16 -0
  479. package/dist/frontend/lowering/runtime-optional-provenance.js +41 -0
  480. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
  481. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  482. package/dist/frontend/lowering/strict-equality.d.ts +9 -0
  483. package/dist/frontend/lowering/strict-equality.js +116 -0
  484. package/dist/frontend/lowering/strict-equality.js.map +1 -0
  485. package/dist/frontend/lowering/string-index-bounds.d.ts +36 -0
  486. package/dist/frontend/lowering/string-index-bounds.js +537 -0
  487. package/dist/frontend/lowering/string-index-bounds.js.map +1 -0
  488. package/dist/frontend/lowering/string-index-bounds.test.d.ts +1 -0
  489. package/dist/frontend/lowering/string-index-bounds.test.js +223 -0
  490. package/dist/frontend/lowering/string-index-bounds.test.js.map +1 -0
  491. package/dist/frontend/lowering/surfaces.js +3 -0
  492. package/dist/frontend/lowering/surfaces.js.map +1 -1
  493. package/dist/frontend/lowering/union-comparison.d.ts +5 -0
  494. package/dist/frontend/lowering/union-comparison.js +47 -0
  495. package/dist/frontend/lowering/union-comparison.js.map +1 -0
  496. package/dist/frontend/lowering/union-narrow.d.ts +2 -0
  497. package/dist/frontend/lowering/union-narrow.js +10 -6
  498. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  499. package/dist/frontend/program-analysis.d.ts +10 -0
  500. package/dist/frontend/program-analysis.js +7 -0
  501. package/dist/frontend/program-analysis.js.map +1 -1
  502. package/dist/frontend/program.d.ts +63 -2
  503. package/dist/frontend/program.js +1038 -61
  504. package/dist/frontend/program.js.map +1 -1
  505. package/dist/frontend/program.test.js +122 -6
  506. package/dist/frontend/program.test.js.map +1 -1
  507. package/dist/frontend/resolve.d.ts +6 -0
  508. package/dist/frontend/resolve.js +14 -0
  509. package/dist/frontend/resolve.js.map +1 -1
  510. package/dist/frontend/threads-import.d.ts +5 -0
  511. package/dist/frontend/threads-import.js +21 -0
  512. package/dist/frontend/threads-import.js.map +1 -0
  513. package/dist/frontend/type-mapper.d.ts +4 -1
  514. package/dist/frontend/type-mapper.js +161 -20
  515. package/dist/frontend/type-mapper.js.map +1 -1
  516. package/dist/frontend/type-mapper.test.js +15 -3
  517. package/dist/frontend/type-mapper.test.js.map +1 -1
  518. package/dist/frontend/worker-target.d.ts +4 -0
  519. package/dist/frontend/worker-target.js +8 -1
  520. package/dist/frontend/worker-target.js.map +1 -1
  521. package/dist/index.d.ts +6 -1
  522. package/dist/index.js +70 -16
  523. package/dist/index.js.map +1 -1
  524. package/dist/ir/analysis.d.ts +3 -1
  525. package/dist/ir/analysis.js +4 -0
  526. package/dist/ir/analysis.js.map +1 -1
  527. package/dist/ir/build.d.ts +5 -0
  528. package/dist/ir/build.js +7 -0
  529. package/dist/ir/build.js.map +1 -1
  530. package/dist/ir/builtin-signatures.d.ts +1 -1
  531. package/dist/ir/builtin-signatures.js +5 -3
  532. package/dist/ir/builtin-signatures.js.map +1 -1
  533. package/dist/ir/constant-tables.test.js +1 -1
  534. package/dist/ir/initializer-bindings.test.js +1 -1
  535. package/dist/ir/int32-slots.d.ts +72 -0
  536. package/dist/ir/int32-slots.js +837 -0
  537. package/dist/ir/int32-slots.js.map +1 -0
  538. package/dist/ir/int32-slots.test.d.ts +1 -0
  539. package/dist/ir/int32-slots.test.js +222 -0
  540. package/dist/ir/int32-slots.test.js.map +1 -0
  541. package/dist/ir/integer-ranges.d.ts +19 -3
  542. package/dist/ir/integer-ranges.js +168 -23
  543. package/dist/ir/integer-ranges.js.map +1 -1
  544. package/dist/ir/integer-ranges.test.js +74 -2
  545. package/dist/ir/integer-ranges.test.js.map +1 -1
  546. package/dist/ir/ir.d.ts +101 -20
  547. package/dist/ir/ir.js +20 -6
  548. package/dist/ir/ir.js.map +1 -1
  549. package/dist/ir/scalar-records.test.js +1 -1
  550. package/dist/ir/serialize.d.ts +1 -1
  551. package/dist/ir/serialize.js +3 -3
  552. package/dist/ir/serialize.js.map +1 -1
  553. package/dist/ir/traverse.js +8 -0
  554. package/dist/ir/traverse.js.map +1 -1
  555. package/dist/ir/validate.js +139 -22
  556. package/dist/ir/validate.js.map +1 -1
  557. package/dist/ir/validate.test.js +308 -8
  558. package/dist/ir/validate.test.js.map +1 -1
  559. package/dist/library/fence-eval.test.js +1 -1
  560. package/dist/library/int-infer.test.js +4 -4
  561. package/dist/library/library-cache.test.js +5 -5
  562. package/dist/library/library-profile.d.ts +2 -1
  563. package/dist/library/library-profile.js +4 -3
  564. package/dist/library/library-profile.js.map +1 -1
  565. package/dist/native/cache.d.ts +3 -0
  566. package/dist/native/cache.js +49 -1
  567. package/dist/native/cache.js.map +1 -1
  568. package/dist/native/cache.test.js +21 -1
  569. package/dist/native/cache.test.js.map +1 -1
  570. package/dist/native/cli.js +1 -1
  571. package/dist/native/cli.js.map +1 -1
  572. package/dist/native/compiler.d.ts +5 -0
  573. package/dist/native/compiler.js +51 -4
  574. package/dist/native/compiler.js.map +1 -1
  575. package/dist/native/compiler.test.js +2 -2
  576. package/dist/native/library.d.ts +2 -1
  577. package/dist/native/library.js.map +1 -1
  578. package/dist/native/prepare.d.ts +4 -0
  579. package/dist/native/prepare.js +28 -3
  580. package/dist/native/prepare.js.map +1 -1
  581. package/dist/native/sanitizer.d.ts +3 -2
  582. package/dist/native/sanitizer.js +3 -13
  583. package/dist/native/sanitizer.js.map +1 -1
  584. package/dist/startup-cache.d.ts +2 -0
  585. package/dist/startup-cache.js +2 -0
  586. package/dist/startup-cache.js.map +1 -1
  587. package/package.json +20 -20
  588. package/surface-manifest.json +8 -2
@@ -89,6 +89,10 @@ export interface ClassInfo {
89
89
  * unassigned read throws the catchable TypeError instead of yielding
90
90
  * an undefined the declared type cannot hold (SEMANTICS.md). */
91
91
  deferredInitFields?: Set<string>;
92
+ /** True when construction may hand the instance to other code (a method
93
+ * call, an argument, a callback, or a base constructor that does) — a
94
+ * subclass's own fields can then be read before their assignment. */
95
+ constructionEscapes?: true;
92
96
  /** null for the builtin error classes (runtime-provided; no source).
93
97
  * Class EXPRESSIONS carry their ts.ClassExpression here — members,
94
98
  * accessors, and locs read identically off either form. */
@@ -164,6 +168,8 @@ export interface ClassInfo {
164
168
  staticFields: {
165
169
  name: string;
166
170
  type: IrType;
171
+ /** Indexed sources can be absent despite the declared static type. */
172
+ runtimeOptional?: true;
167
173
  initializer: ts.Expression;
168
174
  globalId: string;
169
175
  readonly: boolean;
@@ -1,4 +1,5 @@
1
1
  import { dynUndefinedExpr, nodeThrowExpr } from "../../ir/build.js";
2
+ import { collectClassMethodMutations } from "./class-method-mutations.js";
2
3
  import { InternalCompilerError } from "../../errors.js";
3
4
  /* Class lowering: shape collection over the single-inheritance graph
4
5
  * (fields, methods, accessors, overrides), constructor/member lowering with
@@ -41,6 +42,7 @@ import { lowerObjectFactoryNew } from "./object-factory-new.js";
41
42
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
42
43
  import { lowerInstanceConstructorNew } from "./class-instance-constructor.js";
43
44
  import { classPrototypeData } from "./class-prototypes.js";
45
+ import { constructionEscape } from "./construction-escapes.js";
44
46
  import { checkedClassConstruction, checkedClassConstructionPacked } from "./class-construction.js";
45
47
  import { initializeRuntimeStatics, hasRuntimeStatics } from "./class-runtime-statics.js";
46
48
  import { reflectedClassStaticMethodValue } from "./class-method-values.js";
@@ -380,6 +382,10 @@ export function registerBuiltinErrorClasses(lowerer) {
380
382
  { name: "%nameEnumerable", type: BOOL },
381
383
  { name: "%stackFrames", type: STRING },
382
384
  { name: "%stack", type: STRING },
385
+ { name: "%systemErrno", type: F64 },
386
+ { name: "%systemCall", type: STRING },
387
+ { name: "%systemPath", type: STRING },
388
+ { name: "%systemDest", type: STRING },
383
389
  ],
384
390
  loc,
385
391
  },
@@ -994,15 +1000,7 @@ function collectClassShapeDeferring(lowerer, decl) {
994
1000
  const hasDeclTimeCode = (n) => ts.isClassStaticBlockDeclaration(n) ||
995
1001
  (n.modifiers ?? []).some((m) => m.kind === ts.SyntaxKind.Decorator);
996
1002
  if (symbol && (hasDeclTimeCode(decl) || decl.members.some(hasDeclTimeCode))) {
997
- const diags = lowerer.deferredDiags.get(symbol);
998
- if (diags) {
999
- lowerer.deferredDiags.delete(symbol);
1000
- if (!lowerer.alreadyFlushed.has(symbol)) {
1001
- lowerer.flushedSymbols.add(symbol);
1002
- for (const d of diags)
1003
- lowerer.pushDiag(d);
1004
- }
1005
- }
1003
+ lowerer.reportDeferred(symbol);
1006
1004
  }
1007
1005
  // A poisoned BASE this class EXTENDS must report EAGERLY for the same
1008
1006
  // reason: the derived statement evaluates its heritage when module
@@ -1020,15 +1018,8 @@ function collectClassShapeDeferring(lowerer, decl) {
1020
1018
  ?.types.map((t) => t.expression)
1021
1019
  .filter(ts.isIdentifier)[0];
1022
1020
  const baseSym = baseIdent ? lowerer.resolveValueSymbol(baseIdent) : null;
1023
- const baseDiags = baseSym ? lowerer.deferredDiags.get(baseSym) : undefined;
1024
- if (baseSym && baseDiags) {
1025
- lowerer.deferredDiags.delete(baseSym);
1026
- if (!lowerer.alreadyFlushed.has(baseSym)) {
1027
- lowerer.flushedSymbols.add(baseSym);
1028
- for (const d of baseDiags)
1029
- lowerer.pushDiag(d);
1030
- }
1031
- }
1021
+ if (baseSym)
1022
+ lowerer.reportDeferred(baseSym);
1032
1023
  }
1033
1024
  }
1034
1025
  function inferredEmptyCollectionFieldType(lowerer, decl, field, initializer) {
@@ -1691,7 +1682,7 @@ mixin) {
1691
1682
  lowerer.badType(member.name, lowerer.typeOf(member.name));
1692
1683
  if (type.kind === "dyn" &&
1693
1684
  !isJsSourceFile(member.getSourceFile()) &&
1694
- !lowerer.classImplementedProtocol(lowerer.typeOf(member.name)) &&
1685
+ !lowerer.classFieldStoresDyn(lowerer.typeOf(member.name)) &&
1695
1686
  (member.type !== undefined ||
1696
1687
  (lowerer.typeOf(member.name).flags & ts.TypeFlags.Any) === 0)) {
1697
1688
  lowerer.unsupported("SC1090", member.name, "'unknown'-typed static fields");
@@ -1883,8 +1874,8 @@ mixin) {
1883
1874
  // declaration is an ordinary OWN field (tsc guarantees every
1884
1875
  // instantiable subclass declares it and, under
1885
1876
  // strictPropertyInitialization, initializes it). Reads through
1886
- // ABSTRACT-typed receivers have no slot to read and keep a
1887
- // per-site fence.
1877
+ // ABSTRACT-typed receivers resolve the concrete instance's
1878
+ // property through checked class dispatch.
1888
1879
  if (modifiers?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword))
1889
1880
  continue;
1890
1881
  if (modifiers?.some((m) => m.kind === ts.SyntaxKind.AccessorKeyword)) {
@@ -2054,7 +2045,7 @@ mixin) {
2054
2045
  // storage as implicit constructor-assigned JS fields.
2055
2046
  if (type.kind === "dyn" &&
2056
2047
  !isJsSourceFile(member.getSourceFile()) &&
2057
- !lowerer.classImplementedProtocol(lowerer.typeOf(member.name))) {
2048
+ !lowerer.classFieldStoresDyn(lowerer.typeOf(member.name))) {
2058
2049
  lowerer.unsupported("SC1090", member.name, "'unknown'-typed class fields");
2059
2050
  }
2060
2051
  const undefinedInitializer = type.kind === "dyn" && !member.initializer ? locOf(member) : undefined;
@@ -2182,7 +2173,7 @@ mixin) {
2182
2173
  if (type.kind === "void")
2183
2174
  lowerer.badType(p.name, lowerer.typeOf(p.name));
2184
2175
  // The class-field dyn rule verbatim (KEEP NARROW).
2185
- if (type.kind === "dyn" && !lowerer.classImplementedProtocol(lowerer.typeOf(p))) {
2176
+ if (type.kind === "dyn" && !lowerer.classFieldStoresDyn(lowerer.typeOf(p))) {
2186
2177
  lowerer.unsupported("SC1090", p.name, "'unknown'-typed class fields");
2187
2178
  }
2188
2179
  // `override x` (and any same-named inherited member) would
@@ -2234,15 +2225,12 @@ mixin) {
2234
2225
  if (findGenericMethodOn(lowerer, base, mName)) {
2235
2226
  lowerer.unsupported("SC1090", member.name, `overriding the inherited generic method '${mName}' with a non-generic method (generic methods dispatch statically and would never reach this override)`);
2236
2227
  }
2237
- // Abstract re-declarations keep the overridden ABI exactly,
2238
- // like any override (a concrete implementation below must
2239
- // agree with BOTH, which exactness makes one constraint).
2240
2228
  const overridden = lowerer.findMethodOn(base, mName);
2241
2229
  if (overridden &&
2242
2230
  (overridden.sig.params.length !== shapes.length ||
2243
2231
  !overridden.sig.params.every((p, i) => typeEquals(p.type, shapes[i].type)) ||
2244
- !typeEquals(overridden.sig.ret, ret))) {
2245
- lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter and return types must match the base declaration exactly)");
2232
+ !typeEquals(overridden.sig.ret, overrideReturnAbi(lowerer, ret, overridden.sig.ret, className, base)))) {
2233
+ lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter types must match the base declaration exactly; returns may narrow to a subclass)");
2246
2234
  }
2247
2235
  methods.set(mName, { params: shapes, ret, abstract: true });
2248
2236
  continue;
@@ -2363,11 +2351,12 @@ mixin) {
2363
2351
  if (refined)
2364
2352
  ft.ret = refined;
2365
2353
  }
2366
- // Overrides keep the EXACT overridden ABI signature. tsc's method
2354
+ // Overrides keep the inherited ABI signature. tsc's method
2367
2355
  // bivariance would let a narrowed parameter type through, and a
2368
2356
  // vtable-dispatched call could then hand the override a base
2369
2357
  // instance it reads out-of-bounds fields from — exactness keeps
2370
- // every slot sound (covariant returns can come later). Comparing
2358
+ // every parameter slot sound. Nominal covariant returns share the
2359
+ // base pointer ABI while retaining their declared result type. Comparing
2371
2360
  // ABI types only (not modes) is deliberate: call sites complete
2372
2361
  // against the STATIC receiver's shape, so `m(x?: number)` and
2373
2362
  // `m(x: number | undefined)` interchange soundly in overrides.
@@ -2429,7 +2418,7 @@ mixin) {
2429
2418
  member.asteriskToken === undefined &&
2430
2419
  (overridden.sig.params.length !== shapes.length ||
2431
2420
  !overridden.sig.params.every((p, i) => typeEquals(p.type, shapes[i].type)) ||
2432
- !typeEquals(overridden.sig.ret, ft.ret))) {
2421
+ !typeEquals(overridden.sig.ret, overrideReturnAbi(lowerer, ft.ret, overridden.sig.ret, className, base)))) {
2433
2422
  const fencedJsOverride = isJsSourceFile(member.getSourceFile()) &&
2434
2423
  overridden.declarer.decl !== null &&
2435
2424
  isJsSourceFile(overridden.declarer.decl.getSourceFile()) &&
@@ -2456,12 +2445,12 @@ mixin) {
2456
2445
  });
2457
2446
  methodEntryFences.set(mName, unsupportedDiag("SC1090", locOf(member.name), returnOnly
2458
2447
  ? `overriding method '${mName}' with a different return type (the native return type must match the base declaration exactly)`
2459
- : `overriding method '${mName}' with a different signature (the native parameter and return types must match the base declaration exactly)`));
2448
+ : `overriding method '${mName}' with a different signature (the native parameter types must match the base declaration exactly; returns may narrow to a subclass)`));
2460
2449
  shapes.splice(0, shapes.length, ...overridden.sig.params);
2461
2450
  ft.ret = overridden.sig.ret;
2462
2451
  }
2463
2452
  else {
2464
- lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter and return types must match the base declaration exactly)");
2453
+ lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter types must match the base declaration exactly; returns may narrow to a subclass)");
2465
2454
  }
2466
2455
  }
2467
2456
  const asyncMember = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) === true;
@@ -2622,6 +2611,52 @@ mixin) {
2622
2611
  initializer: undefined,
2623
2612
  })));
2624
2613
  }
2614
+ // Fields read before their first assignment. Construction that hands
2615
+ // the instance to other code (a method call, an argument, a callback,
2616
+ // a base constructor that does either) before assigning a class-typed
2617
+ // field lets that code read the field while Node still holds
2618
+ // undefined. Such fields take the deferred-init representation, whose
2619
+ // slot (a nullable instance pointer) starts empty and whose reads check
2620
+ // it. Fields assigned before any exposure keep their plain reads.
2621
+ const derived = decl.heritageClauses?.some((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword) ??
2622
+ false;
2623
+ // Generic instances and mixins share layouts across declarations, so
2624
+ // they only report whether construction exposes the instance.
2625
+ const escape = familyMode || mixin
2626
+ ? { escapes: derived, assigned: null }
2627
+ : constructionEscape({
2628
+ ctor,
2629
+ fields: fieldOrder.flatMap((f) => paramProps.some((pp) => pp.name === f.name)
2630
+ ? []
2631
+ : [{ name: f.name, initializer: f.initializer }]),
2632
+ paramProps: paramProps.map((pp) => pp.name),
2633
+ derived,
2634
+ baseEscapes: base === null ||
2635
+ callableBase !== undefined ||
2636
+ factoryBaseExpression !== undefined ||
2637
+ base.constructionEscapes === true,
2638
+ isField: (name) => fields.has(name) &&
2639
+ !methods.has(`set:${name}`) &&
2640
+ !lowerer.findMethodOn(base, `set:${name}`),
2641
+ privateMethodBody: (call) => {
2642
+ const callee = call.expression;
2643
+ if (!ts.isPropertyAccessExpression(callee))
2644
+ return null;
2645
+ const name = callee.name.text;
2646
+ const declaration = decl.members.find((member) => ts.isMethodDeclaration(member) &&
2647
+ member.body !== undefined &&
2648
+ (ts.isIdentifier(member.name) || ts.isPrivateIdentifier(member.name)) &&
2649
+ member.name.text === name);
2650
+ if (!declaration?.body || declaration.asteriskToken)
2651
+ return null;
2652
+ const modifiers = ts.getModifiers(declaration) ?? [];
2653
+ if (modifiers.some((m) => m.kind === ts.SyntaxKind.StaticKeyword || m.kind === ts.SyntaxKind.AsyncKeyword))
2654
+ return null;
2655
+ const isPrivate = ts.isPrivateIdentifier(declaration.name) ||
2656
+ modifiers.some((m) => m.kind === ts.SyntaxKind.PrivateKeyword);
2657
+ return isPrivate ? declaration.body : null;
2658
+ },
2659
+ });
2625
2660
  // The deferred definite-assignment check: a field on the unguarded
2626
2661
  // list passes only with an unconditional `this.x = ...` at the
2627
2662
  // constructor's TOP LEVEL — the same standard the JS-class path
@@ -2642,7 +2677,7 @@ mixin) {
2642
2677
  }
2643
2678
  }
2644
2679
  for (const f of unguardedFields) {
2645
- if (topAssigned.has(f.name))
2680
+ if (topAssigned.has(f.name) || escape.assigned?.has(f.name))
2646
2681
  continue;
2647
2682
  // DEFERRED INITIALIZATION (the Output.initialize idiom —
2648
2683
  // `stream!: T` assigned inside a method the constructor calls):
@@ -2676,6 +2711,23 @@ mixin) {
2676
2711
  lowerer.unsupported("SC1090", f.node, f.why);
2677
2712
  }
2678
2713
  }
2714
+ if (escape.assigned && !inst) {
2715
+ for (const f of fieldOrder) {
2716
+ if (f.redeclared || escape.assigned.has(f.name) || deferredInitFields.has(f.name))
2717
+ continue;
2718
+ if (paramProps.some((pp) => pp.name === f.name))
2719
+ continue;
2720
+ const declared = fields.get(f.name);
2721
+ if (declared?.kind !== "object" || lowerer.classes.get(declared.className)?.def.runtime)
2722
+ continue;
2723
+ const armed = lowerer.withUndefinedArm(declared);
2724
+ if (armed === null || armed.kind !== "union")
2725
+ continue;
2726
+ fields.set(f.name, armed);
2727
+ f.type = armed;
2728
+ deferredInitFields.add(f.name);
2729
+ }
2730
+ }
2679
2731
  // Partial overrides of an inherited accessor pair. JS gives the
2680
2732
  // derived class ONE own accessor property that SHADOWS the whole
2681
2733
  // inherited pair — the missing half does NOT resolve to the base's
@@ -3056,6 +3108,7 @@ mixin) {
3056
3108
  ? { classDecorators: { nodes: classDecoratorNodes } }
3057
3109
  : {}),
3058
3110
  ...(deferredInitFields.size > 0 ? { deferredInitFields } : {}),
3111
+ ...(escape.escapes ? { constructionEscapes: true } : {}),
3059
3112
  };
3060
3113
  // GENERIC members get their declaring-class backlink now that the
3061
3114
  // info exists (instance lowering reads it for `this` typing and the
@@ -3939,7 +3992,13 @@ export function lowerStaticFieldRead(lowerer, expr) {
3939
3992
  lowerer.unsupported("SC1090", expr, `reading the private static '${expr.name.text}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
3940
3993
  }
3941
3994
  if (found?.field !== undefined) {
3942
- return lowerer.maybeNarrow({ kind: "varRef", localId: found.field.globalId, type: found.field.type, loc }, expr);
3995
+ const value = {
3996
+ kind: "varRef",
3997
+ localId: found.field.globalId,
3998
+ type: found.field.type,
3999
+ loc,
4000
+ };
4001
+ return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
3943
4002
  }
3944
4003
  if (found) {
3945
4004
  return staticMethodValue(lowerer, found.declarer, expr.name.text, found.method, expr, loc);
@@ -4752,7 +4811,13 @@ export function lowerClassValueProperty(lowerer, expr) {
4752
4811
  lowerer.unsupported("SC1090", expr, `reading the static member '${member}' through a class value (a subclass of '${info.def.name.replace(/^%|^%m\d+\./, "")}' redeclares it, so the runtime class decides which declaration answers)`);
4753
4812
  }
4754
4813
  if (found.field !== undefined) {
4755
- return lowerer.maybeNarrow({ kind: "varRef", localId: found.field.globalId, type: found.field.type, loc }, expr);
4814
+ const value = {
4815
+ kind: "varRef",
4816
+ localId: found.field.globalId,
4817
+ type: found.field.type,
4818
+ loc,
4819
+ };
4820
+ return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
4756
4821
  }
4757
4822
  return staticMethodValue(lowerer, found.declarer, member, found.method, expr, loc);
4758
4823
  }
@@ -4770,6 +4835,20 @@ function abstractMemberSignature(lowerer, member) {
4770
4835
  ret: lowerer.declaredReturnType(member, member.name),
4771
4836
  };
4772
4837
  }
4838
+ /** A nominal return subtype uses the same owned pointer as the inherited
4839
+ * return slot. The current class is still being collected, so consult its
4840
+ * already collected base chain before the complete class graph is available. */
4841
+ function overrideReturnAbi(lowerer, declared, inherited, className, base) {
4842
+ if (declared.kind !== "object" || inherited.kind !== "object")
4843
+ return declared;
4844
+ if (lowerer.isSubclassOf(declared.className, inherited.className) ||
4845
+ (declared.className === className &&
4846
+ base !== null &&
4847
+ (base.def.name === inherited.className ||
4848
+ lowerer.isSubclassOf(base.def.name, inherited.className))))
4849
+ return inherited;
4850
+ return declared;
4851
+ }
4773
4852
  /** The nearest declaration of `name` at or above `info` — the method a
4774
4853
  * receiver of that static class runs when nothing below overrides it. */
4775
4854
  export function findMethodOn(lowerer, info, name) {
@@ -4933,34 +5012,7 @@ export function collectInheritedJsFieldWrites(lowerer, files) {
4933
5012
  * hierarchy identifies the original declarations through aliases as well. */
4934
5013
  export function collectVirtualJsMethods(lowerer, files) {
4935
5014
  const families = [];
4936
- // Record named prototype accesses before collecting method signatures.
4937
- // Those slots need a callable ABI even when JavaScript would otherwise
4938
- // specialize each call independently.
4939
- for (const file of files)
4940
- ts.walkPreorder(file, (node) => {
4941
- if (!ts.isPropertyAccessExpression(node) && !ts.isElementAccessExpression(node))
4942
- return;
4943
- const name = ts.isPropertyAccessExpression(node)
4944
- ? node.name.text
4945
- : ts.isStringLiteralLike(node.argumentExpression)
4946
- ? node.argumentExpression.text
4947
- : null;
4948
- if (name === null)
4949
- return;
4950
- const prototype = ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === "prototype";
4951
- const assigned = ts.isBinaryExpression(node.parent) &&
4952
- node.parent.left === node &&
4953
- node.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken;
4954
- const symbol = !assigned
4955
- ? undefined
4956
- : ts.isPropertyAccessExpression(node)
4957
- ? lowerer.checker.getSymbolAtLocation(node.name)
4958
- : lowerer.checker.getPropertyOfType(lowerer.typeOf(node.expression), name);
4959
- if (prototype ||
4960
- (symbol && lowerer.checker.declarationsOf(symbol).some(ts.isMethodDeclaration))) {
4961
- lowerer.prototypeMethodAccesses.set(name, node);
4962
- }
4963
- });
5015
+ collectClassMethodMutations(lowerer, files);
4964
5016
  const visit = (node) => {
4965
5017
  if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
4966
5018
  const accessors = node.members.filter((member) => (ts.isGetAccessorDeclaration(member) || ts.isSetAccessorDeclaration(member)) &&
@@ -7273,7 +7325,7 @@ export function lowerNew(lowerer, expr) {
7273
7325
  if (targs[1]) {
7274
7326
  lowerer.unsupported("SC1090", expr, `Map values of type '${lowerer.checker.typeToString(targs[1])}' ` +
7275
7327
  `(Map values must be number, string, boolean, records, class instances, ` +
7276
- `arrays, promises, Maps, Sets, or unions of those — not functions, 'unknown', or 'any')`);
7328
+ `typed arrays, arrays, promises, Maps, Sets, or supported unions and checked values)`);
7277
7329
  }
7278
7330
  lowerer.badType(expr, tsType);
7279
7331
  }