@scriptc/compiler 0.2.5 → 0.2.7

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 (520) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +62 -48
  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/executable-features.js +1 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/link-plan-core.d.ts +4 -1
  13. package/dist/backend/link-plan-core.js +16 -3
  14. package/dist/backend/link-plan-core.js.map +1 -1
  15. package/dist/backend/link-plan.d.ts +3 -1
  16. package/dist/backend/link-plan.js +3 -0
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/alloc.d.ts +40 -0
  19. package/dist/backend/llvm/alloc.js +205 -0
  20. package/dist/backend/llvm/alloc.js.map +1 -0
  21. package/dist/backend/llvm/alloc.test.d.ts +1 -0
  22. package/dist/backend/llvm/alloc.test.js +102 -0
  23. package/dist/backend/llvm/alloc.test.js.map +1 -0
  24. package/dist/backend/llvm/byte-numbers.js +32 -4
  25. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  26. package/dist/backend/llvm/byte-windows.d.ts +31 -0
  27. package/dist/backend/llvm/byte-windows.js +334 -0
  28. package/dist/backend/llvm/byte-windows.js.map +1 -0
  29. package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
  30. package/dist/backend/llvm/byte-windows.test.js +244 -0
  31. package/dist/backend/llvm/byte-windows.test.js.map +1 -0
  32. package/dist/backend/llvm/call-lifetimes.d.ts +17 -5
  33. package/dist/backend/llvm/call-lifetimes.js +58 -24
  34. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  35. package/dist/backend/llvm/call-lifetimes.test.js +170 -0
  36. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  37. package/dist/backend/llvm/classes.d.ts +18 -2
  38. package/dist/backend/llvm/classes.js +115 -41
  39. package/dist/backend/llvm/classes.js.map +1 -1
  40. package/dist/backend/llvm/classes.test.d.ts +1 -0
  41. package/dist/backend/llvm/classes.test.js +132 -0
  42. package/dist/backend/llvm/classes.test.js.map +1 -0
  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 +27 -0
  47. package/dist/backend/llvm/constant-callbacks.js +450 -0
  48. package/dist/backend/llvm/constant-callbacks.js.map +1 -0
  49. package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
  50. package/dist/backend/llvm/constant-callbacks.test.js +261 -0
  51. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
  52. package/dist/backend/llvm/dense-array-access.d.ts +29 -0
  53. package/dist/backend/llvm/dense-array-access.js +335 -0
  54. package/dist/backend/llvm/dense-array-access.js.map +1 -0
  55. package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
  56. package/dist/backend/llvm/dense-array-access.test.js +149 -0
  57. package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
  58. package/dist/backend/llvm/dyn.d.ts +35 -1
  59. package/dist/backend/llvm/dyn.js +196 -35
  60. package/dist/backend/llvm/dyn.js.map +1 -1
  61. package/dist/backend/llvm/emitter.d.ts +143 -4
  62. package/dist/backend/llvm/emitter.js +882 -136
  63. package/dist/backend/llvm/emitter.js.map +1 -1
  64. package/dist/backend/llvm/emitter.test.js +82 -14
  65. package/dist/backend/llvm/emitter.test.js.map +1 -1
  66. package/dist/backend/llvm/expr-async.js +58 -4
  67. package/dist/backend/llvm/expr-async.js.map +1 -1
  68. package/dist/backend/llvm/expr-async.test.d.ts +1 -0
  69. package/dist/backend/llvm/expr-async.test.js +62 -0
  70. package/dist/backend/llvm/expr-async.test.js.map +1 -0
  71. package/dist/backend/llvm/expr-bytes.js +11 -0
  72. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  73. package/dist/backend/llvm/expr-calls.js +151 -25
  74. package/dist/backend/llvm/expr-calls.js.map +1 -1
  75. package/dist/backend/llvm/expr-containers.js +37 -14
  76. package/dist/backend/llvm/expr-containers.js.map +1 -1
  77. package/dist/backend/llvm/expr-control.js +92 -2
  78. package/dist/backend/llvm/expr-control.js.map +1 -1
  79. package/dist/backend/llvm/expr-dispatch.js +2 -0
  80. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +210 -28
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  84. package/dist/backend/llvm/expr-primitives.js +58 -23
  85. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  86. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  87. package/dist/backend/llvm/expr-records.js +3 -3
  88. package/dist/backend/llvm/expr-records.js.map +1 -1
  89. package/dist/backend/llvm/expr-stream-bridges.js +59 -2
  90. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  91. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  92. package/dist/backend/llvm/integer-remainder.d.ts +18 -0
  93. package/dist/backend/llvm/integer-remainder.js +117 -0
  94. package/dist/backend/llvm/integer-remainder.js.map +1 -0
  95. package/dist/backend/llvm/layouts.d.ts +2 -1
  96. package/dist/backend/llvm/layouts.js +4 -3
  97. package/dist/backend/llvm/layouts.js.map +1 -1
  98. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  99. package/dist/backend/llvm/lazy-captures.js +96 -0
  100. package/dist/backend/llvm/lazy-captures.js.map +1 -0
  101. package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
  102. package/dist/backend/llvm/lazy-captures.test.js +78 -0
  103. package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
  104. package/dist/backend/llvm/lib-abi.js +7 -0
  105. package/dist/backend/llvm/lib-abi.js.map +1 -1
  106. package/dist/backend/llvm/lib-dispatch.js +7 -22
  107. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  108. package/dist/backend/llvm/lib-filesystem.js +3 -4
  109. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  110. package/dist/backend/llvm/lib-shared.js +15 -0
  111. package/dist/backend/llvm/lib-shared.js.map +1 -1
  112. package/dist/backend/llvm/local-array-reads.d.ts +13 -3
  113. package/dist/backend/llvm/local-array-reads.js +159 -77
  114. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  115. package/dist/backend/llvm/local-array-reads.test.js +105 -4
  116. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  117. package/dist/backend/llvm/local-union-storage.d.ts +5 -1
  118. package/dist/backend/llvm/local-union-storage.js +48 -6
  119. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  120. package/dist/backend/llvm/local-union-storage.test.js +91 -4
  121. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  122. package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
  123. package/dist/backend/llvm/loop-array-borrows.js +70 -0
  124. package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
  125. package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
  126. package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
  127. package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
  128. package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
  129. package/dist/backend/llvm/map-read-lifetimes.js +20 -5
  130. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  131. package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
  132. package/dist/backend/llvm/nullable-fields.d.ts +28 -0
  133. package/dist/backend/llvm/nullable-fields.js +45 -0
  134. package/dist/backend/llvm/nullable-fields.js.map +1 -0
  135. package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
  136. package/dist/backend/llvm/nullable-fields.test.js +48 -0
  137. package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
  138. package/dist/backend/llvm/reference-effects.d.ts +2 -1
  139. package/dist/backend/llvm/reference-effects.js +7 -0
  140. package/dist/backend/llvm/reference-effects.js.map +1 -1
  141. package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
  142. package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
  143. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
  144. package/dist/backend/llvm/shapes.d.ts +73 -3
  145. package/dist/backend/llvm/shapes.js +281 -34
  146. package/dist/backend/llvm/shapes.js.map +1 -1
  147. package/dist/backend/llvm/shapes.test.js +114 -5
  148. package/dist/backend/llvm/shapes.test.js.map +1 -1
  149. package/dist/backend/llvm/split-loops.d.ts +48 -0
  150. package/dist/backend/llvm/split-loops.js +183 -0
  151. package/dist/backend/llvm/split-loops.js.map +1 -0
  152. package/dist/backend/llvm/split.js +0 -7
  153. package/dist/backend/llvm/split.js.map +1 -1
  154. package/dist/backend/llvm/split.test.js +66 -2
  155. package/dist/backend/llvm/split.test.js.map +1 -1
  156. package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
  157. package/dist/backend/llvm/stack-callbacks.js +72 -0
  158. package/dist/backend/llvm/stack-callbacks.js.map +1 -0
  159. package/dist/backend/llvm/stack-captures.d.ts +27 -0
  160. package/dist/backend/llvm/stack-captures.js +152 -0
  161. package/dist/backend/llvm/stack-captures.js.map +1 -0
  162. package/dist/backend/llvm/stack-unions.test.js +38 -1
  163. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  164. package/dist/backend/llvm/string-construction.test.js +1 -1
  165. package/dist/backend/llvm/string-key-hash.d.ts +8 -0
  166. package/dist/backend/llvm/string-key-hash.js +59 -0
  167. package/dist/backend/llvm/string-key-hash.js.map +1 -0
  168. package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
  169. package/dist/backend/llvm/string-key-hash.test.js +34 -0
  170. package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
  171. package/dist/backend/llvm/string-lifetimes.test.js +48 -7
  172. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  173. package/dist/backend/llvm/string-slices.d.ts +20 -0
  174. package/dist/backend/llvm/string-slices.js +87 -0
  175. package/dist/backend/llvm/string-slices.js.map +1 -0
  176. package/dist/backend/llvm/string-slices.test.d.ts +1 -0
  177. package/dist/backend/llvm/string-slices.test.js +98 -0
  178. package/dist/backend/llvm/string-slices.test.js.map +1 -0
  179. package/dist/backend/llvm/switch-dispatch.js +1 -1
  180. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  181. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  182. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  183. package/dist/backend/llvm/walkers.d.ts +4 -14
  184. package/dist/backend/llvm/walkers.js +53 -311
  185. package/dist/backend/llvm/walkers.js.map +1 -1
  186. package/dist/backend/may-throw.js +4 -1
  187. package/dist/backend/may-throw.js.map +1 -1
  188. package/dist/backend/may-throw.test.js +1 -1
  189. package/dist/backend/native/cache-warm.d.ts +2 -1
  190. package/dist/backend/native/cache-warm.js.map +1 -1
  191. package/dist/backend/native/contracts.d.ts +5 -2
  192. package/dist/backend/native/contracts.js.map +1 -1
  193. package/dist/backend/native/executable.js +12 -4
  194. package/dist/backend/native/executable.js.map +1 -1
  195. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  196. package/dist/backend/native/runtime-inputs.js +3 -0
  197. package/dist/backend/native/runtime-inputs.js.map +1 -1
  198. package/dist/backend/native-codegen-core.d.ts +7 -0
  199. package/dist/backend/native-codegen-core.js +21 -0
  200. package/dist/backend/native-codegen-core.js.map +1 -1
  201. package/dist/backend/native-codegen.d.ts +9 -0
  202. package/dist/backend/native-codegen.js +38 -18
  203. package/dist/backend/native-codegen.js.map +1 -1
  204. package/dist/backend/native-codegen.test.js +70 -2
  205. package/dist/backend/native-codegen.test.js.map +1 -1
  206. package/dist/backend/native-link-info-core.d.ts +4 -2
  207. package/dist/backend/native-link-info-core.js.map +1 -1
  208. package/dist/backend/native-link-info.d.ts +2 -1
  209. package/dist/backend/native-link-info.js.map +1 -1
  210. package/dist/backend/native-link-info.test.js +2 -2
  211. package/dist/backend/native-link-info.test.js.map +1 -1
  212. package/dist/backend/native-tools.d.ts +6 -2
  213. package/dist/backend/native-tools.js +6 -5
  214. package/dist/backend/native-tools.js.map +1 -1
  215. package/dist/backend/optimization.d.ts +25 -0
  216. package/dist/backend/optimization.js +21 -0
  217. package/dist/backend/optimization.js.map +1 -0
  218. package/dist/backend/optimization.test.d.ts +1 -0
  219. package/dist/backend/optimization.test.js +24 -0
  220. package/dist/backend/optimization.test.js.map +1 -0
  221. package/dist/backend/runtime-abi.d.ts +2 -2
  222. package/dist/backend/runtime-abi.js +2 -2
  223. package/dist/backend/runtime-pack-core.d.ts +16 -4
  224. package/dist/backend/runtime-pack-core.js +31 -13
  225. package/dist/backend/runtime-pack-core.js.map +1 -1
  226. package/dist/backend/runtime-pack-native.d.ts +7 -3
  227. package/dist/backend/runtime-pack-native.js +0 -3
  228. package/dist/backend/runtime-pack-native.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +41 -4
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.d.ts +20 -2
  232. package/dist/backend/runtime-pack.js +23 -0
  233. package/dist/backend/runtime-pack.js.map +1 -1
  234. package/dist/backend/runtime-pack.test.js +125 -2
  235. package/dist/backend/runtime-pack.test.js.map +1 -1
  236. package/dist/backend/target-diagnostics.test.js +1 -1
  237. package/dist/backend/targets.d.ts +2 -1
  238. package/dist/backend/targets.js +1 -1
  239. package/dist/backend/targets.js.map +1 -1
  240. package/dist/cli/command.js +5 -4
  241. package/dist/cli/command.js.map +1 -1
  242. package/dist/cli/host.d.ts +2 -1
  243. package/dist/cli/usage.d.ts +1 -1
  244. package/dist/cli/usage.js +5 -2
  245. package/dist/cli/usage.js.map +1 -1
  246. package/dist/compile-types.d.ts +5 -2
  247. package/dist/diagnostics/diagnostic.js +10 -8
  248. package/dist/diagnostics/diagnostic.js.map +1 -1
  249. package/dist/executable/executable-cache.d.ts +3 -2
  250. package/dist/executable/executable-cache.js +8 -4
  251. package/dist/executable/executable-cache.js.map +1 -1
  252. package/dist/executable/executable-cache.test.js +35 -0
  253. package/dist/executable/executable-cache.test.js.map +1 -1
  254. package/dist/frontend/fork-target.d.ts +5 -0
  255. package/dist/frontend/fork-target.js +40 -8
  256. package/dist/frontend/fork-target.js.map +1 -1
  257. package/dist/frontend/fork-target.test.d.ts +1 -0
  258. package/dist/frontend/fork-target.test.js +59 -0
  259. package/dist/frontend/fork-target.test.js.map +1 -0
  260. package/dist/frontend/lowering/abstract-equality.js +5 -49
  261. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  262. package/dist/frontend/lowering/array-values.d.ts +23 -0
  263. package/dist/frontend/lowering/array-values.js +129 -0
  264. package/dist/frontend/lowering/array-values.js.map +1 -1
  265. package/dist/frontend/lowering/binding-analysis.js +2 -2
  266. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/atomics.d.ts +2 -11
  268. package/dist/frontend/lowering/builtins/atomics.js +64 -28
  269. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  270. package/dist/frontend/lowering/builtins/errors.js +17 -2
  271. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +3 -0
  273. package/dist/frontend/lowering/builtins/filesystem-calls.js +51 -4
  274. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/module-calls.js +6 -1
  276. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  277. package/dist/frontend/lowering/builtins/process.d.ts +6 -17
  278. package/dist/frontend/lowering/builtins/process.js +56 -29
  279. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
  281. package/dist/frontend/lowering/builtins/workers.js +65 -0
  282. package/dist/frontend/lowering/builtins/workers.js.map +1 -0
  283. package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
  284. package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
  285. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
  286. package/dist/frontend/lowering/class-assertions.d.ts +11 -0
  287. package/dist/frontend/lowering/class-assertions.js +104 -0
  288. package/dist/frontend/lowering/class-assertions.js.map +1 -0
  289. package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
  290. package/dist/frontend/lowering/class-callbacks.js +18 -5
  291. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  292. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
  293. package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
  294. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  295. package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
  296. package/dist/frontend/lowering/class-method-mutations.js +472 -0
  297. package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
  298. package/dist/frontend/lowering/class-method-values.js +25 -5
  299. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  300. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  301. package/dist/frontend/lowering/class-protocols.js +126 -0
  302. package/dist/frontend/lowering/class-protocols.js.map +1 -0
  303. package/dist/frontend/lowering/class-prototypes.js +8 -2
  304. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  305. package/dist/frontend/lowering/class-unions.d.ts +16 -0
  306. package/dist/frontend/lowering/class-unions.js +127 -0
  307. package/dist/frontend/lowering/class-unions.js.map +1 -0
  308. package/dist/frontend/lowering/coercions/builders.js +8 -1
  309. package/dist/frontend/lowering/coercions/builders.js.map +1 -1
  310. package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
  311. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  312. package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
  313. package/dist/frontend/lowering/coercions/identity.js +26 -0
  314. package/dist/frontend/lowering/coercions/identity.js.map +1 -0
  315. package/dist/frontend/lowering/coercions/structural.js +9 -6
  316. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  317. package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
  318. package/dist/frontend/lowering/collection-narrowing.js +31 -0
  319. package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
  320. package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
  321. package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
  322. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
  323. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -12
  324. package/dist/frontend/lowering/containers/array-callbacks.js +415 -136
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
  327. package/dist/frontend/lowering/containers/array-concat.js +130 -0
  328. package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
  329. package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
  330. package/dist/frontend/lowering/containers/array-construction.js +95 -3
  331. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  332. package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
  333. package/dist/frontend/lowering/containers/array-methods.js +43 -132
  334. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  335. package/dist/frontend/lowering/containers/bytes.js +12 -34
  336. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  337. package/dist/frontend/lowering/containers/collection-methods.js +10 -1
  338. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  339. package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
  340. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  341. package/dist/frontend/lowering/containers/string-and-regexp.js +22 -3
  342. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  343. package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
  344. package/dist/frontend/lowering/cycle-initialization.js +277 -0
  345. package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
  346. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
  347. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  348. package/dist/frontend/lowering/expressions/object-literals.js +140 -38
  349. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  350. package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
  351. package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
  352. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  353. package/dist/frontend/lowering/generic-functions.d.ts +2 -5
  354. package/dist/frontend/lowering/generic-functions.js +13 -10
  355. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  356. package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
  357. package/dist/frontend/lowering/instantiation-path.js +10 -0
  358. package/dist/frontend/lowering/instantiation-path.js.map +1 -0
  359. package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
  360. package/dist/frontend/lowering/instantiation-path.test.js +23 -0
  361. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
  362. package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
  363. package/dist/frontend/lowering/iterator-adapters.js +605 -0
  364. package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
  365. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  366. package/dist/frontend/lowering/lower-array-sort.js +44 -5
  367. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  368. package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
  369. package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
  370. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
  371. package/dist/frontend/lowering/lower-assert.js +7 -0
  372. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  373. package/dist/frontend/lowering/lower-builtin-values.js +12 -7
  374. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  375. package/dist/frontend/lowering/lower-calls.d.ts +3 -3
  376. package/dist/frontend/lowering/lower-calls.js +198 -124
  377. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  378. package/dist/frontend/lowering/lower-classes.d.ts +7 -0
  379. package/dist/frontend/lowering/lower-classes.js +166 -96
  380. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  381. package/dist/frontend/lowering/lower-event-emitter.js +1 -1
  382. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  383. package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
  384. package/dist/frontend/lowering/lower-exprs.js +421 -167
  385. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  386. package/dist/frontend/lowering/lower-functions.d.ts +1 -1
  387. package/dist/frontend/lowering/lower-functions.js +33 -20
  388. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  389. package/dist/frontend/lowering/lower-inspect.js +26 -2
  390. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  391. package/dist/frontend/lowering/lower-island.js +1 -1
  392. package/dist/frontend/lowering/lower-island.js.map +1 -1
  393. package/dist/frontend/lowering/lower-modules.d.ts +1 -0
  394. package/dist/frontend/lowering/lower-modules.js +54 -11
  395. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  396. package/dist/frontend/lowering/lower-stmts.js +59 -69
  397. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  398. package/dist/frontend/lowering/lower-stream.js +1 -1
  399. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  400. package/dist/frontend/lowering/lowerer.d.ts +50 -1
  401. package/dist/frontend/lowering/lowerer.js +333 -26
  402. package/dist/frontend/lowering/lowerer.js.map +1 -1
  403. package/dist/frontend/lowering/native-ffi.js +3 -1
  404. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  405. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
  406. package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
  407. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
  408. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  409. package/dist/frontend/lowering/split-consumers.d.ts +7 -0
  410. package/dist/frontend/lowering/split-consumers.js +64 -0
  411. package/dist/frontend/lowering/split-consumers.js.map +1 -0
  412. package/dist/frontend/lowering/strict-equality.d.ts +9 -0
  413. package/dist/frontend/lowering/strict-equality.js +116 -0
  414. package/dist/frontend/lowering/strict-equality.js.map +1 -0
  415. package/dist/frontend/lowering/surfaces.d.ts +3 -4
  416. package/dist/frontend/lowering/surfaces.js +38 -7
  417. package/dist/frontend/lowering/surfaces.js.map +1 -1
  418. package/dist/frontend/lowering/union-comparison.d.ts +5 -0
  419. package/dist/frontend/lowering/union-comparison.js +47 -0
  420. package/dist/frontend/lowering/union-comparison.js.map +1 -0
  421. package/dist/frontend/module-source-candidates.d.ts +10 -0
  422. package/dist/frontend/module-source-candidates.js +40 -0
  423. package/dist/frontend/module-source-candidates.js.map +1 -0
  424. package/dist/frontend/module-source-candidates.test.d.ts +1 -0
  425. package/dist/frontend/module-source-candidates.test.js +53 -0
  426. package/dist/frontend/module-source-candidates.test.js.map +1 -0
  427. package/dist/frontend/pipeline.js +2 -2
  428. package/dist/frontend/pipeline.js.map +1 -1
  429. package/dist/frontend/program-analysis.d.ts +2 -0
  430. package/dist/frontend/program-analysis.js +2 -0
  431. package/dist/frontend/program-analysis.js.map +1 -1
  432. package/dist/frontend/program.d.ts +38 -2
  433. package/dist/frontend/program.js +457 -88
  434. package/dist/frontend/program.js.map +1 -1
  435. package/dist/frontend/program.test.js +59 -6
  436. package/dist/frontend/program.test.js.map +1 -1
  437. package/dist/frontend/ts7/ast-node.js +6 -8
  438. package/dist/frontend/ts7/ast-node.js.map +1 -1
  439. package/dist/frontend/ts7/ast-node.test.js +42 -1
  440. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  441. package/dist/frontend/ts7/ast-wire.d.ts +4 -0
  442. package/dist/frontend/ts7/ast-wire.js +28 -0
  443. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  444. package/dist/frontend/ts7/ast.d.ts +2 -1
  445. package/dist/frontend/ts7/ast.js +8 -4
  446. package/dist/frontend/ts7/ast.js.map +1 -1
  447. package/dist/frontend/ts7/checker.d.ts +8 -2
  448. package/dist/frontend/ts7/checker.js +41 -5
  449. package/dist/frontend/ts7/checker.js.map +1 -1
  450. package/dist/frontend/ts7/checker.test.js +42 -0
  451. package/dist/frontend/ts7/checker.test.js.map +1 -1
  452. package/dist/frontend/ts7/program-host.d.ts +7 -0
  453. package/dist/frontend/ts7/program-host.js +26 -2
  454. package/dist/frontend/ts7/program-host.js.map +1 -1
  455. package/dist/frontend/ts7/program-host.test.js +29 -0
  456. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  457. package/dist/frontend/type-mapper.d.ts +4 -1
  458. package/dist/frontend/type-mapper.js +133 -16
  459. package/dist/frontend/type-mapper.js.map +1 -1
  460. package/dist/frontend/type-mapper.test.js +15 -3
  461. package/dist/frontend/type-mapper.test.js.map +1 -1
  462. package/dist/frontend/worker-target.d.ts +6 -0
  463. package/dist/frontend/worker-target.js +108 -0
  464. package/dist/frontend/worker-target.js.map +1 -0
  465. package/dist/frontend/worker-target.test.d.ts +1 -0
  466. package/dist/frontend/worker-target.test.js +71 -0
  467. package/dist/frontend/worker-target.test.js.map +1 -0
  468. package/dist/index.js +47 -14
  469. package/dist/index.js.map +1 -1
  470. package/dist/ir/analysis.d.ts +3 -1
  471. package/dist/ir/analysis.js +4 -0
  472. package/dist/ir/analysis.js.map +1 -1
  473. package/dist/ir/builtin-effects.js +12 -0
  474. package/dist/ir/builtin-effects.js.map +1 -1
  475. package/dist/ir/builtin-signatures.d.ts +1 -1
  476. package/dist/ir/builtin-signatures.js +15 -15
  477. package/dist/ir/builtin-signatures.js.map +1 -1
  478. package/dist/ir/constant-tables.test.js +1 -1
  479. package/dist/ir/initializer-bindings.test.js +1 -1
  480. package/dist/ir/ir.d.ts +85 -23
  481. package/dist/ir/ir.js +20 -6
  482. package/dist/ir/ir.js.map +1 -1
  483. package/dist/ir/numeric-call-specialization.d.ts +8 -0
  484. package/dist/ir/numeric-call-specialization.js +198 -0
  485. package/dist/ir/numeric-call-specialization.js.map +1 -0
  486. package/dist/ir/runtime-features.js +4 -3
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/scalar-records.test.js +1 -1
  489. package/dist/ir/serialize.d.ts +1 -1
  490. package/dist/ir/serialize.js +3 -3
  491. package/dist/ir/serialize.js.map +1 -1
  492. package/dist/ir/traverse.js +8 -0
  493. package/dist/ir/traverse.js.map +1 -1
  494. package/dist/ir/validate.js +207 -43
  495. package/dist/ir/validate.js.map +1 -1
  496. package/dist/ir/validate.test.js +356 -8
  497. package/dist/ir/validate.test.js.map +1 -1
  498. package/dist/library/fence-eval.test.js +1 -1
  499. package/dist/library/int-infer.test.js +4 -4
  500. package/dist/library/ir-policy.js +2 -0
  501. package/dist/library/ir-policy.js.map +1 -1
  502. package/dist/library/library-cache.test.js +5 -5
  503. package/dist/library/library-profile.d.ts +2 -1
  504. package/dist/library/library-profile.js +4 -3
  505. package/dist/library/library-profile.js.map +1 -1
  506. package/dist/native/compiler.js +24 -11
  507. package/dist/native/compiler.js.map +1 -1
  508. package/dist/native/compiler.test.js +7 -3
  509. package/dist/native/compiler.test.js.map +1 -1
  510. package/dist/native/library.d.ts +2 -1
  511. package/dist/native/library.js.map +1 -1
  512. package/dist/native/prepare.js +29 -3
  513. package/dist/native/prepare.js.map +1 -1
  514. package/dist/native/sanitizer.d.ts +3 -2
  515. package/dist/native/sanitizer.js +3 -13
  516. package/dist/native/sanitizer.js.map +1 -1
  517. package/dist/native/sanitizer.test.js +1 -0
  518. package/dist/native/sanitizer.test.js.map +1 -1
  519. package/package.json +20 -20
  520. package/surface-manifest.json +37 -3
