@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
@@ -1,9 +1,13 @@
1
+ import { lowerArrayIteratorValue } from "../iterator-adapters.js";
2
+ import { identityPreservingWidening } from "../coercions/identity.js";
3
+ import { arrayConcatHelper } from "./array-concat.js";
1
4
  import { boolLit, countedFor, numLit, strLit, varRef } from "../../../ir/build.js";
2
5
  import { InternalCompilerError } from "../../../errors.js";
3
6
  import * as ts from "../../ts7/adapter.js";
4
7
  import { BOOL, DYN, F64, JSVAL, STRING, UNDEFINED_T, arrayOf, isRefCounted, isUnitType, typeEquals, } from "../../../ir/ir.js";
5
8
  import { ARRAY_METHODS } from "../surfaces.js";
6
9
  import { tryLowerExpression } from "../expressions/try-lower-expression.js";
10
+ import { isSafeToRepeat } from "../expressions/evaluation-safety.js";
7
11
  import { isJsSourceFile, locOf } from "../../program.js";
8
12
  import { islandPrimitiveExit, lowerDynDispatchMethodCall } from "../lower-calls.js";
9
13
  import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, } from "../array-values.js";
@@ -11,9 +15,124 @@ import { typeKey } from "../../type-mapper.js";
11
15
  import { defaultAfterUndefined, lowerPositionArgument, lowerStaticallyUndefinedArgument, positionNumber, } from "../optional-arguments.js";
12
16
  import { lowerArrayCopyWithin, lowerArrayFill } from "../array-indexed-mutation.js";
13
17
  import { lowerArrayUnionHofCall, lowerArraySortCall, lowerArrayHofCall, lowerArrayFindLikeCall, lowerArrayFlatMapCall, lowerArrayReduceCall, } from "./array-callbacks.js";
14
- import { lowerArraySpreadItems, lowerArrayValueItems } from "./array-construction.js";
18
+ import { lowerArraySpreadItems, lowerArrayValueItems, widenArraySpread, } from "./array-construction.js";
15
19
  import { arrayLengthDeclaration } from "./array-iteration.js";
16
20
  import { lowerArrayCallback, callbackArrayElement, requireProducedArrayElement, } from "./callback-arguments.js";
