@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
@@ -5,10 +5,15 @@ import { isRefCounted, typeEquals, typeKey } from "../../ir/ir.js";
5
5
  import { mangleResolveThunk } from "../mangle.js";
6
6
  import { elemAccess, FN_ATTRS, mapKeyAccess, mapKeyKindNum, mapKeyParamType, mapValKindNum, traceArg, vAdapters, } from "./shapes.js";
7
7
  import { F64_INF, f64Lit } from "./common.js";
8
+ import { MUTATING_COLLECTION_METHODS } from "../publication.js";
8
9
  import { borrowsStringInputs, emitStringInputs } from "./string-lifetimes.js";
9
- import { emitMapLookupKey, borrowsMapReadInputs, borrowsMapMutationReceiver, } from "./map-read-lifetimes.js";
10
+ import { emitMapLookupKey, borrowsMapReadInputs, borrowsMapMutationReceiver, inlineNumberKey, } from "./map-read-lifetimes.js";
11
+ import { emitNumberMapGetRef, emitNumberMapGetScalar, emitNumberMapHas, } from "./map-number-lookup.js";
10
12
  import { emitBorrowedInput } from "./borrowed-inputs.js";
11
13
  import { emitStringSliceRead } from "./string-slices.js";
14
+ import { STRING_CHAR_CODE_AT_DECL, STRING_UTF16_LEN_DECL } from "./string-reads.js";
15
+ import { emitDenseArrayNumber, emitDenseArrayPush } from "./dense-array-access.js";
16
+ import { emitUnionWiden } from "./expr-records.js";
12
17
  export function resolveThunkFor(host, inner) {
13
18
  const key = typeKey(inner);
14
19
  let sym = host.resolveThunks.get(key);
@@ -21,9 +26,9 @@ export function resolveThunkFor(host, inner) {
21
26
  }
22
27
  return sym;
23
28
  }