@@ -2,6 +2,7 @@ import * as ts from "../ts7/adapter.js";
2
2
  import type { FnCtx, Lowerer } from "./lowerer.js";
3
3
  import { type IrClassDef, type IrExpr, type IrFunction, type IrLocal, type IrStmt, type IrType, type SrcLoc } from "../../ir/ir.js";
4
4
  import { type GenericFnInfo } from "./generic-functions.js";
5
+ import { type InstantiationPath } from "./instantiation-path.js";
5
6
  import { type ParamShape } from "./call-signatures.js";
6
7
  import { type ScrDiagnostic } from "../../diagnostics/diagnostic.js";
7
8
  import { type EmitOverrideRec } from "./lower-event-emitter.js";
@@ -131,6 +132,8 @@ export interface ClassInfo {
131
132
  * (forwarding the completed ABI values; defaults apply in the base). */
132
133
  ctorParams: ParamShape[];
133
134
  base: ClassInfo | null;
135
+ /** Family heritage resolves its type arguments separately for each instance. */
136
+ genericBase?: ts.ExpressionWithTypeArguments;
134
137
  /** A module class may inherit a compiled ordinary JS constructor. Its
135
138
  * callable and prototype are captured when the class declaration runs. */
136
139
  callableBase?: {
@@ -161,6 +164,8 @@ export interface ClassInfo {
161
164
  staticFields: {
162
165
  name: string;
163
166
  type: IrType;
167
+ /** Indexed sources can be absent despite the declared static type. */
168
+ runtimeOptional?: true;
164
169
  initializer: ts.Expression;
165
170
  globalId: string;
166
171
  readonly: boolean;
@@ -214,6 +219,7 @@ export interface ClassInfo {
214
219
  * counts statements toward coverage — re-instantiations re-visit the
215
220
  * same source lines). */
216
221
  genericInstance?: {
222
+ path: InstantiationPath;
217
223
  family: ClassInfo;
218
224
  bindings: Map<ts.Symbol, IrType>;
219
225
  typeArgsText: string;
@@ -376,6 +382,7 @@ export declare function guaranteedDecorationThrow(lowerer: Lowerer, decl: ts.Cla
376
382
  } | null;
377
383
  export declare function collectClassShape(lowerer: Lowerer, decl: ts.ClassDeclaration): void;
378
384
  export declare function collectClassShapeInner(lowerer: Lowerer, decl: ts.ClassLikeDeclaration, jsNameOverride?: string, inst?: {
385
+ path: InstantiationPath;
379
386
  family: ClassInfo;
380
387
  name: string;
381
388
  bindings: Map<ts.Symbol, IrType>;
@@ -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
@@ -7,7 +8,8 @@ import { InternalCompilerError } from "../../errors.js";
7
8
  * hierarchy registration. */
8
9
  import * as ts from "../ts7/adapter.js";
9
10
  import { BOOL, DATE_T, DYN, F64, bytesOf, JSVAL, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
10
- import { MAX_GENERIC_INSTANCES, genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, } from "./generic-functions.js";
11
+ import { genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, } from "./generic-functions.js";
12
+ import { extendInstantiationPath, MAX_INSTANTIATION_RECURSION, } from "./instantiation-path.js";
11
13
  import { appendImplicitUndefinedReturn, hasExplicitJsDocReturn } from "./function-returns.js";
12
14
  import { bodyReadsArguments } from "../arguments-usage.js";
13
15
  import { generatorMeta } from "./call-signatures.js";
@@ -22,6 +24,7 @@ import { bufEncoding } from "./containers/bytes.js";
22
24
  import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
23
25
  import { lowerSearchParamsNew } from "./builtins/url.js";
24
26
  import { lowerTextCodecNew } from "./builtins/text-codecs.js";
27
+ import { lowerWorkerNew } from "./builtins/workers.js";
25
28
  import { requiresDynamicPackageDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
26
29
  import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, UNDERSCORE_METHODS, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
27
30
  import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
@@ -378,6 +381,10 @@ export function registerBuiltinErrorClasses(lowerer) {
378
381
  { name: "%nameEnumerable", type: BOOL },
379
382
  { name: "%stackFrames", type: STRING },
380
383
  { name: "%stack", type: STRING },
384
+ { name: "%systemErrno", type: F64 },
385
+ { name: "%systemCall", type: STRING },
386
+ { name: "%systemPath", type: STRING },
387
+ { name: "%systemDest", type: STRING },
381
388
  ],
382
389
  loc,
383
390
  },
@@ -949,7 +956,36 @@ export function guaranteedDecorationThrow(lowerer, decl) {
949
956
  return null;
950
957
  }
951
958
  export function collectClassShape(lowerer, decl) {
952
- const symbol = lowerer.collectDeferring(() => declSymbolOf(lowerer, decl), () => lowerer.collectClassShapeInner(decl));
959
+ if (lowerer.classes.has(lowerer.classNamer(decl)) ||
960
+ lowerer.collectingClassDeclarations.has(decl))
961
+ return;
962
+ lowerer.collectingClassDeclarations.add(decl);
963
+ try {
964
+ collectClassShapeDeferring(lowerer, decl);
965
+ }
966
+ finally {
967
+ lowerer.collectingClassDeclarations.delete(decl);
968
+ }
969
+ }
970
+ function collectClassShapeDeferring(lowerer, decl) {
971
+ const symbol = lowerer.collectDeferring(() => declSymbolOf(lowerer, decl), () => {
972
+ // A forward type reference can demand this class before collection
973
+ // reaches its earlier base declaration. Collect that dependency first;
974
+ // a later same-file base remains subject to the runtime order boundary.
975
+ const heritage = decl.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types[0]?.expression;
976
+ const reference = heritage && ts.isPropertyAccessExpression(heritage) ? heritage.name : heritage;
977
+ const baseSymbol = reference && ts.isIdentifier(reference) ? lowerer.resolveValueSymbol(reference) : undefined;
978
+ const baseDeclaration = baseSymbol
979
+ ? lowerer.checker.declarationsOf(baseSymbol).find(ts.isClassDeclaration)
980
+ : undefined;
981
+ if (baseDeclaration &&
982
+ !lowerer.isStdlibSymbol(baseSymbol ?? undefined) &&
983
+ !baseDeclaration.getSourceFile().isDeclarationFile &&
984
+ (baseDeclaration.getSourceFile() !== decl.getSourceFile() ||
985
+ baseDeclaration.getStart() < decl.getStart()))
986
+ lowerer.collectClassShape(baseDeclaration);
987
+ lowerer.collectClassShapeInner(decl);
988
+ });
953
989
  // Typed receivers and module retention know the class only by its
954
990
  // qualified IR name — index the deferral under it too.
955
991
  if (symbol)
@@ -1212,18 +1248,16 @@ mixin) {
1212
1248
  lowerer.unsupported("SC1090", decl, "generic class expressions");
1213
1249
  }
1214
1250
  const className = inst ? inst.name : mixin ? mixin.name : lowerer.classNamer(decl); // program-wide qualified name
1215
- // Single inheritance: `extends` of a class declared in the program.
1216
- // tsc guarantees the base is declared before the derived class (its
1217
- // use-before-declaration error), and collection runs in module order,
1218
- // so the base's ClassInfo already exists here. An INSTANTIATION's
1219
- // base is its family (whose base is the declared one) — the heritage
1220
- // clause resolved when the family collected.
1251
+ // Collection follows module order for runtime heritage. Ordinary
1252
+ // instances use the family as their storage base; generic heritage
1253
+ // resolves a concrete base under each instance's type bindings.
1221
1254
  const computedBase = lowerer.computedClassBases.get(lowerer.classNamer(decl));
1222
1255
  let base = inst
1223
1256
  ? inst.family
1224
1257
  : mixin
1225
1258
  ? mixin.base
1226
1259
  : (computedBase?.classInfo ?? null);
1260
+ let genericBase;
1227
1261
  let callableBase;
1228
1262
  let factoryBaseExpression;
1229
1263
  const adoptCallableBase = (expression) => {
@@ -1250,35 +1284,12 @@ mixin) {
1250
1284
  };
1251
1285
  return true;
1252
1286
  };
1253
- // A family whose `extends` clause mentions its OWN type parameters
1254
- // (`class D<T> extends Box<T>`) would need a different base per
1255
- // instantiation — no single family interval can sit above all of
1256
- // them. Named fence at the declaration.
1257
- if (familyMode && decl.heritageClauses !== undefined) {
1258
- const tpSyms = new Set();
1259
- for (const tp of decl.typeParameters) {
1260
- const s = lowerer.checker.getSymbolAtLocation(tp.name);
1261
- if (s)
1262
- tpSyms.add(s);
1263
- }
1264
- for (const clause of decl.heritageClauses) {
1265
- if (clause.token !== ts.SyntaxKind.ExtendsKeyword)
1266
- continue;
1267
- for (const t of clause.types) {
1268
- let mentions = false;
1269
- ts.walkPreorder(t, (n) => {
1270
- const s = ts.isIdentifier(n) ? lowerer.checker.getSymbolAtLocation(n) : undefined;
1271
- if (s && tpSyms.has(s)) {
1272
- mentions = true;
1273
- return "stop";
1274
- }
1275
- return undefined;
1276
- });
1277
- if (mentions) {
1278
- lowerer.unsupported("SC1090", t, "generic classes whose 'extends' clause mentions their own type parameters (each instantiation would need a different base)");
1279
- }
1280
- }
1281
- }
1287
+ const ownGenericBase = inst?.family.genericBase;
1288
+ if (inst && ownGenericBase) {
1289
+ const mapped = lowerer.mapTypeOf(lowerer.checker.getTypeAtLocation(ownGenericBase));
1290
+ base = mapped?.kind === "object" ? (lowerer.classes.get(mapped.className) ?? null) : null;
1291
+ if (!base || base.generic)
1292
+ lowerer.unsupported("SC1090", ownGenericBase, "a generic base whose type arguments have no concrete layout");
1282
1293
  }
1283
1294
  for (const clause of inst || mixin || computedBase ? [] : (decl.heritageClauses ?? [])) {
1284
1295
  // `implements` is pure type-world: tsc checked the conformance and
@@ -1288,6 +1299,22 @@ mixin) {
1288
1299
  if (clause.token === ts.SyntaxKind.ImplementsKeyword)
1289
1300
  continue;
1290
1301
  const t = clause.types[0];
1302
+ if (familyMode && t) {
1303
+ const reference = ts.isPropertyAccessExpression(t.expression)
1304
+ ? t.expression.name
1305
+ : t.expression;
1306
+ const symbol = ts.isIdentifier(reference)
1307
+ ? lowerer.resolveValueSymbol(reference)
1308
+ : undefined;
1309
+ const familyBase = symbol ? lowerer.classBySymbol.get(symbol) : undefined;
1310
+ if (familyBase?.generic) {
1311
+ if (symbol && ts.isPropertyAccessExpression(t.expression))
1312
+ fenceEarlyNsMemberRef(lowerer, t.expression, symbol);
1313
+ base = familyBase;
1314
+ genericBase = t;
1315
+ continue;
1316
+ }
1317
+ }
1291
1318
  // `extends events.EventEmitter` — the namespace-member spelling of
1292
1319
  // the ambient emitter base resolves like the named import.
1293
1320
  if (t && ts.isPropertyAccessExpression(t.expression) && ts.isIdentifier(t.expression.name)) {
@@ -1669,6 +1696,7 @@ mixin) {
1669
1696
  lowerer.badType(member.name, lowerer.typeOf(member.name));
1670
1697
  if (type.kind === "dyn" &&
1671
1698
  !isJsSourceFile(member.getSourceFile()) &&
1699
+ !lowerer.classImplementedProtocol(lowerer.typeOf(member.name)) &&
1672
1700
  (member.type !== undefined ||
1673
1701
  (lowerer.typeOf(member.name).flags & ts.TypeFlags.Any) === 0)) {
1674
1702
  lowerer.unsupported("SC1090", member.name, "'unknown'-typed static fields");
@@ -1860,8 +1888,8 @@ mixin) {
1860
1888
  // declaration is an ordinary OWN field (tsc guarantees every
1861
1889
  // instantiable subclass declares it and, under
1862
1890
  // strictPropertyInitialization, initializes it). Reads through
1863
- // ABSTRACT-typed receivers have no slot to read and keep a
1864
- // per-site fence.
1891
+ // ABSTRACT-typed receivers resolve the concrete instance's
1892
+ // property through checked class dispatch.
1865
1893
  if (modifiers?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword))
1866
1894
  continue;
1867
1895
  if (modifiers?.some((m) => m.kind === ts.SyntaxKind.AccessorKeyword)) {
@@ -1899,7 +1927,9 @@ mixin) {
1899
1927
  : null;
1900
1928
  if (!type ||
1901
1929
  type.kind === "void" ||
1902
- (type.kind === "dyn" && !isJsSourceFile(member.getSourceFile())))
1930
+ (type.kind === "dyn" &&
1931
+ !isJsSourceFile(member.getSourceFile()) &&
1932
+ !lowerer.classImplementedProtocol(inferred)))
1903
1933
  lowerer.badType(member, inferred);
1904
1934
  if (isJsSourceFile(member.getSourceFile())) {
1905
1935
  type = inheritedJsFieldType(lowerer, decl, fieldName, type);
@@ -2027,7 +2057,9 @@ mixin) {
2027
2057
  // Bundled JS declares fields without annotations before assigning
2028
2058
  // them in the constructor. Use the same native checked-dynamic
2029
2059
  // storage as implicit constructor-assigned JS fields.
2030
- if (type.kind === "dyn" && !isJsSourceFile(member.getSourceFile())) {
2060
+ if (type.kind === "dyn" &&
2061
+ !isJsSourceFile(member.getSourceFile()) &&
2062
+ !lowerer.classImplementedProtocol(lowerer.typeOf(member.name))) {
2031
2063
  lowerer.unsupported("SC1090", member.name, "'unknown'-typed class fields");
2032
2064
  }
2033
2065
  const undefinedInitializer = type.kind === "dyn" && !member.initializer ? locOf(member) : undefined;
@@ -2155,7 +2187,7 @@ mixin) {
2155
2187
  if (type.kind === "void")
2156
2188
  lowerer.badType(p.name, lowerer.typeOf(p.name));
2157
2189
  // The class-field dyn rule verbatim (KEEP NARROW).
2158
- if (type.kind === "dyn") {
2190
+ if (type.kind === "dyn" && !lowerer.classImplementedProtocol(lowerer.typeOf(p))) {
2159
2191
  lowerer.unsupported("SC1090", p.name, "'unknown'-typed class fields");
2160
2192
  }
2161
2193
  // `override x` (and any same-named inherited member) would
@@ -2207,15 +2239,12 @@ mixin) {
2207
2239
  if (findGenericMethodOn(lowerer, base, mName)) {
2208
2240
  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)`);
2209
2241
  }
2210
- // Abstract re-declarations keep the overridden ABI exactly,
2211
- // like any override (a concrete implementation below must
2212
- // agree with BOTH, which exactness makes one constraint).
2213
2242
  const overridden = lowerer.findMethodOn(base, mName);
2214
2243
  if (overridden &&
2215
2244
  (overridden.sig.params.length !== shapes.length ||
2216
2245
  !overridden.sig.params.every((p, i) => typeEquals(p.type, shapes[i].type)) ||
2217
- !typeEquals(overridden.sig.ret, ret))) {
2218
- lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter and return types must match the base declaration exactly)");
2246
+ !typeEquals(overridden.sig.ret, overrideReturnAbi(lowerer, ret, overridden.sig.ret, className, base)))) {
2247
+ 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)");
2219
2248
  }
2220
2249
  methods.set(mName, { params: shapes, ret, abstract: true });
2221
2250
  continue;
@@ -2336,11 +2365,12 @@ mixin) {
2336
2365
  if (refined)
2337
2366
  ft.ret = refined;
2338
2367
  }
2339
- // Overrides keep the EXACT overridden ABI signature. tsc's method
2368
+ // Overrides keep the inherited ABI signature. tsc's method
2340
2369
  // bivariance would let a narrowed parameter type through, and a
2341
2370
  // vtable-dispatched call could then hand the override a base
2342
2371
  // instance it reads out-of-bounds fields from — exactness keeps
2343
- // every slot sound (covariant returns can come later). Comparing
2372
+ // every parameter slot sound. Nominal covariant returns share the
2373
+ // base pointer ABI while retaining their declared result type. Comparing
2344
2374
  // ABI types only (not modes) is deliberate: call sites complete
2345
2375
  // against the STATIC receiver's shape, so `m(x?: number)` and
2346
2376
  // `m(x: number | undefined)` interchange soundly in overrides.
@@ -2402,7 +2432,7 @@ mixin) {
2402
2432
  member.asteriskToken === undefined &&
2403
2433
  (overridden.sig.params.length !== shapes.length ||
2404
2434
  !overridden.sig.params.every((p, i) => typeEquals(p.type, shapes[i].type)) ||
2405
- !typeEquals(overridden.sig.ret, ft.ret))) {
2435
+ !typeEquals(overridden.sig.ret, overrideReturnAbi(lowerer, ft.ret, overridden.sig.ret, className, base)))) {
2406
2436
  const fencedJsOverride = isJsSourceFile(member.getSourceFile()) &&
2407
2437
  overridden.declarer.decl !== null &&
2408
2438
  isJsSourceFile(overridden.declarer.decl.getSourceFile()) &&
@@ -2429,12 +2459,12 @@ mixin) {
2429
2459
  });
2430
2460
  methodEntryFences.set(mName, unsupportedDiag("SC1090", locOf(member.name), returnOnly
2431
2461
  ? `overriding method '${mName}' with a different return type (the native return type must match the base declaration exactly)`
2432
- : `overriding method '${mName}' with a different signature (the native parameter and return types must match the base declaration exactly)`));
2462
+ : `overriding method '${mName}' with a different signature (the native parameter types must match the base declaration exactly; returns may narrow to a subclass)`));
2433
2463
  shapes.splice(0, shapes.length, ...overridden.sig.params);
2434
2464
  ft.ret = overridden.sig.ret;
2435
2465
  }
2436
2466
  else {
2437
- lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter and return types must match the base declaration exactly)");
2467
+ 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)");
2438
2468
  }
2439
2469
  }
2440
2470
  const asyncMember = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) === true;
@@ -3015,6 +3045,7 @@ mixin) {
3015
3045
  ctorParams,
3016
3046
  ...(paramProps.length > 0 ? { paramProps } : {}),
3017
3047
  base,
3048
+ ...(genericBase ? { genericBase } : {}),
3018
3049
  ...(callableBase ? { callableBase } : {}),
3019
3050
  ...(factoryBaseExpression ? { factoryBaseExpression } : {}),
3020
3051
  subclasses: [],
@@ -3044,6 +3075,7 @@ mixin) {
3044
3075
  }
3045
3076
  if (inst) {
3046
3077
  info.genericInstance = {
3078
+ path: inst.path,
3047
3079
  family: inst.family,
3048
3080
  bindings: inst.bindings,
3049
3081
  typeArgsText: inst.typeArgsText,
@@ -3146,7 +3178,14 @@ mixin) {
3146
3178
  * arguments, the instance cap, an uncollected family) make the whole
3147
3179
  * reference unmappable — per-site diagnostics own the fence. */
3148
3180
  export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
3149
- const gci = lowerer.genericClassByDecl.get(decl);
3181
+ let gci = lowerer.genericClassByDecl.get(decl);
3182
+ if (!gci && ts.isClassDeclaration(decl)) {
3183
+ // A method signature can reference a generic class declared later in
3184
+ // the same module. Resolve its family now rather than freezing the
3185
+ // signature at the erased family layout for the rest of the build.
3186
+ lowerer.collectClassShape(decl);
3187
+ gci = lowerer.genericClassByDecl.get(decl);
3188
+ }
3150
3189
  if (!gci) {
3151
3190
  // The family never collected (a deferred/poisoned declaration): the
3152
3191
  // pre-generics answer — the class's own name, unregistered, so dead
@@ -3203,12 +3242,12 @@ export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
3203
3242
  lowerer.noteGenericClassInstanceDemand(existing.info);
3204
3243
  return existing.poisoned ? null : { kind: "object", className: existing.name };
3205
3244
  }
3206
- // The generic-fn cap, same rationale (polymorphic recursion through
3207
- // class fields would mint instances forever). mapType has no
3208
- // diagnostic channel — the family answer keeps the site compilable
3209
- // where the OBJECT itself is never touched; touched members fence.
3210
- if (gci.instances.size >= MAX_GENERIC_INSTANCES)
3211
- return familyT;
3245
+ // Recursive class fields and queued member bodies share the function
3246
+ // demand budget. Independent uses do not limit the family size.
3247
+ const path = extendInstantiationPath(lowerer.genericInstantiationPath, decl);
3248
+ if (!path) {
3249
+ lowerer.unsupported("SC1090", decl, `unbounded generic class instantiation ('${gci.baseName}' exceeded ${MAX_INSTANTIATION_RECURSION} recursive specializations on one demand path)`);
3250
+ }
3212
3251
  const ordinal = gci.instances.size;
3213
3252
  const name = `${gci.family.def.name}%${ordinal}`;
3214
3253
  const entry = { name, info: null };
@@ -3219,10 +3258,13 @@ export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
3219
3258
  const typeArgsText = `<${rendered.length > 80 ? rendered.slice(0, 77) + "..." : rendered}>`;
3220
3259
  const prevBindings = lowerer.typeParamBindings;
3221
3260
  const prevContext = lowerer.instantiationContext;
3261
+ const previousPath = lowerer.genericInstantiationPath;
3262
+ lowerer.genericInstantiationPath = path;
3222
3263
  lowerer.typeParamBindings = bindings;
3223
3264
  lowerer.instantiationContext = `instantiating class '${gci.baseName}' with ${typeArgsText}`;
3224
3265
  try {
3225
3266
  lowerer.collectClassShapeInner(decl, undefined, {
3267
+ path,
3226
3268
  family: gci.family,
3227
3269
  name,
3228
3270
  bindings,
@@ -3241,6 +3283,7 @@ export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
3241
3283
  finally {
3242
3284
  lowerer.typeParamBindings = prevBindings;
3243
3285
  lowerer.instantiationContext = prevContext;
3286
+ lowerer.genericInstantiationPath = previousPath;
3244
3287
  }
3245
3288
  const info = lowerer.classes.get(name);
3246
3289
  if (!info) {
@@ -3290,6 +3333,8 @@ function withInstanceBindings(lowerer, info, fn) {
3290
3333
  const prevBindings = lowerer.typeParamBindings;
3291
3334
  const prevContext = lowerer.instantiationContext;
3292
3335
  const prevSuppress = lowerer.suppressStats;
3336
+ const previousPath = lowerer.genericInstantiationPath;
3337
+ lowerer.genericInstantiationPath = gi.path;
3293
3338
  lowerer.typeParamBindings = gi.bindings;
3294
3339
  lowerer.instantiationContext = `instantiating class '${gi.family.generic?.baseName ?? info.def.jsName ?? ""}' with ${gi.typeArgsText}`;
3295
3340
  lowerer.suppressStats = prevSuppress || gi.ordinal > 0;
@@ -3300,6 +3345,7 @@ function withInstanceBindings(lowerer, info, fn) {
3300
3345
  lowerer.typeParamBindings = prevBindings;
3301
3346
  lowerer.instantiationContext = prevContext;
3302
3347
  lowerer.suppressStats = prevSuppress;
3348
+ lowerer.genericInstantiationPath = previousPath;
3303
3349
  }
3304
3350
  }
3305
3351
  /** The `%init` statements for one class's static readonly fields AND
@@ -3896,7 +3942,13 @@ export function lowerStaticFieldRead(lowerer, expr) {
3896
3942
  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)`);
3897
3943
  }
3898
3944
  if (found?.field !== undefined) {
3899
- return lowerer.maybeNarrow({ kind: "varRef", localId: found.field.globalId, type: found.field.type, loc }, expr);
3945
+ const value = {
3946
+ kind: "varRef",
3947
+ localId: found.field.globalId,
3948
+ type: found.field.type,
3949
+ loc,
3950
+ };
3951
+ return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
3900
3952
  }
3901
3953
  if (found) {
3902
3954
  return staticMethodValue(lowerer, found.declarer, expr.name.text, found.method, expr, loc);
@@ -4420,6 +4472,19 @@ export function lowerStaticMethodCall(lowerer, call, access) {
4420
4472
  if (info)
4421
4473
  return staticCallOn(lowerer, call, access, info, false);
4422
4474
  }
4475
+ // Namespace exports are immutable bindings to the same declaration as
4476
+ // named imports. Resolve them before asking for a constructor-value ABI:
4477
+ // a generic family has statics but no single constructor signature.
4478
+ if (ts.isPropertyAccessExpression(access.expression) && !access.expression.questionDotToken) {
4479
+ const member = nsMemberIdentOf(lowerer, access.expression);
4480
+ const symbol = member ? lowerer.resolveValueSymbol(member) : null;
4481
+ const info = symbol ? lowerer.classBySymbol.get(symbol) : undefined;
4482
+ if (info && info.classDecorators?.valueGlobalId === undefined) {
4483
+ if (symbol)
4484
+ fenceEarlyNsMemberRef(lowerer, access.expression, symbol);
4485
+ return staticCallOn(lowerer, call, access, info, false);
4486
+ }
4487
+ }
4423
4488
  // `module.exports.describe()` in a module whose whole export IS a
4424
4489
  // class expression: the receiver is exactly that class (the kept
4425
4490
  // export assignment pins it) — the direct-name rules apply.
@@ -4696,7 +4761,13 @@ export function lowerClassValueProperty(lowerer, expr) {
4696
4761
  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)`);
4697
4762
  }
4698
4763
  if (found.field !== undefined) {
4699
- return lowerer.maybeNarrow({ kind: "varRef", localId: found.field.globalId, type: found.field.type, loc }, expr);
4764
+ const value = {
4765
+ kind: "varRef",
4766
+ localId: found.field.globalId,
4767
+ type: found.field.type,
4768
+ loc,
4769
+ };
4770
+ return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
4700
4771
  }
4701
4772
  return staticMethodValue(lowerer, found.declarer, member, found.method, expr, loc);
4702
4773
  }
@@ -4714,6 +4785,20 @@ function abstractMemberSignature(lowerer, member) {
4714
4785
  ret: lowerer.declaredReturnType(member, member.name),
4715
4786
  };
4716
4787
  }
4788
+ /** A nominal return subtype uses the same owned pointer as the inherited
4789
+ * return slot. The current class is still being collected, so consult its
4790
+ * already collected base chain before the complete class graph is available. */
4791
+ function overrideReturnAbi(lowerer, declared, inherited, className, base) {
4792
+ if (declared.kind !== "object" || inherited.kind !== "object")
4793
+ return declared;
4794
+ if (lowerer.isSubclassOf(declared.className, inherited.className) ||
4795
+ (declared.className === className &&
4796
+ base !== null &&
4797
+ (base.def.name === inherited.className ||
4798
+ lowerer.isSubclassOf(base.def.name, inherited.className))))
4799
+ return inherited;
4800
+ return declared;
4801
+ }
4717
4802
  /** The nearest declaration of `name` at or above `info` — the method a
4718
4803
  * receiver of that static class runs when nothing below overrides it. */
4719
4804
  export function findMethodOn(lowerer, info, name) {
@@ -4726,9 +4811,15 @@ export function findMethodOn(lowerer, info, name) {
4726
4811
  }
4727
4812
  /** True when `sub` is a STRICT descendant of `sup` in the class graph. */
4728
4813
  export function isSubclassOf(lowerer, sub, sup) {
4729
- for (let c = lowerer.classes.get(sub)?.base ?? null; c; c = c.base) {
4730
- if (c.def.name === sup)
4814
+ if (sub === sup)
4815
+ return false;
4816
+ for (let c = lowerer.classes.get(sub); c; c = c.base ?? undefined) {
4817
+ if (c.def.name === sup && c.def.name !== sub)
4731
4818
  return true;
4819
+ for (let family = c.genericInstance?.family; family; family = family.base ?? undefined) {
4820
+ if (family.def.name === sup)
4821
+ return true;
4822
+ }
4732
4823
  }
4733
4824
  return false;
4734
4825
  }
@@ -4871,34 +4962,7 @@ export function collectInheritedJsFieldWrites(lowerer, files) {
4871
4962
  * hierarchy identifies the original declarations through aliases as well. */
4872
4963
  export function collectVirtualJsMethods(lowerer, files) {
4873
4964
  const families = [];
4874
- // Record named prototype accesses before collecting method signatures.
4875
- // Those slots need a callable ABI even when JavaScript would otherwise
4876
- // specialize each call independently.
4877
- for (const file of files)
4878
- ts.walkPreorder(file, (node) => {
4879
- if (!ts.isPropertyAccessExpression(node) && !ts.isElementAccessExpression(node))
4880
- return;
4881
- const name = ts.isPropertyAccessExpression(node)
4882
- ? node.name.text
4883
- : ts.isStringLiteralLike(node.argumentExpression)
4884
- ? node.argumentExpression.text
4885
- : null;
4886
- if (name === null)
4887
- return;
4888
- const prototype = ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === "prototype";
4889
- const assigned = ts.isBinaryExpression(node.parent) &&
4890
- node.parent.left === node &&
4891
- node.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken;
4892
- const symbol = !assigned
4893
- ? undefined
4894
- : ts.isPropertyAccessExpression(node)
4895
- ? lowerer.checker.getSymbolAtLocation(node.name)
4896
- : lowerer.checker.getPropertyOfType(lowerer.typeOf(node.expression), name);
4897
- if (prototype ||
4898
- (symbol && lowerer.checker.declarationsOf(symbol).some(ts.isMethodDeclaration))) {
4899
- lowerer.prototypeMethodAccesses.set(name, node);
4900
- }
4901
- });
4965
+ collectClassMethodMutations(lowerer, files);
4902
4966
  const visit = (node) => {
4903
4967
  if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
4904
4968
  const accessors = node.members.filter((member) => (ts.isGetAccessorDeclaration(member) || ts.isSetAccessorDeclaration(member)) &&
@@ -5065,7 +5129,7 @@ export function exactInstanceClassOf(lowerer, expr) {
5065
5129
  * Const + direct `new` only — a reassignable binding or a produced
5066
5130
  * value keeps today's record story and its fences. */
5067
5131
  export function genericIfaceBindingKeepsClass(lowerer, decl, declaredType) {
5068
- if (declaredType.kind !== "record")
5132
+ if (declaredType.kind !== "record" && declaredType.kind !== "dyn")
5069
5133
  return false;
5070
5134
  if (!ts.isIdentifier(decl.name) || decl.initializer === undefined || decl.type === undefined)
5071
5135
  return false;
@@ -5076,13 +5140,16 @@ export function genericIfaceBindingKeepsClass(lowerer, decl, declaredType) {
5076
5140
  init = init.expression;
5077
5141
  if (!ts.isNewExpression(init))
5078
5142
  return false;
5079
- const shape = lowerer.shapes.get(declaredType.shapeId);
5080
- if (!shape || shape.fields.length > 0 || shape.indexValue !== undefined || shape.tuple === true)
5081
- return false;
5082
5143
  const annT = lowerer.typeOf(decl.name);
5083
5144
  const props = lowerer.checker.getPropertiesOfType(annT);
5084
5145
  if (props.length === 0)
5085
5146
  return false;
5147
+ if (declaredType.kind === "dyn")
5148
+ return (lowerer.classImplementedProtocol(annT) &&
5149
+ props.some((property) => isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(property), lowerer.checker)));
5150
+ const shape = lowerer.shapes.get(declaredType.shapeId);
5151
+ if (!shape || shape.fields.length > 0 || shape.indexValue !== undefined || shape.tuple === true)
5152
+ return false;
5086
5153
  return props.every((p) => isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(p), lowerer.checker));
5087
5154
  }
5088
5155
  /** `recv.m<T>(args)` — a GENERIC method call, dispatched STATICALLY: the
@@ -6599,6 +6666,9 @@ function assignedThisFieldType(lowerer, expr) {
6599
6666
  }
6600
6667
  export function lowerNew(lowerer, expr) {
6601
6668
  const loc = locOf(expr);
6669
+ const worker = lowerWorkerNew(lowerer, expr);
6670
+ if (worker)
6671
+ return worker;
6602
6672
  let intlConstructor = expr.expression;
6603
6673
  if (ts.isIdentifier(intlConstructor)) {
6604
6674
  const symbol = lowerer.resolveValueSymbol(intlConstructor);
@@ -7205,7 +7275,7 @@ export function lowerNew(lowerer, expr) {
7205
7275
  if (targs[1]) {
7206
7276
  lowerer.unsupported("SC1090", expr, `Map values of type '${lowerer.checker.typeToString(targs[1])}' ` +
7207
7277
  `(Map values must be number, string, boolean, records, class instances, ` +
7208
- `arrays, promises, Maps, Sets, or unions of those — not functions, 'unknown', or 'any')`);
7278
+ `typed arrays, arrays, promises, Maps, Sets, or supported unions and checked values)`);
7209
7279
  }
7210
7280
  lowerer.badType(expr, tsType);
7211
7281
  }