@scriptc/compiler 0.4.3 → 0.4.5

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 (852) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +270 -72
  2. package/ambient/scriptc-overrides.d.ts +21 -0
  3. package/dist/backend/executable-features.js +3 -0
  4. package/dist/backend/executable-features.js.map +1 -1
  5. package/dist/backend/library-pack.js +2 -1
  6. package/dist/backend/library-pack.js.map +1 -1
  7. package/dist/backend/linker.js +11 -1
  8. package/dist/backend/linker.js.map +1 -1
  9. package/dist/backend/lld.d.ts +9 -0
  10. package/dist/backend/lld.js +48 -0
  11. package/dist/backend/lld.js.map +1 -0
  12. package/dist/backend/lld.test.d.ts +1 -0
  13. package/dist/backend/lld.test.js +53 -0
  14. package/dist/backend/lld.test.js.map +1 -0
  15. package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
  16. package/dist/backend/llvm/appended-array-literals.js +29 -0
  17. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  18. package/dist/backend/llvm/blocks.js +10 -1
  19. package/dist/backend/llvm/blocks.js.map +1 -1
  20. package/dist/backend/llvm/bytes-alias.d.ts +13 -4
  21. package/dist/backend/llvm/bytes-alias.js +16 -5
  22. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  23. package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
  24. package/dist/backend/llvm/bytes-bounds.js +199 -2
  25. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
  27. package/dist/backend/llvm/bytes-loop-versions.js +244 -20
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +18 -6
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
  32. package/dist/backend/llvm/call-lifetimes.js +87 -18
  33. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  34. package/dist/backend/llvm/call-lifetimes.test.js +132 -0
  35. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  36. package/dist/backend/llvm/classes.d.ts +3 -2
  37. package/dist/backend/llvm/classes.js +4 -4
  38. package/dist/backend/llvm/classes.js.map +1 -1
  39. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  40. package/dist/backend/llvm/counted-loops.js +54 -5
  41. package/dist/backend/llvm/counted-loops.js.map +1 -1
  42. package/dist/backend/llvm/debug-info.d.ts +42 -1
  43. package/dist/backend/llvm/debug-info.js +72 -6
  44. package/dist/backend/llvm/debug-info.js.map +1 -1
  45. package/dist/backend/llvm/dense-array-loops.js +2 -2
  46. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  47. package/dist/backend/llvm/dense-array-loops.test.js +1 -0
  48. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  49. package/dist/backend/llvm/dyn.d.ts +69 -8
  50. package/dist/backend/llvm/dyn.js +396 -49
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emit-function.js +30 -16
  53. package/dist/backend/llvm/emit-function.js.map +1 -1
  54. package/dist/backend/llvm/emit-journal.d.ts +8 -4
  55. package/dist/backend/llvm/emit-journal.js +75 -5
  56. package/dist/backend/llvm/emit-journal.js.map +1 -1
  57. package/dist/backend/llvm/emit-module.d.ts +4 -0
  58. package/dist/backend/llvm/emit-module.js +74 -29
  59. package/dist/backend/llvm/emit-module.js.map +1 -1
  60. package/dist/backend/llvm/emit-statements.js +297 -28
  61. package/dist/backend/llvm/emit-statements.js.map +1 -1
  62. package/dist/backend/llvm/emitter.d.ts +144 -13
  63. package/dist/backend/llvm/emitter.js +523 -92
  64. package/dist/backend/llvm/emitter.js.map +1 -1
  65. package/dist/backend/llvm/emitter.test.js +11 -2
  66. package/dist/backend/llvm/emitter.test.js.map +1 -1
  67. package/dist/backend/llvm/expr-async.js +11 -13
  68. package/dist/backend/llvm/expr-async.js.map +1 -1
  69. package/dist/backend/llvm/expr-bytes.d.ts +6 -4
  70. package/dist/backend/llvm/expr-bytes.js +45 -16
  71. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  72. package/dist/backend/llvm/expr-calls.js +13 -11
  73. package/dist/backend/llvm/expr-calls.js.map +1 -1
  74. package/dist/backend/llvm/expr-containers.d.ts +11 -0
  75. package/dist/backend/llvm/expr-containers.js +101 -9
  76. package/dist/backend/llvm/expr-containers.js.map +1 -1
  77. package/dist/backend/llvm/expr-context.d.ts +3 -0
  78. package/dist/backend/llvm/expr-control.js +83 -0
  79. package/dist/backend/llvm/expr-control.js.map +1 -1
  80. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +22 -4
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.js +121 -14
  84. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  85. package/dist/backend/llvm/expr-stream-bridges.js +111 -26
  86. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  87. package/dist/backend/llvm/forked-analysis.d.ts +8 -0
  88. package/dist/backend/llvm/forked-analysis.js +43 -0
  89. package/dist/backend/llvm/forked-analysis.js.map +1 -0
  90. package/dist/backend/llvm/integer-values.d.ts +12 -0
  91. package/dist/backend/llvm/integer-values.js +69 -5
  92. package/dist/backend/llvm/integer-values.js.map +1 -1
  93. package/dist/backend/llvm/integer-views.d.ts +2 -1
  94. package/dist/backend/llvm/integer-views.js +12 -1
  95. package/dist/backend/llvm/integer-views.js.map +1 -1
  96. package/dist/backend/llvm/js-ic.d.ts +4 -0
  97. package/dist/backend/llvm/js-ic.js +133 -15
  98. package/dist/backend/llvm/js-ic.js.map +1 -1
  99. package/dist/backend/llvm/layouts.d.ts +1 -0
  100. package/dist/backend/llvm/layouts.js.map +1 -1
  101. package/dist/backend/llvm/lazy-captures.d.ts +6 -1
  102. package/dist/backend/llvm/lazy-captures.js +10 -5
  103. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  104. package/dist/backend/llvm/lib-abi.d.ts +5 -0
  105. package/dist/backend/llvm/lib-abi.js +19 -0
  106. package/dist/backend/llvm/lib-abi.js.map +1 -1
  107. package/dist/backend/llvm/lib-dispatch.js +249 -33
  108. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  109. package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
  110. package/dist/backend/llvm/lib-filesystem.js +32 -0
  111. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  112. package/dist/backend/llvm/lib-http2.js +2 -2
  113. package/dist/backend/llvm/lib-http2.js.map +1 -1
  114. package/dist/backend/llvm/lib-network.js +2 -0
  115. package/dist/backend/llvm/lib-network.js.map +1 -1
  116. package/dist/backend/llvm/lib-process.js +48 -1
  117. package/dist/backend/llvm/lib-process.js.map +1 -1
  118. package/dist/backend/llvm/lib-shared.js +64 -0
  119. package/dist/backend/llvm/lib-shared.js.map +1 -1
  120. package/dist/backend/llvm/lib-tls.js +28 -3
  121. package/dist/backend/llvm/lib-tls.js.map +1 -1
  122. package/dist/backend/llvm/local-union-storage.test.js +2 -1
  123. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  124. package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
  125. package/dist/backend/llvm/loop-array-borrows.js +11 -5
  126. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  127. package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
  128. package/dist/backend/llvm/map-entry-fusion.js +20 -11
  129. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  130. package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
  131. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
  132. package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
  133. package/dist/backend/llvm/map-number-lookup.js +41 -9
  134. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  135. package/dist/backend/llvm/map-number-lookup.test.js +70 -2
  136. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  137. package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
  138. package/dist/backend/llvm/map-read-lifetimes.js +136 -6
  139. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  140. package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
  141. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  142. package/dist/backend/llvm/nullable-unions.d.ts +5 -0
  143. package/dist/backend/llvm/nullable-unions.js +29 -2
  144. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  145. package/dist/backend/llvm/nullable-unions.test.js +25 -1
  146. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  147. package/dist/backend/llvm/publish.js +3 -3
  148. package/dist/backend/llvm/publish.js.map +1 -1
  149. package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
  150. package/dist/backend/llvm/record-union-keys.test.js +161 -0
  151. package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
  152. package/dist/backend/llvm/reference-effects.js +3 -0
  153. package/dist/backend/llvm/reference-effects.js.map +1 -1
  154. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  155. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  156. package/dist/backend/llvm/shapes.d.ts +4 -5
  157. package/dist/backend/llvm/shapes.js +106 -58
  158. package/dist/backend/llvm/shapes.js.map +1 -1
  159. package/dist/backend/llvm/shapes.test.js +14 -2
  160. package/dist/backend/llvm/shapes.test.js.map +1 -1
  161. package/dist/backend/llvm/speculative-integers.d.ts +50 -3
  162. package/dist/backend/llvm/speculative-integers.js +411 -24
  163. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  164. package/dist/backend/llvm/speculative-integers.test.js +103 -1
  165. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  166. package/dist/backend/llvm/split.d.ts +10 -1
  167. package/dist/backend/llvm/split.js +243 -59
  168. package/dist/backend/llvm/split.js.map +1 -1
  169. package/dist/backend/llvm/split.test.js +92 -13
  170. package/dist/backend/llvm/split.test.js.map +1 -1
  171. package/dist/backend/llvm/stack-captures.js +1 -5
  172. package/dist/backend/llvm/stack-captures.js.map +1 -1
  173. package/dist/backend/llvm/stack-objects.test.js +3 -2
  174. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  175. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  176. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  177. package/dist/backend/llvm/string-reads.d.ts +13 -0
  178. package/dist/backend/llvm/string-reads.js +22 -0
  179. package/dist/backend/llvm/string-reads.js.map +1 -1
  180. package/dist/backend/llvm/string-slices.d.ts +36 -2
  181. package/dist/backend/llvm/string-slices.js +308 -12
  182. package/dist/backend/llvm/string-slices.js.map +1 -1
  183. package/dist/backend/llvm/string-slices.test.js +182 -3
  184. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  185. package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
  186. package/dist/backend/llvm/string-unit-versions.js +191 -0
  187. package/dist/backend/llvm/string-unit-versions.js.map +1 -0
  188. package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
  189. package/dist/backend/llvm/string-unit-versions.test.js +117 -0
  190. package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
  191. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
  192. package/dist/backend/llvm/test-boxed-unions.js +24 -8
  193. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  194. package/dist/backend/llvm/union-repr.d.ts +4 -3
  195. package/dist/backend/llvm/union-repr.js +6 -5
  196. package/dist/backend/llvm/union-repr.js.map +1 -1
  197. package/dist/backend/llvm/unwind-abi.d.ts +52 -0
  198. package/dist/backend/llvm/unwind-abi.js +498 -0
  199. package/dist/backend/llvm/unwind-abi.js.map +1 -0
  200. package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
  201. package/dist/backend/llvm/unwind-abi.test.js +255 -0
  202. package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
  203. package/dist/backend/llvm/walkers.js +13 -0
  204. package/dist/backend/llvm/walkers.js.map +1 -1
  205. package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
  206. package/dist/backend/llvm/wrapping-sums.js +31 -14
  207. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  208. package/dist/backend/loop-polls.d.ts +6 -0
  209. package/dist/backend/loop-polls.js +24 -0
  210. package/dist/backend/loop-polls.js.map +1 -1
  211. package/dist/backend/may-throw.js +8 -8
  212. package/dist/backend/may-throw.js.map +1 -1
  213. package/dist/backend/native/contracts.d.ts +12 -2
  214. package/dist/backend/native/executable.js +48 -6
  215. package/dist/backend/native/executable.js.map +1 -1
  216. package/dist/backend/native/library.js +4 -3
  217. package/dist/backend/native/library.js.map +1 -1
  218. package/dist/backend/native/program-shards.d.ts +2 -2
  219. package/dist/backend/native/program-shards.js +2 -2
  220. package/dist/backend/native/program-shards.js.map +1 -1
  221. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  222. package/dist/backend/native/runtime-inputs.js +4 -1
  223. package/dist/backend/native/runtime-inputs.js.map +1 -1
  224. package/dist/backend/native/vendor.d.ts +1 -1
  225. package/dist/backend/native/vendor.js +1 -1
  226. package/dist/backend/native/vendor.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.d.ts +3 -1
  231. package/dist/backend/native-codegen.js +4 -3
  232. package/dist/backend/native-codegen.js.map +1 -1
  233. package/dist/backend/native-codegen.test.js +6 -4
  234. package/dist/backend/native-codegen.test.js.map +1 -1
  235. package/dist/backend/native-link-info-core.d.ts +8 -0
  236. package/dist/backend/native-link-info-core.js.map +1 -1
  237. package/dist/backend/native-profile.d.ts +14 -0
  238. package/dist/backend/native-profile.js +28 -0
  239. package/dist/backend/native-profile.js.map +1 -1
  240. package/dist/backend/native-profile.test.js +8 -1
  241. package/dist/backend/native-profile.test.js.map +1 -1
  242. package/dist/backend/native-toolchain.test.js +11 -11
  243. package/dist/backend/native-toolchain.test.js.map +1 -1
  244. package/dist/backend/runtime-abi.d.ts +2 -2
  245. package/dist/backend/runtime-abi.js +2 -2
  246. package/dist/backend/runtime-pack-core.d.ts +3 -1
  247. package/dist/backend/runtime-pack-core.js +2 -0
  248. package/dist/backend/runtime-pack-core.js.map +1 -1
  249. package/dist/backend/runtime-pack-native.d.ts +17 -5
  250. package/dist/backend/runtime-pack-native.js +186 -14
  251. package/dist/backend/runtime-pack-native.js.map +1 -1
  252. package/dist/backend/runtime-pack-native.test.js +160 -3
  253. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  254. package/dist/backend/runtime-pack-targets.test.js +2 -1
  255. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  256. package/dist/backend/runtime-pack.test.js +2 -1
  257. package/dist/backend/runtime-pack.test.js.map +1 -1
  258. package/dist/backend/target-cpu.d.ts +26 -0
  259. package/dist/backend/target-cpu.js +98 -0
  260. package/dist/backend/target-cpu.js.map +1 -0
  261. package/dist/backend/target-cpu.test.d.ts +1 -0
  262. package/dist/backend/target-cpu.test.js +38 -0
  263. package/dist/backend/target-cpu.test.js.map +1 -0
  264. package/dist/backend/vendor-archives.d.ts +4 -1
  265. package/dist/backend/vendor-archives.js +78 -4
  266. package/dist/backend/vendor-archives.js.map +1 -1
  267. package/dist/backend/vendor-inputs.d.ts +3 -1
  268. package/dist/backend/vendor-inputs.js +3 -1
  269. package/dist/backend/vendor-inputs.js.map +1 -1
  270. package/dist/backend/warm-cache.js +1 -0
  271. package/dist/backend/warm-cache.js.map +1 -1
  272. package/dist/cli/command.js +98 -12
  273. package/dist/cli/command.js.map +1 -1
  274. package/dist/cli/usage.d.ts +25 -1
  275. package/dist/cli/usage.js +40 -3
  276. package/dist/cli/usage.js.map +1 -1
  277. package/dist/compat/fetch-profile.d.ts +15 -6
  278. package/dist/compat/fetch-profile.js +519 -498
  279. package/dist/compat/fetch-profile.js.map +1 -1
  280. package/dist/compile-types.d.ts +14 -0
  281. package/dist/contracts/int32-elements.js +2 -1
  282. package/dist/contracts/int32-elements.js.map +1 -1
  283. package/dist/coverage/report.d.ts +14 -3
  284. package/dist/coverage/report.js +216 -0
  285. package/dist/coverage/report.js.map +1 -1
  286. package/dist/coverage/surface-manifest.js +25 -25
  287. package/dist/coverage/surface-manifest.js.map +1 -1
  288. package/dist/coverage/verdict-cache.d.ts +2 -0
  289. package/dist/coverage/verdict-cache.js +10 -1
  290. package/dist/coverage/verdict-cache.js.map +1 -1
  291. package/dist/diagnostics/diagnostic.d.ts +19 -0
  292. package/dist/diagnostics/diagnostic.js +53 -2
  293. package/dist/diagnostics/diagnostic.js.map +1 -1
  294. package/dist/diagnostics/envelope.d.ts +54 -0
  295. package/dist/diagnostics/envelope.js +7 -1
  296. package/dist/diagnostics/envelope.js.map +1 -1
  297. package/dist/diagnostics/render.d.ts +7 -0
  298. package/dist/diagnostics/render.js +15 -4
  299. package/dist/diagnostics/render.js.map +1 -1
  300. package/dist/executable/executable-cache.d.ts +6 -0
  301. package/dist/executable/executable-cache.js +5 -0
  302. package/dist/executable/executable-cache.js.map +1 -1
  303. package/dist/executable/executable-cache.test.js +3 -0
  304. package/dist/executable/executable-cache.test.js.map +1 -1
  305. package/dist/executable/prepare.js +5 -1
  306. package/dist/executable/prepare.js.map +1 -1
  307. package/dist/frontend/analysis.js +26 -2
  308. package/dist/frontend/analysis.js.map +1 -1
  309. package/dist/frontend/decl-projection.js +105 -10
  310. package/dist/frontend/decl-projection.js.map +1 -1
  311. package/dist/frontend/fork-target.js +67 -1
  312. package/dist/frontend/fork-target.js.map +1 -1
  313. package/dist/frontend/fork-target.test.js +43 -0
  314. package/dist/frontend/fork-target.test.js.map +1 -1
  315. package/dist/frontend/input-tracker.d.ts +4 -1
  316. package/dist/frontend/input-tracker.js +42 -4
  317. package/dist/frontend/input-tracker.js.map +1 -1
  318. package/dist/frontend/input-tracker.test.js +45 -0
  319. package/dist/frontend/input-tracker.test.js.map +1 -1
  320. package/dist/frontend/lowering/abstract-equality.js +38 -1
  321. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  322. package/dist/frontend/lowering/argument-counts.d.ts +36 -0
  323. package/dist/frontend/lowering/argument-counts.js +201 -0
  324. package/dist/frontend/lowering/argument-counts.js.map +1 -0
  325. package/dist/frontend/lowering/array-values.d.ts +27 -0
  326. package/dist/frontend/lowering/array-values.js +112 -0
  327. package/dist/frontend/lowering/array-values.js.map +1 -1
  328. package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
  329. package/dist/frontend/lowering/binding-analysis.js +9 -3
  330. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  331. package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
  332. package/dist/frontend/lowering/builtin-namespaces.js +238 -0
  333. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
  334. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  335. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  336. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  337. package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
  338. package/dist/frontend/lowering/builtins/compression.js +86 -5
  339. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  340. package/dist/frontend/lowering/builtins/crypto.js +3 -1
  341. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  342. package/dist/frontend/lowering/builtins/date-classes.js +17 -1
  343. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
  344. package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
  345. package/dist/frontend/lowering/builtins/dates.js +163 -9
  346. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/filesystem-calls.js +29 -4
  348. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  350. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  351. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  352. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  353. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
  355. package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
  356. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  357. package/dist/frontend/lowering/builtins/json.d.ts +4 -1
  358. package/dist/frontend/lowering/builtins/json.js +9 -3
  359. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
  361. package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
  362. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  363. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  364. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
  366. package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
  367. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  368. package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
  369. package/dist/frontend/lowering/builtins/promises.js +293 -139
  370. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  372. package/dist/frontend/lowering/builtins/readline.js +22 -11
  373. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  374. package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
  375. package/dist/frontend/lowering/builtins/reflection.js +41 -1
  376. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  377. package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
  378. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/webassembly.js +4 -1
  380. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  381. package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
  382. package/dist/frontend/lowering/builtins/x509.js +431 -0
  383. package/dist/frontend/lowering/builtins/x509.js.map +1 -0
  384. package/dist/frontend/lowering/call-arguments.js +44 -0
  385. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  386. package/dist/frontend/lowering/call-signatures.js +1 -2
  387. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  388. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  389. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  390. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  391. package/dist/frontend/lowering/cjs-inline-require.js +308 -5
  392. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  393. package/dist/frontend/lowering/class-attributes.d.ts +7 -0
  394. package/dist/frontend/lowering/class-attributes.js +52 -10
  395. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  396. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +23 -0
  397. package/dist/frontend/lowering/class-dynamic-dispatch.js +288 -9
  398. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  399. package/dist/frontend/lowering/class-method-mutations.js +97 -26
  400. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  401. package/dist/frontend/lowering/class-method-values.js +71 -1
  402. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  403. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  404. package/dist/frontend/lowering/class-protocols.js +183 -1
  405. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  406. package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
  407. package/dist/frontend/lowering/class-prototypes.js +83 -2
  408. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  409. package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
  410. package/dist/frontend/lowering/class-to-primitive.js +79 -7
  411. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  412. package/dist/frontend/lowering/coercions/state.d.ts +1 -0
  413. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  414. package/dist/frontend/lowering/coercions/structural.js +89 -10
  415. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  416. package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
  417. package/dist/frontend/lowering/coercions/unions.js +13 -6
  418. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  419. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  420. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  421. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  422. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  423. package/dist/frontend/lowering/containers/array-callbacks.js +58 -21
  424. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  425. package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
  426. package/dist/frontend/lowering/containers/array-construction.js +107 -9
  427. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  428. package/dist/frontend/lowering/containers/array-methods.js +96 -8
  429. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  430. package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
  431. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  432. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  433. package/dist/frontend/lowering/containers/bytes.js +453 -45
  434. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  435. package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
  436. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  437. package/dist/frontend/lowering/containers/collection-methods.js +12 -0
  438. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  439. package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
  440. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  441. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
  442. package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
  443. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  444. package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
  445. package/dist/frontend/lowering/containers/replacer-params.js +294 -0
  446. package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
  447. package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
  448. package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
  449. package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
  450. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
  451. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  452. package/dist/frontend/lowering/containers/string-replacement.js +7 -3
  453. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  454. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
  455. package/dist/frontend/lowering/cycle-initialization.js +4 -1
  456. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  457. package/dist/frontend/lowering/date-values.d.ts +14 -0
  458. package/dist/frontend/lowering/date-values.js +254 -0
  459. package/dist/frontend/lowering/date-values.js.map +1 -0
  460. package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
  461. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  462. package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
  463. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  464. package/dist/frontend/lowering/dispatch-sites.js +1 -0
  465. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  466. package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
  467. package/dist/frontend/lowering/expressions/array-literals.js +125 -26
  468. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  469. package/dist/frontend/lowering/expressions/binary.js +102 -26
  470. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  471. package/dist/frontend/lowering/expressions/element-access.js +129 -6
  472. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  473. package/dist/frontend/lowering/expressions/identifiers.js +66 -4
  474. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  475. package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
  476. package/dist/frontend/lowering/expressions/narrowing.js +8 -1
  477. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  478. package/dist/frontend/lowering/expressions/object-literals.js +8 -2
  479. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  480. package/dist/frontend/lowering/expressions/property-access.js +121 -34
  481. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  482. package/dist/frontend/lowering/expressions/relational.js +76 -11
  483. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  484. package/dist/frontend/lowering/expressions/typeof.js +12 -1
  485. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  486. package/dist/frontend/lowering/expressions/updates.js +37 -11
  487. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  488. package/dist/frontend/lowering/f64-handles.d.ts +8 -0
  489. package/dist/frontend/lowering/f64-handles.js +16 -0
  490. package/dist/frontend/lowering/f64-handles.js.map +1 -0
  491. package/dist/frontend/lowering/frozen-records.d.ts +5 -0
  492. package/dist/frontend/lowering/frozen-records.js +12 -4
  493. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  494. package/dist/frontend/lowering/function-context.d.ts +3 -0
  495. package/dist/frontend/lowering/function-context.js.map +1 -1
  496. package/dist/frontend/lowering/function-returns.js +30 -0
  497. package/dist/frontend/lowering/function-returns.js.map +1 -1
  498. package/dist/frontend/lowering/generic-functions.js +17 -6
  499. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  500. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  501. package/dist/frontend/lowering/indexed-unions.js +401 -0
  502. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  503. package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
  504. package/dist/frontend/lowering/instantiation-path.js.map +1 -1
  505. package/dist/frontend/lowering/instantiation-path.test.js +6 -4
  506. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
  507. package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
  508. package/dist/frontend/lowering/iterator-adapters.js +26 -33
  509. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  510. package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
  511. package/dist/frontend/lowering/js-collection-types.js +490 -0
  512. package/dist/frontend/lowering/js-collection-types.js.map +1 -0
  513. package/dist/frontend/lowering/key-order-witness.js +210 -32
  514. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  515. package/dist/frontend/lowering/key-order-witness.test.js +104 -4
  516. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  517. package/dist/frontend/lowering/lib-boundary.js +2 -2
  518. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  519. package/dist/frontend/lowering/lower-assert.d.ts +14 -0
  520. package/dist/frontend/lowering/lower-assert.js +298 -29
  521. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  522. package/dist/frontend/lowering/lower-builtin-values.js +3 -3
  523. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  524. package/dist/frontend/lowering/lower-calls.js +116 -10
  525. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  526. package/dist/frontend/lowering/lower-classes.d.ts +59 -7
  527. package/dist/frontend/lowering/lower-classes.js +668 -222
  528. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  529. package/dist/frontend/lowering/lower-console.js +2 -1
  530. package/dist/frontend/lowering/lower-console.js.map +1 -1
  531. package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
  532. package/dist/frontend/lowering/lower-exprs.js +254 -3
  533. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  534. package/dist/frontend/lowering/lower-functions.js +7 -0
  535. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  536. package/dist/frontend/lowering/lower-generators.js +5 -4
  537. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  538. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  539. package/dist/frontend/lowering/lower-inspect.js +299 -57
  540. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  541. package/dist/frontend/lowering/lower-modules.js +49 -22
  542. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  543. package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
  544. package/dist/frontend/lowering/lower-namespaces.js +44 -1
  545. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  546. package/dist/frontend/lowering/lower-node-module.js +1 -1
  547. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  548. package/dist/frontend/lowering/lower-server.js +126 -32
  549. package/dist/frontend/lowering/lower-server.js.map +1 -1
  550. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
  551. package/dist/frontend/lowering/lower-stdlib.js +51 -37
  552. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  553. package/dist/frontend/lowering/lower-stmts.js +393 -79
  554. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  555. package/dist/frontend/lowering/lower-stream.js +515 -121
  556. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  557. package/dist/frontend/lowering/lowerer.d.ts +82 -12
  558. package/dist/frontend/lowering/lowerer.js +317 -44
  559. package/dist/frontend/lowering/lowerer.js.map +1 -1
  560. package/dist/frontend/lowering/lowerer.test.js +1 -1
  561. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  562. package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
  563. package/dist/frontend/lowering/module-namespace-elements.js +118 -1
  564. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  565. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  566. package/dist/frontend/lowering/object-factory-new.js +20 -6
  567. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  568. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  569. package/dist/frontend/lowering/overload-choice.js +190 -0
  570. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  571. package/dist/frontend/lowering/private-brands.d.ts +5 -0
  572. package/dist/frontend/lowering/private-brands.js +39 -0
  573. package/dist/frontend/lowering/private-brands.js.map +1 -1
  574. package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
  575. package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
  576. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  577. package/dist/frontend/lowering/sanitize-class-types.js +2 -0
  578. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  579. package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
  580. package/dist/frontend/lowering/site-dependencies.js +0 -15
  581. package/dist/frontend/lowering/site-dependencies.js.map +1 -1
  582. package/dist/frontend/lowering/site-dependencies.test.js +7 -5
  583. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
  584. package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
  585. package/dist/frontend/lowering/string-index-bounds.js +21 -7
  586. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  587. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  588. package/dist/frontend/lowering/surfaces.js +1630 -1540
  589. package/dist/frontend/lowering/surfaces.js.map +1 -1
  590. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  591. package/dist/frontend/lowering/symbol-fields.js +45 -2
  592. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  593. package/dist/frontend/lowering/union-narrow.d.ts +5 -2
  594. package/dist/frontend/lowering/union-narrow.js +6 -3
  595. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  596. package/dist/frontend/lowering/union-narrow.test.js +10 -0
  597. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  598. package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
  599. package/dist/frontend/npm-static-namespace-defaults.js +163 -0
  600. package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
  601. package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
  602. package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
  603. package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
  604. package/dist/frontend/npm-static-prune.js +152 -111
  605. package/dist/frontend/npm-static-prune.js.map +1 -1
  606. package/dist/frontend/npm-static.js +35 -32
  607. package/dist/frontend/npm-static.js.map +1 -1
  608. package/dist/frontend/package-shims.d.ts +7 -4
  609. package/dist/frontend/package-shims.js +39 -40
  610. package/dist/frontend/package-shims.js.map +1 -1
  611. package/dist/frontend/pipeline-native.d.ts +2 -2
  612. package/dist/frontend/pipeline-native.js +2 -2
  613. package/dist/frontend/pipeline-native.js.map +1 -1
  614. package/dist/frontend/pipeline.d.ts +19 -2
  615. package/dist/frontend/pipeline.js +103 -12
  616. package/dist/frontend/pipeline.js.map +1 -1
  617. package/dist/frontend/program-analysis.d.ts +7 -1
  618. package/dist/frontend/program-analysis.js +8 -0
  619. package/dist/frontend/program-analysis.js.map +1 -1
  620. package/dist/frontend/program.d.ts +28 -5
  621. package/dist/frontend/program.js +422 -76
  622. package/dist/frontend/program.js.map +1 -1
  623. package/dist/frontend/resolve.d.ts +2 -0
  624. package/dist/frontend/resolve.js +5 -0
  625. package/dist/frontend/resolve.js.map +1 -1
  626. package/dist/frontend/services.d.ts +3 -0
  627. package/dist/frontend/services.js +31 -4
  628. package/dist/frontend/services.js.map +1 -1
  629. package/dist/frontend/shape-inference/analyze.d.ts +93 -0
  630. package/dist/frontend/shape-inference/analyze.js +3138 -0
  631. package/dist/frontend/shape-inference/analyze.js.map +1 -0
  632. package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
  633. package/dist/frontend/shape-inference/constant-graphs.js +357 -0
  634. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
  635. package/dist/frontend/shape-inference/domain.d.ts +32 -0
  636. package/dist/frontend/shape-inference/domain.js +104 -0
  637. package/dist/frontend/shape-inference/domain.js.map +1 -0
  638. package/dist/frontend/shape-inference/index.d.ts +7 -0
  639. package/dist/frontend/shape-inference/index.js +19 -0
  640. package/dist/frontend/shape-inference/index.js.map +1 -0
  641. package/dist/frontend/shape-inference/report.d.ts +21 -0
  642. package/dist/frontend/shape-inference/report.js +348 -0
  643. package/dist/frontend/shape-inference/report.js.map +1 -0
  644. package/dist/frontend/token-equivalence.d.ts +6 -0
  645. package/dist/frontend/token-equivalence.js +66 -9
  646. package/dist/frontend/token-equivalence.js.map +1 -1
  647. package/dist/frontend/token-equivalence.test.js +33 -1
  648. package/dist/frontend/token-equivalence.test.js.map +1 -1
  649. package/dist/frontend/ts7/checker-features.d.ts +15 -0
  650. package/dist/frontend/ts7/checker-features.js +45 -0
  651. package/dist/frontend/ts7/checker-features.js.map +1 -0
  652. package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
  653. package/dist/frontend/ts7/checker-features.test.js +40 -0
  654. package/dist/frontend/ts7/checker-features.test.js.map +1 -0
  655. package/dist/frontend/ts7/checker-server.d.ts +19 -0
  656. package/dist/frontend/ts7/checker-server.js +46 -0
  657. package/dist/frontend/ts7/checker-server.js.map +1 -0
  658. package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
  659. package/dist/frontend/ts7/checker-server.test.js +38 -0
  660. package/dist/frontend/ts7/checker-server.test.js.map +1 -0
  661. package/dist/frontend/ts7/lib-diagnostics.js +39 -13
  662. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  663. package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
  664. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  665. package/dist/frontend/ts7/native-api.d.ts +1 -0
  666. package/dist/frontend/ts7/native-api.js +25 -2
  667. package/dist/frontend/ts7/native-api.js.map +1 -1
  668. package/dist/frontend/ts7/native-process.d.ts +9 -2
  669. package/dist/frontend/ts7/native-process.js +22 -4
  670. package/dist/frontend/ts7/native-process.js.map +1 -1
  671. package/dist/frontend/ts7/program-host.d.ts +11 -0
  672. package/dist/frontend/ts7/program-host.js +36 -22
  673. package/dist/frontend/ts7/program-host.js.map +1 -1
  674. package/dist/frontend/ts7/semantic-json.d.ts +9 -0
  675. package/dist/frontend/ts7/semantic-json.js +25 -5
  676. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  677. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  678. package/dist/frontend/ts7/semantic-model.js +8 -1
  679. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  680. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  681. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  682. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  683. package/dist/frontend/ts7/semantic-types.js +1 -1
  684. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  685. package/dist/frontend/ts7/source-parser.js +3 -1
  686. package/dist/frontend/ts7/source-parser.js.map +1 -1
  687. package/dist/frontend/tsc-codes.js +10 -0
  688. package/dist/frontend/tsc-codes.js.map +1 -1
  689. package/dist/frontend/type-mapper.d.ts +18 -6
  690. package/dist/frontend/type-mapper.js +205 -44
  691. package/dist/frontend/type-mapper.js.map +1 -1
  692. package/dist/index.d.ts +44 -3
  693. package/dist/index.js +39 -8
  694. package/dist/index.js.map +1 -1
  695. package/dist/ir/builtin-effects.js +37 -0
  696. package/dist/ir/builtin-effects.js.map +1 -1
  697. package/dist/ir/builtin-signatures.d.ts +7 -2
  698. package/dist/ir/builtin-signatures.js +5104 -4894
  699. package/dist/ir/builtin-signatures.js.map +1 -1
  700. package/dist/ir/callback-specialization.d.ts +4 -2
  701. package/dist/ir/callback-specialization.js +24 -9
  702. package/dist/ir/callback-specialization.js.map +1 -1
  703. package/dist/ir/capture-values.js +4 -2
  704. package/dist/ir/capture-values.js.map +1 -1
  705. package/dist/ir/char-unit-locals.d.ts +12 -2
  706. package/dist/ir/char-unit-locals.js +400 -58
  707. package/dist/ir/char-unit-locals.js.map +1 -1
  708. package/dist/ir/char-unit-locals.test.js +111 -0
  709. package/dist/ir/char-unit-locals.test.js.map +1 -1
  710. package/dist/ir/constant-globals.js +18 -4
  711. package/dist/ir/constant-globals.js.map +1 -1
  712. package/dist/ir/expression-inlining.d.ts +15 -0
  713. package/dist/ir/expression-inlining.js +166 -0
  714. package/dist/ir/expression-inlining.js.map +1 -0
  715. package/dist/ir/expression-inlining.test.d.ts +1 -0
  716. package/dist/ir/expression-inlining.test.js +123 -0
  717. package/dist/ir/expression-inlining.test.js.map +1 -0
  718. package/dist/ir/function-references.js +2 -0
  719. package/dist/ir/function-references.js.map +1 -1
  720. package/dist/ir/function-references.test.js +6 -0
  721. package/dist/ir/function-references.test.js.map +1 -1
  722. package/dist/ir/int32-arrays.d.ts +27 -6
  723. package/dist/ir/int32-arrays.js +106 -18
  724. package/dist/ir/int32-arrays.js.map +1 -1
  725. package/dist/ir/int32-slots.d.ts +26 -1
  726. package/dist/ir/int32-slots.js +291 -5
  727. package/dist/ir/int32-slots.js.map +1 -1
  728. package/dist/ir/int32-slots.test.js +38 -0
  729. package/dist/ir/int32-slots.test.js.map +1 -1
  730. package/dist/ir/integer-loop-facts.d.ts +5 -0
  731. package/dist/ir/integer-loop-facts.js +90 -1
  732. package/dist/ir/integer-loop-facts.js.map +1 -1
  733. package/dist/ir/integer-loops.d.ts +14 -1
  734. package/dist/ir/integer-loops.js +107 -11
  735. package/dist/ir/integer-loops.js.map +1 -1
  736. package/dist/ir/integer-loops.test.js +70 -0
  737. package/dist/ir/integer-loops.test.js.map +1 -1
  738. package/dist/ir/integer-ranges.js +18 -2
  739. package/dist/ir/integer-ranges.js.map +1 -1
  740. package/dist/ir/integer-ranges.test.js +64 -4
  741. package/dist/ir/integer-ranges.test.js.map +1 -1
  742. package/dist/ir/ir.d.ts +63 -11
  743. package/dist/ir/ir.js +47 -7
  744. package/dist/ir/ir.js.map +1 -1
  745. package/dist/ir/ir.test.js +2 -1
  746. package/dist/ir/ir.test.js.map +1 -1
  747. package/dist/ir/js-ic.d.ts +10 -3
  748. package/dist/ir/js-ic.js +14 -2
  749. package/dist/ir/js-ic.js.map +1 -1
  750. package/dist/ir/js-ic.test.js +11 -0
  751. package/dist/ir/js-ic.test.js.map +1 -1
  752. package/dist/ir/node-index.d.ts +7 -0
  753. package/dist/ir/node-index.js +32 -0
  754. package/dist/ir/node-index.js.map +1 -1
  755. package/dist/ir/receiver-readers.d.ts +6 -1
  756. package/dist/ir/receiver-readers.js +53 -28
  757. package/dist/ir/receiver-readers.js.map +1 -1
  758. package/dist/ir/row-pairs.d.ts +15 -0
  759. package/dist/ir/row-pairs.js +373 -0
  760. package/dist/ir/row-pairs.js.map +1 -0
  761. package/dist/ir/row-pairs.test.d.ts +1 -0
  762. package/dist/ir/row-pairs.test.js +129 -0
  763. package/dist/ir/row-pairs.test.js.map +1 -0
  764. package/dist/ir/runtime-features.d.ts +17 -4
  765. package/dist/ir/runtime-features.js +94 -13
  766. package/dist/ir/runtime-features.js.map +1 -1
  767. package/dist/ir/scalar-records.d.ts +15 -0
  768. package/dist/ir/scalar-records.js +301 -1
  769. package/dist/ir/scalar-records.js.map +1 -1
  770. package/dist/ir/scalar-records.test.js +181 -1
  771. package/dist/ir/scalar-records.test.js.map +1 -1
  772. package/dist/ir/self-captures.js +8 -0
  773. package/dist/ir/self-captures.js.map +1 -1
  774. package/dist/ir/validate.js +78 -28
  775. package/dist/ir/validate.js.map +1 -1
  776. package/dist/library/fence-eval.js +4 -4
  777. package/dist/library/fence-eval.js.map +1 -1
  778. package/dist/library/ir-policy.js +5 -0
  779. package/dist/library/ir-policy.js.map +1 -1
  780. package/dist/library/library-cache.d.ts +1 -0
  781. package/dist/library/library-cache.js +1 -0
  782. package/dist/library/library-cache.js.map +1 -1
  783. package/dist/library/library-cache.test.js +13 -0
  784. package/dist/library/library-cache.test.js.map +1 -1
  785. package/dist/native/cache.d.ts +5 -1
  786. package/dist/native/cache.js +15 -3
  787. package/dist/native/cache.js.map +1 -1
  788. package/dist/native/cli.js +6 -0
  789. package/dist/native/cli.js.map +1 -1
  790. package/dist/native/compiler.d.ts +3 -0
  791. package/dist/native/compiler.js +72 -26
  792. package/dist/native/compiler.js.map +1 -1
  793. package/dist/native/compiler.test.js +87 -2
  794. package/dist/native/compiler.test.js.map +1 -1
  795. package/dist/native/executable-cache-open.test.d.ts +1 -0
  796. package/dist/native/executable-cache-open.test.js +80 -0
  797. package/dist/native/executable-cache-open.test.js.map +1 -0
  798. package/dist/native/executable-cache.d.ts +43 -3
  799. package/dist/native/executable-cache.js +177 -36
  800. package/dist/native/executable-cache.js.map +1 -1
  801. package/dist/native/executable-cache.test.js +103 -0
  802. package/dist/native/executable-cache.test.js.map +1 -1
  803. package/dist/native/prepare.d.ts +1 -1
  804. package/dist/native/prepare.js +49 -17
  805. package/dist/native/prepare.js.map +1 -1
  806. package/dist/native/prepare.test.js +69 -3
  807. package/dist/native/prepare.test.js.map +1 -1
  808. package/dist/native/sanitizer.d.ts +1 -1
  809. package/dist/native/sanitizer.js +17 -3
  810. package/dist/native/sanitizer.js.map +1 -1
  811. package/dist/native/sanitizer.test.js +4 -0
  812. package/dist/native/sanitizer.test.js.map +1 -1
  813. package/dist/node-islands/classify.d.ts +14 -0
  814. package/dist/node-islands/classify.js +114 -0
  815. package/dist/node-islands/classify.js.map +1 -0
  816. package/dist/node-islands/detect.d.ts +13 -0
  817. package/dist/node-islands/detect.js +805 -0
  818. package/dist/node-islands/detect.js.map +1 -0
  819. package/dist/node-islands/detect.test.d.ts +1 -0
  820. package/dist/node-islands/detect.test.js +136 -0
  821. package/dist/node-islands/detect.test.js.map +1 -0
  822. package/dist/node-islands/origin.d.ts +21 -0
  823. package/dist/node-islands/origin.js +60 -0
  824. package/dist/node-islands/origin.js.map +1 -0
  825. package/dist/node-islands/policy.d.ts +49 -0
  826. package/dist/node-islands/policy.js +130 -0
  827. package/dist/node-islands/policy.js.map +1 -0
  828. package/dist/node-islands/report.d.ts +22 -0
  829. package/dist/node-islands/report.js +326 -0
  830. package/dist/node-islands/report.js.map +1 -0
  831. package/dist/node-islands/report.test.d.ts +1 -0
  832. package/dist/node-islands/report.test.js +228 -0
  833. package/dist/node-islands/report.test.js.map +1 -0
  834. package/dist/node-islands/rules.d.ts +20 -0
  835. package/dist/node-islands/rules.js +91 -0
  836. package/dist/node-islands/rules.js.map +1 -0
  837. package/dist/node-islands/scan.d.ts +53 -0
  838. package/dist/node-islands/scan.js +104 -0
  839. package/dist/node-islands/scan.js.map +1 -0
  840. package/dist/node-islands/summary.d.ts +78 -0
  841. package/dist/node-islands/summary.js +26 -0
  842. package/dist/node-islands/summary.js.map +1 -0
  843. package/dist/project-config.d.ts +50 -0
  844. package/dist/project-config.js +372 -0
  845. package/dist/project-config.js.map +1 -0
  846. package/dist/project-config.test.d.ts +1 -0
  847. package/dist/project-config.test.js +154 -0
  848. package/dist/project-config.test.js.map +1 -0
  849. package/dist/wasm/discover.js +6 -31
  850. package/dist/wasm/discover.js.map +1 -1
  851. package/package.json +20 -20
  852. package/surface-manifest.json +21 -38
