@scriptc/compiler 0.2.6 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +7 -18
  2. package/dist/backend/cycle-analysis.d.ts +21 -9
  3. package/dist/backend/cycle-analysis.js +139 -67
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +283 -3
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +39 -0
  8. package/dist/backend/cycle-mutability.js +205 -0
  9. package/dist/backend/cycle-mutability.js.map +1 -0
  10. package/dist/backend/link-plan-core.d.ts +2 -1
  11. package/dist/backend/link-plan-core.js +15 -3
  12. package/dist/backend/link-plan-core.js.map +1 -1
  13. package/dist/backend/link-plan.d.ts +2 -1
  14. package/dist/backend/link-plan.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +43 -0
  16. package/dist/backend/llvm/alloc.js +246 -0
  17. package/dist/backend/llvm/alloc.js.map +1 -0
  18. package/dist/backend/llvm/alloc.test.d.ts +1 -0
  19. package/dist/backend/llvm/alloc.test.js +102 -0
  20. package/dist/backend/llvm/alloc.test.js.map +1 -0
  21. package/dist/backend/llvm/blocks.d.ts +9 -0
  22. package/dist/backend/llvm/blocks.js +9 -0
  23. package/dist/backend/llvm/blocks.js.map +1 -1
  24. package/dist/backend/llvm/borrowed-receivers.d.ts +7 -0
  25. package/dist/backend/llvm/borrowed-receivers.js +39 -0
  26. package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
  27. package/dist/backend/llvm/call-lifetimes.d.ts +18 -3
  28. package/dist/backend/llvm/call-lifetimes.js +54 -19
  29. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  30. package/dist/backend/llvm/call-lifetimes.test.js +178 -3
  31. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  32. package/dist/backend/llvm/checked-narrows.d.ts +24 -0
  33. package/dist/backend/llvm/checked-narrows.js +108 -0
  34. package/dist/backend/llvm/checked-narrows.js.map +1 -0
  35. package/dist/backend/llvm/checked-narrows.test.d.ts +1 -0
  36. package/dist/backend/llvm/checked-narrows.test.js +208 -0
  37. package/dist/backend/llvm/checked-narrows.test.js.map +1 -0
  38. package/dist/backend/llvm/classes.d.ts +16 -1
  39. package/dist/backend/llvm/classes.js +60 -49
  40. package/dist/backend/llvm/classes.js.map +1 -1
  41. package/dist/backend/llvm/classes.test.js +68 -6
  42. package/dist/backend/llvm/classes.test.js.map +1 -1
  43. package/dist/backend/llvm/common.d.ts +13 -0
  44. package/dist/backend/llvm/common.js +30 -0
  45. package/dist/backend/llvm/common.js.map +1 -1
  46. package/dist/backend/llvm/constant-callbacks.d.ts +19 -3
  47. package/dist/backend/llvm/constant-callbacks.js +289 -52
  48. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  49. package/dist/backend/llvm/constant-callbacks.test.js +140 -3
  50. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  51. package/dist/backend/llvm/debug-info.d.ts +6 -2
  52. package/dist/backend/llvm/debug-info.js +11 -1
  53. package/dist/backend/llvm/debug-info.js.map +1 -1
  54. package/dist/backend/llvm/dense-array-access.d.ts +29 -0
  55. package/dist/backend/llvm/dense-array-access.js +335 -0
  56. package/dist/backend/llvm/dense-array-access.js.map +1 -0
  57. package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
  58. package/dist/backend/llvm/dense-array-access.test.js +238 -0
  59. package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
  60. package/dist/backend/llvm/dyn.d.ts +38 -0
  61. package/dist/backend/llvm/dyn.js +213 -14
  62. package/dist/backend/llvm/dyn.js.map +1 -1
  63. package/dist/backend/llvm/emitter.d.ts +308 -15
  64. package/dist/backend/llvm/emitter.js +1788 -206
  65. package/dist/backend/llvm/emitter.js.map +1 -1
  66. package/dist/backend/llvm/emitter.test.js +89 -7
  67. package/dist/backend/llvm/emitter.test.js.map +1 -1
  68. package/dist/backend/llvm/expr-async.js +62 -8
  69. package/dist/backend/llvm/expr-async.js.map +1 -1
  70. package/dist/backend/llvm/expr-async.test.d.ts +1 -0
  71. package/dist/backend/llvm/expr-async.test.js +62 -0
  72. package/dist/backend/llvm/expr-async.test.js.map +1 -0
  73. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  74. package/dist/backend/llvm/expr-bytes.js +85 -8
  75. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  76. package/dist/backend/llvm/expr-callbacks.js +29 -21
  77. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  78. package/dist/backend/llvm/expr-calls.d.ts +5 -0
  79. package/dist/backend/llvm/expr-calls.js +118 -15
  80. package/dist/backend/llvm/expr-calls.js.map +1 -1
  81. package/dist/backend/llvm/expr-containers.d.ts +7 -1
  82. package/dist/backend/llvm/expr-containers.js +246 -32
  83. package/dist/backend/llvm/expr-containers.js.map +1 -1
  84. package/dist/backend/llvm/expr-control.js +113 -8
  85. package/dist/backend/llvm/expr-control.js.map +1 -1
  86. package/dist/backend/llvm/expr-dispatch.js +2 -0
  87. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  88. package/dist/backend/llvm/expr-dynamic.js +244 -44
  89. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  90. package/dist/backend/llvm/expr-island.js +3 -8
  91. package/dist/backend/llvm/expr-island.js.map +1 -1
  92. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  93. package/dist/backend/llvm/expr-primitives.js +93 -36
  94. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  95. package/dist/backend/llvm/expr-primitives.test.js +51 -3
  96. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  97. package/dist/backend/llvm/expr-records.js +31 -17
  98. package/dist/backend/llvm/expr-records.js.map +1 -1
  99. package/dist/backend/llvm/expr-stream-bridges.js +96 -29
  100. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  101. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  102. package/dist/backend/llvm/expr-stream-callbacks.js +6 -3
  103. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  104. package/dist/backend/llvm/integer-remainder.d.ts +11 -0
  105. package/dist/backend/llvm/integer-remainder.js +91 -0
  106. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  107. package/dist/backend/llvm/layouts.d.ts +3 -1
  108. package/dist/backend/llvm/layouts.js +3 -2
  109. package/dist/backend/llvm/layouts.js.map +1 -1
  110. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  111. package/dist/backend/llvm/lazy-captures.js +96 -0
  112. package/dist/backend/llvm/lazy-captures.js.map +1 -0
  113. package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
  114. package/dist/backend/llvm/lazy-captures.test.js +78 -0
  115. package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
  116. package/dist/backend/llvm/lib-abi.js +10 -0
  117. package/dist/backend/llvm/lib-abi.js.map +1 -1
  118. package/dist/backend/llvm/lib-filesystem.js +10 -15
  119. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  120. package/dist/backend/llvm/lib-process.js +8 -8
  121. package/dist/backend/llvm/lib-process.js.map +1 -1
  122. package/dist/backend/llvm/lib-shared.js +1 -0
  123. package/dist/backend/llvm/lib-shared.js.map +1 -1
  124. package/dist/backend/llvm/local-array-reads.d.ts +5 -1
  125. package/dist/backend/llvm/local-array-reads.js +147 -26
  126. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  127. package/dist/backend/llvm/local-array-reads.test.js +85 -4
  128. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  129. package/dist/backend/llvm/local-union-storage.d.ts +5 -1
  130. package/dist/backend/llvm/local-union-storage.js +54 -8
  131. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  132. package/dist/backend/llvm/local-union-storage.test.js +94 -6
  133. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  134. package/dist/backend/llvm/map-number-lookup.d.ts +18 -0
  135. package/dist/backend/llvm/map-number-lookup.js +62 -0
  136. package/dist/backend/llvm/map-number-lookup.js.map +1 -0
  137. package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -0
  138. package/dist/backend/llvm/map-read-lifetimes.js +24 -3
  139. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  140. package/dist/backend/llvm/map-read-lifetimes.test.js +39 -20
  141. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  142. package/dist/backend/llvm/nullable-fields.d.ts +28 -0
  143. package/dist/backend/llvm/nullable-fields.js +45 -0
  144. package/dist/backend/llvm/nullable-fields.js.map +1 -0
  145. package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
  146. package/dist/backend/llvm/nullable-fields.test.js +48 -0
  147. package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
  148. package/dist/backend/llvm/nullable-unions.d.ts +68 -0
  149. package/dist/backend/llvm/nullable-unions.js +132 -0
  150. package/dist/backend/llvm/nullable-unions.js.map +1 -0
  151. package/dist/backend/llvm/publish.d.ts +58 -0
  152. package/dist/backend/llvm/publish.js +286 -0
  153. package/dist/backend/llvm/publish.js.map +1 -0
  154. package/dist/backend/llvm/rebound-parameters.d.ts +12 -0
  155. package/dist/backend/llvm/rebound-parameters.js +72 -0
  156. package/dist/backend/llvm/rebound-parameters.js.map +1 -0
  157. package/dist/backend/llvm/rebound-parameters.test.d.ts +1 -0
  158. package/dist/backend/llvm/rebound-parameters.test.js +67 -0
  159. package/dist/backend/llvm/rebound-parameters.test.js.map +1 -0
  160. package/dist/backend/llvm/reference-effects.d.ts +18 -2
  161. package/dist/backend/llvm/reference-effects.js +106 -16
  162. package/dist/backend/llvm/reference-effects.js.map +1 -1
  163. package/dist/backend/llvm/reference-effects.test.js +52 -1
  164. package/dist/backend/llvm/reference-effects.test.js.map +1 -1
  165. package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
  166. package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
  167. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
  168. package/dist/backend/llvm/shapes.d.ts +104 -9
  169. package/dist/backend/llvm/shapes.js +356 -46
  170. package/dist/backend/llvm/shapes.js.map +1 -1
  171. package/dist/backend/llvm/shapes.test.js +139 -5
  172. package/dist/backend/llvm/shapes.test.js.map +1 -1
  173. package/dist/backend/llvm/stack-callbacks.js +2 -3
  174. package/dist/backend/llvm/stack-callbacks.js.map +1 -1
  175. package/dist/backend/llvm/stack-captures.d.ts +3 -1
  176. package/dist/backend/llvm/stack-captures.js +5 -3
  177. package/dist/backend/llvm/stack-captures.js.map +1 -1
  178. package/dist/backend/llvm/stack-unions.test.js +43 -3
  179. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  180. package/dist/backend/llvm/string-construction.d.ts +10 -0
  181. package/dist/backend/llvm/string-construction.js +42 -0
  182. package/dist/backend/llvm/string-construction.js.map +1 -1
  183. package/dist/backend/llvm/string-construction.test.js +1 -1
  184. package/dist/backend/llvm/string-key-hash.d.ts +15 -0
  185. package/dist/backend/llvm/string-key-hash.js +76 -0
  186. package/dist/backend/llvm/string-key-hash.js.map +1 -0
  187. package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
  188. package/dist/backend/llvm/string-key-hash.test.js +45 -0
  189. package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
  190. package/dist/backend/llvm/string-lifetimes.test.js +65 -15
  191. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  192. package/dist/backend/llvm/string-reads.d.ts +7 -0
  193. package/dist/backend/llvm/string-reads.js +76 -0
  194. package/dist/backend/llvm/string-reads.js.map +1 -0
  195. package/dist/backend/llvm/switch-dispatch.js +1 -1
  196. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  197. package/dist/backend/llvm/switch-dispatch.test.js +3 -3
  198. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  199. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -0
  200. package/dist/backend/llvm/test-boxed-unions.js +13 -0
  201. package/dist/backend/llvm/test-boxed-unions.js.map +1 -0
  202. package/dist/backend/llvm/union-repr.d.ts +15 -0
  203. package/dist/backend/llvm/union-repr.js +89 -0
  204. package/dist/backend/llvm/union-repr.js.map +1 -0
  205. package/dist/backend/llvm/virtual-borrows.d.ts +31 -0
  206. package/dist/backend/llvm/virtual-borrows.js +82 -0
  207. package/dist/backend/llvm/virtual-borrows.js.map +1 -0
  208. package/dist/backend/llvm/walk-borrows.d.ts +43 -0
  209. package/dist/backend/llvm/walk-borrows.js +150 -0
  210. package/dist/backend/llvm/walk-borrows.js.map +1 -0
  211. package/dist/backend/llvm/walk-borrows.test.d.ts +1 -0
  212. package/dist/backend/llvm/walk-borrows.test.js +119 -0
  213. package/dist/backend/llvm/walk-borrows.test.js.map +1 -0
  214. package/dist/backend/llvm/walkers.d.ts +5 -1
  215. package/dist/backend/llvm/walkers.js +24 -21
  216. package/dist/backend/llvm/walkers.js.map +1 -1
  217. package/dist/backend/may-throw.d.ts +29 -1
  218. package/dist/backend/may-throw.js +349 -3
  219. package/dist/backend/may-throw.js.map +1 -1
  220. package/dist/backend/may-throw.test.js +114 -2
  221. package/dist/backend/may-throw.test.js.map +1 -1
  222. package/dist/backend/native/cache-warm.d.ts +2 -1
  223. package/dist/backend/native/cache-warm.js.map +1 -1
  224. package/dist/backend/native/contracts.d.ts +3 -2
  225. package/dist/backend/native/contracts.js.map +1 -1
  226. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  227. package/dist/backend/native/runtime-inputs.js +2 -0
  228. package/dist/backend/native/runtime-inputs.js.map +1 -1
  229. package/dist/backend/native-codegen-core.d.ts +7 -4
  230. package/dist/backend/native-codegen-core.js +14 -9
  231. package/dist/backend/native-codegen-core.js.map +1 -1
  232. package/dist/backend/native-codegen.d.ts +9 -0
  233. package/dist/backend/native-codegen.js +53 -2
  234. package/dist/backend/native-codegen.js.map +1 -1
  235. package/dist/backend/native-codegen.test.js +64 -10
  236. package/dist/backend/native-codegen.test.js.map +1 -1
  237. package/dist/backend/native-link-info-core.d.ts +3 -2
  238. package/dist/backend/native-link-info-core.js.map +1 -1
  239. package/dist/backend/native-link-info.d.ts +2 -1
  240. package/dist/backend/native-link-info.js.map +1 -1
  241. package/dist/backend/native-link-info.test.js +2 -2
  242. package/dist/backend/native-link-info.test.js.map +1 -1
  243. package/dist/backend/native-tools.d.ts +5 -1
  244. package/dist/backend/native-tools.js +3 -1
  245. package/dist/backend/native-tools.js.map +1 -1
  246. package/dist/backend/optimization.d.ts +25 -0
  247. package/dist/backend/optimization.js +21 -0
  248. package/dist/backend/optimization.js.map +1 -0
  249. package/dist/backend/optimization.test.d.ts +1 -0
  250. package/dist/backend/optimization.test.js +24 -0
  251. package/dist/backend/optimization.test.js.map +1 -0
  252. package/dist/backend/publication.d.ts +28 -0
  253. package/dist/backend/publication.js +155 -0
  254. package/dist/backend/publication.js.map +1 -0
  255. package/dist/backend/publication.test.d.ts +1 -0
  256. package/dist/backend/publication.test.js +72 -0
  257. package/dist/backend/publication.test.js.map +1 -0
  258. package/dist/backend/runtime-abi.d.ts +2 -2
  259. package/dist/backend/runtime-abi.js +2 -2
  260. package/dist/backend/runtime-pack-core.d.ts +15 -4
  261. package/dist/backend/runtime-pack-core.js +23 -12
  262. package/dist/backend/runtime-pack-core.js.map +1 -1
  263. package/dist/backend/runtime-pack-native.d.ts +7 -3
  264. package/dist/backend/runtime-pack-native.js +0 -3
  265. package/dist/backend/runtime-pack-native.js.map +1 -1
  266. package/dist/backend/runtime-pack-targets.test.js +1 -1
  267. package/dist/backend/runtime-pack.d.ts +20 -2
  268. package/dist/backend/runtime-pack.js +23 -0
  269. package/dist/backend/runtime-pack.js.map +1 -1
  270. package/dist/backend/runtime-pack.test.js +115 -2
  271. package/dist/backend/runtime-pack.test.js.map +1 -1
  272. package/dist/backend/target-diagnostics.test.js +1 -1
  273. package/dist/backend/targets.d.ts +2 -1
  274. package/dist/backend/targets.js +1 -1
  275. package/dist/backend/targets.js.map +1 -1
  276. package/dist/cli/command.js +75 -11
  277. package/dist/cli/command.js.map +1 -1
  278. package/dist/cli/host.d.ts +2 -1
  279. package/dist/cli/usage.d.ts +4 -1
  280. package/dist/cli/usage.js +13 -3
  281. package/dist/cli/usage.js.map +1 -1
  282. package/dist/compile-types.d.ts +17 -5
  283. package/dist/coverage/report.d.ts +25 -2
  284. package/dist/coverage/report.js +161 -33
  285. package/dist/coverage/report.js.map +1 -1
  286. package/dist/coverage/verdict-cache.d.ts +63 -0
  287. package/dist/coverage/verdict-cache.js +193 -0
  288. package/dist/coverage/verdict-cache.js.map +1 -0
  289. package/dist/coverage/verdict-cache.test.d.ts +1 -0
  290. package/dist/coverage/verdict-cache.test.js +52 -0
  291. package/dist/coverage/verdict-cache.test.js.map +1 -0
  292. package/dist/coverage/verdict-semantic.d.ts +2 -0
  293. package/dist/coverage/verdict-semantic.js +24 -0
  294. package/dist/coverage/verdict-semantic.js.map +1 -0
  295. package/dist/coverage/verdict-startup.d.ts +15 -0
  296. package/dist/coverage/verdict-startup.js +66 -0
  297. package/dist/coverage/verdict-startup.js.map +1 -0
  298. package/dist/diagnostics/diagnostic.d.ts +29 -1
  299. package/dist/diagnostics/diagnostic.js +84 -12
  300. package/dist/diagnostics/diagnostic.js.map +1 -1
  301. package/dist/diagnostics/envelope.d.ts +130 -0
  302. package/dist/diagnostics/envelope.js +257 -0
  303. package/dist/diagnostics/envelope.js.map +1 -0
  304. package/dist/diagnostics/envelope.test.d.ts +1 -0
  305. package/dist/diagnostics/envelope.test.js +91 -0
  306. package/dist/diagnostics/envelope.test.js.map +1 -0
  307. package/dist/diagnostics/render.d.ts +3 -0
  308. package/dist/diagnostics/render.js +13 -2
  309. package/dist/diagnostics/render.js.map +1 -1
  310. package/dist/executable/executable-cache.d.ts +2 -2
  311. package/dist/executable/executable-cache.js +7 -4
  312. package/dist/executable/executable-cache.js.map +1 -1
  313. package/dist/executable/executable-cache.test.js +20 -0
  314. package/dist/executable/executable-cache.test.js.map +1 -1
  315. package/dist/executable/prepare.d.ts +4 -0
  316. package/dist/executable/prepare.js +7 -1
  317. package/dist/executable/prepare.js.map +1 -1
  318. package/dist/frontend/analysis.js +1 -0
  319. package/dist/frontend/analysis.js.map +1 -1
  320. package/dist/frontend/lowering/abstract-equality.js +5 -49
  321. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  322. package/dist/frontend/lowering/array-values.d.ts +30 -0
  323. package/dist/frontend/lowering/array-values.js +246 -1
  324. package/dist/frontend/lowering/array-values.js.map +1 -1
  325. package/dist/frontend/lowering/builtins/errors.js +17 -2
  326. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  327. package/dist/frontend/lowering/builtins/numbers.js +29 -1
  328. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  329. package/dist/frontend/lowering/builtins/process.d.ts +10 -17
  330. package/dist/frontend/lowering/builtins/process.js +66 -29
  331. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  332. package/dist/frontend/lowering/builtins/workers.js +4 -2
  333. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  334. package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
  335. package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
  336. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
  337. package/dist/frontend/lowering/class-assertions.d.ts +12 -0
  338. package/dist/frontend/lowering/class-assertions.js +229 -5
  339. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  340. package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
  341. package/dist/frontend/lowering/class-callbacks.js +18 -5
  342. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  343. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
  344. package/dist/frontend/lowering/class-dynamic-dispatch.js +12 -6
  345. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  346. package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
  347. package/dist/frontend/lowering/class-method-mutations.js +472 -0
  348. package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
  349. package/dist/frontend/lowering/class-method-values.js +25 -5
  350. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  351. package/dist/frontend/lowering/class-prototypes.js +8 -2
  352. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  353. package/dist/frontend/lowering/class-unions.d.ts +16 -0
  354. package/dist/frontend/lowering/class-unions.js +127 -0
  355. package/dist/frontend/lowering/class-unions.js.map +1 -0
  356. package/dist/frontend/lowering/coercions/builders.js +8 -1
  357. package/dist/frontend/lowering/coercions/builders.js.map +1 -1
  358. package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
  359. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  360. package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
  361. package/dist/frontend/lowering/coercions/identity.js +26 -0
  362. package/dist/frontend/lowering/coercions/identity.js.map +1 -0
  363. package/dist/frontend/lowering/coercions/state.d.ts +6 -0
  364. package/dist/frontend/lowering/coercions/state.js +2 -0
  365. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  366. package/dist/frontend/lowering/coercions/structural.js +9 -6
  367. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  368. package/dist/frontend/lowering/coercions/unions.d.ts +8 -0
  369. package/dist/frontend/lowering/coercions/unions.js +67 -2
  370. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  371. package/dist/frontend/lowering/collation-repertoire.d.ts +1 -0
  372. package/dist/frontend/lowering/collation-repertoire.js +19 -0
  373. package/dist/frontend/lowering/collation-repertoire.js.map +1 -0
  374. package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
  375. package/dist/frontend/lowering/collection-narrowing.js +31 -0
  376. package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
  377. package/dist/frontend/lowering/construction-escapes.d.ts +38 -0
  378. package/dist/frontend/lowering/construction-escapes.js +146 -0
  379. package/dist/frontend/lowering/construction-escapes.js.map +1 -0
  380. package/dist/frontend/lowering/construction-escapes.test.d.ts +1 -0
  381. package/dist/frontend/lowering/construction-escapes.test.js +150 -0
  382. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -0
  383. package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
  384. package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
  385. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
  386. package/dist/frontend/lowering/containers/array-callbacks.d.ts +1 -1
  387. package/dist/frontend/lowering/containers/array-callbacks.js +416 -65
  388. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
  390. package/dist/frontend/lowering/containers/array-concat.js +130 -0
  391. package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
  392. package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
  393. package/dist/frontend/lowering/containers/array-construction.js +110 -5
  394. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  395. package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
  396. package/dist/frontend/lowering/containers/array-methods.js +274 -144
  397. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/callback-arguments.js +43 -1
  399. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  400. package/dist/frontend/lowering/containers/collection-methods.js +10 -1
  401. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  402. package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +7 -63
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/cycle-initialization.d.ts +46 -0
  407. package/dist/frontend/lowering/cycle-initialization.js +303 -0
  408. package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
  409. package/dist/frontend/lowering/divergences.d.ts +9 -0
  410. package/dist/frontend/lowering/divergences.js +630 -0
  411. package/dist/frontend/lowering/divergences.js.map +1 -0
  412. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
  413. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  414. package/dist/frontend/lowering/expressions/object-literals.js +178 -34
  415. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  416. package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
  417. package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
  418. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  419. package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
  420. package/dist/frontend/lowering/iterator-adapters.js +605 -0
  421. package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
  422. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  423. package/dist/frontend/lowering/lower-array-sort.js +44 -5
  424. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  425. package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
  426. package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
  427. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
  428. package/dist/frontend/lowering/lower-assert.js +7 -0
  429. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  430. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  431. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  432. package/dist/frontend/lowering/lower-calls.d.ts +8 -3
  433. package/dist/frontend/lowering/lower-calls.js +388 -278
  434. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  435. package/dist/frontend/lowering/lower-classes.d.ts +6 -0
  436. package/dist/frontend/lowering/lower-classes.js +117 -65
  437. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  438. package/dist/frontend/lowering/lower-exprs.d.ts +22 -2
  439. package/dist/frontend/lowering/lower-exprs.js +811 -254
  440. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  441. package/dist/frontend/lowering/lower-functions.js +32 -19
  442. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  443. package/dist/frontend/lowering/lower-generators.d.ts +19 -13
  444. package/dist/frontend/lowering/lower-generators.js +67 -44
  445. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  446. package/dist/frontend/lowering/lower-inspect.js +29 -4
  447. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  448. package/dist/frontend/lowering/lower-island.d.ts +1 -1
  449. package/dist/frontend/lowering/lower-island.js +24 -7
  450. package/dist/frontend/lowering/lower-island.js.map +1 -1
  451. package/dist/frontend/lowering/lower-modules.js +100 -3
  452. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  453. package/dist/frontend/lowering/lower-stmts.js +82 -64
  454. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  455. package/dist/frontend/lowering/lowerer.d.ts +115 -2
  456. package/dist/frontend/lowering/lowerer.js +1266 -88
  457. package/dist/frontend/lowering/lowerer.js.map +1 -1
  458. package/dist/frontend/lowering/native-ffi.js +3 -1
  459. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  460. package/dist/frontend/lowering/runtime-optional-bounds.d.ts +19 -0
  461. package/dist/frontend/lowering/runtime-optional-bounds.js +354 -0
  462. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -0
  463. package/dist/frontend/lowering/runtime-optional-bounds.test.d.ts +1 -0
  464. package/dist/frontend/lowering/runtime-optional-bounds.test.js +66 -0
  465. package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -0
  466. package/dist/frontend/lowering/runtime-optional-elements.d.ts +117 -0
  467. package/dist/frontend/lowering/runtime-optional-elements.js +738 -0
  468. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -0
  469. package/dist/frontend/lowering/runtime-optional-guards.d.ts +36 -0
  470. package/dist/frontend/lowering/runtime-optional-guards.js +375 -0
  471. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -0
  472. package/dist/frontend/lowering/runtime-optional-guards.test.d.ts +1 -0
  473. package/dist/frontend/lowering/runtime-optional-guards.test.js +92 -0
  474. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -0
  475. package/dist/frontend/lowering/runtime-optional-ownership.d.ts +63 -0
  476. package/dist/frontend/lowering/runtime-optional-ownership.js +382 -0
  477. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -0
  478. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +16 -0
  479. package/dist/frontend/lowering/runtime-optional-provenance.js +41 -0
  480. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
  481. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  482. package/dist/frontend/lowering/strict-equality.d.ts +9 -0
  483. package/dist/frontend/lowering/strict-equality.js +116 -0
  484. package/dist/frontend/lowering/strict-equality.js.map +1 -0
  485. package/dist/frontend/lowering/string-index-bounds.d.ts +36 -0
  486. package/dist/frontend/lowering/string-index-bounds.js +537 -0
  487. package/dist/frontend/lowering/string-index-bounds.js.map +1 -0
  488. package/dist/frontend/lowering/string-index-bounds.test.d.ts +1 -0
  489. package/dist/frontend/lowering/string-index-bounds.test.js +223 -0
  490. package/dist/frontend/lowering/string-index-bounds.test.js.map +1 -0
  491. package/dist/frontend/lowering/surfaces.js +3 -0
  492. package/dist/frontend/lowering/surfaces.js.map +1 -1
  493. package/dist/frontend/lowering/union-comparison.d.ts +5 -0
  494. package/dist/frontend/lowering/union-comparison.js +47 -0
  495. package/dist/frontend/lowering/union-comparison.js.map +1 -0
  496. package/dist/frontend/lowering/union-narrow.d.ts +2 -0
  497. package/dist/frontend/lowering/union-narrow.js +10 -6
  498. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  499. package/dist/frontend/program-analysis.d.ts +10 -0
  500. package/dist/frontend/program-analysis.js +7 -0
  501. package/dist/frontend/program-analysis.js.map +1 -1
  502. package/dist/frontend/program.d.ts +63 -2
  503. package/dist/frontend/program.js +1038 -61
  504. package/dist/frontend/program.js.map +1 -1
  505. package/dist/frontend/program.test.js +122 -6
  506. package/dist/frontend/program.test.js.map +1 -1
  507. package/dist/frontend/resolve.d.ts +6 -0
  508. package/dist/frontend/resolve.js +14 -0
  509. package/dist/frontend/resolve.js.map +1 -1
  510. package/dist/frontend/threads-import.d.ts +5 -0
  511. package/dist/frontend/threads-import.js +21 -0
  512. package/dist/frontend/threads-import.js.map +1 -0
  513. package/dist/frontend/type-mapper.d.ts +4 -1
  514. package/dist/frontend/type-mapper.js +161 -20
  515. package/dist/frontend/type-mapper.js.map +1 -1
  516. package/dist/frontend/type-mapper.test.js +15 -3
  517. package/dist/frontend/type-mapper.test.js.map +1 -1
  518. package/dist/frontend/worker-target.d.ts +4 -0
  519. package/dist/frontend/worker-target.js +8 -1
  520. package/dist/frontend/worker-target.js.map +1 -1
  521. package/dist/index.d.ts +6 -1
  522. package/dist/index.js +70 -16
  523. package/dist/index.js.map +1 -1
  524. package/dist/ir/analysis.d.ts +3 -1
  525. package/dist/ir/analysis.js +4 -0
  526. package/dist/ir/analysis.js.map +1 -1
  527. package/dist/ir/build.d.ts +5 -0
  528. package/dist/ir/build.js +7 -0
  529. package/dist/ir/build.js.map +1 -1
  530. package/dist/ir/builtin-signatures.d.ts +1 -1
  531. package/dist/ir/builtin-signatures.js +5 -3
  532. package/dist/ir/builtin-signatures.js.map +1 -1
  533. package/dist/ir/constant-tables.test.js +1 -1
  534. package/dist/ir/initializer-bindings.test.js +1 -1
  535. package/dist/ir/int32-slots.d.ts +72 -0
  536. package/dist/ir/int32-slots.js +837 -0
  537. package/dist/ir/int32-slots.js.map +1 -0
  538. package/dist/ir/int32-slots.test.d.ts +1 -0
  539. package/dist/ir/int32-slots.test.js +222 -0
  540. package/dist/ir/int32-slots.test.js.map +1 -0
  541. package/dist/ir/integer-ranges.d.ts +19 -3
  542. package/dist/ir/integer-ranges.js +168 -23
  543. package/dist/ir/integer-ranges.js.map +1 -1
  544. package/dist/ir/integer-ranges.test.js +74 -2
  545. package/dist/ir/integer-ranges.test.js.map +1 -1
  546. package/dist/ir/ir.d.ts +101 -20
  547. package/dist/ir/ir.js +20 -6
  548. package/dist/ir/ir.js.map +1 -1
  549. package/dist/ir/scalar-records.test.js +1 -1
  550. package/dist/ir/serialize.d.ts +1 -1
  551. package/dist/ir/serialize.js +3 -3
  552. package/dist/ir/serialize.js.map +1 -1
  553. package/dist/ir/traverse.js +8 -0
  554. package/dist/ir/traverse.js.map +1 -1
  555. package/dist/ir/validate.js +139 -22
  556. package/dist/ir/validate.js.map +1 -1
  557. package/dist/ir/validate.test.js +308 -8
  558. package/dist/ir/validate.test.js.map +1 -1
  559. package/dist/library/fence-eval.test.js +1 -1
  560. package/dist/library/int-infer.test.js +4 -4
  561. package/dist/library/library-cache.test.js +5 -5
  562. package/dist/library/library-profile.d.ts +2 -1
  563. package/dist/library/library-profile.js +4 -3
  564. package/dist/library/library-profile.js.map +1 -1
  565. package/dist/native/cache.d.ts +3 -0
  566. package/dist/native/cache.js +49 -1
  567. package/dist/native/cache.js.map +1 -1
  568. package/dist/native/cache.test.js +21 -1
  569. package/dist/native/cache.test.js.map +1 -1
  570. package/dist/native/cli.js +1 -1
  571. package/dist/native/cli.js.map +1 -1
  572. package/dist/native/compiler.d.ts +5 -0
  573. package/dist/native/compiler.js +51 -4
  574. package/dist/native/compiler.js.map +1 -1
  575. package/dist/native/compiler.test.js +2 -2
  576. package/dist/native/library.d.ts +2 -1
  577. package/dist/native/library.js.map +1 -1
  578. package/dist/native/prepare.d.ts +4 -0
  579. package/dist/native/prepare.js +28 -3
  580. package/dist/native/prepare.js.map +1 -1
  581. package/dist/native/sanitizer.d.ts +3 -2
  582. package/dist/native/sanitizer.js +3 -13
  583. package/dist/native/sanitizer.js.map +1 -1
  584. package/dist/startup-cache.d.ts +2 -0
  585. package/dist/startup-cache.js +2 -0
  586. package/dist/startup-cache.js.map +1 -1
  587. package/package.json +20 -20
  588. package/surface-manifest.json +8 -2