24
- export function tagInSet(host, uName, tags) {
29
+ export function tagInSet(host, uName, unionId, tags) {
25
30
  const B = host.B;
26
- const tag = host.unionTag(uName);
31
+ const tag = host.unionTag(uName, unionId);
27
32
  let acc = "";
28
33
  for (const t of tags) {
29
34
  const c = B.tmp();
@@ -40,11 +45,7 @@ export function tagInSet(host, uName, tags) {
40
45
  return acc;
41
46
  }
42
47
  export function arrPush(host, arr, acc, value) {
43
- const argTy = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
44
- host.declare(`declare double @scr_arr_push_${acc}(ptr, ${argTy === "i1" ? "i1 zeroext" : argTy})`);
45
- const t = host.B.tmp();
46
- host.B.line(`${t} = call double @scr_arr_push_${acc}(ptr ${arr}, ${argTy} ${value})`);
47
- return t;
48
+ return emitDenseArrayPush(host, arr, acc, value);
48
49
  }
49
50
  /** Move evaluated values through one bounded slot buffer per call site. */
50
51
  export function emitArrayValues(host, arr, acc, values, prepend = false, sharedBuffer) {
@@ -95,6 +96,97 @@ export function emitArrayValues(host, arr, acc, values, prepend = false, sharedB
95
96
  }
96
97
  return result;
97
98
  }
99
+ /** A splice whose removed-elements array is discarded (statement position)
100
+ * and whose insertion items, if any, are plain evaluated values: evaluate
101
+ * the receiver, start, count, and items in order, then splice the values in
102
+ * without a result or argument array. Returns false for every other shape,
103
+ * which keeps the ordinary intrinsic. */
104
+ export function emitDiscardedSplice(host, e) {
105
+ if (!discardsSplice(e))
106
+ return false;
107
+ emitDiscarded(host, e);
108
+ return true;
109
+ }
110
+ /** The plain-value items of a splice that can drop its result, or null. */
111
+ function droppableSpliceItems(e) {
112
+ if (e.kind !== "arrIntrinsic" || e.receiver.type.kind !== "array")
113
+ return null;
114
+ if (e.method === "splice")
115
+ return [];
116
+ if (e.method !== "spliceInsert")
117
+ return null;
118
+ const list = e.args[2];
119
+ if (list?.kind !== "arrayLit" || (list.spreads?.length ?? 0) > 0)
120
+ return null;
121
+ return list.elems.length <= 64 ? list.elems : null;
122
+ }
123
+ /** A droppable splice, possibly behind statements or one arm of a
124
+ * conditional (the runtime-optional item lowering). */
125
+ function discardsSplice(e) {
126
+ if (e.kind === "seqExpr")
127
+ return discardsSplice(e.result);
128
+ if (e.kind === "ternary")
129
+ return discardsSplice(e.then) || discardsSplice(e.else_);
130
+ return droppableSpliceItems(e) !== null;
131
+ }
132
+ /** Emit an expression whose value is unused. Ternary arms keep their own
133
+ * frames, exactly like an evaluated conditional. */
134
+ function emitDiscarded(host, e) {
135
+ const B = host.B;
136
+ if (e.kind === "seqExpr") {
137
+ for (const s of e.stmts)
138
+ host.emitStmt(s);
139
+ emitDiscarded(host, e.result);
140
+ return;
141
+ }
142
+ if (e.kind === "ternary") {
143
+ const c = host.emitExpr(e.cond);
144
+ const lt = B.newLabel("drop.t"), lf = B.newLabel("drop.f"), lj = B.newLabel("drop.j");
145
+ B.condBr(c.name, lt, lf);
146
+ for (const [label, arm] of [
147
+ [lt, e.then],
148
+ [lf, e.else_],
149
+ ]) {
150
+ B.startBlock(label);
151
+ host.frames.push([]);
152
+ emitDiscarded(host, arm);
153
+ host.releaseFrame(host.frames.pop());
154
+ B.br(lj);
155
+ }
156
+ B.startBlock(lj);
157
+ return;
158
+ }
159
+ const items = droppableSpliceItems(e);
160
+ if (items === null || e.kind !== "arrIntrinsic" || e.receiver.type.kind !== "array") {
161
+ host.emitExpr(e);
162
+ return;
163
+ }
164
+ const r = emitBorrowedInput(host, e.receiver);
165
+ const acc = elemAccess(e.receiver.type.elem);
166
+ const start = host.emitExpr(e.args[0]);
167
+ const count = e.args[1] ? host.emitExpr(e.args[1]).name : F64_INF;
168
+ const values = items.map((item) => host.emitExpr(item));
169
+ if (acc === "ref")
170
+ values.forEach((value) => host.moveTemp(value));
171
+ let buffer = "null";
172
+ if (values.length > 0) {
173
+ buffer = B.tmp();
174
+ B.entryAllocas.push(`${buffer} = alloca [${values.length} x i64]`);
175
+ values.forEach((value, i) => {
176
+ const slot = B.tmp(), pointer = B.tmp();
177
+ const pack = acc === "f64"
178
+ ? `bitcast double ${value.name} to i64`
179
+ : acc === "bool"
180
+ ? `zext i1 ${value.name} to i64`
181
+ : `ptrtoint ptr ${value.name} to i64`;
182
+ B.line(`${slot} = ${pack}`);
183
+ B.line(`${pointer} = getelementptr inbounds i64, ptr ${buffer}, ${host.sizeType} ${i}`);
184
+ B.line(`store i64 ${slot}, ptr ${pointer}`);
185
+ });
186
+ }
187
+ host.declare(`declare void @scr_arr_splice_drop(ptr, double, double, ${host.sizeType}, ptr)`);
188
+ B.line(`call void @scr_arr_splice_drop(ptr ${r.name}, double ${start.name}, double ${count}, ${host.sizeType} ${values.length}, ptr ${buffer})`);
189
+ }
98
190
  export function emitArrayCopyLoop(host, dst, src, acc) {
99
191
  void acc;
100
192
  host.declare(`declare double @scr_arr_push_spread(ptr, ptr)`);
@@ -126,10 +218,19 @@ export function emitStrIntrinsic(host, e) {
126
218
  };
127
219
  const method = e.method;
128
220
  switch (method) {
129
- case "length":
130
- return call("scr_str_utf16_len", "double (ptr)", `ptr ${r.name}`, "double", false);
131
- case "charCodeAt":
132
- return call("scr_str_char_code_at", "double (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "double", false);
221
+ case "length": {
222
+ // sc_str_utf16_len (string-reads.ts) answers proven-ASCII strings inline.
223
+ host.declare(STRING_UTF16_LEN_DECL);
224
+ const t = B.tmp();
225
+ B.line(`${t} = call double @sc_str_utf16_len(ptr ${r.name})`);
226
+ return { name: t, type: e.type };
227
+ }
228
+ case "charCodeAt": {
229
+ host.declare(STRING_CHAR_CODE_AT_DECL);
230
+ const t = B.tmp();
231
+ B.line(`${t} = call double @sc_str_char_code_at(ptr ${r.name}, double ${args[0].name})`);
232
+ return { name: t, type: e.type };
233
+ }
133
234
  case "charAt":
134
235
  return call("scr_str_char_at", "ptr (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "ptr", true);
135
236
  case "indexOf":
@@ -156,8 +257,12 @@ export function emitStrIntrinsic(host, e) {
156
257
  return call("scr_str_slice", "ptr (ptr, double, double)", `ptr ${r.name}, double ${args[0]?.name ?? f64Lit(0)}, double ${args[1]?.name ?? F64_INF}`, "ptr", true);
157
258
  case "substring":
158
259
  return call("scr_str_substring", "ptr (ptr, double, double)", `ptr ${r.name}, double ${args[0].name}, double ${args[1]?.name ?? F64_INF}`, "ptr", true);
159
- case "repeat":
160
- return call("scr_str_repeat", "ptr (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "ptr", true);
260
+ case "repeat": {
261
+ // A negative or infinite count throws Node's catchable RangeError.
262
+ const result = call("scr_str_repeat", "ptr (ptr, double)", `ptr ${r.name}, double ${args[0].name}`, "ptr", true);
263
+ host.emitPendingCheck();
264
+ return result;
265
+ }
161
266
  case "trim":
162
267
  return call("scr_str_trim", "ptr (ptr)", `ptr ${r.name}`, "ptr", true);
163
268
  case "trimStart":
@@ -248,6 +353,8 @@ export function emitArrIntrinsic(host, e) {
248
353
  const table = e.receiver.kind === "varRef"
249
354
  ? host.constantNumericTables.get(e.receiver.localId)
250
355
  : undefined;
356
+ if (!table && elem.kind === "f64")
357
+ return { name: emitDenseArrayNumber(host, r.name, index, e.args[0]), type: e.type };
251
358
  host.declare(`declare double @scr_arr_get_number(ptr, double)`);
252
359
  const t = B.tmp();
253
360
  B.line(`${t} = call double @${table ? `${table.symbol}_get` : "scr_arr_get_number"}(ptr ${r.name}, double ${index.name})`);
@@ -276,12 +383,19 @@ export function emitArrIntrinsic(host, e) {
276
383
  // the last push's return, or the unchanged length for Node's
277
384
  // no-op zero-argument call.
278
385
  const vs = e.args.map((a) => host.emitExpr(a));
386
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 1, f64Lit(0), f64Lit(vs.length));
279
387
  return { name: emitArrayValues(host, r.name, acc, vs), type: e.type };
280
388
  }
281
389
  case "pushSpread": {
282
390
  // `a.push(...src)`: append src's elements in order (borrowed src,
283
391
  // count snapshotted). Result: the new length.
284
392
  const src = emitBorrowedInput(host, e.args[0]);
393
+ if (host.publishedTypes?.containerGuarded(e.receiver.type) === true) {
394
+ host.declare(`declare double @scr_arr_len(ptr)`);
395
+ const n = B.tmp();
396
+ B.line(`${n} = call double @scr_arr_len(ptr ${src.name})`);
397
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 1, f64Lit(0), n);
398
+ }
285
399
  host.emitArrayCopyLoop(r.name, src.name, acc);
286
400
  host.declare(`declare double @scr_arr_len(ptr)`);
287
401
  const t = B.tmp();
@@ -299,11 +413,18 @@ export function emitArrIntrinsic(host, e) {
299
413
  // Evaluate every argument before the first mutation, then insert
300
414
  // from right to left so the final front order is source order.
301
415
  const vs = e.args.map((a) => host.emitExpr(a));
416
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 4, f64Lit(0), f64Lit(vs.length));
302
417
  return { name: emitArrayValues(host, r.name, acc, vs, true), type: e.type };
303
418
  }
304
419
  case "unshiftSpread": {
305
420
  // The runtime snapshots the borrowed source and handles self-spread.
306
421
  const src = emitBorrowedInput(host, e.args[0]);
422
+ if (host.publishedTypes?.containerGuarded(e.receiver.type) === true) {
423
+ host.declare(`declare double @scr_arr_len(ptr)`);
424
+ const n = B.tmp();
425
+ B.line(`${n} = call double @scr_arr_len(ptr ${src.name})`);
426
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 4, f64Lit(0), n);
427
+ }
307
428
  host.declare(`declare double @scr_arr_unshift_spread(ptr, ptr)`);
308
429
  const t = B.tmp();
309
430
  B.line(`${t} = call double @scr_arr_unshift_spread(ptr ${r.name}, ptr ${src.name})`);
@@ -311,6 +432,7 @@ export function emitArrIntrinsic(host, e) {
311
432
  }
312
433
  case "pop":
313
434
  case "shift": {
435
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, method === "pop" ? 2 : 6);
314
436
  const dynamic = elem.kind === "dyn" && e.type.kind === "dyn";
315
437
  if (!dynamic && e.type.kind !== "union")
316
438
  throw new InternalCompilerError("llvm emitter bug: array removal result is not a union");
@@ -343,7 +465,7 @@ export function emitArrIntrinsic(host, e) {
343
465
  B.line(`${value} = icmp ne i64 ${raw}, 0`);
344
466
  else
345
467
  B.line(`${value} = inttoptr i64 ${raw} to ptr`);
346
- B.line(`store ptr ${dynamic || sameUnion ? value : host.unionNewOwned(tag, { name: value, type: elem })}, ptr ${resultSlot}`);
468
+ B.line(`store ptr ${dynamic || sameUnion || e.type.kind !== "union" ? value : host.unionNewOwned(e.type.unionId, tag, { name: value, type: elem })}, ptr ${resultSlot}`);
347
469
  B.br(lj);
348
470
  B.startBlock(la);
349
471
  if (dynamic) {
@@ -413,13 +535,28 @@ export function emitArrIntrinsic(host, e) {
413
535
  }
414
536
  case "sortPrimitive":
415
537
  case "toSortedPrimitive": {
538
+ if (e.method === "sortPrimitive")
539
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 7);
416
540
  host.declare(`declare ptr @scr_arr_sort_primitive(ptr, i1 zeroext)`);
417
541
  const result = B.tmp();
418
542
  B.line(`${result} = call ptr @scr_arr_sort_primitive(ptr ${r.name}, i1 ${e.method === "toSortedPrimitive" ? 1 : 0})`);
419
543
  return host.own({ name: result, type: e.type });
420
544
  }
545
+ case "sortValues": {
546
+ // The runtime invokes the borrowed comparator with the callValue ABI
547
+ // and stops at the first pending exception.
548
+ const count = host.emitExpr(e.args[0]);
549
+ const comparator = emitBorrowedInput(host, e.args[1]);
550
+ const cmp = e.args[1].type;
551
+ const arity = cmp.kind === "func" ? cmp.params.length : 0;
552
+ host.declare(`declare void @scr_arr_sort_values(ptr, double, ptr, i32)`);
553
+ B.line(`call void @scr_arr_sort_values(ptr ${r.name}, double ${count.name}, ptr ${comparator.name}, i32 ${arity})`);
554
+ host.emitPendingCheck();
555
+ return { name: "", type: e.type };
556
+ }
421
557
  case "reverse": {
422
558
  // Mutates in place and returns the same receiver as a fresh +1.
559
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 7);
423
560
  host.declare(`declare ptr @scr_arr_reverse(ptr)`);
424
561
  const t = B.tmp();
425
562
  B.line(`${t} = call ptr @scr_arr_reverse(ptr ${r.name})`);
@@ -429,6 +566,7 @@ export function emitArrIntrinsic(host, e) {
429
566
  case "fill":
430
567
  case "fillUndefined": {
431
568
  const args = e.args.map((arg) => host.emitExpr(arg));
569
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 7);
432
570
  const helper = e.method === "copyWithin"
433
571
  ? "scr_arr_copy_within"
434
572
  : e.method === "fillUndefined"
@@ -477,6 +615,7 @@ export function emitArrIntrinsic(host, e) {
477
615
  // removes to the end (+Infinity, the slice convention).
478
616
  const start = host.emitExpr(e.args[0]);
479
617
  const cnt = e.args[1] ? host.emitExpr(e.args[1]).name : F64_INF;
618
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 7);
480
619
  host.declare(`declare ptr @scr_arr_splice(ptr, double, double)`);
481
620
  const t = B.tmp();
482
621
  B.line(`${t} = call ptr @scr_arr_splice(ptr ${r.name}, double ${start.name}, double ${cnt})`);
@@ -486,6 +625,7 @@ export function emitArrIntrinsic(host, e) {
486
625
  const start = host.emitExpr(e.args[0]);
487
626
  const count = host.emitExpr(e.args[1]);
488
627
  const items = emitBorrowedInput(host, e.args[2]);
628
+ host.emitPublishedArrayGuard(r.name, e.receiver.type, 7);
489
629
  host.declare(`declare ptr @scr_arr_splice_insert(ptr, double, double, ptr)`);
490
630
  const t = B.tmp();
491
631
  B.line(`${t} = call ptr @scr_arr_splice_insert(ptr ${r.name}, double ${start.name}, double ${count.name}, ptr ${items.name})`);
@@ -508,6 +648,16 @@ export function emitArrIntrinsic(host, e) {
508
648
  }
509
649
  export function wrapNullable(host, raw, present, valueType, valueTag, resultType, absentTag) {
510
650
  const B = host.B;
651
+ if (host.nullableUnions.has(resultType.unionId)) {
652
+ // A nullable union is its present payload, or the absent arm's encoding.
653
+ const absent = host.unitInstanceRef(resultType.unionId, absentTag);
654
+ if (raw === present && absent === "null")
655
+ return host.own({ name: present, type: resultType });
656
+ const isnull = B.tmp(), t = B.tmp();
657
+ B.line(`${isnull} = icmp eq ptr ${raw}, null`);
658
+ B.line(`${t} = select i1 ${isnull}, ptr ${absent}, ptr ${present}`);
659
+ return host.own({ name: t, type: resultType });
660
+ }
511
661
  const slot = B.slot();
512
662
  B.entryAllocas.push(`${slot} = alloca ptr`);
513
663
  const isnull = B.tmp();
@@ -517,7 +667,7 @@ export function wrapNullable(host, raw, present, valueType, valueTag, resultType
517
667
  const lj = B.newLabel("nw.j");
518
668
  B.condBr(isnull, la, lp);
519
669
  B.startBlock(lp);
520
- B.line(`store ptr ${host.unionNewOwned(valueTag, { name: present, type: valueType })}, ptr ${slot}`);
670
+ B.line(`store ptr ${host.unionNewOwned(resultType.unionId, valueTag, { name: present, type: valueType })}, ptr ${slot}`);
521
671
  B.br(lj);
522
672
  B.startBlock(la);
523
673
  B.line(`store ptr ${host.unitInstanceRef(resultType.unionId, absentTag)}, ptr ${slot}`);
@@ -601,6 +751,10 @@ export function emitMapLikeIntrinsic(host, e) {
601
751
  const kAcc = mapKeyAccess(key);
602
752
  const kTy = mapKeyParamType(kAcc);
603
753
  const method = e.method;
754
+ // A published Map or Set rejects mutation (the guard precedes the
755
+ // operands, which each method evaluates itself).
756
+ if (MUTATING_COLLECTION_METHODS.has(method))
757
+ host.emitPublishedCollectionGuard(r.name, receiverType);
604
758
  if (method === "clone" || method === "keySet") {
605
759
  const keysOnly = method === "keySet" || receiverType.kind === "set";
606
760
  const checked = key.kind === "dyn" &&
@@ -704,12 +858,48 @@ export function emitMapLikeIntrinsic(host, e) {
704
858
  if (!def || undefTag < 0)
705
859
  throw new InternalCompilerError("llvm emitter bug: map get union lacks its undefined arm");
706
860
  const absent = host.unitInstanceRef(e.type.unionId, undefTag);
707
- if (value.kind === "union") {
861
+ if (value.kind === "union" &&
862
+ host.nullableUnions.has(value.unionId) &&
863
+ !typeEquals(value, e.type)) {
864
+ // A nullable `C | null` value widens into `C | null | undefined`:
865
+ // NULL is the stored null, so presence decides the undefined arm.
866
+ host.declare(`declare zeroext i1 @scr_map_has_${kAcc}(ptr, ${kTy})`);
708
867
  host.declare(`declare ptr @scr_map_get_${kAcc}_ref(ptr, ${kTy})`);
868
+ const has = B.tmp();
869
+ B.line(`${has} = call zeroext i1 @scr_map_has_${kAcc}(ptr ${r.name}, ${k.args})`);
870
+ const slot = B.slot();
871
+ B.entryAllocas.push(`${slot} = alloca ptr`);
872
+ const lp = B.newLabel("mgn.p");
873
+ const la = B.newLabel("mgn.a");
874
+ const lj = B.newLabel("mgn.j");
875
+ B.condBr(has, lp, la);
876
+ B.startBlock(lp);
709
877
  const raw = B.tmp();
878
+ B.line(`${raw} = call ptr @scr_map_get_${kAcc}_ref(ptr ${r.name}, ${k.args})`);
879
+ const widened = emitUnionWiden(host, raw, value.unionId, e.type.unionId, true);
880
+ B.line(`store ptr ${widened}, ptr ${slot}`);
881
+ B.br(lj);
882
+ B.startBlock(la);
883
+ B.line(`store ptr ${absent}, ptr ${slot}`);
884
+ B.br(lj);
885
+ B.startBlock(lj);
886
+ const t = B.tmp();
887
+ B.line(`${t} = load ptr, ptr ${slot}`);
888
+ return host.own({ name: t, type: e.type });
889
+ }
890
+ const numberKey = inlineNumberKey(k);
891
+ if (value.kind === "union") {
710
892
  const isnull = B.tmp();
711
893
  const t = B.tmp();
712
- B.line(`${raw} = call ptr @scr_map_get_${kAcc}_ref(ptr ${r.name}, ${k.args})`);
894
+ let raw;
895
+ if (numberKey !== null) {
896
+ raw = emitNumberMapGetRef(host, r.name, numberKey, value);
897
+ }
898
+ else {
899
+ host.declare(`declare ptr @scr_map_get_${kAcc}_ref(ptr, ${kTy})`);
900
+ raw = B.tmp();
901
+ B.line(`${raw} = call ptr @scr_map_get_${kAcc}_ref(ptr ${r.name}, ${k.args})`);
902
+ }
713
903
  B.line(`${isnull} = icmp eq ptr ${raw}, null`);
714
904
  B.line(`${t} = select i1 ${isnull}, ptr ${absent}, ptr ${raw}`);
715
905
  return host.own({ name: t, type: e.type });
@@ -719,12 +909,36 @@ export function emitMapLikeIntrinsic(host, e) {
719
909
  throw new InternalCompilerError("llvm emitter bug: map get union lacks its value arm");
720
910
  if (value.kind === "f64" || value.kind === "bool") {
721
911
  const outTy = value.kind === "f64" ? "double" : "i8";
722
- const outSlot = B.slot();
723
- B.entryAllocas.push(`${outSlot} = alloca ${outTy}`);
724
- B.line(`store ${outTy} ${value.kind === "f64" ? f64Lit(0) : "0"}, ptr ${outSlot}`);
725
- host.declare(`declare zeroext i1 @scr_map_get_${kAcc}_${value.kind === "f64" ? "f64" : "bool"}(ptr, ${kTy}, ptr)`);
726
- const found = B.tmp();
727
- B.line(`${found} = call zeroext i1 @scr_map_get_${kAcc}_${value.kind === "f64" ? "f64" : "bool"}(ptr ${r.name}, ${k.args}, ptr ${outSlot})`);
912
+ let found;
913
+ let readHit;
914
+ if (numberKey !== null) {
915
+ const scalar = emitNumberMapGetScalar(host, r.name, numberKey);
916
+ found = scalar.found;
917
+ readHit = () => {
918
+ const hit = B.tmp();
919
+ B.line(value.kind === "f64"
920
+ ? `${hit} = bitcast i64 ${scalar.bits} to double`
921
+ : `${hit} = icmp ne i64 ${scalar.bits}, 0`);
922
+ return hit;
923
+ };
924
+ }
925
+ else {
926
+ const outSlot = B.slot();
927
+ B.entryAllocas.push(`${outSlot} = alloca ${outTy}`);
928
+ B.line(`store ${outTy} ${value.kind === "f64" ? f64Lit(0) : "0"}, ptr ${outSlot}`);
929
+ host.declare(`declare zeroext i1 @scr_map_get_${kAcc}_${value.kind === "f64" ? "f64" : "bool"}(ptr, ${kTy}, ptr)`);
930
+ found = B.tmp();
931
+ B.line(`${found} = call zeroext i1 @scr_map_get_${kAcc}_${value.kind === "f64" ? "f64" : "bool"}(ptr ${r.name}, ${k.args}, ptr ${outSlot})`);
932
+ readHit = () => {
933
+ const rawOut = B.tmp();
934
+ B.line(`${rawOut} = load ${outTy}, ptr ${outSlot}`);
935
+ if (value.kind !== "bool")
936
+ return rawOut;
937
+ const hit = B.tmp();
938
+ B.line(`${hit} = trunc i8 ${rawOut} to i1`);
939
+ return hit;
940
+ };
941
+ }
728
942
  const slot = B.slot();
729
943
  B.entryAllocas.push(`${slot} = alloca ptr`);
730
944
  const lp = B.newLabel("mg.p");
@@ -732,14 +946,8 @@ export function emitMapLikeIntrinsic(host, e) {
732
946
  const lj = B.newLabel("mg.j");
733
947
  B.condBr(found, lp, la);
734
948
  B.startBlock(lp);
735
- const rawOut = B.tmp();
736
- B.line(`${rawOut} = load ${outTy}, ptr ${outSlot}`);
737
- let hit = rawOut;
738
- if (value.kind === "bool") {
739
- hit = B.tmp();
740
- B.line(`${hit} = trunc i8 ${rawOut} to i1`);
741
- }
742
- B.line(`store ptr ${host.unionNewOwned(valueTag, { name: hit, type: value })}, ptr ${slot}`);
949
+ const hit = readHit();
950
+ B.line(`store ptr ${host.unionNewOwned(e.type.unionId, valueTag, { name: hit, type: value })}, ptr ${slot}`);
743
951
  B.br(lj);
744
952
  B.startBlock(la);
745
953
  B.line(`store ptr ${absent}, ptr ${slot}`);
@@ -749,6 +957,10 @@ export function emitMapLikeIntrinsic(host, e) {
749
957
  B.line(`${t} = load ptr, ptr ${slot}`);
750
958
  return host.own({ name: t, type: e.type });
751
959
  }
960
+ if (numberKey !== null && isRefCounted(value)) {
961
+ const raw = emitNumberMapGetRef(host, r.name, numberKey, value);
962
+ return host.wrapNullable(raw, raw, value, valueTag, e.type, undefTag);
963
+ }
752
964
  host.declare(`declare ptr @scr_map_get_${kAcc}_ref(ptr, ${kTy})`);
753
965
  const raw = B.tmp();
754
966
  B.line(`${raw} = call ptr @scr_map_get_${kAcc}_ref(ptr ${r.name}, ${k.args})`);
@@ -778,6 +990,8 @@ export function emitMapLikeIntrinsic(host, e) {
778
990
  }
779
991
  case "has": {
780
992
  const k = borrowInputs ? host.emitReadReceiver(e.args[0]) : host.emitExpr(e.args[0]);
993
+ if (kAcc === "f64")
994
+ return { name: emitNumberMapHas(host, r.name, k.name), type: e.type };
781
995
  host.declare(`declare zeroext i1 @scr_map_has_${kAcc}(ptr, ${kTy})`);
782
996
  const t = B.tmp();
783
997
  B.line(`${t} = call zeroext i1 @scr_map_has_${kAcc}(ptr ${r.name}, ${kTy} ${k.name})`);