@@ -1,7 +1,11 @@
1
+ import * as ts from "../../ts7/adapter.js";
2
+ import { CONTRACT_TYPES_MODULE } from "../../contract-types.js";
1
3
  import { keyedHelperName } from "../stable-names.js";
4
+ import { writtenLocals } from "../../../ir/callback-specialization.js";
5
+ import { AmbientReceiverReaders } from "../../../ir/receiver-readers.js";
2
6
  import { boolLit, countedFor, numLit, varRef } from "../../../ir/build.js";
3
7
  import { BOOL, F64, VOID, typeEquals, typeKey, } from "../../../ir/ir.js";
4
- import { everyExprChild, everyStmtChild, everyStmtList, transformStmtList, } from "../../../ir/traverse.js";
8
+ import { everyExpr, everyExprChild, everyStmt, everyStmtChild, everyStmtList, transformExpr, transformStmtList, } from "../../../ir/traverse.js";
5
9
  import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, } from "../array-values.js";
6
10
  const PRODUCERS = new Set(["map", "filter", "flatMap", "flatMapArray"]);
7
11
  const TERMINALS = new Set([
@@ -454,6 +458,70 @@ function matchChain(lowerer, e) {
454
458
  loc: e.loc,
455
459
  };
456
460
  }
461
+ /** The outermost array-HOF call of `e` on its own, over its receiver. */
462
+ function loneChain(lowerer, e) {
463
+ const top = stageOf(lowerer, e);
464
+ if (!top)
465
+ return null;
466
+ const { stage, receiver } = top;
467
+ if (receiver.type.kind !== "array")
468
+ return null;
469
+ const stages = [];
470
+ let terminal;
471
+ if (TERMINALS.has(stage.info.method)) {
472
+ const init = stage.info.method === "reduce" && stage.info.hasInit && e.kind === "call" ? e.args[2] : null;
473
+ terminal = { kind: "call", stage, init };
474
+ }
475
+ else if (PRODUCERS.has(stage.info.method)) {
476
+ terminal = { kind: "collect" };
477
+ stages.push(stage);
478
+ }
479
+ else
480
+ return null;
481
+ return {
482
+ source: receiver,
483
+ sourceType: receiver.type,
484
+ slice: null,
485
+ stages,
486
+ terminal,
487
+ type: e.type,
488
+ loc: e.loc,
489
+ };
490
+ }
491
+ /** The callbacks of `chain` in order, or null when its stages cannot run
492
+ * in one loop: element types that do not line up, an array argument past
493
+ * the first stage, reduce without a seed, or findIndex over holes. */
494
+ function chainCallbacks(chain) {
495
+ const { stages, terminal } = chain;
496
+ const terminalStage = terminal.kind === "call" ? terminal.stage : null;
497
+ const callbacks = terminalStage ? [...stages, terminalStage] : stages;
498
+ // Element types must line up stage to stage.
499
+ let elem = chain.sourceType.elem;
500
+ for (const stage of callbacks) {
501
+ if (!typeEquals(stage.info.elem, elem))
502
+ return null;
503
+ if (stage.info.method === "filter" && !typeEquals(stage.info.outElem, stage.info.elem))
504
+ return null;
505
+ if ((stage.info.method === "map" || stage.info.method === "flatMap") &&
506
+ !typeEquals(stage.info.outElem, stage.info.fnRet))
507
+ return null;
508
+ elem = stage.info.outElem;
509
+ }
510
+ // Index arguments are reproduced; an array argument only names the source.
511
+ for (let k = 0; k < callbacks.length; k++) {
512
+ const stage = callbacks[k];
513
+ const lead = stage.info.method === "reduce" ? 1 : 0;
514
+ if (stage.info.arity > lead + 3)
515
+ return null;
516
+ if (stage.info.arity === lead + 3 && (k !== 0 || chain.slice))
517
+ return null;
518
+ }
519
+ if (terminalStage?.info.method === "reduce" && !terminalStage.info.hasInit)
520
+ return null;
521
+ if (terminalStage?.info.method === "findIndex" && holeCarrying(chain))
522
+ return null;
523
+ return callbacks;
524
+ }
457
525
  /** Fuse chains of array-HOF helper calls into one loop.
458
526
  *
459
527
  * `xs.filter(f).map(g).reduce(h, z)` lowers to nested helper calls, each
@@ -500,9 +568,27 @@ class PipelineFusion {
500
568
  added = [];
501
569
  effects;
502
570
  helpers = new Map();
571
+ /** Bindings each function, or a closure it creates, writes after their
572
+ * declaration. */
573
+ written;
574
+ /** classCaptured's answers by function name. */
575
+ classCaptures = new Map();
576
+ /** Whether a module imports or re-exports the contract types. */
577
+ contractTypes;
578
+ /** Bindings of the function being fused that inlined callbacks captured. */
579
+ inlinedCaptures = new Set();
580
+ /** The helper calls each callback with an undefined receiver; a copied
581
+ * body runs under the receiver around the array call instead. */
582
+ receivers;
503
583
  constructor(lowerer, functions) {
504
584
  this.lowerer = lowerer;
505
585
  this.effects = new CallbackEffects(functions, lowerer.globalsList);
586
+ this.written = writtenLocals({ functions });
587
+ this.receivers = new AmbientReceiverReaders(new Map(functions.map((fn) => [fn.name, fn])));
588
+ this.contractTypes = lowerer.moduleOrder.some((sf) => sf.statements.nodes.some((st) => (ts.isImportDeclaration(st) || ts.isExportDeclaration(st)) &&
589
+ st.moduleSpecifier !== undefined &&
590
+ ts.isStringLiteral(st.moduleSpecifier) &&
591
+ st.moduleSpecifier.text === CONTRACT_TYPES_MODULE));
506
592
  }
507
593
  run(fn) {
508
594
  const infos = this.lowerer.arrHofInfo;
@@ -513,6 +599,7 @@ class PipelineFusion {
513
599
  if (!candidate)
514
600
  return;
515
601
  const removed = new Set();
602
+ this.inlinedCaptures = new Set();
516
603
  let body = this.lists(fn.body, fn, removed);
517
604
  body = transformStmtList(body, {
518
605
  stmt: (s) => s,
@@ -521,6 +608,8 @@ class PipelineFusion {
521
608
  fn.body = body;
522
609
  if (removed.size > 0)
523
610
  fn.locals = fn.locals.filter((l) => !removed.has(l.id));
611
+ if (this.inlinedCaptures.size > 0)
612
+ unboxUncaptured(fn, this.inlinedCaptures);
524
613
  }
525
614
  /* ── statement lists: fold single-use chain bindings ── */
526
615
  lists(list, fn, removed) {
@@ -645,43 +734,55 @@ class PipelineFusion {
645
734
  }
646
735
  /* ── expressions ── */
647
736
  fuse(e, fn) {
648
- const plan = this.plan(e, fn);
737
+ const plan = this.plan(e, fn) ?? this.lonePlan(e, fn);
649
738
  return plan ? this.emit(plan) : null;
650
739
  }
740
+ /** One array-HOF call on its own (or the last call of a chain that does
741
+ * not fuse), when every callback is a closure literal whose body can be
742
+ * copied into the loop. A single stage reorders nothing, so the
743
+ * callbacks' effects need no model; their captured bindings must keep
744
+ * one value while the loop runs (stableTarget), since the loop reads
745
+ * them once, when it starts. The loop keeps the helper's order: the
746
+ * length read once, each element read when it is visited, holes
747
+ * skipped (and kept by map). */
748
+ lonePlan(e, fn) {
749
+ const chain = loneChain(this.lowerer, e);
750
+ if (!chain)
751
+ return null;
752
+ const callbacks = chainCallbacks(chain);
753
+ if (!callbacks)
754
+ return null;
755
+ const inline = this.stableTarget(fn);
756
+ let frame;
757
+ for (const stage of callbacks) {
758
+ for (const arg of [stage.slow, stage.fast]) {
759
+ if (!arg)
760
+ continue;
761
+ const target = inline(arg);
762
+ if (!target)
763
+ return null;
764
+ frame ??= target.sourceName;
765
+ }
766
+ }
767
+ return {
768
+ chain,
769
+ callbacks,
770
+ writes: new Set(),
771
+ risky: true,
772
+ inline,
773
+ ...(frame === undefined ? {} : { frame }),
774
+ };
775
+ }
651
776
  /** Decide whether `e` is a fusable chain; null when it is not. */
652
777
  plan(e, fn) {
653
778
  const chain = matchChain(this.lowerer, e);
654
779
  if (!chain)
655
780
  return null;
781
+ const callbacks = chainCallbacks(chain);
782
+ if (!callbacks)
783
+ return null;
656
784
  const { stages, terminal } = chain;
657
785
  const terminalStage = terminal.kind === "call" ? terminal.stage : null;
658
- const callbacks = terminalStage ? [...stages, terminalStage] : stages;
659
- // Element types must line up stage to stage.
660
- let elem = chain.sourceType.elem;
661
- for (const stage of callbacks) {
662
- if (!typeEquals(stage.info.elem, elem))
663
- return null;
664
- if (stage.info.method === "filter" && !typeEquals(stage.info.outElem, stage.info.elem))
665
- return null;
666
- if ((stage.info.method === "map" || stage.info.method === "flatMap") &&
667
- !typeEquals(stage.info.outElem, stage.info.fnRet))
668
- return null;
669
- elem = stage.info.outElem;
670
- }
671
- // Index arguments are reproduced; an array argument only names the source.
672
- for (let k = 0; k < callbacks.length; k++) {
673
- const stage = callbacks[k];
674
- const lead = stage.info.method === "reduce" ? 1 : 0;
675
- if (stage.info.arity > lead + 3)
676
- return null;
677
- if (stage.info.arity === lead + 3 && (k !== 0 || chain.slice))
678
- return null;
679
- }
680
- if (terminalStage?.info.method === "reduce" && !terminalStage.info.hasInit)
681
- return null;
682
- const holes = holeCarrying(chain);
683
- if (terminalStage?.info.method === "findIndex" && holes)
684
- return null;
685
786
  // Effects of each callback, in chain order.
686
787
  const scope = this.effects.scope(fn, true);
687
788
  const summaries = [];
@@ -758,35 +859,90 @@ class PipelineFusion {
758
859
  * are passed in by value, read when the fused call starts; no callback
759
860
  * in the chain assigns a binding another one reads). */
760
861
  inlineTarget = (arg) => {
761
- if (arg.kind !== "closure" || arg.adapts)
762
- return null;
763
- const fn = this.effects.fn(arg.fnName);
764
- if (!fn || fn.async || fn.generator || fn.classCaptures?.length)
862
+ const fn = this.closureTarget(arg);
863
+ if (!fn)
765
864
  return null;
766
865
  const captures = new Set((fn.captures ?? []).map((c) => c.localId));
767
- if (captures.size !== arg.captures.length)
768
- return null;
769
866
  const effects = this.effects.ofFunction(fn);
770
867
  if (!effects || intersects(effects.writes, captures))
771
868
  return null;
772
- if (fn.locals.some((l) => l.tdz || (l.boxed && !captures.has(l.id))))
773
- return null;
774
- let size = 0;
775
- const small = everyStmtList(fn.body, {
776
- expr: (e) => ++size <= MAX_INLINE_NODES && e.kind !== "closure" && e.kind !== "selfRef",
777
- stmt: (s) => ++size <= MAX_INLINE_NODES && s.kind !== "tryCatch",
778
- });
779
- return small ? fn : null;
869
+ return inlinableBody(fn, captures) ? fn : null;
780
870
  };
871
+ /** inlineTarget for a callback created in `fn` whose captured bindings
872
+ * nothing assigns after their declaration: `fn`'s own locals and
873
+ * parameters, written neither by `fn` nor by any closure that shares
874
+ * them, and not by the callback body. A binding a local class captures
875
+ * counts as written, since its methods may assign it; so does a binding
876
+ * a method reads through its class's captures. The callback must
877
+ * not observe the ambient receiver (AmbientReceiverReaders). */
878
+ stableTarget(fn) {
879
+ const locals = new Map(fn.locals.map((l) => [l.id, l]));
880
+ const inherited = new Set([...(fn.captures ?? []), ...(fn.classCaptures ?? [])].map((c) => c.localId));
881
+ const written = this.written.get(fn.name);
882
+ const classCaptured = this.classCaptured(fn);
883
+ return (arg) => {
884
+ const target = this.closureTarget(arg);
885
+ if (!target || !written || arg.kind !== "closure")
886
+ return null;
887
+ if (!this.receivers.ignores(target))
888
+ return null;
889
+ for (const id of arg.captures) {
890
+ const local = locals.get(id);
891
+ if (!local || local.tdz || inherited.has(id) || written.has(id) || classCaptured.has(id))
892
+ return null;
893
+ }
894
+ const captures = new Set((target.captures ?? []).map((c) => c.localId));
895
+ const assigns = !everyStmtList(target.body, {
896
+ stmt: (st) => !((st.kind === "assign" || st.kind === "forOf") && captures.has(st.localId)),
897
+ expr: (ex) => !((ex.kind === "assignExpr" || ex.kind === "incDec") && captures.has(ex.localId)),
898
+ });
899
+ return !assigns && inlinableBody(target, captures) ? target : null;
900
+ };
901
+ }
902
+ /** The bindings of `fn` that a local class it creates captures. */
903
+ classCaptured(fn) {
904
+ const known = this.classCaptures.get(fn.name);
905
+ if (known)
906
+ return known;
907
+ const ids = new Set();
908
+ everyStmtList(fn.body, {
909
+ expr: (e) => {
910
+ if (e.kind === "classRef")
911
+ for (const id of e.captures ?? [])
912
+ ids.add(id);
913
+ return true;
914
+ },
915
+ stmt: () => true,
916
+ });
917
+ this.classCaptures.set(fn.name, ids);
918
+ return ids;
919
+ }
920
+ /** The function behind a closure-literal callback the loop can inline. */
921
+ closureTarget(arg) {
922
+ if (arg.kind !== "closure" || arg.adapts)
923
+ return null;
924
+ const fn = this.effects.fn(arg.fnName);
925
+ if (!fn || fn.async || fn.generator || fn.classCaptures?.length)
926
+ return null;
927
+ if ((fn.captures ?? []).length !== arg.captures.length)
928
+ return null;
929
+ return fn;
930
+ }
781
931
  emit(plan) {
782
- const built = new FusedLoop(this.lowerer, plan.chain, this.inlineTarget).build();
932
+ const built = new FusedLoop(this.lowerer, plan.chain, plan.inline ?? this.inlineTarget, this.contractTypes).build();
783
933
  if (!built)
784
934
  return null;
935
+ for (const id of built.inlinedCaptures)
936
+ this.inlinedCaptures.add(id);
785
937
  let name = this.helpers.get(built.key);
786
938
  if (!name) {
787
- name = keyedHelperName(this.lowerer, "%arr.fused", built.key);
939
+ name = keyedHelperName(this.lowerer, plan.inline ? "%arr.loop" : "%arr.fused", built.key);
788
940
  this.helpers.set(built.key, name);
789
- this.added.push({ ...built.fn, name });
941
+ const helper = { ...built.fn, name };
942
+ // A lone call's loop stands in the inlined callback's stack frame.
943
+ if (plan.frame !== undefined)
944
+ helper.sourceName = plan.frame;
945
+ this.added.push(helper);
790
946
  }
791
947
  return {
792
948
  kind: "call",
@@ -797,6 +953,47 @@ class PipelineFusion {
797
953
  };
798
954
  }
799
955
  }
956
+ /** Whether a statement inside `e` (a sequence expression's) returns. */
957
+ function returns(e) {
958
+ return !everyExpr(e, { expr: () => true, stmt: (s) => s.kind !== "return" });
959
+ }
960
+ /** Drops the box of each binding in `inlined` that no closure or class
961
+ * created in `fn` captures any more: the callbacks that captured it were
962
+ * copied into loops, which receive its value. A dead-zone binding keeps the
963
+ * box that represents its uninitialized state, and bindings `fn` itself
964
+ * captures keep theirs. */
965
+ function unboxUncaptured(fn, inlined) {
966
+ const captured = new Set();
967
+ everyStmtList(fn.body, {
968
+ expr: (e) => {
969
+ if (e.kind === "closure" || e.kind === "classRef")
970
+ for (const id of e.captures ?? [])
971
+ captured.add(id);
972
+ return true;
973
+ },
974
+ stmt: () => true,
975
+ });
976
+ const inherited = new Set([...(fn.captures ?? []), ...(fn.classCaptures ?? [])].map((c) => c.localId));
977
+ fn.locals = fn.locals.map((local) => {
978
+ if (local.boxed !== true || local.tdz === true || !inlined.has(local.id))
979
+ return local;
980
+ if (captured.has(local.id) || inherited.has(local.id))
981
+ return local;
982
+ const { boxed: _boxed, ...plain } = local;
983
+ return plain;
984
+ });
985
+ }
986
+ /** A callback body the loop can copy: small, no nested closures, recursion
987
+ * or try statements, and no boxed locals besides its captures. */
988
+ function inlinableBody(fn, captures) {
989
+ if (fn.locals.some((l) => l.tdz || (l.boxed && !captures.has(l.id))))
990
+ return false;
991
+ let size = 0;
992
+ return everyStmtList(fn.body, {
993
+ expr: (e) => ++size <= MAX_INLINE_NODES && e.kind !== "closure" && e.kind !== "selfRef",
994
+ stmt: (s) => ++size <= MAX_INLINE_NODES && s.kind !== "tryCatch",
995
+ });
996
+ }
800
997
  function intersects(a, b) {
801
998
  for (const id of a)
802
999
  if (b.has(id))
@@ -889,6 +1086,7 @@ class FusedLoop {
889
1086
  lowerer;
890
1087
  chain;
891
1088
  inlineTarget;
1089
+ contractTypes;
892
1090
  params = [];
893
1091
  locals = [];
894
1092
  args = [];
@@ -897,18 +1095,21 @@ class FusedLoop {
897
1095
  loc;
898
1096
  next = 0;
899
1097
  failed = false;
900
- constructor(lowerer, chain, inlineTarget) {
1098
+ /** `contractTypes`: the program writes contract types, which the
1099
+ * contract checker binds to source bindings. */
1100
+ constructor(lowerer, chain, inlineTarget, contractTypes) {
901
1101
  this.lowerer = lowerer;
902
1102
  this.chain = chain;
903
1103
  this.inlineTarget = inlineTarget;
1104
+ this.contractTypes = contractTypes;
904
1105
  this.loc = chain.loc;
905
1106
  }
906
1107
  fresh(name) {
907
1108
  return `${name}.${this.next++}`;
908
1109
  }
909
- local(name, type, mutable = false) {
1110
+ local(name, type, mutable = false, source) {
910
1111
  const id = this.fresh(name);
911
- this.locals.push({ id, name, type, mutable });
1112
+ this.locals.push(source ? { id, name, type, mutable, source } : { id, name, type, mutable });
912
1113
  return id;
913
1114
  }
914
1115
  param(name, value, key) {
@@ -924,7 +1125,9 @@ class FusedLoop {
924
1125
  const known = this.callees.find((c) => c.arg === arg);
925
1126
  if (known)
926
1127
  return known;
927
- const target = this.inlineTarget(arg);
1128
+ // Called as a plain function: the loop is not the target's receiver.
1129
+ const inlineTarget = this.inlineTarget;
1130
+ const target = inlineTarget(arg);
928
1131
  let callee;
929
1132
  if (target && arg.kind === "closure") {
930
1133
  const captures = new Map();
@@ -974,10 +1177,18 @@ class FusedLoop {
974
1177
  return true;
975
1178
  },
976
1179
  });
1180
+ // Copies keep their source bindings, so contract types written on
1181
+ // them are checked against what the loop stores. In a program that
1182
+ // writes contract types, a parameter with a source binding keeps its
1183
+ // own local for the same reason.
1184
+ const sources = new Map(fn.locals.map((l) => [l.id, l.source]));
977
1185
  const aliased = new Set();
978
1186
  fn.params.forEach((p, index) => {
979
1187
  const arg = args[index];
980
- if (arg.kind === "varRef" && !assigned.has(p.localId) && typeEquals(arg.type, p.type)) {
1188
+ if (arg.kind === "varRef" &&
1189
+ !assigned.has(p.localId) &&
1190
+ typeEquals(arg.type, p.type) &&
1191
+ !(this.contractTypes && sources.get(p.localId) !== undefined)) {
981
1192
  renamed.set(p.localId, arg.localId);
982
1193
  aliased.add(p.localId);
983
1194
  }
@@ -985,11 +1196,31 @@ class FusedLoop {
985
1196
  for (const l of fn.locals) {
986
1197
  if (renamed.has(l.id))
987
1198
  continue;
988
- const id = this.local(l.name, l.type, true);
1199
+ const id = this.local(l.name, l.type, true, l.source);
989
1200
  renamed.set(l.id, id);
990
1201
  }
1202
+ const rename = (id) => renamed.get(id) ?? id;
1203
+ const renameExpr = (e) => {
1204
+ switch (e.kind) {
1205
+ case "varRef":
1206
+ case "incDec":
1207
+ case "assignExpr":
1208
+ return { ...e, localId: rename(e.localId) };
1209
+ default:
1210
+ return e;
1211
+ }
1212
+ };
1213
+ // A bound parameter's value is an element or index with no source text
1214
+ // of its own; it is located at the parameter, without a span.
1215
+ const bind = fn.params.flatMap((p, index) => {
1216
+ if (aliased.has(p.localId))
1217
+ return [];
1218
+ const source = sources.get(p.localId);
1219
+ const arg = args[index];
1220
+ const init = source ? { ...arg, loc: { ...source.loc, end: source.loc.start } } : arg;
1221
+ return [{ kind: "varDecl", localId: rename(p.localId), init, loc }];
1222
+ });
991
1223
  const labels = new Map();
992
- const exit = this.fresh("%fused.exit");
993
1224
  const label = (name) => {
994
1225
  let id = labels.get(name);
995
1226
  if (!id) {
@@ -998,19 +1229,51 @@ class FusedLoop {
998
1229
  }
999
1230
  return id;
1000
1231
  };
1232
+ /** Locals and labels of a copied statement; returns are the caller's. */
1233
+ const renameStmt = (st) => {
1234
+ switch (st.kind) {
1235
+ case "varDecl":
1236
+ case "assign":
1237
+ return { ...st, localId: rename(st.localId) };
1238
+ case "break":
1239
+ case "continue":
1240
+ return st.label ? { ...st, label: label(st.label) } : st;
1241
+ case "forOf": {
1242
+ const renamedFor = { ...st, localId: rename(st.localId) };
1243
+ return st.labels ? { ...renamedFor, labels: st.labels.map(label) } : renamedFor;
1244
+ }
1245
+ case "while":
1246
+ case "doWhile":
1247
+ case "for":
1248
+ case "switch":
1249
+ case "block":
1250
+ return st.labels ? { ...st, labels: st.labels.map(label) } : st;
1251
+ default:
1252
+ return st;
1253
+ }
1254
+ };
1255
+ // A body whose only return is its last statement (`(x) => x * k`,
1256
+ // `{ const y = x * 2; return y > 4; }`) needs no exit block: its other
1257
+ // statements run after the bindings, and the call's value is the
1258
+ // returned expression.
1259
+ const last = fn.body[fn.body.length - 1];
1260
+ const prefix = fn.body.slice(0, -1);
1261
+ if (last !== undefined &&
1262
+ last.kind === "return" &&
1263
+ last.value !== null &&
1264
+ typeEquals(last.value.type, fn.returnType) &&
1265
+ !returns(last.value) &&
1266
+ prefix.every((st) => everyStmt(st, { expr: () => true, stmt: (x) => x.kind !== "return" }))) {
1267
+ const copy = { expr: renameExpr, stmt: renameStmt };
1268
+ return {
1269
+ pre: [...bind, ...transformStmtList(prefix, copy)],
1270
+ value: transformExpr(last.value, copy),
1271
+ };
1272
+ }
1273
+ const exit = this.fresh("%fused.exit");
1001
1274
  const result = fn.returnType.kind === "void" ? null : this.local("ret", fn.returnType, true);
1002
- const rename = (id) => renamed.get(id) ?? id;
1003
1275
  const body = transformStmtList(fn.body, {
1004
- expr: (e) => {
1005
- switch (e.kind) {
1006
- case "varRef":
1007
- case "incDec":
1008
- case "assignExpr":
1009
- return { ...e, localId: rename(e.localId) };
1010
- default:
1011
- return e;
1012
- }
1013
- },
1276
+ expr: renameExpr,
1014
1277
  stmt: (s) => {
1015
1278
  switch (s.kind) {
1016
1279
  case "return": {
@@ -1030,25 +1293,14 @@ class FusedLoop {
1030
1293
  loc: s.loc,
1031
1294
  };
1032
1295
  }
1033
- case "varDecl":
1034
- case "assign":
1035
- return { ...s, localId: rename(s.localId) };
1036
1296
  case "break":
1037
1297
  case "continue":
1038
1298
  return s.label && s.label !== exit ? { ...s, label: label(s.label) } : s;
1039
- case "while":
1040
- case "doWhile":
1041
- case "for":
1042
- case "block":
1043
- return s.labels ? { ...s, labels: s.labels.map(label) } : s;
1044
1299
  default:
1045
- return s;
1300
+ return renameStmt(s);
1046
1301
  }
1047
1302
  },
1048
1303
  });
1049
- const bind = fn.params.flatMap((p, index) => aliased.has(p.localId)
1050
- ? []
1051
- : [{ kind: "varDecl", localId: rename(p.localId), init: args[index], loc }]);
1052
1304
  const pre = [];
1053
1305
  if (result !== null)
1054
1306
  pre.push({ kind: "varDecl", localId: result, init: null, loc });
@@ -1523,7 +1775,8 @@ class FusedLoop {
1523
1775
  };
1524
1776
  foldKnownUnions(fn);
1525
1777
  scalarizeRecordTemporaries(this.lowerer, fn);
1526
- return { fn, args: this.args, key: this.keyParts.join("|") };
1778
+ const inlinedCaptures = this.callees.flatMap((c) => c.inline && c.arg.kind === "closure" ? c.arg.captures : []);
1779
+ return { fn, args: this.args, key: this.keyParts.join("|"), inlinedCaptures };
1527
1780
  }
1528
1781
  }
1529
1782
  function increment(id, loc) {
@@ -1623,8 +1876,11 @@ function foldKnownUnions(fn) {
1623
1876
  case "for":
1624
1877
  case "while":
1625
1878
  case "doWhile":
1879
+ case "forOf":
1626
1880
  case "block":
1627
1881
  return { ...s, body: prune(s.body) };
1882
+ case "switch":
1883
+ return { ...s, cases: s.cases.map((c) => ({ ...c, body: prune(c.body) })) };
1628
1884
  default:
1629
1885
  return s;
1630
1886
  }
@@ -1816,6 +2072,19 @@ function scalarizeRecordTemporaries(lowerer, fn) {
1816
2072
  body: rewriteList(s.body),
1817
2073
  },
1818
2074
  ];
2075
+ case "forOf":
2076
+ return [{ ...s, iterable: rewriteExpr(s.iterable), body: rewriteList(s.body) }];
2077
+ case "switch":
2078
+ return [
2079
+ {
2080
+ ...s,
2081
+ disc: rewriteExpr(s.disc),
2082
+ cases: s.cases.map((c) => ({
2083
+ test: c.test === null ? null : rewriteExpr(c.test),
2084
+ body: rewriteList(c.body),
2085
+ })),
2086
+ },
2087
+ ];
1819
2088
  case "block":
1820
2089
  return [{ ...s, body: rewriteList(s.body) }];
1821
2090
  default: {