@scriptc/compiler 0.4.7 → 0.4.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 (776) hide show
  1. package/ambient/node-fallback/child_process.d.ts +71 -22
  2. package/ambient/node-fallback/crypto.d.ts +15 -7
  3. package/ambient/node-fallback/events.d.ts +23 -5
  4. package/ambient/node-fallback/fs.d.ts +3 -2
  5. package/ambient/node-fallback/http.d.ts +23 -17
  6. package/ambient/node-fallback/https.d.ts +5 -2
  7. package/ambient/node-fallback/net.d.ts +6 -0
  8. package/ambient/node-fallback/os.d.ts +11 -1
  9. package/ambient/node-fallback/path-posix.d.ts +6 -0
  10. package/ambient/node-fallback/path-win32.d.ts +5 -0
  11. package/ambient/node-fallback/path.d.ts +2 -0
  12. package/ambient/node-fallback/zlib.d.ts +31 -2
  13. package/ambient/scriptc-node-fallback.d.ts +37 -7
  14. package/ambient/scriptc.d.ts +7 -2
  15. package/dist/backend/executable-features.js +11 -3
  16. package/dist/backend/executable-features.js.map +1 -1
  17. package/dist/backend/library-pack.d.ts +6 -0
  18. package/dist/backend/library-pack.js +17 -6
  19. package/dist/backend/library-pack.js.map +1 -1
  20. package/dist/backend/library-pack.test.d.ts +1 -0
  21. package/dist/backend/library-pack.test.js +28 -0
  22. package/dist/backend/library-pack.test.js.map +1 -0
  23. package/dist/backend/linker.d.ts +9 -2
  24. package/dist/backend/linker.js +190 -32
  25. package/dist/backend/linker.js.map +1 -1
  26. package/dist/backend/lld.d.ts +8 -4
  27. package/dist/backend/lld.js +19 -13
  28. package/dist/backend/lld.js.map +1 -1
  29. package/dist/backend/lld.test.js +3 -1
  30. package/dist/backend/lld.test.js.map +1 -1
  31. package/dist/backend/llvm/alloc.d.ts +15 -2
  32. package/dist/backend/llvm/alloc.js +172 -36
  33. package/dist/backend/llvm/alloc.js.map +1 -1
  34. package/dist/backend/llvm/alloc.test.js +69 -1
  35. package/dist/backend/llvm/alloc.test.js.map +1 -1
  36. package/dist/backend/llvm/arenas.d.ts +17 -4
  37. package/dist/backend/llvm/arenas.js +105 -10
  38. package/dist/backend/llvm/arenas.js.map +1 -1
  39. package/dist/backend/llvm/arenas.test.js +229 -0
  40. package/dist/backend/llvm/arenas.test.js.map +1 -1
  41. package/dist/backend/llvm/bytes-alias.js +10 -1
  42. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  43. package/dist/backend/llvm/bytes-headers.js +6 -0
  44. package/dist/backend/llvm/bytes-headers.js.map +1 -1
  45. package/dist/backend/llvm/bytes-loop-versions.test.js +25 -0
  46. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  47. package/dist/backend/llvm/call-lifetimes.js +10 -0
  48. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  49. package/dist/backend/llvm/classes.d.ts +16 -9
  50. package/dist/backend/llvm/classes.js +142 -37
  51. package/dist/backend/llvm/classes.js.map +1 -1
  52. package/dist/backend/llvm/classes.test.js +42 -0
  53. package/dist/backend/llvm/classes.test.js.map +1 -1
  54. package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
  55. package/dist/backend/llvm/cpu-dispatch.js +31 -7
  56. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  57. package/dist/backend/llvm/dyn.d.ts +12 -3
  58. package/dist/backend/llvm/dyn.js +31 -7
  59. package/dist/backend/llvm/dyn.js.map +1 -1
  60. package/dist/backend/llvm/emit-function.js +67 -4
  61. package/dist/backend/llvm/emit-function.js.map +1 -1
  62. package/dist/backend/llvm/emit-module.js +90 -39
  63. package/dist/backend/llvm/emit-module.js.map +1 -1
  64. package/dist/backend/llvm/emit-module.test.d.ts +1 -0
  65. package/dist/backend/llvm/emit-module.test.js +52 -0
  66. package/dist/backend/llvm/emit-module.test.js.map +1 -0
  67. package/dist/backend/llvm/emit-statements.js +99 -15
  68. package/dist/backend/llvm/emit-statements.js.map +1 -1
  69. package/dist/backend/llvm/emitter.d.ts +113 -8
  70. package/dist/backend/llvm/emitter.js +438 -67
  71. package/dist/backend/llvm/emitter.js.map +1 -1
  72. package/dist/backend/llvm/emitter.test.js +31 -3
  73. package/dist/backend/llvm/emitter.test.js.map +1 -1
  74. package/dist/backend/llvm/expr-async.js +19 -1
  75. package/dist/backend/llvm/expr-async.js.map +1 -1
  76. package/dist/backend/llvm/expr-bytes.js +16 -1
  77. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  78. package/dist/backend/llvm/expr-calls.js +18 -2
  79. package/dist/backend/llvm/expr-calls.js.map +1 -1
  80. package/dist/backend/llvm/expr-dynamic.js +31 -10
  81. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  82. package/dist/backend/llvm/expr-primitives.js +31 -3
  83. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  84. package/dist/backend/llvm/expr-records.d.ts +1 -1
  85. package/dist/backend/llvm/expr-records.js +124 -56
  86. package/dist/backend/llvm/expr-records.js.map +1 -1
  87. package/dist/backend/llvm/expr-stream-bridges.js +17 -0
  88. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  89. package/dist/backend/llvm/js-groups.d.ts +21 -0
  90. package/dist/backend/llvm/js-groups.js +277 -0
  91. package/dist/backend/llvm/js-groups.js.map +1 -0
  92. package/dist/backend/llvm/js-ic.d.ts +19 -1
  93. package/dist/backend/llvm/js-ic.js +96 -23
  94. package/dist/backend/llvm/js-ic.js.map +1 -1
  95. package/dist/backend/llvm/lib-dispatch.js +132 -1
  96. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  97. package/dist/backend/llvm/lib-network.js +33 -6
  98. package/dist/backend/llvm/lib-network.js.map +1 -1
  99. package/dist/backend/llvm/lib-process.js +44 -3
  100. package/dist/backend/llvm/lib-process.js.map +1 -1
  101. package/dist/backend/llvm/lib-shared.js +69 -2
  102. package/dist/backend/llvm/lib-shared.js.map +1 -1
  103. package/dist/backend/llvm/local-union-storage.test.js +32 -0
  104. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  105. package/dist/backend/llvm/loop-state.js +7 -2
  106. package/dist/backend/llvm/loop-state.js.map +1 -1
  107. package/dist/backend/llvm/map-entry-fusion.d.ts +8 -0
  108. package/dist/backend/llvm/map-entry-fusion.js +3 -3
  109. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  110. package/dist/backend/llvm/map-number-lookup.test.js +6 -6
  111. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  112. package/dist/backend/llvm/nullable-unions.js +7 -6
  113. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  114. package/dist/backend/llvm/nullable-unions.test.js +4 -1
  115. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  116. package/dist/backend/llvm/receivers.js +3 -0
  117. package/dist/backend/llvm/receivers.js.map +1 -1
  118. package/dist/backend/llvm/record-entry-fusion.d.ts +32 -0
  119. package/dist/backend/llvm/record-entry-fusion.js +217 -0
  120. package/dist/backend/llvm/record-entry-fusion.js.map +1 -0
  121. package/dist/backend/llvm/record-results.d.ts +5 -2
  122. package/dist/backend/llvm/record-results.js +13 -12
  123. package/dist/backend/llvm/record-results.js.map +1 -1
  124. package/dist/backend/llvm/record-views.js +12 -6
  125. package/dist/backend/llvm/record-views.js.map +1 -1
  126. package/dist/backend/llvm/reference-effects.js +1 -0
  127. package/dist/backend/llvm/reference-effects.js.map +1 -1
  128. package/dist/backend/llvm/reference-writes.js +3 -0
  129. package/dist/backend/llvm/reference-writes.js.map +1 -1
  130. package/dist/backend/llvm/region-ir.js +1 -0
  131. package/dist/backend/llvm/region-ir.js.map +1 -1
  132. package/dist/backend/llvm/region-sites.d.ts +18 -0
  133. package/dist/backend/llvm/region-sites.js +79 -1
  134. package/dist/backend/llvm/region-sites.js.map +1 -1
  135. package/dist/backend/llvm/runtime-registries.test.js +53 -6
  136. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  137. package/dist/backend/llvm/serialized-ir-emission.test.js +3 -1
  138. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  139. package/dist/backend/llvm/shapes.d.ts +33 -3
  140. package/dist/backend/llvm/shapes.js +183 -13
  141. package/dist/backend/llvm/shapes.js.map +1 -1
  142. package/dist/backend/llvm/stack-objects.d.ts +1 -2
  143. package/dist/backend/llvm/stack-objects.js +8 -5
  144. package/dist/backend/llvm/stack-objects.js.map +1 -1
  145. package/dist/backend/llvm/walkers.d.ts +12 -0
  146. package/dist/backend/llvm/walkers.js +46 -2
  147. package/dist/backend/llvm/walkers.js.map +1 -1
  148. package/dist/backend/may-throw.js +12 -2
  149. package/dist/backend/may-throw.js.map +1 -1
  150. package/dist/backend/may-throw.test.js +13 -0
  151. package/dist/backend/may-throw.test.js.map +1 -1
  152. package/dist/backend/native/contracts.d.ts +48 -8
  153. package/dist/backend/native/executable.js +55 -13
  154. package/dist/backend/native/executable.js.map +1 -1
  155. package/dist/backend/native/helper-identity-record.d.ts +11 -0
  156. package/dist/backend/native/helper-identity-record.js +76 -0
  157. package/dist/backend/native/helper-identity-record.js.map +1 -0
  158. package/dist/backend/native/helper-identity-record.test.d.ts +1 -0
  159. package/dist/backend/native/helper-identity-record.test.js +101 -0
  160. package/dist/backend/native/helper-identity-record.test.js.map +1 -0
  161. package/dist/backend/native/library.js +9 -1
  162. package/dist/backend/native/library.js.map +1 -1
  163. package/dist/backend/native/runtime-inputs.js +4 -1
  164. package/dist/backend/native/runtime-inputs.js.map +1 -1
  165. package/dist/backend/native/vendor.d.ts +1 -1
  166. package/dist/backend/native/vendor.js +1 -1
  167. package/dist/backend/native/vendor.js.map +1 -1
  168. package/dist/backend/native-codegen-core.d.ts +13 -10
  169. package/dist/backend/native-codegen-core.js +26 -13
  170. package/dist/backend/native-codegen-core.js.map +1 -1
  171. package/dist/backend/native-codegen.js +27 -8
  172. package/dist/backend/native-codegen.js.map +1 -1
  173. package/dist/backend/native-codegen.test.js +110 -14
  174. package/dist/backend/native-codegen.test.js.map +1 -1
  175. package/dist/backend/native-link-info-core.d.ts +37 -8
  176. package/dist/backend/native-link-info-core.js.map +1 -1
  177. package/dist/backend/runtime-pack-core.d.ts +17 -2
  178. package/dist/backend/runtime-pack-core.js +18 -3
  179. package/dist/backend/runtime-pack-core.js.map +1 -1
  180. package/dist/backend/runtime-pack-targets.test.js +1 -1
  181. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  182. package/dist/backend/runtime-pack.test.js +211 -2
  183. package/dist/backend/runtime-pack.test.js.map +1 -1
  184. package/dist/backend/tree-classes.d.ts +42 -0
  185. package/dist/backend/tree-classes.js +723 -0
  186. package/dist/backend/tree-classes.js.map +1 -0
  187. package/dist/backend/tree-classes.test.d.ts +1 -0
  188. package/dist/backend/tree-classes.test.js +338 -0
  189. package/dist/backend/tree-classes.test.js.map +1 -0
  190. package/dist/backend/vendor-archives.d.ts +5 -1
  191. package/dist/backend/vendor-archives.js +51 -7
  192. package/dist/backend/vendor-archives.js.map +1 -1
  193. package/dist/backend/vendor-inputs.d.ts +25 -4
  194. package/dist/backend/vendor-inputs.js +68 -4
  195. package/dist/backend/vendor-inputs.js.map +1 -1
  196. package/dist/backend/vendor-inputs.test.js +35 -1
  197. package/dist/backend/vendor-inputs.test.js.map +1 -1
  198. package/dist/backend/warm-cache.js +1 -1
  199. package/dist/backend/warm-cache.js.map +1 -1
  200. package/dist/compat/fetch-profile.js +2 -2
  201. package/dist/coverage/report.js +47 -0
  202. package/dist/coverage/report.js.map +1 -1
  203. package/dist/coverage/surface-manifest.js +1 -1
  204. package/dist/diagnostics/codes.d.ts +8 -0
  205. package/dist/diagnostics/codes.js +8 -0
  206. package/dist/diagnostics/codes.js.map +1 -1
  207. package/dist/diagnostics/diagnostic.d.ts +27 -9
  208. package/dist/diagnostics/diagnostic.js +60 -19
  209. package/dist/diagnostics/diagnostic.js.map +1 -1
  210. package/dist/diagnostics/envelope.d.ts +18 -0
  211. package/dist/diagnostics/envelope.js.map +1 -1
  212. package/dist/executable/executable-cache.d.ts +21 -2
  213. package/dist/executable/executable-cache.js +21 -1
  214. package/dist/executable/executable-cache.js.map +1 -1
  215. package/dist/executable/executable-cache.test.js +123 -1
  216. package/dist/executable/executable-cache.test.js.map +1 -1
  217. package/dist/executable/prepare.js +199 -248
  218. package/dist/executable/prepare.js.map +1 -1
  219. package/dist/frontend/analysis.js +200 -18
  220. package/dist/frontend/analysis.js.map +1 -1
  221. package/dist/frontend/builtin-modules.d.ts +4 -0
  222. package/dist/frontend/builtin-modules.js +10 -0
  223. package/dist/frontend/builtin-modules.js.map +1 -1
  224. package/dist/frontend/early-errors.d.ts +12 -2
  225. package/dist/frontend/early-errors.js +535 -4
  226. package/dist/frontend/early-errors.js.map +1 -1
  227. package/dist/frontend/early-errors.test.js +165 -0
  228. package/dist/frontend/early-errors.test.js.map +1 -1
  229. package/dist/frontend/inferred-js-diagnostics.test.js +65 -0
  230. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  231. package/dist/frontend/jsx-opinion-sites.test.d.ts +1 -0
  232. package/dist/frontend/jsx-opinion-sites.test.js +86 -0
  233. package/dist/frontend/jsx-opinion-sites.test.js.map +1 -0
  234. package/dist/frontend/lib-exports.d.ts +23 -4
  235. package/dist/frontend/lib-exports.js +98 -26
  236. package/dist/frontend/lib-exports.js.map +1 -1
  237. package/dist/frontend/lowering/binding-analysis.js +21 -3
  238. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  239. package/dist/frontend/lowering/buffers.d.ts +8 -0
  240. package/dist/frontend/lowering/buffers.js +43 -0
  241. package/dist/frontend/lowering/buffers.js.map +1 -0
  242. package/dist/frontend/lowering/builtin-calls.js +4 -0
  243. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  244. package/dist/frontend/lowering/builtin-namespaces.d.ts +3 -2
  245. package/dist/frontend/lowering/builtin-namespaces.js +24 -3
  246. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  247. package/dist/frontend/lowering/builtin-statics.d.ts +24 -0
  248. package/dist/frontend/lowering/builtin-statics.js +407 -0
  249. package/dist/frontend/lowering/builtin-statics.js.map +1 -0
  250. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  251. package/dist/frontend/lowering/builtins/arguments.js +12 -0
  252. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  253. package/dist/frontend/lowering/builtins/atomics.d.ts +6 -1
  254. package/dist/frontend/lowering/builtins/atomics.js +87 -1
  255. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  256. package/dist/frontend/lowering/builtins/child-process-methods.js +2 -2
  257. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/child-process-sync.d.ts +13 -0
  259. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -13
  260. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  261. package/dist/frontend/lowering/builtins/child-process.d.ts +10 -4
  262. package/dist/frontend/lowering/builtins/child-process.js +560 -27
  263. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/compression.d.ts +2 -2
  265. package/dist/frontend/lowering/builtins/compression.js +41 -21
  266. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/constants.js +7 -2
  268. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  270. package/dist/frontend/lowering/builtins/filesystem-calls.js +28 -2
  271. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/json.js +4 -0
  273. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  274. package/dist/frontend/lowering/builtins/module-calls.js +3 -1
  275. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/numbers.d.ts +4 -1
  277. package/dist/frontend/lowering/builtins/numbers.js +10 -2
  278. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  279. package/dist/frontend/lowering/builtins/operating-system.d.ts +6 -3
  280. package/dist/frontend/lowering/builtins/operating-system.js +96 -16
  281. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  283. package/dist/frontend/lowering/builtins/process.js +103 -8
  284. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  285. package/dist/frontend/lowering/builtins/promises.js +169 -8
  286. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/properties.js +6 -2
  288. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  289. package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
  290. package/dist/frontend/lowering/builtins/readline.js +180 -36
  291. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  292. package/dist/frontend/lowering/builtins/url.js +35 -12
  293. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  294. package/dist/frontend/lowering/builtins/webassembly.js +2 -0
  295. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  296. package/dist/frontend/lowering/call-arguments.d.ts +10 -0
  297. package/dist/frontend/lowering/call-arguments.js +37 -2
  298. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  299. package/dist/frontend/lowering/call-signatures.d.ts +10 -0
  300. package/dist/frontend/lowering/call-signatures.js +103 -0
  301. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  302. package/dist/frontend/lowering/class-construction.d.ts +14 -2
  303. package/dist/frontend/lowering/class-construction.js +99 -5
  304. package/dist/frontend/lowering/class-construction.js.map +1 -1
  305. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +9 -0
  306. package/dist/frontend/lowering/class-dynamic-dispatch.js +1283 -1030
  307. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  308. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +158 -0
  309. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  310. package/dist/frontend/lowering/class-prototypes.js +20 -15
  311. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  312. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  313. package/dist/frontend/lowering/class-runtime-statics.js +20 -1
  314. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  315. package/dist/frontend/lowering/class-unions.js +21 -4
  316. package/dist/frontend/lowering/class-unions.js.map +1 -1
  317. package/dist/frontend/lowering/coercions/function-adapters.js +9 -0
  318. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  319. package/dist/frontend/lowering/coercions/state.d.ts +8 -0
  320. package/dist/frontend/lowering/coercions/state.js +17 -0
  321. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  322. package/dist/frontend/lowering/coercions/structural-plans.js +20 -5
  323. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  324. package/dist/frontend/lowering/coercions/structural.js +10 -1
  325. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  326. package/dist/frontend/lowering/coercions/unions.d.ts +2 -1
  327. package/dist/frontend/lowering/coercions/unions.js +54 -10
  328. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  329. package/dist/frontend/lowering/constructor-returns.d.ts +23 -2
  330. package/dist/frontend/lowering/constructor-returns.js +284 -58
  331. package/dist/frontend/lowering/constructor-returns.js.map +1 -1
  332. package/dist/frontend/lowering/containers/array-callbacks.js +156 -62
  333. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  334. package/dist/frontend/lowering/containers/array-construction.js +21 -3
  335. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  336. package/dist/frontend/lowering/containers/array-from-async.js +139 -3
  337. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  338. package/dist/frontend/lowering/containers/array-iteration.d.ts +14 -4
  339. package/dist/frontend/lowering/containers/array-iteration.js +24 -7
  340. package/dist/frontend/lowering/containers/array-iteration.js.map +1 -1
  341. package/dist/frontend/lowering/containers/array-methods.js +14 -11
  342. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  343. package/dist/frontend/lowering/containers/bytes.d.ts +6 -0
  344. package/dist/frontend/lowering/containers/bytes.js +446 -86
  345. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  346. package/dist/frontend/lowering/containers/callback-arguments.d.ts +5 -0
  347. package/dist/frontend/lowering/containers/callback-arguments.js +21 -12
  348. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  349. package/dist/frontend/lowering/containers/collection-grouping.js +421 -2
  350. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  351. package/dist/frontend/lowering/containers/collection-methods.js +52 -17
  352. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  353. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +23 -0
  354. package/dist/frontend/lowering/containers/iterator-helpers.js +176 -10
  355. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  356. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +5 -2
  357. package/dist/frontend/lowering/containers/string-and-regexp.js +45 -11
  358. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  359. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  360. package/dist/frontend/lowering/crypto-tables.js +5 -5
  361. package/dist/frontend/lowering/dispatch-sites.js +3 -0
  362. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  363. package/dist/frontend/lowering/divergences.d.ts +40 -0
  364. package/dist/frontend/lowering/divergences.js +239 -20
  365. package/dist/frontend/lowering/divergences.js.map +1 -1
  366. package/dist/frontend/lowering/effect-free.d.ts +12 -0
  367. package/dist/frontend/lowering/effect-free.js +44 -0
  368. package/dist/frontend/lowering/effect-free.js.map +1 -0
  369. package/dist/frontend/lowering/expressions/array-literals.d.ts +10 -0
  370. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  371. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  372. package/dist/frontend/lowering/expressions/binary.js +115 -5
  373. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  374. package/dist/frontend/lowering/expressions/element-access.js +151 -7
  375. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  376. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +15 -0
  377. package/dist/frontend/lowering/expressions/hosted-narrowing.js +54 -1
  378. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  379. package/dist/frontend/lowering/expressions/identifiers.js +31 -2
  380. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  381. package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
  382. package/dist/frontend/lowering/expressions/narrowing.js +175 -22
  383. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  384. package/dist/frontend/lowering/expressions/object-literals.js +173 -11
  385. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  386. package/dist/frontend/lowering/expressions/optional-chains.js +5 -1
  387. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  388. package/dist/frontend/lowering/expressions/property-access.d.ts +8 -0
  389. package/dist/frontend/lowering/expressions/property-access.js +379 -109
  390. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  391. package/dist/frontend/lowering/expressions/relational.js +237 -7
  392. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  393. package/dist/frontend/lowering/expressions/typeof.js +8 -0
  394. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  395. package/dist/frontend/lowering/expressions/union-fields.d.ts +20 -1
  396. package/dist/frontend/lowering/expressions/union-fields.js +103 -13
  397. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  398. package/dist/frontend/lowering/expressions/updates.js +74 -55
  399. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  400. package/dist/frontend/lowering/function-returns.js +37 -10
  401. package/dist/frontend/lowering/function-returns.js.map +1 -1
  402. package/dist/frontend/lowering/general-streams.js +5 -0
  403. package/dist/frontend/lowering/general-streams.js.map +1 -1
  404. package/dist/frontend/lowering/generator-delegation.d.ts +15 -7
  405. package/dist/frontend/lowering/generator-delegation.js +301 -118
  406. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  407. package/dist/frontend/lowering/generic-functions.d.ts +27 -1
  408. package/dist/frontend/lowering/generic-functions.js +432 -18
  409. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  410. package/dist/frontend/lowering/global-function-values.d.ts +25 -0
  411. package/dist/frontend/lowering/global-function-values.js +193 -0
  412. package/dist/frontend/lowering/global-function-values.js.map +1 -0
  413. package/dist/frontend/lowering/global-values.d.ts +6 -4
  414. package/dist/frontend/lowering/global-values.js +24 -10
  415. package/dist/frontend/lowering/global-values.js.map +1 -1
  416. package/dist/frontend/lowering/host-global-values.d.ts +31 -0
  417. package/dist/frontend/lowering/host-global-values.js +121 -0
  418. package/dist/frontend/lowering/host-global-values.js.map +1 -0
  419. package/dist/frontend/lowering/host-globals.d.ts +74 -0
  420. package/dist/frontend/lowering/host-globals.js +344 -0
  421. package/dist/frontend/lowering/host-globals.js.map +1 -0
  422. package/dist/frontend/lowering/http2-constants.js +1 -1
  423. package/dist/frontend/lowering/iterator-adapters.js +46 -17
  424. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  425. package/dist/frontend/lowering/iterator-prototype.d.ts +30 -0
  426. package/dist/frontend/lowering/iterator-prototype.js +160 -0
  427. package/dist/frontend/lowering/iterator-prototype.js.map +1 -0
  428. package/dist/frontend/lowering/key-order-witness.js +43 -22
  429. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  430. package/dist/frontend/lowering/key-order-witness.test.js +1 -0
  431. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  432. package/dist/frontend/lowering/lib-boundary.js +11 -3
  433. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  434. package/dist/frontend/lowering/lower-assert.js +30 -15
  435. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  436. package/dist/frontend/lowering/lower-async-iteration.d.ts +11 -0
  437. package/dist/frontend/lowering/lower-async-iteration.js +15 -0
  438. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  439. package/dist/frontend/lowering/lower-builtin-values.js +11 -1
  440. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  441. package/dist/frontend/lowering/lower-calls.d.ts +25 -0
  442. package/dist/frontend/lowering/lower-calls.js +929 -227
  443. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  444. package/dist/frontend/lowering/lower-calls.test.js +59 -16
  445. package/dist/frontend/lowering/lower-calls.test.js.map +1 -1
  446. package/dist/frontend/lowering/lower-classes.d.ts +20 -0
  447. package/dist/frontend/lowering/lower-classes.js +468 -44
  448. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  449. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -2
  450. package/dist/frontend/lowering/lower-event-emitter.js +253 -83
  451. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  452. package/dist/frontend/lowering/lower-exprs.d.ts +1 -1
  453. package/dist/frontend/lowering/lower-exprs.js +71 -20
  454. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  455. package/dist/frontend/lowering/lower-functions.js +25 -6
  456. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  457. package/dist/frontend/lowering/lower-generators.js +57 -10
  458. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  459. package/dist/frontend/lowering/lower-global-value.d.ts +6 -0
  460. package/dist/frontend/lowering/lower-global-value.js +14 -5
  461. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  462. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  463. package/dist/frontend/lowering/lower-inspect.js +638 -64
  464. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  465. package/dist/frontend/lowering/lower-modules.js +48 -2
  466. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  467. package/dist/frontend/lowering/lower-namespaces.js +18 -0
  468. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  469. package/dist/frontend/lowering/lower-node-island.js +16 -6
  470. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  471. package/dist/frontend/lowering/lower-server.js +303 -87
  472. package/dist/frontend/lowering/lower-server.js.map +1 -1
  473. package/dist/frontend/lowering/lower-stdlib.js +45 -0
  474. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  475. package/dist/frontend/lowering/lower-stmts.d.ts +14 -11
  476. package/dist/frontend/lowering/lower-stmts.js +270 -52
  477. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  478. package/dist/frontend/lowering/lower-timers.js +110 -27
  479. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  480. package/dist/frontend/lowering/lower-url.js +6 -3
  481. package/dist/frontend/lowering/lower-url.js.map +1 -1
  482. package/dist/frontend/lowering/lowerer.d.ts +227 -21
  483. package/dist/frontend/lowering/lowerer.js +651 -92
  484. package/dist/frontend/lowering/lowerer.js.map +1 -1
  485. package/dist/frontend/lowering/lowerer.test.js +18 -0
  486. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  487. package/dist/frontend/lowering/lowering-facts.d.ts +110 -0
  488. package/dist/frontend/lowering/lowering-facts.js +323 -0
  489. package/dist/frontend/lowering/lowering-facts.js.map +1 -0
  490. package/dist/frontend/lowering/lowering-facts.test.d.ts +1 -0
  491. package/dist/frontend/lowering/lowering-facts.test.js +100 -0
  492. package/dist/frontend/lowering/lowering-facts.test.js.map +1 -0
  493. package/dist/frontend/lowering/nan-coded-reads.d.ts +27 -4
  494. package/dist/frontend/lowering/nan-coded-reads.js +112 -9
  495. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  496. package/dist/frontend/lowering/optional-arguments.d.ts +4 -0
  497. package/dist/frontend/lowering/optional-arguments.js +26 -2
  498. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  499. package/dist/frontend/lowering/partial-assertions.d.ts +0 -3
  500. package/dist/frontend/lowering/partial-assertions.js +9 -15
  501. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  502. package/dist/frontend/lowering/primitive-throws.d.ts +100 -0
  503. package/dist/frontend/lowering/primitive-throws.js +241 -0
  504. package/dist/frontend/lowering/primitive-throws.js.map +1 -0
  505. package/dist/frontend/lowering/primitive-wrappers.js +1 -0
  506. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  507. package/dist/frontend/lowering/record-inherited.d.ts +17 -1
  508. package/dist/frontend/lowering/record-inherited.js +16 -2
  509. package/dist/frontend/lowering/record-inherited.js.map +1 -1
  510. package/dist/frontend/lowering/record-links.d.ts +73 -0
  511. package/dist/frontend/lowering/record-links.js +797 -0
  512. package/dist/frontend/lowering/record-links.js.map +1 -0
  513. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +27 -7
  514. package/dist/frontend/lowering/runtime-optional-provenance.js +25 -11
  515. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  516. package/dist/frontend/lowering/runtime-optional-report.d.ts +40 -0
  517. package/dist/frontend/lowering/runtime-optional-report.js +300 -0
  518. package/dist/frontend/lowering/runtime-optional-report.js.map +1 -0
  519. package/dist/frontend/lowering/scoped-type-memo.test.d.ts +1 -0
  520. package/dist/frontend/lowering/scoped-type-memo.test.js +86 -0
  521. package/dist/frontend/lowering/scoped-type-memo.test.js.map +1 -0
  522. package/dist/frontend/lowering/static-typeof.d.ts +3 -1
  523. package/dist/frontend/lowering/static-typeof.js +6 -1
  524. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  525. package/dist/frontend/lowering/strict-mode.d.ts +1 -5
  526. package/dist/frontend/lowering/strict-mode.js +4 -30
  527. package/dist/frontend/lowering/strict-mode.js.map +1 -1
  528. package/dist/frontend/lowering/structural-instances.d.ts +7 -0
  529. package/dist/frontend/lowering/structural-instances.js +23 -0
  530. package/dist/frontend/lowering/structural-instances.js.map +1 -1
  531. package/dist/frontend/lowering/surfaces.d.ts +15 -1
  532. package/dist/frontend/lowering/surfaces.js +78 -10
  533. package/dist/frontend/lowering/surfaces.js.map +1 -1
  534. package/dist/frontend/lowering/union-retag.d.ts +13 -1
  535. package/dist/frontend/lowering/union-retag.js +55 -1
  536. package/dist/frontend/lowering/union-retag.js.map +1 -1
  537. package/dist/frontend/lowering/union-retag.test.js +51 -0
  538. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  539. package/dist/frontend/lowering/unit-journal.d.ts +8 -0
  540. package/dist/frontend/lowering/unit-journal.js +14 -0
  541. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  542. package/dist/frontend/lowering/unit-journal.test.js +36 -1
  543. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  544. package/dist/frontend/lowering/zlib-constants.js +3 -2
  545. package/dist/frontend/lowering/zlib-constants.js.map +1 -1
  546. package/dist/frontend/npm-static.js +78 -9
  547. package/dist/frontend/npm-static.js.map +1 -1
  548. package/dist/frontend/npm-static.test.js +95 -2
  549. package/dist/frontend/npm-static.test.js.map +1 -1
  550. package/dist/frontend/pipeline.d.ts +5 -4
  551. package/dist/frontend/pipeline.js +94 -31
  552. package/dist/frontend/pipeline.js.map +1 -1
  553. package/dist/frontend/pipeline.test.js +68 -11
  554. package/dist/frontend/pipeline.test.js.map +1 -1
  555. package/dist/frontend/program.d.ts +62 -2
  556. package/dist/frontend/program.js +695 -422
  557. package/dist/frontend/program.js.map +1 -1
  558. package/dist/frontend/program.test.js +37 -1
  559. package/dist/frontend/program.test.js.map +1 -1
  560. package/dist/frontend/services-node.d.ts +7 -0
  561. package/dist/frontend/services-node.js +32 -1
  562. package/dist/frontend/services-node.js.map +1 -1
  563. package/dist/frontend/services-node.test.js +51 -0
  564. package/dist/frontend/services-node.test.js.map +1 -1
  565. package/dist/frontend/shape-inference/overlay.js +68 -2
  566. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  567. package/dist/frontend/tier-analysis.d.ts +9 -0
  568. package/dist/frontend/tier-analysis.js +1 -0
  569. package/dist/frontend/tier-analysis.js.map +1 -1
  570. package/dist/frontend/tsc-codes.d.ts +57 -3
  571. package/dist/frontend/tsc-codes.js +935 -150
  572. package/dist/frontend/tsc-codes.js.map +1 -1
  573. package/dist/frontend/tsc-codes.test.js +221 -12
  574. package/dist/frontend/tsc-codes.test.js.map +1 -1
  575. package/dist/frontend/type-mapper.d.ts +91 -9
  576. package/dist/frontend/type-mapper.js +622 -181
  577. package/dist/frontend/type-mapper.js.map +1 -1
  578. package/dist/index.d.ts +1 -1
  579. package/dist/index.js +80 -15
  580. package/dist/index.js.map +1 -1
  581. package/dist/index.test.d.ts +1 -0
  582. package/dist/index.test.js +60 -0
  583. package/dist/index.test.js.map +1 -0
  584. package/dist/ir/builtin-effects.js +43 -0
  585. package/dist/ir/builtin-effects.js.map +1 -1
  586. package/dist/ir/builtin-signatures.d.ts +1 -1
  587. package/dist/ir/builtin-signatures.js +242 -16
  588. package/dist/ir/builtin-signatures.js.map +1 -1
  589. package/dist/ir/callback-specialization.d.ts +3 -2
  590. package/dist/ir/callback-specialization.js +35 -25
  591. package/dist/ir/callback-specialization.js.map +1 -1
  592. package/dist/ir/capture-values.d.ts +8 -4
  593. package/dist/ir/capture-values.js +9 -6
  594. package/dist/ir/capture-values.js.map +1 -1
  595. package/dist/ir/char-unit-locals.d.ts +6 -2
  596. package/dist/ir/char-unit-locals.js +11 -2
  597. package/dist/ir/char-unit-locals.js.map +1 -1
  598. package/dist/ir/class-key-index.d.ts +18 -0
  599. package/dist/ir/class-key-index.js +29 -0
  600. package/dist/ir/class-key-index.js.map +1 -0
  601. package/dist/ir/class-key-index.test.d.ts +1 -0
  602. package/dist/ir/class-key-index.test.js +25 -0
  603. package/dist/ir/class-key-index.test.js.map +1 -0
  604. package/dist/ir/codec.generated.d.ts +1 -1
  605. package/dist/ir/codec.generated.js +724 -648
  606. package/dist/ir/codec.generated.js.map +1 -1
  607. package/dist/ir/constant-globals.d.ts +5 -2
  608. package/dist/ir/constant-globals.js +25 -27
  609. package/dist/ir/constant-globals.js.map +1 -1
  610. package/dist/ir/expression-inlining.d.ts +4 -2
  611. package/dist/ir/expression-inlining.js +8 -2
  612. package/dist/ir/expression-inlining.js.map +1 -1
  613. package/dist/ir/field-values.d.ts +5 -2
  614. package/dist/ir/field-values.js +32 -21
  615. package/dist/ir/field-values.js.map +1 -1
  616. package/dist/ir/fields.generated.d.ts +11 -2
  617. package/dist/ir/fields.generated.js +8 -0
  618. package/dist/ir/fields.generated.js.map +1 -1
  619. package/dist/ir/final-fields.js +1 -1
  620. package/dist/ir/final-fields.js.map +1 -1
  621. package/dist/ir/function-references.d.ts +5 -4
  622. package/dist/ir/function-references.js +7 -4
  623. package/dist/ir/function-references.js.map +1 -1
  624. package/dist/ir/function-references.test.js +7 -0
  625. package/dist/ir/function-references.test.js.map +1 -1
  626. package/dist/ir/init-only-globals.d.ts +4 -2
  627. package/dist/ir/init-only-globals.js +17 -18
  628. package/dist/ir/init-only-globals.js.map +1 -1
  629. package/dist/ir/inline-array-views.js +1 -0
  630. package/dist/ir/inline-array-views.js.map +1 -1
  631. package/dist/ir/int32-slots.js +7 -0
  632. package/dist/ir/int32-slots.js.map +1 -1
  633. package/dist/ir/ir.d.ts +59 -4
  634. package/dist/ir/ir.js +7 -0
  635. package/dist/ir/ir.js.map +1 -1
  636. package/dist/ir/js-groups.d.ts +51 -0
  637. package/dist/ir/js-groups.js +394 -0
  638. package/dist/ir/js-groups.js.map +1 -0
  639. package/dist/ir/js-groups.test.d.ts +1 -0
  640. package/dist/ir/js-groups.test.js +555 -0
  641. package/dist/ir/js-groups.test.js.map +1 -0
  642. package/dist/ir/js-ic.js +30 -5
  643. package/dist/ir/js-ic.js.map +1 -1
  644. package/dist/ir/js-ic.test.js +27 -1
  645. package/dist/ir/js-ic.test.js.map +1 -1
  646. package/dist/ir/node-index.d.ts +23 -6
  647. package/dist/ir/node-index.js +126 -49
  648. package/dist/ir/node-index.js.map +1 -1
  649. package/dist/ir/numeric-call-specialization.d.ts +4 -2
  650. package/dist/ir/numeric-call-specialization.js +40 -26
  651. package/dist/ir/numeric-call-specialization.js.map +1 -1
  652. package/dist/ir/paired-while-loops.d.ts +4 -2
  653. package/dist/ir/paired-while-loops.js +8 -2
  654. package/dist/ir/paired-while-loops.js.map +1 -1
  655. package/dist/ir/parameter-versions.d.ts +13 -4
  656. package/dist/ir/parameter-versions.js +63 -42
  657. package/dist/ir/parameter-versions.js.map +1 -1
  658. package/dist/ir/property-bags.d.ts +4 -2
  659. package/dist/ir/property-bags.js +22 -17
  660. package/dist/ir/property-bags.js.map +1 -1
  661. package/dist/ir/row-pairs.d.ts +4 -2
  662. package/dist/ir/row-pairs.js +12 -11
  663. package/dist/ir/row-pairs.js.map +1 -1
  664. package/dist/ir/runtime-features.d.ts +87 -12
  665. package/dist/ir/runtime-features.js +263 -160
  666. package/dist/ir/runtime-features.js.map +1 -1
  667. package/dist/ir/runtime-features.test.js +109 -139
  668. package/dist/ir/runtime-features.test.js.map +1 -1
  669. package/dist/ir/runtime-jam-loops.d.ts +35 -0
  670. package/dist/ir/runtime-jam-loops.js +604 -0
  671. package/dist/ir/runtime-jam-loops.js.map +1 -0
  672. package/dist/ir/runtime-jam-loops.test.d.ts +1 -0
  673. package/dist/ir/runtime-jam-loops.test.js +565 -0
  674. package/dist/ir/runtime-jam-loops.test.js.map +1 -0
  675. package/dist/ir/saturating-loop-jams.d.ts +4 -2
  676. package/dist/ir/saturating-loop-jams.js +11 -10
  677. package/dist/ir/saturating-loop-jams.js.map +1 -1
  678. package/dist/ir/scalar-records.d.ts +5 -2
  679. package/dist/ir/scalar-records.js +12 -2
  680. package/dist/ir/scalar-records.js.map +1 -1
  681. package/dist/ir/self-captures.d.ts +4 -2
  682. package/dist/ir/self-captures.js +32 -27
  683. package/dist/ir/self-captures.js.map +1 -1
  684. package/dist/ir/serialize.d.ts +6 -1
  685. package/dist/ir/serialize.js +87 -23
  686. package/dist/ir/serialize.js.map +1 -1
  687. package/dist/ir/serialize.test.js +26 -0
  688. package/dist/ir/serialize.test.js.map +1 -1
  689. package/dist/ir/tiers.js +1 -0
  690. package/dist/ir/tiers.js.map +1 -1
  691. package/dist/ir/traverse.js +4 -0
  692. package/dist/ir/traverse.js.map +1 -1
  693. package/dist/ir/typed-argument-clones.d.ts +30 -0
  694. package/dist/ir/typed-argument-clones.js +789 -0
  695. package/dist/ir/typed-argument-clones.js.map +1 -0
  696. package/dist/ir/union-arm-loops.d.ts +3 -0
  697. package/dist/ir/union-arm-loops.js +373 -0
  698. package/dist/ir/union-arm-loops.js.map +1 -0
  699. package/dist/ir/union-arm-loops.test.d.ts +1 -0
  700. package/dist/ir/union-arm-loops.test.js +230 -0
  701. package/dist/ir/union-arm-loops.test.js.map +1 -0
  702. package/dist/ir/validate.js +88 -18
  703. package/dist/ir/validate.js.map +1 -1
  704. package/dist/library/compiler-self-identity.d.ts +8 -2
  705. package/dist/library/compiler-self-identity.js +92 -18
  706. package/dist/library/compiler-self-identity.js.map +1 -1
  707. package/dist/library/compiler-self-identity.test.js +150 -3
  708. package/dist/library/compiler-self-identity.test.js.map +1 -1
  709. package/dist/library/int-infer.d.ts +5 -0
  710. package/dist/library/int-infer.js +15 -3
  711. package/dist/library/int-infer.js.map +1 -1
  712. package/dist/library/ir-policy.js +1 -0
  713. package/dist/library/ir-policy.js.map +1 -1
  714. package/dist/library/library-cache.d.ts +4 -0
  715. package/dist/library/library-cache.js +2 -0
  716. package/dist/library/library-cache.js.map +1 -1
  717. package/dist/library/library-cache.test.js +26 -0
  718. package/dist/library/library-cache.test.js.map +1 -1
  719. package/dist/library/prepare.js +99 -31
  720. package/dist/library/prepare.js.map +1 -1
  721. package/dist/native/cache.d.ts +7 -0
  722. package/dist/native/cache.js +47 -0
  723. package/dist/native/cache.js.map +1 -1
  724. package/dist/native/cache.test.js +13 -1
  725. package/dist/native/cache.test.js.map +1 -1
  726. package/dist/native/cli.js +1 -1
  727. package/dist/native/cli.js.map +1 -1
  728. package/dist/native/compiler.js +18 -3
  729. package/dist/native/compiler.js.map +1 -1
  730. package/dist/native/executable-cache-open.test.js +31 -5
  731. package/dist/native/executable-cache-open.test.js.map +1 -1
  732. package/dist/native/executable-cache.d.ts +6 -1
  733. package/dist/native/executable-cache.js +7 -1
  734. package/dist/native/executable-cache.js.map +1 -1
  735. package/dist/native/prepare.d.ts +3 -0
  736. package/dist/native/prepare.js +43 -26
  737. package/dist/native/prepare.js.map +1 -1
  738. package/dist/native/prepare.test.js +25 -3
  739. package/dist/native/prepare.test.js.map +1 -1
  740. package/dist/native/sanitizer.js +10 -1
  741. package/dist/native/sanitizer.js.map +1 -1
  742. package/dist/native/sanitizer.test.js +7 -2
  743. package/dist/native/sanitizer.test.js.map +1 -1
  744. package/dist/node-islands/boundary.d.ts +12 -0
  745. package/dist/node-islands/boundary.js +38 -6
  746. package/dist/node-islands/boundary.js.map +1 -1
  747. package/dist/node-islands/boundary.test.d.ts +1 -0
  748. package/dist/node-islands/boundary.test.js +76 -0
  749. package/dist/node-islands/boundary.test.js.map +1 -0
  750. package/dist/node-islands/detect.d.ts +9 -0
  751. package/dist/node-islands/detect.js +110 -0
  752. package/dist/node-islands/detect.js.map +1 -1
  753. package/dist/node-islands/detect.test.js +24 -0
  754. package/dist/node-islands/detect.test.js.map +1 -1
  755. package/dist/node-islands/graph-islands.d.ts +40 -0
  756. package/dist/node-islands/graph-islands.js +128 -0
  757. package/dist/node-islands/graph-islands.js.map +1 -0
  758. package/dist/node-islands/growth.d.ts +57 -0
  759. package/dist/node-islands/growth.js +205 -0
  760. package/dist/node-islands/growth.js.map +1 -0
  761. package/dist/node-islands/report.d.ts +12 -0
  762. package/dist/node-islands/report.js +28 -0
  763. package/dist/node-islands/report.js.map +1 -1
  764. package/dist/node-islands/report.test.js +2 -0
  765. package/dist/node-islands/report.test.js.map +1 -1
  766. package/dist/node-islands/rules.js +5 -0
  767. package/dist/node-islands/rules.js.map +1 -1
  768. package/dist/node-islands/scan.d.ts +11 -2
  769. package/dist/node-islands/scan.js +61 -9
  770. package/dist/node-islands/scan.js.map +1 -1
  771. package/dist/wasm/translate.js +11 -5
  772. package/dist/wasm/translate.js.map +1 -1
  773. package/dist/wasm/translate.test.js +35 -0
  774. package/dist/wasm/translate.test.js.map +1 -1
  775. package/package.json +20 -20
  776. package/surface-manifest.json +184 -117