21
+ /** `a.push(v, ...)` where some argument is a runtime-optional read of the
22
+ * element type (an unchecked array read or a hole-observing iteration
23
+ * binding). Every argument evaluates before the first append; a present
24
+ * value takes the ordinary push (and its inline dense fast path), while a
25
+ * missing one appends a present-undefined slot at the current length,
26
+ * exactly what Node stores. The result is the final length. Pure
27
+ * receivers and arguments are repeated instead of copied into temporaries:
28
+ * appends run no user code, so repeated reads observe the same values. */
29
+ function lowerOptionalArrayPush(lowerer, receiver, values, elem, loc) {
30
+ const stmts = [];
31
+ const pure = isSafeToRepeat(receiver) && values.every(isSafeToRepeat);
32
+ const stable = (value, name) => {
33
+ if (pure)
34
+ return value;
35
+ const temp = lowerer.declareHiddenLocal(name, value.type);
36
+ stmts.push({ kind: "varDecl", localId: temp.id, init: value, loc });
37
+ return varRef(temp.id, value.type, loc);
38
+ };
39
+ const target = stable(receiver, "%pushTarget");
40
+ const args = values.map((value) => stable(value, "%pushValue"));
41
+ const length = () => ({
42
+ kind: "arrIntrinsic",
43
+ method: "length",
44
+ receiver: target,
45
+ args: [],
46
+ type: F64,
47
+ loc,
48
+ });
49
+ const push = (value) => ({
50
+ kind: "exprStmt",
51
+ expr: { kind: "arrIntrinsic", method: "push", receiver: target, args: [value], type: F64, loc },
52
+ loc,
53
+ });
54
+ for (const value of args) {
55
+ if (value.type.kind === "union" && lowerer.runtimeOptionalWidening(value.type, elem) !== null) {
56
+ const unionId = value.type.unionId;
57
+ stmts.push({
58
+ kind: "if",
59
+ cond: {
60
+ kind: "unionIsTag",
61
+ unionId,
62
+ tag: lowerer.armTag(unionId, UNDEFINED_T),
63
+ negated: false,
64
+ value,
65
+ type: BOOL,
66
+ loc,
67
+ },
68
+ then: [{ kind: "arraySetUndefined", arr: target, index: length(), loc }],
69
+ else_: [push(lowerer.coerceToExpected(value, elem))],
70
+ loc,
71
+ });
72
+ }
73
+ else {
74
+ stmts.push(push(lowerer.coerceToExpected(value, elem)));
75
+ }
76
+ }
77
+ return { kind: "seqExpr", stmts, result: length(), type: F64, loc };
78
+ }
79
+ /** `a.splice(start, count, v)` where v may hold undefined at run time.
80
+ * Receiver, start, count, and v evaluate once, in order; a present v is
81
+ * inserted as a plain element literal (which a statement-position splice
82
+ * then inserts without any temporary array), a missing one through the
83
+ * present-undefined item array. Both arms return the removed elements. */
84
+ function lowerOptionalSpliceItem(lowerer, receiver, positions, value, elem, arrType, loc) {
85
+ const stmts = [];
86
+ const repeatable = (e) => e.kind === "numLit" || isSafeToRepeat(e);
87
+ const pure = repeatable(receiver) && positions.every(repeatable) && repeatable(value);
88
+ const stable = (e, name) => {
89
+ if (pure)
90
+ return e;
91
+ const temp = lowerer.declareHiddenLocal(name, e.type);
92
+ stmts.push({ kind: "varDecl", localId: temp.id, init: e, loc });
93
+ return varRef(temp.id, e.type, loc);
94
+ };
95
+ const target = stable(receiver, "%spliceTarget");
96
+ const bounds = positions.map((position) => stable(position, "%splicePosition"));
97
+ const item = stable(value, "%spliceValue");
98
+ if (item.type.kind !== "union")
99
+ throw new InternalCompilerError("runtime-optional splice item is not a union");
100
+ const splice = (items) => ({
101
+ kind: "arrIntrinsic",
102
+ method: "spliceInsert",
103
+ receiver: target,
104
+ args: [...bounds, items],
105
+ type: arrType,
106
+ loc,
107
+ });
108
+ return {
109
+ kind: "seqExpr",
110
+ stmts,
111
+ result: {
112
+ kind: "ternary",
113
+ cond: {
114
+ kind: "unionIsTag",
115
+ unionId: item.type.unionId,
116
+ tag: lowerer.armTag(item.type.unionId, UNDEFINED_T),
117
+ negated: false,
118
+ value: item,
119
+ type: BOOL,
120
+ loc,
121
+ },
122
+ then: splice(lowerArrayValueItems(lowerer, [item], elem, arrType, loc)),
123
+ else_: splice({
124
+ kind: "arrayLit",
125
+ elems: [lowerer.coerceToExpected(item, elem)],
126
+ type: arrType,
127
+ loc,
128
+ }),
129
+ type: arrType,
130
+ loc,
131
+ },
132
+ type: arrType,
133
+ loc,
134
+ };
135
+ }
17
136
  function primitivePositionType(lowerer, type) {
18
137
  if (type.kind === "union") {
19
138
  return (lowerer.unions.get(type.unionId)?.arms.every((arm) => primitivePositionType(lowerer, arm)) ??
@@ -100,7 +219,12 @@ export function lowerArrayMethodCall(lowerer, call, access) {
100
219
  if (lowerer.chainBlocked(access, call))
101
220
  return null;
102
221
  const name = access.name.text;
103
- if (!ARRAY_METHODS.has(name) && name !== "sort" && name !== "shift" && name !== "splice")
222
+ const iteratorMethod = (name === "values" || name === "keys" || name === "entries") && call.arguments.length === 0;
223
+ if (!ARRAY_METHODS.has(name) &&
224
+ name !== "sort" &&
225
+ name !== "shift" &&
226
+ name !== "splice" &&
227
+ !iteratorMethod)
104
228
  return null;
105
229
  let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
106
230
  const checkerReceiver = lowerer.checker.getTypeAtLocation(access.expression);
@@ -144,6 +268,19 @@ export function lowerArrayMethodCall(lowerer, call, access) {
144
268
  return null;
145
269
  let elem = receiverIr.elem;
146
270
  const loc = locOf(call);
271
+ if (iteratorMethod) {
272
+ const type = lowerer.mapTypeOf(lowerer.typeOf(call));
273
+ const receiver = lowerer.lowerExpr(access.expression);
274
+ // Only a static array resolves to a generator here; other lowered
275
+ // receivers (island arrays, narrowed unions, checked dynamic values)
276
+ // continue to their dedicated handling below.
277
+ if (receiver.type.kind === "array") {
278
+ const value = type ? lowerArrayIteratorValue(lowerer, receiver, name, type, loc) : null;
279
+ if (value)
280
+ return value;
281
+ lowerer.unsupported("SC1090", call, `'${name}()' iterators over this array element type`);
282
+ }
283
+ }
147
284
  // An island handle behind an array-typed .d.ts surface
148
285
  // (`parts().join("-")` — arrays never exit eagerly, so the value
149
286
  // stays jsval): the ENGINE's own Array.prototype method runs on the
@@ -436,9 +573,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
436
573
  : null;
437
574
  if ((name === "push" || name === "unshift") && spreadArg && ts.isSpreadElement(spreadArg)) {
438
575
  let src = lowerer.lowerExpr(spreadArg.expression);
439
- // `a.push(...someSet)` / `a.unshift(...someSet)`: a same-element Set drains first
576
+ // `a.push(...someSet)` / `a.unshift(...someSet)`: a compatible Set drains first
440
577
  // (setIntrinsic toArray — insertion order), then appends.
441
- if (src.type.kind === "set" && typeEquals(src.type.elem, elem)) {
578
+ if (src.type.kind === "set" && identityPreservingWidening(lowerer, src.type.elem, elem)) {
442
579
  src = {
443
580
  kind: "setIntrinsic",
444
581
  method: "toArray",
@@ -448,6 +585,19 @@ export function lowerArrayMethodCall(lowerer, call, access) {
448
585
  loc,
449
586
  };
450
587
  }
588
+ if (src.type.kind === "array" &&
589
+ !typeEquals(src.type, receiverIr) &&
590
+ identityPreservingWidening(lowerer, src.type.elem, elem)) {
591
+ const items = widenArraySpread(lowerer, src, elem, loc);
592
+ return {
593
+ kind: "arrIntrinsic",
594
+ method: name === "push" ? "pushSpread" : "unshiftSpread",
595
+ receiver,
596
+ args: [items],
597
+ type: F64,
598
+ loc,
599
+ };
600
+ }
451
601
  if (!typeEquals(src.type, receiverIr)) {
452
602
  lowerer.unsupported("SC1090", spreadArg, `${name === "push" ? "pushing" : "unshifting"} a spread of '${lowerer.fmt(src.type)}' onto a '${lowerer.fmt(receiverIr)}' array (only a same-element-type array spreads)`);
453
603
  }
@@ -476,10 +626,13 @@ export function lowerArrayMethodCall(lowerer, call, access) {
476
626
  }
477
627
  const valueProbes = call.arguments.map((arg) => tryLowerExpression(lowerer, arg));
478
628
  if (valueProbes.some((probe) => probe !== null && lowerer.runtimeOptionalWidening(probe.type, elem) !== null)) {
629
+ if (name === "push") {
630
+ return lowerOptionalArrayPush(lowerer, receiver, call.arguments.map((arg) => lowerer.lowerExpr(arg)), elem, loc);
631
+ }
479
632
  const items = lowerArrayValueItems(lowerer, call.arguments.map((arg) => lowerer.lowerExpr(arg)), elem, receiverIr, loc);
480
633
  return {
481
634
  kind: "arrIntrinsic",
482
- method: name === "push" ? "pushSpread" : "unshiftSpread",
635
+ method: "unshiftSpread",
483
636
  receiver,
484
637
  args: [items],
485
638
  type: F64,
@@ -502,6 +655,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
502
655
  };
503
656
  }
504
657
  if (name === "pop") {
658
+ // An unused result needs no value at all: drop the last slot.
659
+ if (resultDiscarded(call))
660
+ return lowerDiscardedPop(lowerer, access.expression, loc);
505
661
  // Widen a union payload through the normal array-read machinery
506
662
  // before removing it. Reinterpreting the stored union's tag as the
507
663
  // result union would confuse arms when undefined changes their order.
@@ -540,7 +696,7 @@ export function lowerArrayMethodCall(lowerer, call, access) {
540
696
  const argIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
541
697
  const probedArg = probedUntyped ? tryLowerExpression(lowerer, argNode) : null;
542
698
  const argArrayType = probedArg?.type.kind === "array" ? probedArg.type : argIr?.kind === "array" ? argIr : null;
543
- if (argArrayType !== null && typeEquals(argArrayType.elem, elem)) {
699
+ if (argArrayType !== null) {
544
700
  if (elem.kind === "array" && typeEquals(argArrayType, elem)) {
545
701
  // number[][].concat(inner: number[]) — TS says element, JS's
546
702
  // IsArray says spread; no honest static answer exists.
@@ -554,7 +710,7 @@ export function lowerArrayMethodCall(lowerer, call, access) {
554
710
  arg = lowerer.coerceInto(argNode, arg, argArrayType);
555
711
  if (arg.type.kind !== "array")
556
712
  lowerer.badType(argNode, lowerer.typeOf(argNode));
557
- shape.push("a");
713
+ shape.push(arg.type.elem);
558
714
  args.push(arg);
559
715
  continue;
560
716
  }
@@ -567,16 +723,16 @@ export function lowerArrayMethodCall(lowerer, call, access) {
567
723
  if (elem.kind === "jsval") {
568
724
  const arg = lowerer.lowerExpr(argNode);
569
725
  if (arg.type.kind === "array" && arg.type.elem.kind === "jsval") {
570
- shape.push("a");
726
+ shape.push(arg.type.elem);
571
727
  args.push(arg);
572
728
  continue;
573
729
  }
574
730
  }
575
731
  // An element value — union elements wrap exactly like a push.
576
- shape.push("e");
732
+ shape.push(null);
577
733
  args.push(lowerer.lowerExprExpecting(argNode, elem));
578
734
  }
579
- const helper = arrayConcatHelper(lowerer, elem, shape, loc);
735
+ const helper = arrayConcatHelper(lowerer, elem, shape, call, loc);
580
736
  return { kind: "call", callee: helper, args: [receiver, ...args], type: receiverIr, loc };
581
737
  }
582
738
  if (name === "slice") {
@@ -600,6 +756,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
600
756
  const hasSpread = itemNodes.some(ts.isSpreadElement);
601
757
  const itemProbes = hasSpread ? [] : itemNodes.map((arg) => tryLowerExpression(lowerer, arg));
602
758
  const statefulItems = itemProbes.some((probe) => probe !== null && lowerer.runtimeOptionalWidening(probe.type, elem) !== null);
759
+ if (statefulItems && itemNodes.length === 1) {
760
+ return lowerOptionalSpliceItem(lowerer, receiver, args, lowerer.lowerExpr(itemNodes[0]), elem, receiverIr, loc);
761
+ }
603
762
  const items = hasSpread
604
763
  ? lowerArraySpreadItems(lowerer, itemNodes, elem, receiverIr, loc)
605
764
  : statefulItems
@@ -688,7 +847,80 @@ export function lowerArrayMethodCall(lowerer, call, access) {
688
847
  // reduce / reduceRight
689
848
  return lowerArrayReduceCall(lowerer, call, access, name, elem);
690
849
  }
691
- /** Read before splice so removal cannot destroy the result's owned payload.
850
+ /** The call's value is never read: an expression statement, a `void`
851
+ * operand, the left of a comma, or a for-loop initializer or update. */
852
+ function resultDiscarded(call) {
853
+ let child = call;
854
+ let parent = call.parent;
855
+ while (parent && ts.isParenthesizedExpression(parent)) {
856
+ child = parent;
857
+ parent = parent.parent;
858
+ }
859
+ if (!parent)
860
+ return false;
861
+ if (ts.isExpressionStatement(parent) || ts.isVoidExpression(parent))
862
+ return true;
863
+ if (ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.CommaToken)
864
+ return parent.left === child || resultDiscarded(parent);
865
+ return (ts.isForStatement(parent) && (parent.initializer === child || parent.incrementor === child));
866
+ }
867
+ /** `xs.pop()` whose result is unused: truncate a non-empty array by one
868
+ * slot. Truncation releases the removed element and leaves the length of
869
+ * an empty array at zero, as pop does (pop's own `length = 0` store, a
870
+ * no-op unless the array is frozen). */
871
+ function lowerDiscardedPop(lowerer, source, loc) {
872
+ const receiver = lowerer.lowerExpr(source);
873
+ const arr = lowerer.declareHiddenLocal("%popArray", receiver.type);
874
+ const arrRef = varRef(arr.id, arr.type, loc);
875
+ const length = lowerer.declareHiddenLocal("%popLength", F64);
876
+ const lengthRef = varRef(length.id, F64, loc);
877
+ return {
878
+ kind: "seqExpr",
879
+ stmts: [
880
+ { kind: "varDecl", localId: arr.id, init: receiver, loc },
881
+ {
882
+ kind: "varDecl",
883
+ localId: length.id,
884
+ init: {
885
+ kind: "arrIntrinsic",
886
+ method: "length",
887
+ receiver: arrRef,
888
+ args: [],
889
+ type: F64,
890
+ loc,
891
+ },
892
+ loc,
893
+ },
894
+ {
895
+ kind: "if",
896
+ cond: { kind: "bin", op: ">", left: lengthRef, right: numLit(0, loc), type: BOOL, loc },
897
+ then: [
898
+ {
899
+ kind: "arraySetLength",
900
+ arr: arrRef,
901
+ length: {
902
+ kind: "bin",
903
+ op: "-",
904
+ left: lengthRef,
905
+ right: numLit(1, loc),
906
+ type: F64,
907
+ loc,
908
+ },
909
+ loc,
910
+ pop: true,
911
+ },
912
+ ],
913
+ else_: [{ kind: "arraySetLength", arr: arrRef, length: numLit(0, loc), loc, pop: true }],
914
+ loc,
915
+ },
916
+ ],
917
+ // The value is never read; any placeholder scalar keeps it unboxed.
918
+ result: numLit(0, loc),
919
+ type: F64,
920
+ loc,
921
+ };
922
+ }
923
+ /** Read before removal so it cannot destroy the result's owned payload.
692
924
  * The source is evaluated once and empty/sparse arrays yield undefined using
693
925
  * the same slot-state checks as an indexed read. */
694
926
  function lowerUnionArrayRemoval(lowerer, source, elem, first, loc) {
@@ -726,18 +958,39 @@ function lowerUnionArrayRemoval(lowerer, source, elem, first, loc) {
726
958
  loc,
727
959
  },
728
960
  { kind: "varDecl", localId: result.id, init: value, loc },
729
- {
730
- kind: "exprStmt",
731
- expr: {
732
- kind: "arrIntrinsic",
733
- method: "splice",
734
- receiver: arrRef,
735
- args: [indexRef, numLit(1, loc)],
736
- type: arr.type,
961
+ first
962
+ ? {
963
+ kind: "exprStmt",
964
+ expr: {
965
+ kind: "arrIntrinsic",
966
+ method: "splice",
967
+ receiver: arrRef,
968
+ args: [indexRef, numLit(1, loc)],
969
+ type: arr.type,
970
+ loc,
971
+ },
972
+ loc,
973
+ }
974
+ : {
975
+ // Removing the last slot is a truncation: no removed-element
976
+ // array, and an empty array keeps length zero.
977
+ kind: "if",
978
+ cond: {
979
+ kind: "bin",
980
+ op: ">=",
981
+ left: indexRef,
982
+ right: numLit(0, loc),
983
+ type: BOOL,
984
+ loc,
985
+ },
986
+ then: [{ kind: "arraySetLength", arr: arrRef, length: indexRef, loc, pop: true }],
987
+ // Pop's `length = 0` store on an empty array (a no-op unless the
988
+ // array is frozen).
989
+ else_: [
990
+ { kind: "arraySetLength", arr: arrRef, length: numLit(0, loc), loc, pop: true },
991
+ ],
737
992
  loc,
738
993
  },
739
- loc,
740
- },
741
994
  ],
742
995
  result: varRef(result.id, result.type, loc),
743
996
  type: result.type,
@@ -1576,129 +1829,6 @@ export function lowerTupleReadMethodCall(lowerer, call, access, tupleReceiver) {
1576
1829
  }
1577
1830
  return { kind: "call", callee: helper, args: [receiver, fnArg], type: outType, loc };
1578
1831
  }
1579
- /** An ordinary indexed read: values retain their element type, while
1580
- * holes, missing properties, and present undefined yield undefined. */
1581
- export function lowerSafeIndexRead(lowerer, arr, index, loc) {
1582
- if (arr.type.kind !== "array")
1583
- throw new InternalCompilerError("indexed read requires an array");
1584
- const elem = arr.type.elem;
1585
- if (elem.kind === "void")
1586
- return null;
1587
- const resultT = arrayValueType(lowerer, elem);
1588
- const key = `idxOr:${typeKey(elem)}`;
1589
- let name = lowerer.arrHofHelpers.get(key);
1590
- if (!name) {
1591
- name = `%arr.idxOr.${lowerer.arrHofHelpers.size}`;
1592
- lowerer.arrHofHelpers.set(key, name);
1593
- const arrT = arr.type;
1594
- lowerer.liftedFns.push({
1595
- name,
1596
- params: [
1597
- { localId: "a.0", name: "a", type: arrT },
1598
- { localId: "i.0", name: "i", type: F64 },
1599
- ],
1600
- returnType: resultT,
1601
- locals: [
1602
- { id: "a.0", name: "a", type: arrT, mutable: false },
1603
- { id: "i.0", name: "i", type: F64, mutable: false },
1604
- ],
1605
- body: [
1606
- {
1607
- kind: "return",
1608
- value: arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc),
1609
- loc,
1610
- },
1611
- ],
1612
- loc,
1613
- });
1614
- }
1615
- return { kind: "call", callee: name, args: [arr, index], type: resultT, loc };
1616
- }
1617
- /** Fuse only our own f64-array read helper with immediate ToNumber.
1618
- * Reuse its arguments verbatim so the receiver and index still evaluate
1619
- * exactly once, in order, before the read. Do not specialize user calls,
1620
- * union-element arrays, or optional values stored in locals. */
1621
- export function tryLowerNumericIndexRead(lowerer, operand, loc) {
1622
- if (operand.kind !== "call" ||
1623
- operand.callee !== lowerer.arrHofHelpers.get(`idxOr:${typeKey(F64)}`))
1624
- return null;
1625
- const [arr, index] = operand.args;
1626
- if (operand.args.length !== 2 ||
1627
- arr?.type.kind !== "array" ||
1628
- arr.type.elem.kind !== "f64" ||
1629
- index?.type.kind !== "f64")
1630
- return null;
1631
- // The intrinsic owns the evaluated receiver through index evaluation,
1632
- // then borrows it for one slot lookup. No extra helper parameter or
1633
- // separate state/getter expressions need to retain the array again.
1634
- return {
1635
- kind: "arrIntrinsic",
1636
- method: "getNumber",
1637
- receiver: arr,
1638
- args: [index],
1639
- type: F64,
1640
- loc,
1641
- };
1642
- }
1643
- /** Backward-compatible name for the npm-static probe path. */
1644
- export const lowerNpmStaticSafeIndexRead = lowerSafeIndexRead;
1645
- /** Interned synthetic function for one (elem, argument-shape) concat —
1646
- * `%arr.concat.<n>(a, x0, x1, ...)`: a fresh array takes a's elements
1647
- * (pushSpread), then each argument pushes (element) or spreads (array)
1648
- * in order; the receiver and array arguments are only READ. Rides
1649
- * liftedFns like the HOF helpers (a plain function — no captures). */
1650
- function arrayConcatHelper(lowerer, elem, shape, loc) {
1651
- const key = `concat:${typeKey(elem)}:${shape.join("")}`;
1652
- const existing = lowerer.arrHofHelpers.get(key);
1653
- if (existing)
1654
- return existing;
1655
- const name = `%arr.concat.${lowerer.arrHofHelpers.size}`;
1656
- lowerer.arrHofHelpers.set(key, name);
1657
- const arrT = arrayOf(elem);
1658
- const locals = [
1659
- { id: "a.0", name: "a", type: arrT, mutable: false },
1660
- ...shape.map((s, i) => ({
1661
- id: `x.${i}`,
1662
- name: `x${i}`,
1663
- type: s === "a" ? arrT : elem,
1664
- mutable: false,
1665
- })),
1666
- { id: "out.0", name: "out", type: arrT, mutable: false },
1667
- ];
1668
- const params = [
1669
- { localId: "a.0", name: "a", type: arrT },
1670
- ...shape.map((s, i) => ({
1671
- localId: `x.${i}`,
1672
- name: `x${i}`,
1673
- type: s === "a" ? arrT : elem,
1674
- })),
1675
- ];
1676
- const append = (s, src) => ({
1677
- kind: "exprStmt",
1678
- expr: {
1679
- kind: "arrIntrinsic",
1680
- method: s === "a" ? "concatSpread" : "push",
1681
- receiver: varRef("out.0", arrT, loc),
1682
- args: [src],
1683
- type: F64,
1684
- loc,
1685
- },
1686
- loc,
1687
- });
1688
- const body = [
1689
- {
1690
- kind: "varDecl",
1691
- localId: "out.0",
1692
- init: { kind: "arrayLit", elems: [], type: arrT, loc },
1693
- loc,
1694
- },
1695
- append("a", varRef("a.0", arrT, loc)),
1696
- ...shape.map((s, i) => append(s, varRef(`x.${i}`, s === "a" ? arrT : elem, loc))),
1697
- { kind: "return", value: varRef("out.0", arrT, loc), loc },
1698
- ];
1699
- lowerer.liftedFns.push({ name, params, returnType: arrT, locals, body, loc });
1700
- return name;
1701
- }
1702
1832
  /** `a.at(i)` — the es2022 relative-index read. Desugars to an interned
1703
1833
  * helper over existing IR nodes, ToIntegerOrInfinity-exact: the index
1704
1834
  * truncates toward zero (floor for non-negatives, mirrored floor for