@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,12 +1,14 @@
1
1
  import { classMembershipIntervals } from "./classes.js";
2
- import { emitBorrowedInput, emitBorrowedInputs } from "./borrowed-inputs.js";
2
+ import { borrowableInputs, emitBorrowedInput, emitBorrowedInputs } from "./borrowed-inputs.js";
3
3
  import { preservesDynTest } from "./checked-value-lifetimes.js";
4
4
  import { typedRefConstructor } from "./shapes.js";
5
5
  /* Focused LLVM expression emission extracted from emitter.ts. */
6
6
  import { InternalCompilerError } from "../../errors.js";
7
+ import { emitNullableIsTag, emitNullablePresent } from "./union-repr.js";
8
+ import { isObjectArm } from "./nullable-unions.js";
7
9
  import { streamTypedRefEligible } from "../../ir/analysis.js";
8
10
  import { DYN, isDynTypedRefType, isRefCounted, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
9
- import { BYTES_ELEM_NUM } from "./common.js";
11
+ import { BYTES_ELEM_NUM, closureIdentityEqual } from "./common.js";
10
12
  import { DYN_KIND } from "./dyn.js";
11
13
  import { elemAccess, vAdapters } from "./shapes.js";
12
14
  import { LlvmUnsupportedError } from "./unsupported.js";
@@ -248,24 +250,24 @@ export function emitDynamicExpr(host, e) {
248
250
  const v = host.emitExpr(e.value);
249
251
  if (isRefCounted(arm))
250
252
  host.moveTemp(v);
251
- return host.own({ name: host.unionNewOwned(e.tag, v), type: e.type });
253
+ return host.own({ name: host.unionNewOwned(e.unionId, e.tag, v), type: e.type });
252
254
  }
253
255
  case "unionNarrow": {
254
256
  // Tag-UNCHECKED payload extraction: the frontend emits this only
255
257
  // where tsc's control-flow narrowing proved the tag. Ref payloads
256
258
  // come out +1. The receiver is consumed before any later expression.
257
- const u = host.emitReadReceiver(e.value);
259
+ const u = host.emitUnionProjection(e.value);
258
260
  const arm = e.type;
259
261
  if (isUnitType(arm))
260
262
  throw new InternalCompilerError(`llvm emitter bug: unionNarrow to unit arm ${arm.kind}`);
261
- const v = host.unionExtract(u.name, arm);
263
+ const v = host.unionExtract(u.name, e.unionId, arm);
262
264
  return host.own({ name: v, type: arm });
263
265
  }
264
266
  case "unionDisc": {
265
267
  // Shared-field read `r.kind`: switch on the runtime tag and read
266
268
  // the (same-typed) field from the concretely-typed payload.
267
269
  // Ref-counted results come out retained (+1), owned by this frame.
268
- const u = host.emitReadReceiver(e.value);
270
+ const u = host.emitUnionProjection(e.value);
269
271
  const def = host.unionsById.get(e.unionId);
270
272
  if (!def)
271
273
  throw new InternalCompilerError(`llvm emitter bug: unionDisc of unknown union ${e.unionId}`);
@@ -277,12 +279,21 @@ export function emitDynamicExpr(host, e) {
277
279
  if (arm.kind !== "record" && arm.kind !== "object") {
278
280
  throw new LlvmUnsupportedError(`unionDisc:${arm.kind}`, e.loc);
279
281
  }
280
- const payload = host.unionPeek(u.name);
282
+ const payload = host.unionPeek(u.name, def.id);
281
283
  const { ptr, type } = arm.kind === "object"
282
284
  ? host.classFieldPtr(payload, arm.className, e.field)
283
285
  : host.recordFieldPtr(payload, arm.shapeId, e.field);
284
- const v = host.loadField(ptr, type);
285
- const value = isRefCounted(e.type) ? host.retainValue(v, e.type) : v;
286
+ const nullable = arm.kind === "object" ? host.nullableFields.get(arm.className, e.field) : null;
287
+ const v = arm.kind === "object"
288
+ ? host.int32Slots.isField(arm.className, e.field)
289
+ ? host.loadInt32Field(ptr, e.type).name
290
+ : host.loadField(ptr, type)
291
+ : host.loadRecordField(ptr, type);
292
+ const value = nullable
293
+ ? host.nullableToOwnedUnion(v, nullable)
294
+ : isRefCounted(e.type)
295
+ ? host.retainValue(v, e.type)
296
+ : v;
286
297
  B.line(`store ${ty} ${value}, ptr ${slot}`);
287
298
  B.br(join);
288
299
  }, host.unionFieldGroups(def, e.field));
@@ -337,7 +348,7 @@ export function emitDynamicExpr(host, e) {
337
348
  // runtime getter answers owned (+1 for ref elements); invalid
338
349
  // indices trap. The result wraps into the join when unit arms
339
350
  // widened it.
340
- const payload = host.unionPeek(u.name);
351
+ const payload = host.unionPeek(u.name, def.id);
341
352
  const acc = elemAccess(arm.elem);
342
353
  const accTy = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
343
354
  host.declare(`declare ${acc === "bool" ? "zeroext i1" : accTy} @scr_arr_get_${acc}(ptr, double)`);
@@ -360,18 +371,18 @@ export function emitDynamicExpr(host, e) {
360
371
  }
361
372
  // The element read is already owned (+1) — ownership MOVES
362
373
  // into the union box, no extra retain.
363
- B.line(`store ptr ${host.unionNewOwned(tag, { name: v, type: arm.elem })}, ptr ${slot}`);
374
+ B.line(`store ptr ${host.unionNewOwned(e.type.unionId, tag, { name: v, type: arm.elem })}, ptr ${slot}`);
364
375
  B.br(join);
365
376
  return;
366
377
  }
367
378
  if (arm.kind !== "record")
368
379
  throw new LlvmUnsupportedError(`unionKeyGet:${arm.kind}`, e.loc);
369
380
  const shape = host.recordShape(arm.shapeId);
370
- const payload = host.unionPeek(u.name);
381
+ const payload = host.unionPeek(u.name, def.id);
371
382
  const declared = literal !== null ? shape.fields.find((f) => f.name === literal) : undefined;
372
383
  if (declared) {
373
384
  const { ptr, type: ft } = host.recordFieldPtr(payload, arm.shapeId, declared.name);
374
- const v = host.loadField(ptr, ft);
385
+ const v = host.loadRecordField(ptr, ft);
375
386
  if (typeEquals(ft, e.type)) {
376
387
  B.line(`store ${ty} ${isRefCounted(ft) ? host.retainValue(v, ft) : v}, ptr ${slot}`);
377
388
  B.br(join);
@@ -388,8 +399,11 @@ export function emitDynamicExpr(host, e) {
388
399
  throw new InternalCompilerError(`llvm emitter bug: unionKeyGet arm answer ${ft.kind} outside the join`);
389
400
  }
390
401
  const wrapped = ft.kind === "f64" || ft.kind === "bool"
391
- ? host.unionNewOwned(tag, { name: v, type: ft })
392
- : host.unionNewOwned(tag, { name: host.retainValue(v, ft), type: ft });
402
+ ? host.unionNewOwned(e.type.unionId, tag, { name: v, type: ft })
403
+ : host.unionNewOwned(e.type.unionId, tag, {
404
+ name: host.retainValue(v, ft),
405
+ type: ft,
406
+ });
393
407
  B.line(`store ptr ${wrapped}, ptr ${slot}`);
394
408
  B.br(join);
395
409
  return;
@@ -406,9 +420,12 @@ export function emitDynamicExpr(host, e) {
406
420
  }
407
421
  case "unionIsTag": {
408
422
  // A pure tag compare — the box is borrowed, no payload is touched.
409
- const u = host.emitReadReceiver(e.value);
410
- const tag = host.unionTag(u.name);
423
+ const u = host.emitUnionProjection(e.value);
424
+ const nullable = host.nullableUnions.get(e.unionId);
411
425
  const t = B.tmp();
426
+ if (nullable)
427
+ return { name: emitNullableIsTag(B, nullable, u.name, e.tag, e.negated), type: e.type };
428
+ const tag = host.unionTag(u.name, e.unionId);
412
429
  B.line(`${t} = icmp ${e.negated ? "ne" : "eq"} i32 ${tag}, ${e.tag}`);
413
430
  return { name: t, type: e.type };
414
431
  }
@@ -477,7 +494,7 @@ export function emitDynamicExpr(host, e) {
477
494
  B.line(`${pv} = getelementptr inbounds i8, ptr ${d.name}, i64 16 ; ->v.str`);
478
495
  const sv = B.tmp();
479
496
  B.line(`${sv} = load ptr, ptr ${pv}`);
480
- B.line(`${eq} = call zeroext i1 @scr_str_eq(ptr ${sv}, ptr ${s.name})`);
497
+ B.line(`${eq} = call zeroext i1 @sc_str_eq(ptr ${sv}, ptr ${s.name})`);
481
498
  }
482
499
  else if (st.kind === "f64") {
483
500
  B.line(`${pv} = getelementptr inbounds i8, ptr ${d.name}, i64 16 ; ->v.num`);
@@ -650,19 +667,74 @@ export function emitDynamicExpr(host, e) {
650
667
  return { name: neg, type: e.type };
651
668
  }
652
669
  case "unionEq": {
670
+ const direct = emitUnionEqWrappedScalar(host, e);
671
+ if (direct)
672
+ return direct;
653
673
  // Strict equality of the ARM values (tag compare + per-arm payload
654
674
  // compare — the C per-union helper, inlined). Both boxes borrowed.
655
- const inputs = emitBorrowedInputs(host, [e.left, e.right]);
675
+ // Stack-representable operands (wrapped literals, optional array
676
+ // reads, Map.get results) and stack-boxed locals never allocate: the
677
+ // compare only reads tags and payloads, and each payload has its own
678
+ // owner, so later operands cannot invalidate an earlier stack box.
679
+ // A borrowed nullable-pointer field read projects its pointer the
680
+ // same way; borrowableInputs already proved later operands cannot
681
+ // replace the field.
682
+ const operands = [e.left, e.right];
683
+ const borrowed = borrowableInputs(host, operands);
684
+ const inputs = operands.map((value, index) => borrowed[index] ||
685
+ host.isStackUnionSource(value) ||
686
+ (value.kind === "varRef" && host.isStackUnionLocal(value.localId))
687
+ ? host.emitUnionProjection(value)
688
+ : host.emitExpr(value));
656
689
  const l = inputs[0], r = inputs[1];
657
690
  const def = host.unionsById.get(e.unionId);
658
691
  if (!def)
659
692
  throw new InternalCompilerError(`llvm emitter bug: equality of unknown union ${e.unionId}`);
693
+ const nullable = host.nullableUnions.get(def.id);
694
+ if (nullable && isObjectArm(nullable)) {
695
+ // Object identity, and NULL === NULL for the unit arm: one compare.
696
+ const eq = B.tmp();
697
+ B.line(`${eq} = icmp ${e.negated ? "ne" : "eq"} ptr ${l.name}, ${r.name}`);
698
+ return { name: eq, type: e.type };
699
+ }
700
+ if (nullable) {
701
+ // String arm: identical pointers are equal (the same string or the
702
+ // same unit encoding); otherwise equal only when both hold strings
703
+ // with the same bytes.
704
+ const slot = B.slot();
705
+ B.entryAllocas.push(`${slot} = alloca i1`);
706
+ const same = B.tmp(), present = B.tmp();
707
+ B.line(`${same} = icmp eq ptr ${l.name}, ${r.name}`);
708
+ const lPresent = emitNullablePresent(B, nullable, l.name);
709
+ const rPresent = emitNullablePresent(B, nullable, r.name);
710
+ B.line(`${present} = and i1 ${lPresent}, ${rPresent}`);
711
+ B.line(`store i1 ${same}, ptr ${slot}`);
712
+ const bytes = B.newLabel("ues.b"), join = B.newLabel("ues.j");
713
+ const notSame = B.tmp(), go = B.tmp();
714
+ B.line(`${notSame} = xor i1 ${same}, true`);
715
+ B.line(`${go} = and i1 ${notSame}, ${present}`);
716
+ B.condBr(go, bytes, join);
717
+ B.startBlock(bytes);
718
+ host.declare(`declare zeroext i1 @scr_str_eq(ptr, ptr)`);
719
+ const eqBytes = B.tmp();
720
+ B.line(`${eqBytes} = call zeroext i1 @sc_str_eq(ptr ${l.name}, ptr ${r.name})`);
721
+ B.line(`store i1 ${eqBytes}, ptr ${slot}`);
722
+ B.br(join);
723
+ B.startBlock(join);
724
+ const eq = B.tmp();
725
+ B.line(`${eq} = load i1, ptr ${slot}`);
726
+ if (!e.negated)
727
+ return { name: eq, type: e.type };
728
+ const ne = B.tmp();
729
+ B.line(`${ne} = xor i1 ${eq}, true`);
730
+ return { name: ne, type: e.type };
731
+ }
660
732
  const slot = B.slot();
661
733
  B.entryAllocas.push(`${slot} = alloca i1`);
662
734
  const join = B.newLabel("ue.j");
663
735
  const same = B.newLabel("ue.s");
664
- const ltag = host.unionTag(l.name);
665
- const rtag = host.unionTag(r.name);
736
+ const ltag = host.unionTag(l.name, def.id);
737
+ const rtag = host.unionTag(r.name, def.id);
666
738
  const tagEq = B.tmp();
667
739
  B.line(`${tagEq} = icmp eq i32 ${ltag}, ${rtag}`);
668
740
  B.line(`store i1 false, ptr ${slot}`);
@@ -675,12 +747,9 @@ export function emitDynamicExpr(host, e) {
675
747
  B.line(`store i1 true, ptr ${slot}`);
676
748
  break;
677
749
  case "f64": {
678
- host.declare(`declare double @scr_union_get_f64(ptr)`);
679
- const a = B.tmp();
680
- const b = B.tmp();
750
+ const a = host.unionGetF64(l.name);
751
+ const b = host.unionGetF64(r.name);
681
752
  const t = B.tmp();
682
- B.line(`${a} = call double @scr_union_get_f64(ptr ${l.name})`);
683
- B.line(`${b} = call double @scr_union_get_f64(ptr ${r.name})`);
684
753
  if (e.sameValue) {
685
754
  // Object.is's f64 compare: NaN equals NaN, +0 differs
686
755
  // from -0 — the runtime SameValue.
@@ -694,29 +763,26 @@ export function emitDynamicExpr(host, e) {
694
763
  break;
695
764
  }
696
765
  case "bool": {
697
- host.declare(`declare zeroext i1 @scr_union_get_bool(ptr)`);
698
- const a = B.tmp();
699
- const b = B.tmp();
766
+ const a = host.unionGetBool(l.name);
767
+ const b = host.unionGetBool(r.name);
700
768
  const t = B.tmp();
701
- B.line(`${a} = call zeroext i1 @scr_union_get_bool(ptr ${l.name})`);
702
- B.line(`${b} = call zeroext i1 @scr_union_get_bool(ptr ${r.name})`);
703
769
  B.line(`${t} = icmp eq i1 ${a}, ${b}`);
704
770
  B.line(`store i1 ${t}, ptr ${slot}`);
705
771
  break;
706
772
  }
707
773
  case "string": {
708
774
  host.declare(`declare zeroext i1 @scr_str_eq(ptr, ptr)`);
709
- const a = host.unionPeek(l.name);
710
- const b = host.unionPeek(r.name);
775
+ const a = host.unionPeek(l.name, def.id);
776
+ const b = host.unionPeek(r.name, def.id);
711
777
  const t = B.tmp();
712
- B.line(`${t} = call zeroext i1 @scr_str_eq(ptr ${a}, ptr ${b})`);
778
+ B.line(`${t} = call zeroext i1 @sc_str_eq(ptr ${a}, ptr ${b})`);
713
779
  B.line(`store i1 ${t}, ptr ${slot}`);
714
780
  break;
715
781
  }
716
782
  case "bigint": {
717
783
  host.declare(`declare zeroext i1 @scr_bigint_eq(ptr, ptr)`);
718
- const a = host.unionPeek(l.name);
719
- const b = host.unionPeek(r.name);
784
+ const a = host.unionPeek(l.name, def.id);
785
+ const b = host.unionPeek(r.name, def.id);
720
786
  const t = B.tmp();
721
787
  B.line(`${t} = call zeroext i1 @scr_bigint_eq(ptr ${a}, ptr ${b})`);
722
788
  B.line(`store i1 ${t}, ptr ${slot}`);
@@ -724,10 +790,14 @@ export function emitDynamicExpr(host, e) {
724
790
  }
725
791
  default: {
726
792
  // Ref arms: pointer identity, exactly JS object equality.
727
- const a = host.unionPeek(l.name);
728
- const b = host.unionPeek(r.name);
793
+ // Function arms compare identity roots (adapters included).
794
+ const a = host.unionPeek(l.name, def.id);
795
+ const b = host.unionPeek(r.name, def.id);
729
796
  const t = B.tmp();
730
- B.line(`${t} = icmp eq ptr ${a}, ${b} ; ${arm.kind}`);
797
+ if (arm.kind === "func")
798
+ B.line(`${t} = ${closureIdentityEqual(host, a, b)}`);
799
+ else
800
+ B.line(`${t} = icmp eq ptr ${a}, ${b} ; ${arm.kind}`);
731
801
  B.line(`store i1 ${t}, ptr ${slot}`);
732
802
  break;
733
803
  }
@@ -746,14 +816,26 @@ export function emitDynamicExpr(host, e) {
746
816
  case "unionFuncEq": {
747
817
  const inputs = emitBorrowedInputs(host, [e.union, e.func]);
748
818
  const u = inputs[0], f = inputs[1];
749
- const tag = host.unionTag(u.name);
819
+ const tag = host.unionTag(u.name, e.unionId);
750
820
  const tagMatch = B.tmp();
751
821
  B.line(`${tagMatch} = icmp eq i32 ${tag}, ${e.tag}`);
752
- const payload = host.unionPeek(u.name);
753
- const ptrMatch = B.tmp();
754
- B.line(`${ptrMatch} = icmp eq ptr ${payload}, ${f.name}`);
822
+ // The payload is a closure only under the function tag; another
823
+ // arm's payload must never be read as one.
824
+ const slot = B.slot();
825
+ B.entryAllocas.push(`${slot} = alloca i1`);
826
+ B.line(`store i1 false, ptr ${slot}`);
827
+ const check = B.newLabel("ufe.c");
828
+ const join = B.newLabel("ufe.j");
829
+ B.condBr(tagMatch, check, join);
830
+ B.startBlock(check);
831
+ const payload = host.unionPeek(u.name, e.unionId);
832
+ const identical = B.tmp();
833
+ B.line(`${identical} = ${closureIdentityEqual(host, payload, f.name)}`);
834
+ B.line(`store i1 ${identical}, ptr ${slot}`);
835
+ B.br(join);
836
+ B.startBlock(join);
755
837
  const result = B.tmp();
756
- B.line(`${result} = and i1 ${tagMatch}, ${ptrMatch}`);
838
+ B.line(`${result} = load i1, ptr ${slot}`);
757
839
  if (!e.negated)
758
840
  return host.own({ name: result, type: e.type });
759
841
  const negated = B.tmp();
@@ -768,6 +850,38 @@ export function emitDynamicExpr(host, e) {
768
850
  const c = host.emitReadReceiver(e.value);
769
851
  if (e.test === "instanceof") {
770
852
  const target = host.classMetaOf(e.className);
853
+ if (!target.hierarchy) {
854
+ // Standalone class payloads have no vtable word. Their retain
855
+ // adapter identifies the exact native layout in the snapshot.
856
+ const adapterSlot = B.tmp();
857
+ const adapter = B.tmp();
858
+ B.line(`${adapterSlot} = getelementptr inbounds %ScrCaught, ptr ${c.name}, i64 0, i32 5`);
859
+ B.line(`${adapter} = load ptr, ptr ${adapterSlot}`);
860
+ let result;
861
+ const intervals = classMembershipIntervals(host.classMeta, target.def.name);
862
+ for (const candidate of host.classMeta.values()) {
863
+ if (candidate.hierarchy ||
864
+ !intervals.some((range) => range.pre <= candidate.pre && candidate.pre <= range.post))
865
+ continue;
866
+ const rc = vAdapters(host.shapeHost, { kind: "object", className: candidate.def.name });
867
+ const matches = B.tmp();
868
+ B.line(`${matches} = icmp eq ptr ${adapter}, ${rc.retain}`);
869
+ if (result === undefined)
870
+ result = matches;
871
+ else {
872
+ const joined = B.tmp();
873
+ B.line(`${joined} = or i1 ${result}, ${matches}`);
874
+ result = joined;
875
+ }
876
+ }
877
+ if (result === undefined)
878
+ throw new InternalCompilerError("empty standalone class membership");
879
+ if (e.negated !== true)
880
+ return { name: result, type: e.type };
881
+ const negated = B.tmp();
882
+ B.line(`${negated} = xor i1 ${result}, true`);
883
+ return { name: negated, type: e.type };
884
+ }
771
885
  host.declare(`declare zeroext i1 @scr_caught_instanceof(ptr, ${host.sizeType}, ${host.sizeType})`);
772
886
  let t;
773
887
  for (const interval of classMembershipIntervals(host.classMeta, target.def.name)) {
@@ -901,4 +1015,90 @@ export function emitDynamicExpr(host, e) {
901
1015
  }
902
1016
  }
903
1017
  }
1018
+ /** `u === v` where one side wraps a unit, bool, or number arm value
1019
+ * (`o.flag === true`, `o.n === undefined`): compare the other union's tag
1020
+ * and payload directly instead of boxing the plain side. Operands keep
1021
+ * their left-to-right evaluation; the union stays borrowed. Null when
1022
+ * neither side is such a wrap. */
1023
+ function emitUnionEqWrappedScalar(host, e) {
1024
+ const B = host.B;
1025
+ const def = host.unionsById.get(e.unionId);
1026
+ if (!def)
1027
+ return null;
1028
+ const scalarWrap = (x) => {
1029
+ if (x.kind !== "unionWrap" || x.unionId !== e.unionId)
1030
+ return null;
1031
+ const arm = def.arms[x.tag];
1032
+ if (!arm)
1033
+ return null;
1034
+ if (isUnitType(arm))
1035
+ return x;
1036
+ // The plain value must not run code that could release the borrowed
1037
+ // union: literals and local reads only.
1038
+ const v = x.value;
1039
+ const pure = v.kind === "boolLit" || v.kind === "numLit" || v.kind === "varRef";
1040
+ return pure && (arm.kind === "f64" || arm.kind === "bool") ? x : null;
1041
+ };
1042
+ const rightWrap = scalarWrap(e.right);
1043
+ const leftWrap = rightWrap ? null : scalarWrap(e.left);
1044
+ const wrap = rightWrap ?? leftWrap;
1045
+ if (!wrap)
1046
+ return null;
1047
+ const arm = def.arms[wrap.tag];
1048
+ let union;
1049
+ let plain = null;
1050
+ const unionInput = (value) => host.canStackReceiver(value) ? host.emitReadReceiver(value) : emitBorrowedInput(host, value);
1051
+ if (rightWrap) {
1052
+ union = unionInput(e.left);
1053
+ if (!isUnitType(arm))
1054
+ plain = host.emitExpr(wrap.value);
1055
+ }
1056
+ else {
1057
+ if (!isUnitType(arm))
1058
+ plain = host.emitExpr(wrap.value);
1059
+ union = unionInput(e.right);
1060
+ }
1061
+ const tag = host.unionTag(union.name, e.unionId);
1062
+ const tagMatch = B.tmp();
1063
+ B.line(`${tagMatch} = icmp eq i32 ${tag}, ${wrap.tag}`);
1064
+ let result = tagMatch;
1065
+ if (plain) {
1066
+ const slot = B.slot();
1067
+ B.entryAllocas.push(`${slot} = alloca i1`);
1068
+ B.line(`store i1 false, ptr ${slot}`);
1069
+ const same = B.newLabel("ueq.s");
1070
+ const join = B.newLabel("ueq.j");
1071
+ B.condBr(tagMatch, same, join);
1072
+ B.startBlock(same);
1073
+ const eq = B.tmp();
1074
+ if (arm.kind === "f64") {
1075
+ host.declare(`declare double @scr_union_get_f64(ptr)`);
1076
+ const v = B.tmp();
1077
+ B.line(`${v} = call double @scr_union_get_f64(ptr ${union.name})`);
1078
+ if (e.sameValue) {
1079
+ host.declare(`declare zeroext i1 @scr_num_same_value(double, double)`);
1080
+ B.line(`${eq} = call zeroext i1 @scr_num_same_value(double ${v}, double ${plain.name})`);
1081
+ }
1082
+ else {
1083
+ B.line(`${eq} = fcmp oeq double ${v}, ${plain.name}`);
1084
+ }
1085
+ }
1086
+ else {
1087
+ host.declare(`declare zeroext i1 @scr_union_get_bool(ptr)`);
1088
+ const v = B.tmp();
1089
+ B.line(`${v} = call zeroext i1 @scr_union_get_bool(ptr ${union.name})`);
1090
+ B.line(`${eq} = icmp eq i1 ${v}, ${plain.name}`);
1091
+ }
1092
+ B.line(`store i1 ${eq}, ptr ${slot}`);
1093
+ B.br(join);
1094
+ B.startBlock(join);
1095
+ result = B.tmp();
1096
+ B.line(`${result} = load i1, ptr ${slot}`);
1097
+ }
1098
+ if (!e.negated)
1099
+ return { name: result, type: e.type };
1100
+ const negated = B.tmp();
1101
+ B.line(`${negated} = xor i1 ${result}, true`);
1102
+ return { name: negated, type: e.type };
1103
+ }
904
1104
  //# sourceMappingURL=expr-dynamic.js.map