@@ -0,0 +1,738 @@
1
+ import * as ts from "../ts7/adapter.js";
2
+ import { indexStoreInBounds } from "./runtime-optional-bounds.js";
3
+ const NOTHING = { undefined: false, holes: false };
4
+ /** Methods whose callbacks also visit holes, as `undefined`. */
5
+ const HOLE_VISITING = new Set(["find", "findIndex", "findLast", "findLastIndex"]);
6
+ /** Array methods returning a new array, by what happens to the receiver's
7
+ * holes in it, and methods returning the receiver itself. */
8
+ const HOLES_KEPT = new Set(["slice", "splice", "concat"]);
9
+ const HOLES_SKIPPED = new Set(["filter", "flat"]);
10
+ const HOLES_FILLED = new Set(["toSorted", "toReversed", "toSpliced", "with"]);
11
+ const IN_PLACE = new Set(["sort", "reverse", "fill", "copyWithin"]);
12
+ /** Whole-program facts about which native array element ABIs can hold an
13
+ * explicit `undefined` value or a hole, refined per expression for arrays
14
+ * an expression creates itself. An element parameter of an array callback
15
+ * is present whenever its receiver can hold neither: the callback methods
16
+ * skip holes (except the find family), and every explicit `undefined`
17
+ * enters a native array through a store, a copy, or a builtin scanned
18
+ * here. Facts only grow, so the enclosing fixed point stays monotone. */
19
+ export class ArrayElementStates {
20
+ host;
21
+ undefinedKeys = new Set();
22
+ holeyKeys = new Set();
23
+ /** A store wrote a possibly undefined value or a hole into an array
24
+ * whose element ABI is decided per generic instantiation. */
25
+ anyUndefined = false;
26
+ anyHoley = false;
27
+ /** Facts of arrays owned by one storage slot. */
28
+ undefinedOwners = new Set();
29
+ holeyOwners = new Set();
30
+ /** The node being scanned, for provenance notes. */
31
+ site;
32
+ /** While set, arrays judged only by their element ABI count as present. */
33
+ ownFactsOnly = false;
34
+ constructor(host) {
35
+ this.host = host;
36
+ }
37
+ /** Every element a callback of `method` receives from `receiver` is a
38
+ * present value. */
39
+ elementsPresent(receiver, method) {
40
+ const contents = this.contents(receiver);
41
+ return (contents !== null && !contents.undefined && !(HOLE_VISITING.has(method) && contents.holes));
42
+ }
43
+ /** Scans one syntax node; true when a fact was added. */
44
+ scan(node) {
45
+ this.site = node;
46
+ if (ts.isBinaryExpression(node))
47
+ return this.scanAssignment(node);
48
+ if ((ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) &&
49
+ (node.operator === ts.SyntaxKind.PlusPlusToken ||
50
+ node.operator === ts.SyntaxKind.MinusMinusToken)) {
51
+ // `xs[i]++` writes index i, and `xs.length++` grows the array.
52
+ const target = peel(node.operand);
53
+ if (ts.isElementAccessExpression(target))
54
+ return this.addHolesTo(target.expression);
55
+ if (ts.isPropertyAccessExpression(target) &&
56
+ target.name.text === "length" &&
57
+ node.operator === ts.SyntaxKind.PlusPlusToken)
58
+ return this.addHolesTo(target.expression);
59
+ return false;
60
+ }
61
+ if (ts.isDeleteExpression(node)) {
62
+ const target = peel(node.expression);
63
+ return ts.isElementAccessExpression(target) ? this.addHolesTo(target.expression) : false;
64
+ }
65
+ if (ts.isArrayLiteralExpression(node))
66
+ return this.record(node);
67
+ if (ts.isCallExpression(node) || ts.isNewExpression(node))
68
+ return this.scanCall(node);
69
+ if (ts.isForOfStatement(node))
70
+ return this.scanForOf(node);
71
+ if (ts.isArrayBindingPattern(node))
72
+ return this.scanRestPattern(node);
73
+ return false;
74
+ }
75
+ /** `[a, ...rest] = source` copies the remaining indices into a new
76
+ * array: holes become undefined. */
77
+ scanRestPattern(pattern) {
78
+ const last = pattern.elements[pattern.elements.length - 1];
79
+ if (!last || ts.isOmittedExpression(last) || !last.dotDotDotToken)
80
+ return false;
81
+ // A parameter or nested pattern has no source expression to judge.
82
+ const owner = pattern.parent;
83
+ const source = ts.isVariableDeclaration(owner) && owner.name === pattern && owner.initializer
84
+ ? this.contents(owner.initializer)
85
+ : null;
86
+ if (source !== null && !source.undefined && !source.holes)
87
+ return false;
88
+ const target = last.name;
89
+ if (!ts.isIdentifier(target))
90
+ return false;
91
+ return this.addUndefined(this.host.arrayKeys(target));
92
+ }
93
+ /** `[a, ...rest] = source` as an assignment. */
94
+ scanRestAssignment(node) {
95
+ const pattern = peel(node.left);
96
+ if (!ts.isArrayLiteralExpression(pattern))
97
+ return false;
98
+ const last = pattern.elements[pattern.elements.length - 1];
99
+ if (!last || !ts.isSpreadElement(last))
100
+ return false;
101
+ if (!this.mayYieldUndefined(node.right))
102
+ return false;
103
+ return this.addUndefinedTo(last.expression);
104
+ }
105
+ /** Contents of the array `node` evaluates to; null when its element ABI
106
+ * is generic. Arrays the expression creates are judged by how they are
107
+ * built; any other array by the facts of its element ABI. */
108
+ contents(node) {
109
+ const e = peel(node);
110
+ if (ts.isArrayLiteralExpression(e)) {
111
+ let undefinedValue = false;
112
+ let holes = false;
113
+ for (const element of e.elements) {
114
+ if (ts.isOmittedExpression(element))
115
+ holes = true;
116
+ else if (this.valueMayBeUndefined(element))
117
+ undefinedValue = true;
118
+ }
119
+ return { undefined: undefinedValue, holes };
120
+ }
121
+ if (ts.isConditionalExpression(e))
122
+ return merge(this.contents(e.whenTrue), this.contents(e.whenFalse));
123
+ if (ts.isBinaryExpression(e)) {
124
+ const op = e.operatorToken.kind;
125
+ if (op === ts.SyntaxKind.QuestionQuestionToken || op === ts.SyntaxKind.BarBarToken)
126
+ return merge(this.contents(e.left), this.contents(e.right));
127
+ if (op === ts.SyntaxKind.AmpersandAmpersandToken || op === ts.SyntaxKind.CommaToken)
128
+ return this.contents(e.right);
129
+ }
130
+ if (ts.isCallExpression(e) || ts.isNewExpression(e)) {
131
+ const built = this.builtContents(e);
132
+ if (built !== undefined)
133
+ return built;
134
+ }
135
+ const owner = this.host.ownerOf(e);
136
+ if (owner !== null)
137
+ return { undefined: this.undefinedOwners.has(owner), holes: this.holeyOwners.has(owner) };
138
+ return this.stored(this.host.arrayKeys(e));
139
+ }
140
+ /** Contents of an array a call creates; undefined when the call is not a
141
+ * known array constructor or method. */
142
+ builtContents(node) {
143
+ const args = node.arguments ?? [];
144
+ const callee = peel(node.expression);
145
+ if (ts.isIdentifier(callee)) {
146
+ if (!this.host.isGlobal(callee, "Array"))
147
+ return undefined;
148
+ // `new Array(n)` allocates holes; more arguments are the elements.
149
+ if (args.length === 1 && !ts.isSpreadElement(args[0]) && isNumberLike(args[0]))
150
+ return { undefined: false, holes: true };
151
+ return { undefined: args.some((arg) => this.valueMayBeUndefined(arg)), holes: false };
152
+ }
153
+ if (!ts.isPropertyAccessExpression(callee))
154
+ return undefined;
155
+ const method = callee.name.text;
156
+ const owner = callee.expression;
157
+ if (this.host.isGlobal(owner, "Array")) {
158
+ if (method === "of")
159
+ return { undefined: args.some((arg) => this.valueMayBeUndefined(arg)), holes: false };
160
+ if (method === "from" || method === "fromAsync") {
161
+ const source = args[0];
162
+ const mapper = args[1];
163
+ // Without a mapper an array-like's missing indices become undefined.
164
+ const fromSource = source !== undefined &&
165
+ !ts.isSpreadElement(source) &&
166
+ (this.mayYieldUndefined(source) ||
167
+ (mapper === undefined && this.host.isArrayLikeObject(source)));
168
+ const fromMapper = mapper !== undefined && this.host.callbackReturnsUndefined(mapper);
169
+ return { undefined: fromSource || fromMapper, holes: false };
170
+ }
171
+ return undefined;
172
+ }
173
+ if (this.host.isGlobal(owner, "Object")) {
174
+ // Present-undefined properties are listed as values.
175
+ return method === "values" || method === "entries"
176
+ ? { undefined: true, holes: false }
177
+ : undefined;
178
+ }
179
+ if (this.host.isGlobal(owner, "Promise")) {
180
+ // A settled value can be a runtime-absent result.
181
+ return method === "all" || method === "allSettled"
182
+ ? { undefined: true, holes: false }
183
+ : undefined;
184
+ }
185
+ if (method === "match" || method === "matchAll" || method === "exec" || method === "split") {
186
+ const separator = args[0];
187
+ if (method === "split" &&
188
+ separator !== undefined &&
189
+ !ts.isSpreadElement(separator) &&
190
+ this.host.isString(separator))
191
+ return NOTHING;
192
+ // Non-participating capture groups produce undefined entries.
193
+ return { undefined: true, holes: false };
194
+ }
195
+ const receiverKeys = this.host.arrayKeys(owner);
196
+ if (receiverKeys !== null && receiverKeys.length === 0)
197
+ return undefined;
198
+ if (method === "map") {
199
+ const callback = args[0];
200
+ const receiver = this.contents(owner);
201
+ // map keeps the receiver's holes; its values are the callback's.
202
+ if (receiver === null)
203
+ return null;
204
+ return {
205
+ undefined: callback !== undefined && this.host.callbackReturnsUndefined(callback),
206
+ holes: receiver.holes,
207
+ };
208
+ }
209
+ if (method === "flatMap") {
210
+ const callback = args[0];
211
+ if (callback !== undefined && this.host.callbackReturnsUndefined(callback))
212
+ return { undefined: true, holes: false };
213
+ // Returned arrays are flattened, keeping their explicit undefined.
214
+ const flattened = this.stored(this.host.arrayKeys(node));
215
+ return flattened === null ? null : { undefined: flattened.undefined, holes: false };
216
+ }
217
+ if (!IN_PLACE.has(method) &&
218
+ !HOLES_KEPT.has(method) &&
219
+ !HOLES_SKIPPED.has(method) &&
220
+ !HOLES_FILLED.has(method))
221
+ return undefined;
222
+ const receiver = this.contents(owner);
223
+ // A whole-array fill writes every slot.
224
+ if (method === "fill" && args.length === 1 && !ts.isSpreadElement(args[0]))
225
+ return receiver === null
226
+ ? null
227
+ : { undefined: this.host.mayBeUndefined(args[0]), holes: false };
228
+ if (IN_PLACE.has(method) || receiver === null)
229
+ return receiver;
230
+ if (HOLES_KEPT.has(method)) {
231
+ let undefinedValue = receiver.undefined;
232
+ let holes = receiver.holes;
233
+ // concat appends its arguments; the slices splice returns keep holes.
234
+ if (method === "concat") {
235
+ for (const arg of args) {
236
+ if (ts.isSpreadElement(arg)) {
237
+ if (this.mayYieldUndefined(arg.expression))
238
+ undefinedValue = true;
239
+ continue;
240
+ }
241
+ const keys = this.host.arrayKeys(arg);
242
+ if (keys !== null && keys.length === 0) {
243
+ if (this.host.mayBeUndefined(arg))
244
+ undefinedValue = true;
245
+ continue;
246
+ }
247
+ const other = this.contents(arg);
248
+ if (other === null)
249
+ return null;
250
+ undefinedValue ||= other.undefined;
251
+ holes ||= other.holes;
252
+ }
253
+ }
254
+ return { undefined: undefinedValue, holes };
255
+ }
256
+ if (HOLES_SKIPPED.has(method)) {
257
+ if (method === "flat") {
258
+ // Nested arrays are flattened, keeping their explicit undefined.
259
+ const flattened = this.stored(this.host.arrayKeys(node));
260
+ if (flattened === null)
261
+ return null;
262
+ return { undefined: receiver.undefined || flattened.undefined, holes: false };
263
+ }
264
+ return { undefined: receiver.undefined, holes: false };
265
+ }
266
+ let undefinedValue = receiver.undefined || receiver.holes;
267
+ if (method === "with" && args[1] !== undefined && this.valueMayBeUndefined(args[1]))
268
+ undefinedValue = true;
269
+ if (method === "toSpliced")
270
+ for (const arg of args.slice(2))
271
+ if (this.valueMayBeUndefined(arg))
272
+ undefinedValue = true;
273
+ return { undefined: undefinedValue, holes: false };
274
+ }
275
+ /** The facts recorded for arrays with these element ABIs. */
276
+ stored(keys) {
277
+ if (this.ownFactsOnly)
278
+ return NOTHING;
279
+ if (keys === null)
280
+ return null;
281
+ return {
282
+ undefined: this.anyUndefined ||
283
+ keys.some((key) => this.undefinedKeys.has(key) || this.host.elementAdmitsUndefined(key)),
284
+ holes: this.anyHoley || keys.some((key) => this.holeyKeys.has(key)),
285
+ };
286
+ }
287
+ /** Reading every index of `node` (a spread, an iteration, `Array.from`)
288
+ * can produce `undefined`. Only native arrays can: other iterables reject
289
+ * an undefined value when it is stored. */
290
+ mayYieldUndefined(node) {
291
+ const keys = this.host.arrayKeys(node);
292
+ if (keys !== null && keys.length === 0)
293
+ return false;
294
+ const contents = this.contents(node);
295
+ return contents === null
296
+ ? this.anyUndefined || this.anyHoley
297
+ : contents.undefined || contents.holes;
298
+ }
299
+ /** One stored value, or the elements a spread copies. */
300
+ valueMayBeUndefined(value) {
301
+ if (ts.isSpreadElement(value))
302
+ return this.mayYieldUndefined(value.expression);
303
+ return this.host.mayBeUndefined(value);
304
+ }
305
+ /** Records an array the expression creates, for the slot that owns it
306
+ * or else under its element ABI. */
307
+ record(node) {
308
+ // Only array constructors and methods build an array whose contents
309
+ // can differ from what its element ABI already records.
310
+ if ((ts.isCallExpression(node) || ts.isNewExpression(node)) && !buildsArray(node))
311
+ return false;
312
+ if (consumedWhereBuilt(node))
313
+ return false;
314
+ // An empty literal holds nothing.
315
+ if (ts.isArrayLiteralExpression(node) && node.elements.length === 0)
316
+ return false;
317
+ const contents = this.contents(node);
318
+ if (contents === null || (!contents.undefined && !contents.holes))
319
+ return false;
320
+ const keys = this.keysAsUsed(node);
321
+ if (keys !== null && keys.length === 0)
322
+ return false;
323
+ const owner = this.host.allocationOwner(node);
324
+ if (owner !== null) {
325
+ let changed = false;
326
+ if (contents.undefined && !this.undefinedOwners.has(owner)) {
327
+ this.undefinedOwners.add(owner);
328
+ changed = true;
329
+ }
330
+ if (contents.holes && !this.holeyOwners.has(owner)) {
331
+ this.holeyOwners.add(owner);
332
+ changed = true;
333
+ }
334
+ return changed;
335
+ }
336
+ let changed = false;
337
+ if (contents.undefined && this.addUndefined(keys))
338
+ changed = true;
339
+ if (contents.holes && this.addHoles(keys))
340
+ changed = true;
341
+ return changed;
342
+ }
343
+ /** Element ABIs of a built array, including those an enclosing type
344
+ * assertion gives it (`[a, , b] as T[]`). */
345
+ keysAsUsed(node) {
346
+ const keys = new Set();
347
+ for (let e = node;; e = e.parent) {
348
+ const own = this.host.arrayKeys(e);
349
+ if (own === null)
350
+ return null;
351
+ for (const key of own)
352
+ keys.add(key);
353
+ const parent = e.parent;
354
+ if (!parent ||
355
+ !(ts.isParenthesizedExpression(parent) ||
356
+ ts.isAsExpression(parent) ||
357
+ ts.isTypeAssertion(parent) ||
358
+ ts.isSatisfiesExpression(parent) ||
359
+ ts.isNonNullExpression(parent)))
360
+ break;
361
+ }
362
+ return [...keys];
363
+ }
364
+ /** A store through `receiver` can add an undefined value. */
365
+ addUndefinedTo(receiver) {
366
+ const owner = this.host.ownerOf(receiver);
367
+ if (owner === null)
368
+ return this.addUndefined(this.host.arrayKeys(receiver));
369
+ if (this.undefinedOwners.has(owner))
370
+ return false;
371
+ this.undefinedOwners.add(owner);
372
+ return true;
373
+ }
374
+ /** A store through `receiver` can leave holes. */
375
+ addHolesTo(receiver) {
376
+ const owner = this.host.ownerOf(receiver);
377
+ if (owner === null)
378
+ return this.addHoles(this.host.arrayKeys(receiver));
379
+ if (this.holeyOwners.has(owner))
380
+ return false;
381
+ this.holeyOwners.add(owner);
382
+ return true;
383
+ }
384
+ addUndefined(keys) {
385
+ if (keys === null) {
386
+ if (this.anyUndefined)
387
+ return false;
388
+ this.anyUndefined = true;
389
+ this.host.note?.("undefined", "*", this.site);
390
+ return true;
391
+ }
392
+ let changed = false;
393
+ for (const key of keys) {
394
+ if (this.undefinedKeys.has(key))
395
+ continue;
396
+ this.undefinedKeys.add(key);
397
+ this.host.note?.("undefined", key, this.site);
398
+ changed = true;
399
+ }
400
+ return changed;
401
+ }
402
+ addHoles(keys) {
403
+ if (keys === null) {
404
+ if (this.anyHoley)
405
+ return false;
406
+ this.anyHoley = true;
407
+ this.host.note?.("holes", "*", this.site);
408
+ return true;
409
+ }
410
+ let changed = false;
411
+ for (const key of keys) {
412
+ if (this.holeyKeys.has(key))
413
+ continue;
414
+ this.holeyKeys.add(key);
415
+ this.host.note?.("holes", key, this.site);
416
+ changed = true;
417
+ }
418
+ return changed;
419
+ }
420
+ scanAssignment(node) {
421
+ const op = node.operatorToken.kind;
422
+ if (op < ts.SyntaxKind.FirstAssignment || op > ts.SyntaxKind.LastAssignment)
423
+ return false;
424
+ const target = peel(node.left);
425
+ if (op === ts.SyntaxKind.EqualsToken && ts.isArrayLiteralExpression(target))
426
+ return this.scanRestAssignment(node);
427
+ if (ts.isElementAccessExpression(target)) {
428
+ // A write past the end leaves holes before it; appending at the
429
+ // receiver's own length does not.
430
+ const holes = !isAppendIndex(target) && !indexStoreInBounds(node);
431
+ const storesValue = op === ts.SyntaxKind.EqualsToken ||
432
+ op === ts.SyntaxKind.QuestionQuestionEqualsToken ||
433
+ op === ts.SyntaxKind.BarBarEqualsToken ||
434
+ op === ts.SyntaxKind.AmpersandAmpersandEqualsToken;
435
+ const undefinedValue = storesValue && this.host.mayBeUndefined(node.right);
436
+ if (!holes && !undefinedValue)
437
+ return false;
438
+ const keys = this.host.arrayKeys(target.expression);
439
+ if (keys !== null && keys.length === 0)
440
+ return false;
441
+ let changed = false;
442
+ if (holes && this.addHolesTo(target.expression))
443
+ changed = true;
444
+ if (undefinedValue && this.addUndefinedTo(target.expression))
445
+ changed = true;
446
+ return changed;
447
+ }
448
+ if (ts.isPropertyAccessExpression(target) &&
449
+ target.name.text === "length" &&
450
+ !isShrinkingLength(node, target)) {
451
+ const keys = this.host.arrayKeys(target.expression);
452
+ if (keys !== null && keys.length === 0)
453
+ return false;
454
+ return this.addHolesTo(target.expression);
455
+ }
456
+ return false;
457
+ }
458
+ scanCall(node) {
459
+ let changed = false;
460
+ const args = node.arguments ?? [];
461
+ // Spreading a sparse array into a rest parameter fills the holes.
462
+ if (args.some((arg) => ts.isSpreadElement(arg))) {
463
+ for (const arg of args) {
464
+ if (!ts.isSpreadElement(arg) || !this.mayYieldUndefined(arg.expression))
465
+ continue;
466
+ const rest = this.host.restKeys(node) ?? this.host.arrayKeys(arg.expression);
467
+ if (this.addUndefined(rest))
468
+ changed = true;
469
+ }
470
+ }
471
+ if (this.record(node))
472
+ changed = true;
473
+ const callee = peel(node.expression);
474
+ if (!ts.isPropertyAccessExpression(callee))
475
+ return changed;
476
+ if (this.scanReflectiveWrite(callee, args))
477
+ changed = true;
478
+ // In-place stores into the receiver.
479
+ let stored;
480
+ switch (callee.name.text) {
481
+ case "push":
482
+ case "unshift":
483
+ stored = args;
484
+ break;
485
+ case "splice":
486
+ stored = args.slice(2);
487
+ break;
488
+ case "fill":
489
+ if (args.length === 0 && this.addUndefinedTo(callee.expression))
490
+ changed = true;
491
+ stored = args.slice(0, 1);
492
+ break;
493
+ default:
494
+ return changed;
495
+ }
496
+ const receiver = this.host.arrayKeys(callee.expression);
497
+ if (receiver !== null && receiver.length === 0)
498
+ return changed;
499
+ for (const value of stored)
500
+ if (this.valueMayBeUndefined(value) && this.addUndefinedTo(callee.expression))
501
+ changed = true;
502
+ return changed;
503
+ }
504
+ /** Writes that bypass the array methods: `Object.assign(xs, ...)`,
505
+ * `Reflect.set(xs, ...)`, `Array.prototype.push.call(xs, ...)` and the
506
+ * like may store any value at any index of an array argument. */
507
+ scanReflectiveWrite(callee, args) {
508
+ const method = callee.name.text;
509
+ const owner = peel(callee.expression);
510
+ const reflective = (this.host.isGlobal(owner, "Object") &&
511
+ (method === "assign" ||
512
+ method === "defineProperty" ||
513
+ method === "defineProperties" ||
514
+ method === "setPrototypeOf")) ||
515
+ (this.host.isGlobal(owner, "Reflect") &&
516
+ (method === "set" || method === "defineProperty" || method === "apply")) ||
517
+ ((method === "call" || method === "apply") &&
518
+ ts.isPropertyAccessExpression(owner) &&
519
+ ts.isPropertyAccessExpression(peel(owner.expression)) &&
520
+ peel(owner.expression).name.text === "prototype" &&
521
+ this.host.isGlobal(peel(owner.expression).expression, "Array"));
522
+ if (!reflective)
523
+ return false;
524
+ let changed = false;
525
+ for (const arg of args) {
526
+ const target = ts.isSpreadElement(arg) ? arg.expression : arg;
527
+ const keys = this.host.arrayKeys(target);
528
+ if (keys !== null && keys.length === 0)
529
+ continue;
530
+ if (this.addUndefinedTo(target))
531
+ changed = true;
532
+ if (this.addHolesTo(target))
533
+ changed = true;
534
+ }
535
+ return changed;
536
+ }
537
+ /** A for-of loop over `node`'s iterable can bind `undefined`: a hole
538
+ * or a stored undefined in the array it walks. When it cannot, every
539
+ * element the loop reads is a present value. */
540
+ loopMayYieldUndefined(node) {
541
+ return this.mayYieldUndefined(this.loopSource(node));
542
+ }
543
+ /** The loop's array itself, as built or as owned by one slot, can hold
544
+ * a hole or undefined. Facts shared by every array with the same element
545
+ * ABI are coarser: a loop judged only by them keeps checked reads. */
546
+ loopHolesKnown(node) {
547
+ const source = this.loopSource(node);
548
+ const keys = this.host.arrayKeys(source);
549
+ if (keys !== null && keys.length === 0)
550
+ return false;
551
+ this.ownFactsOnly = true;
552
+ try {
553
+ const contents = this.contents(source);
554
+ return contents !== null && (contents.undefined || contents.holes);
555
+ }
556
+ finally {
557
+ this.ownFactsOnly = false;
558
+ }
559
+ }
560
+ loopSource(node) {
561
+ let source = peel(node.expression);
562
+ if (ts.isCallExpression(source) &&
563
+ ts.isPropertyAccessExpression(source.expression) &&
564
+ (source.expression.name.text === "values" || source.expression.name.text === "entries") &&
565
+ source.arguments.length === 0) {
566
+ const receiver = this.host.arrayKeys(source.expression.expression);
567
+ if (receiver === null || receiver.length > 0)
568
+ source = source.expression.expression;
569
+ }
570
+ return source;
571
+ }
572
+ scanForOf(node) {
573
+ if (!this.loopMayYieldUndefined(node))
574
+ return false;
575
+ const known = this.loopHolesKnown(node);
576
+ const initializer = node.initializer;
577
+ let changed = false;
578
+ const mark = (name) => {
579
+ if (ts.isIdentifier(name)) {
580
+ if (this.host.markIterationBinding(name, known))
581
+ changed = true;
582
+ return;
583
+ }
584
+ name.forEachChild(mark);
585
+ };
586
+ if (ts.isVariableDeclarationList(initializer)) {
587
+ for (const declaration of initializer.declarations)
588
+ mark(declaration.name);
589
+ }
590
+ else
591
+ mark(initializer);
592
+ return changed;
593
+ }
594
+ }
595
+ /** Names of the constructors, methods and builtins that return a new
596
+ * array or their receiver. */
597
+ const ARRAY_BUILDERS = new Set([
598
+ "Array",
599
+ "of",
600
+ "from",
601
+ "fromAsync",
602
+ "values",
603
+ "entries",
604
+ "all",
605
+ "allSettled",
606
+ "match",
607
+ "matchAll",
608
+ "exec",
609
+ "split",
610
+ "map",
611
+ "flatMap",
612
+ ...HOLES_KEPT,
613
+ ...HOLES_SKIPPED,
614
+ ...HOLES_FILLED,
615
+ ...IN_PLACE,
616
+ ]);
617
+ function buildsArray(node) {
618
+ const callee = peel(node.expression);
619
+ if (ts.isIdentifier(callee))
620
+ return callee.text === "Array";
621
+ return ts.isPropertyAccessExpression(callee) && ARRAY_BUILDERS.has(callee.name.text);
622
+ }
623
+ /** Callback methods, by the position of the parameter receiving the
624
+ * array itself. */
625
+ const ARRAY_ARGUMENT_AT = new Map([
626
+ ["map", 2],
627
+ ["filter", 2],
628
+ ["forEach", 2],
629
+ ["some", 2],
630
+ ["every", 2],
631
+ ["find", 2],
632
+ ["findIndex", 2],
633
+ ["findLast", 2],
634
+ ["findLastIndex", 2],
635
+ ["flatMap", 2],
636
+ ["reduce", 3],
637
+ ["reduceRight", 3],
638
+ ]);
639
+ /** A newly built array that is used up where it is built: discarded, or
640
+ * read by a spread, an iteration, or a method call whose callback cannot
641
+ * see it. Nothing else ever references it, so only the value derived from
642
+ * it (judged by its own contents) can carry its holes or undefined. */
643
+ function consumedWhereBuilt(node) {
644
+ let child = node;
645
+ let parent = node.parent;
646
+ while (parent && ts.isParenthesizedExpression(parent)) {
647
+ child = parent;
648
+ parent = parent.parent;
649
+ }
650
+ if (!parent)
651
+ return false;
652
+ if (ts.isExpressionStatement(parent))
653
+ return true;
654
+ if (ts.isSpreadElement(parent))
655
+ return true;
656
+ if (ts.isForOfStatement(parent))
657
+ return parent.expression === child;
658
+ if (ts.isPropertyAccessExpression(parent) &&
659
+ parent.expression === child &&
660
+ parent.parent &&
661
+ ts.isCallExpression(parent.parent) &&
662
+ parent.parent.expression === parent) {
663
+ const arrayAt = ARRAY_ARGUMENT_AT.get(parent.name.text);
664
+ if (arrayAt === undefined)
665
+ return true;
666
+ const callback = parent.parent.arguments[0];
667
+ return (callback !== undefined &&
668
+ (ts.isArrowFunction(callback) || ts.isFunctionExpression(callback)) &&
669
+ callback.parameters.length <= arrayAt &&
670
+ !callback.parameters.some((parameter) => parameter.dotDotDotToken) &&
671
+ ts.isArrowFunction(callback));
672
+ }
673
+ return false;
674
+ }
675
+ function merge(a, b) {
676
+ if (a === null || b === null)
677
+ return null;
678
+ return { undefined: a.undefined || b.undefined, holes: a.holes || b.holes };
679
+ }
680
+ function peel(node) {
681
+ let e = node;
682
+ while (ts.isParenthesizedExpression(e) ||
683
+ ts.isAsExpression(e) ||
684
+ ts.isTypeAssertion(e) ||
685
+ ts.isSatisfiesExpression(e) ||
686
+ ts.isNonNullExpression(e))
687
+ e = e.expression;
688
+ return e;
689
+ }
690
+ function sameReference(a, b) {
691
+ const left = peel(a);
692
+ const right = peel(b);
693
+ if (ts.isIdentifier(left) && ts.isIdentifier(right))
694
+ return left.text === right.text;
695
+ if (left.kind === ts.SyntaxKind.ThisKeyword && right.kind === ts.SyntaxKind.ThisKeyword)
696
+ return true;
697
+ if (ts.isPropertyAccessExpression(left) && ts.isPropertyAccessExpression(right))
698
+ return left.name.text === right.name.text && sameReference(left.expression, right.expression);
699
+ return false;
700
+ }
701
+ /** `xs[xs.length] = v` appends without leaving a hole. */
702
+ function isAppendIndex(target) {
703
+ const index = peel(target.argumentExpression);
704
+ return (ts.isPropertyAccessExpression(index) &&
705
+ index.name.text === "length" &&
706
+ sameReference(index.expression, target.expression));
707
+ }
708
+ /** `xs.length = 0`, `xs.length = xs.length - k` and `xs.length -= k`
709
+ * truncate; truncation never leaves holes. */
710
+ function isShrinkingLength(node, target) {
711
+ const op = node.operatorToken.kind;
712
+ const right = peel(node.right);
713
+ if (op === ts.SyntaxKind.MinusEqualsToken)
714
+ return ts.isNumericLiteral(right);
715
+ if (op !== ts.SyntaxKind.EqualsToken)
716
+ return false;
717
+ if (ts.isNumericLiteral(right))
718
+ return Number(right.text) === 0;
719
+ if (!ts.isBinaryExpression(right) || right.operatorToken.kind !== ts.SyntaxKind.MinusToken)
720
+ return false;
721
+ const length = peel(right.left);
722
+ return (ts.isNumericLiteral(peel(right.right)) &&
723
+ ts.isPropertyAccessExpression(length) &&
724
+ length.name.text === "length" &&
725
+ sameReference(length.expression, target.expression));
726
+ }
727
+ function isNumberLike(node) {
728
+ const e = peel(node);
729
+ return !(ts.isStringLiteral(e) ||
730
+ ts.isNoSubstitutionTemplateLiteral(e) ||
731
+ ts.isObjectLiteralExpression(e) ||
732
+ ts.isArrayLiteralExpression(e) ||
733
+ ts.isArrowFunction(e) ||
734
+ ts.isFunctionExpression(e) ||
735
+ e.kind === ts.SyntaxKind.TrueKeyword ||
736
+ e.kind === ts.SyntaxKind.FalseKeyword);
737
+ }
738
+ //# sourceMappingURL=runtime-optional-elements.js.map