@@ -0,0 +1,723 @@
1
+ import { everyExprChild, everyStmtChild } from "../ir/traverse.js";
2
+ import { computeTraced } from "./cycle-analysis.js";
3
+ import { constructorEscapePoint } from "./cycle-mutability.js";
4
+ import { computeImmutableFields } from "./immutability.js";
5
+ import { computePublishedTypes } from "./publication.js";
6
+ /** Every class name that passes both analyses, plus one rejection reason
7
+ * list per class name that was considered. Pure: reads `mod` only. */
8
+ export function planTreeClasses(mod, facts) {
9
+ const rejected = new Map();
10
+ const classes = new Set();
11
+ const moves = new Set();
12
+ if (mod.lib !== undefined)
13
+ return { classes, moves, rejected };
14
+ const defs = mod.classes ?? [];
15
+ const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
16
+ const functions = new Map(mod.functions.map((fn) => [fn.name, fn]));
17
+ const traced = facts.traced ?? computeTraced(mod);
18
+ const immutable = facts.immutable !== undefined ? facts.immutable : computeImmutableFields(mod);
19
+ const published = facts.published !== undefined ? facts.published : computePublishedTypes(mod);
20
+ const lifetime = new Set(mod.contracts?.programLifetime ?? []);
21
+ const bases = new Set(defs.flatMap((d) => (d.base === undefined ? [] : [d.base])));
22
+ const slots = collectTypeSlots(mod);
23
+ for (const def of defs) {
24
+ if (def.runtime === true)
25
+ continue;
26
+ const name = def.name;
27
+ const reasons = [];
28
+ const reject = (why) => {
29
+ if (reasons.length < 4)
30
+ reasons.push(why);
31
+ };
32
+ const finish = () => {
33
+ if (reasons.length === 0)
34
+ classes.add(name);
35
+ else
36
+ rejected.set(name, reasons);
37
+ };
38
+ // ── Analysis A: the shape of the class itself ───────────────────────
39
+ if (def.base !== undefined || bases.has(name))
40
+ reject("is part of a hierarchy");
41
+ if (def.arrayElem !== undefined)
42
+ reject("extends Array");
43
+ if (def.localCaptures !== undefined)
44
+ reject("is declared inside a function");
45
+ if (lifetime.has(name))
46
+ reject("implements ProgramLifetime");
47
+ if (def.fields.length === 0)
48
+ reject("declares no fields");
49
+ if (traced.shapes.has(`object:${name}`))
50
+ reject("is on a cycle or reaches one");
51
+ if (published?.classGuarded(name) === true)
52
+ reject("is published to package code");
53
+ if (mod.declBoundary === true)
54
+ reject("the module boxes values at declaration boundaries");
55
+ if (reasons.length > 0) {
56
+ finish();
57
+ continue;
58
+ }
59
+ // Reference fields must be written by the constructor alone: a node
60
+ // that can be rewired after construction can gain a second owner.
61
+ for (const field of def.fields) {
62
+ if (!mentions(field.type, name, unions))
63
+ continue;
64
+ if (immutable?.classField(name, field.name) !== true)
65
+ reject(`field ${field.name} is written after construction`);
66
+ }
67
+ // Only a constructor that never lets `this` out can be a node: every
68
+ // other path out of it would give the object a second owner.
69
+ const ctor = functions.get(`%${name}.constructor`);
70
+ if (ctor === undefined)
71
+ reject("has no constructor body");
72
+ else {
73
+ const thisId = ctor.params[0]?.localId;
74
+ if (thisId === undefined)
75
+ reject("has a constructor without this");
76
+ else if (constructorEscaped(ctor, thisId, null))
77
+ reject("its constructor lets this escape");
78
+ // A constructor whose body owns its `this` releases it on exit, which
79
+ // would destroy an instance its `new` expression still owns.
80
+ if (facts.borrowed.get(`%${name}.constructor`)?.has(0) !== true)
81
+ reject("its constructor body owns this");
82
+ }
83
+ // ── Analysis A: every type in the module that mentions the class ────
84
+ for (const slot of slots) {
85
+ if (!mentions(slot.type, name, unions))
86
+ continue;
87
+ const shape = treeShape(slot.type, name, unions);
88
+ if (shape === null) {
89
+ reject(`${slot.where} holds it in a type that is neither the class nor null or it`);
90
+ continue;
91
+ }
92
+ if (shape === "nullable" && traced.unions.has(unionIdOf(slot.type))) {
93
+ reject(`${slot.where} boxes it in a union that can reach a cycle`);
94
+ continue;
95
+ }
96
+ if (!treeSlot(slot, name))
97
+ reject(`${slot.where} lets a reference escape the tree discipline`);
98
+ }
99
+ if (reasons.length > 0) {
100
+ finish();
101
+ continue;
102
+ }
103
+ // ── Analysis B: whole-program linear use ───────────────────────────
104
+ const check = new LinearUse(name, unions, functions, facts);
105
+ for (const fn of mod.functions)
106
+ check.function(fn);
107
+ for (const why of check.reasons())
108
+ reject(why);
109
+ finish();
110
+ if (classes.has(name))
111
+ for (const move of check.moves())
112
+ moves.add(move);
113
+ }
114
+ return { classes, moves, rejected };
115
+ }
116
+ function treeSlot(slot, name) {
117
+ switch (slot.slot) {
118
+ // Values in flight: parameters arrive owned or borrowed, locals hold an
119
+ // owner for their scope, and a result leaves through a move.
120
+ case "expr":
121
+ case "param":
122
+ case "local":
123
+ case "result":
124
+ return true;
125
+ // Only the class's own fields may point at its nodes. Another class or
126
+ // record field would be a second owner the destroy walk cannot follow
127
+ // (it walks one shape), so the class stays counted.
128
+ case "classField":
129
+ return slot.owner === name;
130
+ case "recordField":
131
+ case "global":
132
+ case "capture":
133
+ return false;
134
+ }
135
+ }
136
+ /** `object:C`, `C | null`, or null when the type is anything else. */
137
+ function treeShape(type, name, unions) {
138
+ if (type.kind === "object")
139
+ return type.className === name ? "object" : null;
140
+ if (type.kind !== "union")
141
+ return null;
142
+ const arms = unions.get(type.unionId)?.arms;
143
+ if (arms === undefined || arms.length !== 2)
144
+ return null;
145
+ let object = false;
146
+ let nulled = false;
147
+ for (const arm of arms) {
148
+ if (arm.kind === "nullT")
149
+ nulled = true;
150
+ else if (arm.kind === "object" && arm.className === name)
151
+ object = true;
152
+ else
153
+ return null;
154
+ }
155
+ return object && nulled ? "nullable" : null;
156
+ }
157
+ function unionIdOf(type) {
158
+ return type.kind === "union" ? type.unionId : "";
159
+ }
160
+ /** Whether a value of this type can lead to an instance of `name`: directly,
161
+ * through a union arm, or through a container, closure or generator slot. */
162
+ export function mentions(type, name, unions) {
163
+ switch (type.kind) {
164
+ case "object":
165
+ case "classval":
166
+ return type.className === name;
167
+ case "union": {
168
+ const arms = unions.get(type.unionId)?.arms;
169
+ return arms !== undefined && arms.some((arm) => mentions(arm, name, unions));
170
+ }
171
+ case "array":
172
+ return mentions(type.elem, name, unions);
173
+ case "map":
174
+ return mentions(type.key, name, unions) || mentions(type.value, name, unions);
175
+ case "set":
176
+ return mentions(type.elem, name, unions);
177
+ case "promise":
178
+ return mentions(type.inner, name, unions);
179
+ case "func":
180
+ return (type.params.some((param) => mentions(param, name, unions)) ||
181
+ mentions(type.ret, name, unions));
182
+ case "generator":
183
+ return (mentions(type.yieldT, name, unions) ||
184
+ mentions(type.retT, name, unions) ||
185
+ mentions(type.nextT, name, unions));
186
+ case "record":
187
+ return false;
188
+ default:
189
+ return false;
190
+ }
191
+ }
192
+ /** Whether `this` leaves the constructor for anywhere but a field of the
193
+ * object under construction. cycle-mutability's escape point is the index
194
+ * of the first body statement after which it did, so only a whole-body
195
+ * answer means it never did. */
196
+ function constructorEscaped(fn, thisId, baseCtor) {
197
+ return constructorEscapePoint(fn, thisId, baseCtor) < fn.body.length;
198
+ }
199
+ const MAX_REASONS = 4;
200
+ /** Linear use, one class at a time, over every function in the module.
201
+ * State is per local and per straight-line region; branch and loop bodies
202
+ * must leave the state of the locals they did not declare unchanged. */
203
+ class LinearUse {
204
+ cls;
205
+ unions;
206
+ functions;
207
+ facts;
208
+ found = [];
209
+ treeLocals = new Map();
210
+ moved = [];
211
+ fn = null;
212
+ constructor(cls, unions, functions, facts) {
213
+ this.cls = cls;
214
+ this.unions = unions;
215
+ this.functions = functions;
216
+ this.facts = facts;
217
+ }
218
+ reasons() {
219
+ return this.found;
220
+ }
221
+ /** The varRef reads that took a node out of a local (see TreeClassPlan). */
222
+ moves() {
223
+ return this.moved;
224
+ }
225
+ fail(what) {
226
+ if (this.found.length < MAX_REASONS) {
227
+ this.found.push(`${this.fn?.name ?? "module"}: ${what}`);
228
+ }
229
+ return null;
230
+ }
231
+ tree(type) {
232
+ return mentions(type, this.cls, this.unions);
233
+ }
234
+ function(fn) {
235
+ this.fn = fn;
236
+ this.treeLocals.clear();
237
+ for (const local of fn.locals)
238
+ if (this.tree(local.type))
239
+ this.treeLocals.set(local.id, local);
240
+ // A function with no tree local and no tree result can still build or
241
+ // read a node inside an expression; walk it when the body mentions the
242
+ // class so the temporary rules reject the class instead of letting the
243
+ // lowering copy a value this analysis never saw moved.
244
+ if (this.treeLocals.size === 0 &&
245
+ !this.tree(fn.returnType) &&
246
+ !fn.body.some((stmt) => this.holdsTree(stmt)))
247
+ return;
248
+ if (fn.generator !== undefined) {
249
+ this.fail("a generator holds it");
250
+ return;
251
+ }
252
+ if (this.tree(fn.returnType)) {
253
+ const borrowed = this.facts.borrowedReturns;
254
+ if (borrowed?.has(fn.name) === true)
255
+ this.fail("returns a node it only borrows");
256
+ }
257
+ for (const capture of [...(fn.captures ?? []), ...(fn.classCaptures ?? [])])
258
+ if (this.tree(capture.type))
259
+ this.fail("a closure captures it");
260
+ const params = new Set(fn.params.map((param) => param.localId));
261
+ const ctorThis = fn.name === `%${this.cls}.constructor` ? fn.params[0]?.localId : undefined;
262
+ // A tree local that a later assignment could rebind needs the store
263
+ // path the lowering does not have; parameters are the exception, since
264
+ // their binding never changes.
265
+ for (const local of this.treeLocals.values())
266
+ if (!params.has(local.id) && local.mutable)
267
+ this.fail(`local ${local.id} is rebound`);
268
+ const state = new Map();
269
+ const borrowedParams = this.facts.borrowed.get(fn.name);
270
+ for (const [index, param] of fn.params.entries()) {
271
+ if (!this.tree(param.type))
272
+ continue;
273
+ // A parameter the callee borrows is a read-only view; one it owns is
274
+ // released at exit unless the body moves it on.
275
+ state.set(param.localId, param.localId === ctorThis
276
+ ? "borrowed"
277
+ : this.pending(param, fn)
278
+ ? "pending"
279
+ : borrowedParams?.has(index) === true
280
+ ? "borrowed"
281
+ : "owned");
282
+ }
283
+ if (!this.statements(fn.body, state))
284
+ return;
285
+ // The `new` expression hands each constructor argument over as an
286
+ // owned child; a parameter the body never stores in a field would leak
287
+ // the subtree it points at.
288
+ for (const [id, held] of state)
289
+ if (held === "pending")
290
+ this.fail(`constructor parameter ${id} is never stored`);
291
+ }
292
+ /** A constructor parameter other than `this` arrives owned by the new
293
+ * object: the body stores it in a field or destroys it. */
294
+ pending(param, fn) {
295
+ return fn.name === `%${this.cls}.constructor` && param.localId !== fn.params[0]?.localId;
296
+ }
297
+ statements(list, state) {
298
+ for (const stmt of list)
299
+ if (!this.statement(stmt, state))
300
+ return false;
301
+ return true;
302
+ }
303
+ statement(stmt, state) {
304
+ switch (stmt.kind) {
305
+ case "varDecl": {
306
+ if (!this.tree(this.treeLocals.get(stmt.localId)?.type ?? NO_TYPE)) {
307
+ return stmt.init === null ? true : this.expr(stmt.init, "borrow", state) !== null;
308
+ }
309
+ if (stmt.init === null)
310
+ return this.fail(`local ${stmt.localId} is declared without a value`) !== null;
311
+ const provenance = this.expr(stmt.init, "move", state);
312
+ if (provenance === null)
313
+ return false;
314
+ if (provenance === "borrowed")
315
+ return this.fail(`local ${stmt.localId} aliases a node it does not own`) !== null;
316
+ state.set(stmt.localId, "owned");
317
+ return true;
318
+ }
319
+ case "assign": {
320
+ if (this.treeLocals.has(stmt.localId) || this.tree(stmt.value.type))
321
+ return this.fail("a tree local is assigned a second value") !== null;
322
+ return this.expr(stmt.value, "borrow", state) !== null;
323
+ }
324
+ case "exprStmt": {
325
+ // A statement that drops its value keeps only what it allocated;
326
+ // a node read out of a local or a field would be destroyed while
327
+ // its owner still holds it.
328
+ const provenance = this.expr(stmt.expr, "borrow", state);
329
+ if (provenance === null)
330
+ return false;
331
+ if (provenance === "fresh" || provenance === "none")
332
+ return true;
333
+ return this.fail("drops a node it does not own") !== null;
334
+ }
335
+ case "if": {
336
+ if (!this.borrowOnly(stmt.cond, state))
337
+ return false;
338
+ const then = new Map(state);
339
+ if (!this.statements(stmt.then, then))
340
+ return false;
341
+ const otherwise = stmt.else_ === null ? state : new Map(state);
342
+ if (stmt.else_ !== null && !this.statements(stmt.else_, otherwise))
343
+ return false;
344
+ return this.join(state, then, otherwise);
345
+ }
346
+ case "block":
347
+ return this.statements(stmt.body, state);
348
+ case "while":
349
+ case "doWhile": {
350
+ if (stmt.kind === "while" && !this.borrowOnly(stmt.cond, state))
351
+ return false;
352
+ const body = new Map(state);
353
+ if (!this.statements(stmt.body, body))
354
+ return false;
355
+ if (stmt.kind === "doWhile" && !this.borrowOnly(stmt.cond, body))
356
+ return false;
357
+ return this.join(state, state, body);
358
+ }
359
+ case "for": {
360
+ const body = new Map(state);
361
+ if (stmt.init !== null && !this.statement(stmt.init, body))
362
+ return false;
363
+ if (stmt.cond !== null && !this.borrowOnly(stmt.cond, body))
364
+ return false;
365
+ if (stmt.update !== null && !this.statement(stmt.update, body))
366
+ return false;
367
+ if (!this.statements(stmt.body, body))
368
+ return false;
369
+ return this.join(state, state, body);
370
+ }
371
+ case "switch": {
372
+ // A discriminant is compared by value; a node has no such compare.
373
+ if (this.tree(stmt.disc.type))
374
+ return this.fail("switches on a node") !== null;
375
+ if (!this.borrowOnly(stmt.disc, state))
376
+ return false;
377
+ for (const arm of stmt.cases) {
378
+ if (arm.test !== null && this.tree(arm.test.type))
379
+ return this.fail("compares a node in a case label") !== null;
380
+ if (arm.test !== null && !this.borrowOnly(arm.test, state))
381
+ return false;
382
+ const body = new Map(state);
383
+ if (!this.statements(arm.body, body))
384
+ return false;
385
+ if (!this.join(state, state, body))
386
+ return false;
387
+ }
388
+ return true;
389
+ }
390
+ case "forOf": {
391
+ if (this.tree(stmt.iterable.type))
392
+ return this.fail("iterates a value that holds it") !== null;
393
+ if (!this.expr(stmt.iterable, "borrow", state))
394
+ return false;
395
+ const body = new Map(state);
396
+ if (!this.statements(stmt.body, body))
397
+ return false;
398
+ return this.join(state, state, body);
399
+ }
400
+ case "fieldSet": {
401
+ if (!this.expr(stmt.obj, "borrow", state))
402
+ return false;
403
+ if (!this.tree(stmt.value.type))
404
+ return this.expr(stmt.value, "borrow", state) !== null;
405
+ const provenance = this.expr(stmt.value, "move", state);
406
+ if (provenance === null)
407
+ return false;
408
+ if (provenance === "borrowed")
409
+ return (this.fail(`field ${stmt.field} takes a node from a field it does not own`) !== null);
410
+ return true;
411
+ }
412
+ case "return": {
413
+ if (stmt.value === null || !this.tree(stmt.value.type))
414
+ return stmt.value === null || this.expr(stmt.value, "borrow", state) !== null;
415
+ if (!this.tree(this.fn?.returnType ?? NO_TYPE))
416
+ return this.fail("returns a node from a function that does not declare one") !== null;
417
+ const provenance = this.expr(stmt.value, "move", state);
418
+ if (provenance === null)
419
+ return false;
420
+ if (provenance === "borrowed")
421
+ return this.fail("returns a node it only borrows") !== null;
422
+ return true;
423
+ }
424
+ case "throw":
425
+ if (this.tree(stmt.value.type))
426
+ return this.fail("throws a node") !== null;
427
+ return this.expr(stmt.value, "borrow", state) !== null;
428
+ case "tryCatch":
429
+ // A catch, a finally or a disposal can run with a partially
430
+ // transferred owner; the store path the lowering adds does not
431
+ // unwind. Keep the class counted instead.
432
+ if (this.holdsTree(stmt))
433
+ return this.fail("a try statement holds one") !== null;
434
+ return true;
435
+ case "recordSet":
436
+ case "recordKeySet":
437
+ case "recordKeyDelete":
438
+ case "arraySet":
439
+ case "arraySetLength":
440
+ case "arraySetUndefined":
441
+ case "arrayDelete":
442
+ case "bytesSet":
443
+ if (this.holdsTree(stmt))
444
+ return this.fail(`a ${stmt.kind} holds one`) !== null;
445
+ return true;
446
+ default:
447
+ // Everything else either touches no tree value or does so in a
448
+ // position this analysis does not model.
449
+ return this.holdsTree(stmt)
450
+ ? this.fail(`a ${stmt.kind} statement holds one`) !== null
451
+ : true;
452
+ }
453
+ }
454
+ /** Branch or loop merge: the state of every local that existed before the
455
+ * region must be the same on every path out of it. The agreed state becomes
456
+ * the state after the region, so a local both branches moved stays moved.
457
+ * Locals the region declared are scoped to it (each iteration allocates a
458
+ * fresh object). */
459
+ join(before, a, b) {
460
+ for (const [id, was] of before) {
461
+ const left = a.get(id) ?? was;
462
+ const right = b.get(id) ?? was;
463
+ if (left === right) {
464
+ before.set(id, left);
465
+ continue;
466
+ }
467
+ return this.fail(`local ${id} is transferred on only one path`) !== null;
468
+ }
469
+ return true;
470
+ }
471
+ borrowOnly(expr, state) {
472
+ return this.expr(expr, "borrow", state) !== null;
473
+ }
474
+ expr(expr, mode, state) {
475
+ switch (expr.kind) {
476
+ case "varRef": {
477
+ if (!this.tree(expr.type))
478
+ return "none";
479
+ const held = state.get(expr.localId);
480
+ if (held === undefined || held === "moved")
481
+ return this.fail(`local ${expr.localId} is used after it was moved`);
482
+ if (mode === "borrow")
483
+ return held === "pending" ? "borrowed" : held;
484
+ if (held === "borrowed")
485
+ return this.fail(`local ${expr.localId} is moved but only borrowed`);
486
+ this.moved.push(expr);
487
+ state.set(expr.localId, "moved");
488
+ return held === "pending" ? "pending" : "owned";
489
+ }
490
+ case "new": {
491
+ const involves = this.tree(expr.type) || expr.args.some((arg) => this.tree(arg.type));
492
+ if (!involves) {
493
+ for (const arg of expr.args)
494
+ if (!this.borrowOnly(arg, state))
495
+ return null;
496
+ return "none";
497
+ }
498
+ if (expr.className !== this.cls)
499
+ return this.fail(`another class's constructor, ${expr.className}, holds it`);
500
+ for (const arg of expr.args) {
501
+ if (!this.tree(arg.type)) {
502
+ if (!this.borrowOnly(arg, state))
503
+ return null;
504
+ continue;
505
+ }
506
+ const provenance = this.expr(arg, "move", state);
507
+ if (provenance === null)
508
+ return null;
509
+ if (provenance === "borrowed")
510
+ return this.fail(`an argument from a field becomes a second owner`);
511
+ }
512
+ return "fresh";
513
+ }
514
+ case "call": {
515
+ const consumes = expr.args.some((arg) => this.tree(arg.type));
516
+ if (!this.tree(expr.type) && !consumes) {
517
+ for (const arg of expr.args)
518
+ if (!this.borrowOnly(arg, state))
519
+ return null;
520
+ return "none";
521
+ }
522
+ const callee = this.functions.get(expr.callee);
523
+ if (callee === undefined)
524
+ return this.fail(`callee ${expr.callee} is not a module function`);
525
+ // A borrowed-return helper hands back a reference it does not own;
526
+ // the caller would treat it as a fresh node.
527
+ if (this.tree(expr.type) && this.facts.borrowedReturns?.has(expr.callee) === true)
528
+ return this.fail(`callee ${expr.callee} lends the node it returns`);
529
+ const borrowed = this.facts.borrowed.get(expr.callee);
530
+ for (let i = 0; i < expr.args.length; i++) {
531
+ const arg = expr.args[i];
532
+ if (!this.tree(arg.type)) {
533
+ if (!this.borrowOnly(arg, state))
534
+ return null;
535
+ continue;
536
+ }
537
+ const borrows = borrowed?.has(i) === true;
538
+ const provenance = this.expr(arg, borrows ? "borrow" : "move", state);
539
+ if (provenance === null)
540
+ return null;
541
+ if (!borrows && provenance === "borrowed")
542
+ return this.fail(`callee ${expr.callee} consumes a node that comes from a field`);
543
+ }
544
+ return this.tree(expr.type) ? "fresh" : "none";
545
+ }
546
+ case "fieldGet": {
547
+ if (this.tree(expr.obj.type)) {
548
+ const provenance = this.expr(expr.obj, "borrow", state);
549
+ if (provenance === null)
550
+ return null;
551
+ if (provenance === "fresh")
552
+ return this.fail(`field ${expr.field} is read from a node the statement owns`);
553
+ }
554
+ else if (!this.borrowOnly(expr.obj, state))
555
+ return null;
556
+ return this.tree(expr.type) ? "borrowed" : "none";
557
+ }
558
+ // Wrappers that move no ownership: unboxing, narrowing, upcasts and
559
+ // the tag test of a nullable slot.
560
+ case "unionWrap":
561
+ case "unionNarrow":
562
+ case "upcast":
563
+ if (expr.value.kind === "unitLit")
564
+ return "none";
565
+ return this.expr(expr.value, mode, state);
566
+ case "unionIsTag": {
567
+ const provenance = this.expr(expr.value, "borrow", state);
568
+ return provenance === null ? null : "none";
569
+ }
570
+ // Arithmetic and condition combining: the operands are read, never
571
+ // moved, and the result is a scalar.
572
+ case "logical":
573
+ if (!this.borrowOnly(expr.left, state) || !this.borrowOnly(expr.right, state))
574
+ return null;
575
+ return "none";
576
+ case "bin":
577
+ if (this.tree(expr.type))
578
+ return this.fail("an operator produces it");
579
+ if (!this.borrowOnly(expr.left, state) || !this.borrowOnly(expr.right, state))
580
+ return null;
581
+ return "none";
582
+ // Scalar operations over values that may be computed from a node
583
+ // (`nodeCount(build(d))`): the operands are read and the result is a
584
+ // number, a string or a bool. None of these can retain a node.
585
+ case "toString":
586
+ if (this.tree(expr.operand.type))
587
+ return this.fail("converts a node to text");
588
+ return this.borrowOnly(expr.operand, state) ? "none" : null;
589
+ case "strConcat":
590
+ case "strEq":
591
+ case "strCmp":
592
+ if (!this.borrowOnly(expr.left, state) || !this.borrowOnly(expr.right, state))
593
+ return null;
594
+ return "none";
595
+ case "intrinsic":
596
+ case "libCall":
597
+ for (const arg of expr.args) {
598
+ if (this.tree(arg.type))
599
+ return this.fail(`a ${expr.kind} takes a node by value`);
600
+ if (!this.borrowOnly(arg, state))
601
+ return null;
602
+ }
603
+ return this.tree(expr.type) ? this.fail(`a ${expr.kind} produces one`) : "none";
604
+ case "seqExpr": {
605
+ for (const stmt of expr.stmts)
606
+ if (!this.statement(stmt, state))
607
+ return null;
608
+ return this.expr(expr.result, mode, state);
609
+ }
610
+ case "unitLit":
611
+ return "none";
612
+ default:
613
+ return this.holdsTree(expr) ? this.fail(`a ${expr.kind} expression holds one`) : "none";
614
+ }
615
+ }
616
+ /** Whether the value or any value inside it can reach a node. */
617
+ holdsTree(node) {
618
+ let found = false;
619
+ const exprVisitor = (e) => {
620
+ if (this.tree(e.type)) {
621
+ found = true;
622
+ return false;
623
+ }
624
+ return everyExprChild(e, exprVisitor, stmtVisitor);
625
+ };
626
+ const stmtVisitor = (s) => !found && everyStmtChild(s, exprVisitor, stmtVisitor);
627
+ if (isExpr(node))
628
+ exprVisitor(node);
629
+ else
630
+ everyStmtChild(node, exprVisitor, stmtVisitor);
631
+ return found;
632
+ }
633
+ }
634
+ const NO_TYPE = { kind: "void" };
635
+ /** Every kind of the IR's statement union, which is the only list of them:
636
+ * the traversal walks anything else as an expression, so a statement kind
637
+ * missing here reaches `everyExprChild` as an expression and throws. */
638
+ const STATEMENT_KINDS = new Set([
639
+ "varDecl",
640
+ "assign",
641
+ "exprStmt",
642
+ "if",
643
+ "while",
644
+ "doWhile",
645
+ "for",
646
+ "forOf",
647
+ "switch",
648
+ "block",
649
+ "return",
650
+ "throw",
651
+ "tryCatch",
652
+ "break",
653
+ "continue",
654
+ "genBindBarrier",
655
+ "rethrow",
656
+ "runtimeFence",
657
+ "fieldSet",
658
+ "recordSet",
659
+ "recordKeySet",
660
+ "recordKeyDelete",
661
+ "arraySet",
662
+ "arraySetLength",
663
+ "arraySetUndefined",
664
+ "arrayDelete",
665
+ "bytesSet",
666
+ ]);
667
+ function isExpr(node) {
668
+ return !STATEMENT_KINDS.has(node.kind);
669
+ }
670
+ /** Every typed slot of the module, with where it sits. Root types only:
671
+ * `mentions` looks through the containers itself. */
672
+ function collectTypeSlots(mod) {
673
+ const slots = [];
674
+ const add = (type, where, slot, owner) => {
675
+ slots.push(owner === undefined ? { type, where, slot } : { type, where, slot, owner });
676
+ };
677
+ for (const fn of mod.functions) {
678
+ for (const param of fn.params)
679
+ add(param.type, `${fn.name} parameter ${param.name}`, "param");
680
+ add(fn.returnType, `${fn.name} result`, "result");
681
+ for (const local of fn.locals)
682
+ add(local.type, `${fn.name} local ${local.name}`, "local");
683
+ for (const capture of fn.captures ?? [])
684
+ add(capture.type, `${fn.name} capture ${capture.name}`, "capture");
685
+ for (const capture of fn.classCaptures ?? [])
686
+ add(capture.type, `${fn.name} class capture ${capture.name}`, "capture");
687
+ if (fn.generator !== undefined) {
688
+ add(fn.generator.yieldT, `${fn.name} yield`, "capture");
689
+ add(fn.generator.nextT, `${fn.name} next`, "capture");
690
+ add(fn.generator.resultType, `${fn.name} generator result`, "capture");
691
+ }
692
+ for (const stmt of fn.body)
693
+ exprSlots(stmt, `${fn.name}`, add);
694
+ }
695
+ for (const def of mod.classes ?? []) {
696
+ for (const field of def.fields)
697
+ add(field.type, `${def.name} field ${field.name}`, "classField", def.name);
698
+ for (const capture of def.localCaptures ?? [])
699
+ add(capture.type, `${def.name} capture ${capture.name}`, "capture");
700
+ if (def.arrayElem !== undefined)
701
+ add(def.arrayElem, `${def.name} element`, "capture");
702
+ }
703
+ for (const record of mod.records ?? [])
704
+ for (const field of record.fields)
705
+ add(field.type, `record ${record.id} field ${field.name}`, "recordField");
706
+ for (const global of mod.globals ?? [])
707
+ add(global.type, `global ${global.name}`, "global");
708
+ for (const union of mod.unions ?? [])
709
+ for (const arm of union.arms)
710
+ add(arm, `union ${union.id}`, "expr");
711
+ return slots;
712
+ }
713
+ /** Expression types inside a statement, which must stay in the in-flight
714
+ * forms (the class itself or `C | null`). */
715
+ function exprSlots(stmt, where, add) {
716
+ const expr = (e) => {
717
+ add(e.type, `${where} expression ${e.kind}`, "expr");
718
+ return everyExprChild(e, expr, stmtVisitor);
719
+ };
720
+ const stmtVisitor = (s) => everyStmtChild(s, expr, stmtVisitor);
721
+ return everyStmtChild(stmt, expr, stmtVisitor);
722
+ }
723
+ //# sourceMappingURL=tree-classes.js.map