@scriptc/compiler 0.2.7 → 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 (385) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +2 -0
  2. package/dist/backend/llvm/alloc.d.ts +3 -0
  3. package/dist/backend/llvm/alloc.js +54 -13
  4. package/dist/backend/llvm/alloc.js.map +1 -1
  5. package/dist/backend/llvm/blocks.d.ts +9 -0
  6. package/dist/backend/llvm/blocks.js +9 -0
  7. package/dist/backend/llvm/blocks.js.map +1 -1
  8. package/dist/backend/llvm/borrowed-receivers.d.ts +7 -0
  9. package/dist/backend/llvm/borrowed-receivers.js +39 -0
  10. package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
  11. package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
  12. package/dist/backend/llvm/call-lifetimes.js +14 -3
  13. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  14. package/dist/backend/llvm/call-lifetimes.test.js +8 -3
  15. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  16. package/dist/backend/llvm/checked-narrows.d.ts +24 -0
  17. package/dist/backend/llvm/checked-narrows.js +108 -0
  18. package/dist/backend/llvm/checked-narrows.js.map +1 -0
  19. package/dist/backend/llvm/checked-narrows.test.d.ts +1 -0
  20. package/dist/backend/llvm/checked-narrows.test.js +208 -0
  21. package/dist/backend/llvm/checked-narrows.test.js.map +1 -0
  22. package/dist/backend/llvm/classes.d.ts +13 -1
  23. package/dist/backend/llvm/classes.js +26 -18
  24. package/dist/backend/llvm/classes.js.map +1 -1
  25. package/dist/backend/llvm/classes.test.js +32 -3
  26. package/dist/backend/llvm/classes.test.js.map +1 -1
  27. package/dist/backend/llvm/debug-info.d.ts +6 -2
  28. package/dist/backend/llvm/debug-info.js +11 -1
  29. package/dist/backend/llvm/debug-info.js.map +1 -1
  30. package/dist/backend/llvm/dense-array-access.test.js +89 -0
  31. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  32. package/dist/backend/llvm/dyn.d.ts +4 -0
  33. package/dist/backend/llvm/dyn.js +31 -20
  34. package/dist/backend/llvm/dyn.js.map +1 -1
  35. package/dist/backend/llvm/emitter.d.ts +184 -11
  36. package/dist/backend/llvm/emitter.js +1189 -125
  37. package/dist/backend/llvm/emitter.js.map +1 -1
  38. package/dist/backend/llvm/emitter.test.js +21 -1
  39. package/dist/backend/llvm/emitter.test.js.map +1 -1
  40. package/dist/backend/llvm/expr-async.js +4 -4
  41. package/dist/backend/llvm/expr-async.js.map +1 -1
  42. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  43. package/dist/backend/llvm/expr-bytes.js +85 -8
  44. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  45. package/dist/backend/llvm/expr-callbacks.js +29 -21
  46. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  47. package/dist/backend/llvm/expr-calls.d.ts +5 -0
  48. package/dist/backend/llvm/expr-calls.js +55 -10
  49. package/dist/backend/llvm/expr-calls.js.map +1 -1
  50. package/dist/backend/llvm/expr-containers.d.ts +7 -1
  51. package/dist/backend/llvm/expr-containers.js +230 -27
  52. package/dist/backend/llvm/expr-containers.js.map +1 -1
  53. package/dist/backend/llvm/expr-control.js +25 -10
  54. package/dist/backend/llvm/expr-control.js.map +1 -1
  55. package/dist/backend/llvm/expr-dynamic.js +72 -21
  56. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  57. package/dist/backend/llvm/expr-island.js +3 -8
  58. package/dist/backend/llvm/expr-island.js.map +1 -1
  59. package/dist/backend/llvm/expr-primitives.js +41 -12
  60. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  61. package/dist/backend/llvm/expr-primitives.test.js +50 -2
  62. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  63. package/dist/backend/llvm/expr-records.js +28 -14
  64. package/dist/backend/llvm/expr-records.js.map +1 -1
  65. package/dist/backend/llvm/expr-stream-bridges.js +41 -31
  66. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  67. package/dist/backend/llvm/expr-stream-callbacks.js +6 -3
  68. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  69. package/dist/backend/llvm/layouts.d.ts +2 -1
  70. package/dist/backend/llvm/layouts.js +2 -2
  71. package/dist/backend/llvm/layouts.js.map +1 -1
  72. package/dist/backend/llvm/lib-abi.js +10 -0
  73. package/dist/backend/llvm/lib-abi.js.map +1 -1
  74. package/dist/backend/llvm/lib-filesystem.js +7 -11
  75. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  76. package/dist/backend/llvm/lib-process.js +8 -8
  77. package/dist/backend/llvm/lib-process.js.map +1 -1
  78. package/dist/backend/llvm/lib-shared.js +1 -0
  79. package/dist/backend/llvm/lib-shared.js.map +1 -1
  80. package/dist/backend/llvm/local-array-reads.js +73 -13
  81. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  82. package/dist/backend/llvm/local-array-reads.test.js +7 -3
  83. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  84. package/dist/backend/llvm/local-union-storage.js +10 -6
  85. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  86. package/dist/backend/llvm/local-union-storage.test.js +3 -2
  87. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  88. package/dist/backend/llvm/map-number-lookup.d.ts +18 -0
  89. package/dist/backend/llvm/map-number-lookup.js +62 -0
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -0
  91. package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -0
  92. package/dist/backend/llvm/map-read-lifetimes.js +24 -3
  93. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  94. package/dist/backend/llvm/map-read-lifetimes.test.js +38 -19
  95. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  96. package/dist/backend/llvm/nullable-unions.d.ts +68 -0
  97. package/dist/backend/llvm/nullable-unions.js +132 -0
  98. package/dist/backend/llvm/nullable-unions.js.map +1 -0
  99. package/dist/backend/llvm/publish.d.ts +58 -0
  100. package/dist/backend/llvm/publish.js +286 -0
  101. package/dist/backend/llvm/publish.js.map +1 -0
  102. package/dist/backend/llvm/rebound-parameters.d.ts +12 -0
  103. package/dist/backend/llvm/rebound-parameters.js +72 -0
  104. package/dist/backend/llvm/rebound-parameters.js.map +1 -0
  105. package/dist/backend/llvm/rebound-parameters.test.d.ts +1 -0
  106. package/dist/backend/llvm/rebound-parameters.test.js +67 -0
  107. package/dist/backend/llvm/rebound-parameters.test.js.map +1 -0
  108. package/dist/backend/llvm/reference-effects.d.ts +18 -2
  109. package/dist/backend/llvm/reference-effects.js +106 -16
  110. package/dist/backend/llvm/reference-effects.js.map +1 -1
  111. package/dist/backend/llvm/reference-effects.test.js +52 -1
  112. package/dist/backend/llvm/reference-effects.test.js.map +1 -1
  113. package/dist/backend/llvm/shapes.d.ts +45 -17
  114. package/dist/backend/llvm/shapes.js +131 -53
  115. package/dist/backend/llvm/shapes.js.map +1 -1
  116. package/dist/backend/llvm/shapes.test.js +33 -8
  117. package/dist/backend/llvm/shapes.test.js.map +1 -1
  118. package/dist/backend/llvm/stack-unions.test.js +5 -2
  119. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  120. package/dist/backend/llvm/string-construction.d.ts +10 -0
  121. package/dist/backend/llvm/string-construction.js +42 -0
  122. package/dist/backend/llvm/string-construction.js.map +1 -1
  123. package/dist/backend/llvm/string-key-hash.d.ts +9 -2
  124. package/dist/backend/llvm/string-key-hash.js +20 -3
  125. package/dist/backend/llvm/string-key-hash.js.map +1 -1
  126. package/dist/backend/llvm/string-key-hash.test.js +14 -3
  127. package/dist/backend/llvm/string-key-hash.test.js.map +1 -1
  128. package/dist/backend/llvm/string-lifetimes.test.js +24 -11
  129. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  130. package/dist/backend/llvm/string-reads.d.ts +7 -0
  131. package/dist/backend/llvm/string-reads.js +76 -0
  132. package/dist/backend/llvm/string-reads.js.map +1 -0
  133. package/dist/backend/llvm/switch-dispatch.test.js +1 -1
  134. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  135. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -0
  136. package/dist/backend/llvm/test-boxed-unions.js +13 -0
  137. package/dist/backend/llvm/test-boxed-unions.js.map +1 -0
  138. package/dist/backend/llvm/union-repr.d.ts +15 -0
  139. package/dist/backend/llvm/union-repr.js +89 -0
  140. package/dist/backend/llvm/union-repr.js.map +1 -0
  141. package/dist/backend/llvm/virtual-borrows.d.ts +31 -0
  142. package/dist/backend/llvm/virtual-borrows.js +82 -0
  143. package/dist/backend/llvm/virtual-borrows.js.map +1 -0
  144. package/dist/backend/llvm/walk-borrows.d.ts +43 -0
  145. package/dist/backend/llvm/walk-borrows.js +150 -0
  146. package/dist/backend/llvm/walk-borrows.js.map +1 -0
  147. package/dist/backend/llvm/walk-borrows.test.d.ts +1 -0
  148. package/dist/backend/llvm/walk-borrows.test.js +119 -0
  149. package/dist/backend/llvm/walk-borrows.test.js.map +1 -0
  150. package/dist/backend/llvm/walkers.d.ts +5 -1
  151. package/dist/backend/llvm/walkers.js +24 -21
  152. package/dist/backend/llvm/walkers.js.map +1 -1
  153. package/dist/backend/may-throw.d.ts +29 -1
  154. package/dist/backend/may-throw.js +346 -3
  155. package/dist/backend/may-throw.js.map +1 -1
  156. package/dist/backend/may-throw.test.js +113 -1
  157. package/dist/backend/may-throw.test.js.map +1 -1
  158. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  159. package/dist/backend/native/runtime-inputs.js +1 -0
  160. package/dist/backend/native/runtime-inputs.js.map +1 -1
  161. package/dist/backend/native-codegen-core.d.ts +7 -5
  162. package/dist/backend/native-codegen-core.js +14 -9
  163. package/dist/backend/native-codegen-core.js.map +1 -1
  164. package/dist/backend/native-codegen.d.ts +4 -0
  165. package/dist/backend/native-codegen.js +49 -2
  166. package/dist/backend/native-codegen.js.map +1 -1
  167. package/dist/backend/native-codegen.test.js +41 -10
  168. package/dist/backend/native-codegen.test.js.map +1 -1
  169. package/dist/backend/native-tools.d.ts +2 -0
  170. package/dist/backend/native-tools.js +3 -0
  171. package/dist/backend/native-tools.js.map +1 -1
  172. package/dist/backend/publication.d.ts +28 -0
  173. package/dist/backend/publication.js +155 -0
  174. package/dist/backend/publication.js.map +1 -0
  175. package/dist/backend/publication.test.d.ts +1 -0
  176. package/dist/backend/publication.test.js +72 -0
  177. package/dist/backend/publication.test.js.map +1 -0
  178. package/dist/backend/runtime-abi.d.ts +2 -2
  179. package/dist/backend/runtime-abi.js +2 -2
  180. package/dist/backend/runtime-pack-targets.test.js +1 -1
  181. package/dist/backend/runtime-pack.test.js +1 -1
  182. package/dist/cli/command.js +70 -7
  183. package/dist/cli/command.js.map +1 -1
  184. package/dist/cli/usage.d.ts +4 -1
  185. package/dist/cli/usage.js +8 -1
  186. package/dist/cli/usage.js.map +1 -1
  187. package/dist/compile-types.d.ts +12 -3
  188. package/dist/coverage/report.d.ts +25 -2
  189. package/dist/coverage/report.js +161 -33
  190. package/dist/coverage/report.js.map +1 -1
  191. package/dist/coverage/verdict-cache.d.ts +63 -0
  192. package/dist/coverage/verdict-cache.js +193 -0
  193. package/dist/coverage/verdict-cache.js.map +1 -0
  194. package/dist/coverage/verdict-cache.test.d.ts +1 -0
  195. package/dist/coverage/verdict-cache.test.js +52 -0
  196. package/dist/coverage/verdict-cache.test.js.map +1 -0
  197. package/dist/coverage/verdict-semantic.d.ts +2 -0
  198. package/dist/coverage/verdict-semantic.js +24 -0
  199. package/dist/coverage/verdict-semantic.js.map +1 -0
  200. package/dist/coverage/verdict-startup.d.ts +15 -0
  201. package/dist/coverage/verdict-startup.js +66 -0
  202. package/dist/coverage/verdict-startup.js.map +1 -0
  203. package/dist/diagnostics/diagnostic.d.ts +29 -1
  204. package/dist/diagnostics/diagnostic.js +74 -4
  205. package/dist/diagnostics/diagnostic.js.map +1 -1
  206. package/dist/diagnostics/envelope.d.ts +130 -0
  207. package/dist/diagnostics/envelope.js +257 -0
  208. package/dist/diagnostics/envelope.js.map +1 -0
  209. package/dist/diagnostics/envelope.test.d.ts +1 -0
  210. package/dist/diagnostics/envelope.test.js +91 -0
  211. package/dist/diagnostics/envelope.test.js.map +1 -0
  212. package/dist/diagnostics/render.d.ts +3 -0
  213. package/dist/diagnostics/render.js +13 -2
  214. package/dist/diagnostics/render.js.map +1 -1
  215. package/dist/executable/prepare.d.ts +4 -0
  216. package/dist/executable/prepare.js +7 -1
  217. package/dist/executable/prepare.js.map +1 -1
  218. package/dist/frontend/analysis.js +1 -0
  219. package/dist/frontend/analysis.js.map +1 -1
  220. package/dist/frontend/lowering/array-values.d.ts +7 -0
  221. package/dist/frontend/lowering/array-values.js +120 -4
  222. package/dist/frontend/lowering/array-values.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/numbers.js +29 -1
  224. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/process.d.ts +4 -0
  226. package/dist/frontend/lowering/builtins/process.js +10 -0
  227. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/workers.js +4 -2
  229. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  230. package/dist/frontend/lowering/class-assertions.d.ts +8 -0
  231. package/dist/frontend/lowering/class-assertions.js +217 -1
  232. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  233. package/dist/frontend/lowering/class-dynamic-dispatch.js +8 -5
  234. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  235. package/dist/frontend/lowering/coercions/state.d.ts +6 -0
  236. package/dist/frontend/lowering/coercions/state.js +2 -0
  237. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  238. package/dist/frontend/lowering/coercions/unions.d.ts +8 -0
  239. package/dist/frontend/lowering/coercions/unions.js +67 -2
  240. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  241. package/dist/frontend/lowering/collation-repertoire.d.ts +1 -0
  242. package/dist/frontend/lowering/collation-repertoire.js +19 -0
  243. package/dist/frontend/lowering/collation-repertoire.js.map +1 -0
  244. package/dist/frontend/lowering/construction-escapes.d.ts +38 -0
  245. package/dist/frontend/lowering/construction-escapes.js +146 -0
  246. package/dist/frontend/lowering/construction-escapes.js.map +1 -0
  247. package/dist/frontend/lowering/construction-escapes.test.d.ts +1 -0
  248. package/dist/frontend/lowering/construction-escapes.test.js +150 -0
  249. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -0
  250. package/dist/frontend/lowering/containers/array-callbacks.js +81 -44
  251. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  252. package/dist/frontend/lowering/containers/array-construction.js +15 -2
  253. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  254. package/dist/frontend/lowering/containers/array-methods.js +231 -12
  255. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  256. package/dist/frontend/lowering/containers/callback-arguments.js +43 -1
  257. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  258. package/dist/frontend/lowering/containers/string-and-regexp.js +7 -63
  259. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  260. package/dist/frontend/lowering/cycle-initialization.d.ts +6 -1
  261. package/dist/frontend/lowering/cycle-initialization.js +59 -33
  262. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  263. package/dist/frontend/lowering/divergences.d.ts +9 -0
  264. package/dist/frontend/lowering/divergences.js +630 -0
  265. package/dist/frontend/lowering/divergences.js.map +1 -0
  266. package/dist/frontend/lowering/expressions/object-literals.js +40 -2
  267. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  268. package/dist/frontend/lowering/lower-calls.d.ts +5 -0
  269. package/dist/frontend/lowering/lower-calls.js +226 -157
  270. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  271. package/dist/frontend/lowering/lower-classes.d.ts +4 -0
  272. package/dist/frontend/lowering/lower-classes.js +72 -22
  273. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  274. package/dist/frontend/lowering/lower-exprs.d.ts +13 -0
  275. package/dist/frontend/lowering/lower-exprs.js +431 -107
  276. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  277. package/dist/frontend/lowering/lower-generators.d.ts +19 -13
  278. package/dist/frontend/lowering/lower-generators.js +67 -44
  279. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  280. package/dist/frontend/lowering/lower-inspect.js +3 -2
  281. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  282. package/dist/frontend/lowering/lower-island.d.ts +1 -1
  283. package/dist/frontend/lowering/lower-island.js +24 -7
  284. package/dist/frontend/lowering/lower-island.js.map +1 -1
  285. package/dist/frontend/lowering/lower-modules.js +90 -1
  286. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  287. package/dist/frontend/lowering/lower-stmts.js +36 -6
  288. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  289. package/dist/frontend/lowering/lowerer.d.ts +78 -2
  290. package/dist/frontend/lowering/lowerer.js +986 -73
  291. package/dist/frontend/lowering/lowerer.js.map +1 -1
  292. package/dist/frontend/lowering/runtime-optional-bounds.d.ts +19 -0
  293. package/dist/frontend/lowering/runtime-optional-bounds.js +354 -0
  294. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -0
  295. package/dist/frontend/lowering/runtime-optional-bounds.test.d.ts +1 -0
  296. package/dist/frontend/lowering/runtime-optional-bounds.test.js +66 -0
  297. package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -0
  298. package/dist/frontend/lowering/runtime-optional-elements.d.ts +117 -0
  299. package/dist/frontend/lowering/runtime-optional-elements.js +738 -0
  300. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -0
  301. package/dist/frontend/lowering/runtime-optional-guards.d.ts +36 -0
  302. package/dist/frontend/lowering/runtime-optional-guards.js +375 -0
  303. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -0
  304. package/dist/frontend/lowering/runtime-optional-guards.test.d.ts +1 -0
  305. package/dist/frontend/lowering/runtime-optional-guards.test.js +92 -0
  306. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -0
  307. package/dist/frontend/lowering/runtime-optional-ownership.d.ts +63 -0
  308. package/dist/frontend/lowering/runtime-optional-ownership.js +382 -0
  309. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -0
  310. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +2 -1
  311. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -1
  312. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  313. package/dist/frontend/lowering/string-index-bounds.d.ts +36 -0
  314. package/dist/frontend/lowering/string-index-bounds.js +537 -0
  315. package/dist/frontend/lowering/string-index-bounds.js.map +1 -0
  316. package/dist/frontend/lowering/string-index-bounds.test.d.ts +1 -0
  317. package/dist/frontend/lowering/string-index-bounds.test.js +223 -0
  318. package/dist/frontend/lowering/string-index-bounds.test.js.map +1 -0
  319. package/dist/frontend/lowering/union-narrow.d.ts +2 -0
  320. package/dist/frontend/lowering/union-narrow.js +10 -6
  321. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  322. package/dist/frontend/program-analysis.d.ts +10 -0
  323. package/dist/frontend/program-analysis.js +7 -0
  324. package/dist/frontend/program-analysis.js.map +1 -1
  325. package/dist/frontend/program.d.ts +25 -0
  326. package/dist/frontend/program.js +613 -17
  327. package/dist/frontend/program.js.map +1 -1
  328. package/dist/frontend/program.test.js +64 -1
  329. package/dist/frontend/program.test.js.map +1 -1
  330. package/dist/frontend/resolve.d.ts +6 -0
  331. package/dist/frontend/resolve.js +14 -0
  332. package/dist/frontend/resolve.js.map +1 -1
  333. package/dist/frontend/threads-import.d.ts +5 -0
  334. package/dist/frontend/threads-import.js +21 -0
  335. package/dist/frontend/threads-import.js.map +1 -0
  336. package/dist/frontend/type-mapper.d.ts +3 -0
  337. package/dist/frontend/type-mapper.js +72 -6
  338. package/dist/frontend/type-mapper.js.map +1 -1
  339. package/dist/frontend/worker-target.d.ts +4 -0
  340. package/dist/frontend/worker-target.js +8 -1
  341. package/dist/frontend/worker-target.js.map +1 -1
  342. package/dist/index.d.ts +6 -1
  343. package/dist/index.js +47 -9
  344. package/dist/index.js.map +1 -1
  345. package/dist/ir/build.d.ts +5 -0
  346. package/dist/ir/build.js +7 -0
  347. package/dist/ir/build.js.map +1 -1
  348. package/dist/ir/builtin-signatures.d.ts +1 -1
  349. package/dist/ir/builtin-signatures.js +3 -0
  350. package/dist/ir/builtin-signatures.js.map +1 -1
  351. package/dist/ir/int32-slots.d.ts +72 -0
  352. package/dist/ir/int32-slots.js +837 -0
  353. package/dist/ir/int32-slots.js.map +1 -0
  354. package/dist/ir/int32-slots.test.d.ts +1 -0
  355. package/dist/ir/int32-slots.test.js +222 -0
  356. package/dist/ir/int32-slots.test.js.map +1 -0
  357. package/dist/ir/integer-ranges.d.ts +19 -3
  358. package/dist/ir/integer-ranges.js +168 -23
  359. package/dist/ir/integer-ranges.js.map +1 -1
  360. package/dist/ir/integer-ranges.test.js +74 -2
  361. package/dist/ir/integer-ranges.test.js.map +1 -1
  362. package/dist/ir/ir.d.ts +24 -6
  363. package/dist/ir/ir.js.map +1 -1
  364. package/dist/ir/validate.js +21 -2
  365. package/dist/ir/validate.js.map +1 -1
  366. package/dist/ir/validate.test.js +39 -0
  367. package/dist/ir/validate.test.js.map +1 -1
  368. package/dist/native/cache.d.ts +3 -0
  369. package/dist/native/cache.js +49 -1
  370. package/dist/native/cache.js.map +1 -1
  371. package/dist/native/cache.test.js +21 -1
  372. package/dist/native/cache.test.js.map +1 -1
  373. package/dist/native/cli.js +1 -1
  374. package/dist/native/cli.js.map +1 -1
  375. package/dist/native/compiler.d.ts +5 -0
  376. package/dist/native/compiler.js +51 -4
  377. package/dist/native/compiler.js.map +1 -1
  378. package/dist/native/prepare.d.ts +4 -0
  379. package/dist/native/prepare.js +2 -1
  380. package/dist/native/prepare.js.map +1 -1
  381. package/dist/startup-cache.d.ts +2 -0
  382. package/dist/startup-cache.js +2 -0
  383. package/dist/startup-cache.js.map +1 -1
  384. package/package.json +20 -20
  385. package/surface-manifest.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"switch-dispatch.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/switch-dispatch.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"switch-dispatch.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/switch-dispatch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { IrModule } from "../../ir/ir.js";
2
+ /** Test helper: a Set of each union keeps it a tagged `%ScrUnion` box (Set
3
+ * elements are runtime-inspected boxes), so stack-box tests exercise the
4
+ * paths that nullable-pointer unions (nullable-unions.ts) bypass. */
5
+ export declare function keepUnionsBoxed(mod: IrModule): IrModule;
@@ -0,0 +1,13 @@
1
+ /** Test helper: a Set of each union keeps it a tagged `%ScrUnion` box (Set
2
+ * elements are runtime-inspected boxes), so stack-box tests exercise the
3
+ * paths that nullable-pointer unions (nullable-unions.ts) bypass. */
4
+ export function keepUnionsBoxed(mod) {
5
+ const keep = (mod.unions ?? []).map((union) => ({
6
+ id: `%g.keep.${union.id}`,
7
+ name: `keep_${union.id}`,
8
+ type: { kind: "set", elem: { kind: "union", unionId: union.id } },
9
+ mutable: false,
10
+ }));
11
+ return { ...mod, globals: [...(mod.globals ?? []), ...keep] };
12
+ }
13
+ //# sourceMappingURL=test-boxed-unions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-boxed-unions.js","sourceRoot":"","sources":["../../../src/backend/llvm/test-boxed-unions.ts"],"names":[],"mappings":"AAEA;;qEAEqE;AACrE,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE,EAAE,WAAW,KAAK,CAAC,EAAE,EAAE;QACzB,IAAI,EAAE,QAAQ,KAAK,CAAC,EAAE,EAAE;QACxB,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,EAAY;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BlockBuilder } from "./blocks.js";
2
+ import { type NullableUnion } from "./nullable-unions.js";
3
+ /** The i32 tag of a union value. */
4
+ export declare function emitUnionTag(B: BlockBuilder, nullable: NullableUnion | null, u: string): string;
5
+ /** i1: a nullable union value holds its reference arm (neither NULL nor
6
+ * the `null` sentinel). */
7
+ export declare function emitNullablePresent(B: BlockBuilder, nullable: NullableUnion, u: string): string;
8
+ /** i1: a nullable union value holds the arm `tag` (`negated`: does not). */
9
+ export declare function emitNullableIsTag(B: BlockBuilder, nullable: NullableUnion, u: string, tag: number, negated: boolean): string;
10
+ /** The BORROWED payload pointer of a reference arm. */
11
+ export declare function emitUnionPeek(B: BlockBuilder, nullable: NullableUnion | null, u: string): string;
12
+ /** Text-template forms for helpers written as raw LLVM lines: `%out`
13
+ * receives the tag / payload of `u`. */
14
+ export declare function unionTagLines(nullable: NullableUnion | null, u: string, out: string): string[];
15
+ export declare function unionPeekLines(nullable: NullableUnion | null, u: string, out: string): string[];
@@ -0,0 +1,89 @@
1
+ import { NULLABLE_NULL } from "./nullable-unions.js";
2
+ /** The i32 tag of a union value. */
3
+ export function emitUnionTag(B, nullable, u) {
4
+ const t = B.tmp();
5
+ if (nullable) {
6
+ const isNull = B.tmp();
7
+ B.line(`${isNull} = icmp eq ptr ${u}, null`);
8
+ if (nullable.nullTag < 0) {
9
+ B.line(`${t} = select i1 ${isNull}, i32 ${nullable.unitTag}, i32 ${nullable.refTag}`);
10
+ return t;
11
+ }
12
+ const isNullArm = B.tmp(), present = B.tmp();
13
+ B.line(`${isNullArm} = icmp eq ptr ${u}, ${NULLABLE_NULL}`);
14
+ B.line(`${present} = select i1 ${isNullArm}, i32 ${nullable.nullTag}, i32 ${nullable.refTag}`);
15
+ B.line(`${t} = select i1 ${isNull}, i32 ${nullable.unitTag}, i32 ${present}`);
16
+ return t;
17
+ }
18
+ const p = B.tmp();
19
+ B.line(`${p} = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 1`);
20
+ B.line(`${t} = load i32, ptr ${p}`);
21
+ return t;
22
+ }
23
+ /** i1: a nullable union value holds its reference arm (neither NULL nor
24
+ * the `null` sentinel). */
25
+ export function emitNullablePresent(B, nullable, u) {
26
+ const present = B.tmp();
27
+ B.line(`${present} = icmp ne ptr ${u}, null`);
28
+ if (nullable.nullTag < 0)
29
+ return present;
30
+ const notNullArm = B.tmp(), both = B.tmp();
31
+ B.line(`${notNullArm} = icmp ne ptr ${u}, ${NULLABLE_NULL}`);
32
+ B.line(`${both} = and i1 ${present}, ${notNullArm}`);
33
+ return both;
34
+ }
35
+ /** i1: a nullable union value holds the arm `tag` (`negated`: does not). */
36
+ export function emitNullableIsTag(B, nullable, u, tag, negated) {
37
+ if (tag === nullable.refTag) {
38
+ const present = emitNullablePresent(B, nullable, u);
39
+ if (!negated)
40
+ return present;
41
+ const t = B.tmp();
42
+ B.line(`${t} = xor i1 ${present}, true`);
43
+ return t;
44
+ }
45
+ const t = B.tmp();
46
+ const target = tag === nullable.nullTag ? NULLABLE_NULL : "null";
47
+ B.line(`${t} = icmp ${negated ? "ne" : "eq"} ptr ${u}, ${target}`);
48
+ return t;
49
+ }
50
+ /** The BORROWED payload pointer of a reference arm. */
51
+ export function emitUnionPeek(B, nullable, u) {
52
+ if (nullable)
53
+ return u;
54
+ const p = B.tmp();
55
+ const t = B.tmp();
56
+ B.line(`${p} = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 5`);
57
+ B.line(`${t} = load ptr, ptr ${p}`);
58
+ return t;
59
+ }
60
+ /** Text-template forms for helpers written as raw LLVM lines: `%out`
61
+ * receives the tag / payload of `u`. */
62
+ export function unionTagLines(nullable, u, out) {
63
+ if (nullable && nullable.nullTag < 0)
64
+ return [
65
+ ` ${out}.isnull = icmp eq ptr ${u}, null`,
66
+ ` ${out} = select i1 ${out}.isnull, i32 ${nullable.unitTag}, i32 ${nullable.refTag}`,
67
+ ];
68
+ if (nullable)
69
+ return [
70
+ ` ${out}.isnull = icmp eq ptr ${u}, null`,
71
+ ` ${out}.isnullarm = icmp eq ptr ${u}, ${NULLABLE_NULL}`,
72
+ ` ${out}.present = select i1 ${out}.isnullarm, i32 ${nullable.nullTag}, i32 ${nullable.refTag}`,
73
+ ` ${out} = select i1 ${out}.isnull, i32 ${nullable.unitTag}, i32 ${out}.present`,
74
+ ];
75
+ return [
76
+ ` ${out}.p = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 1`,
77
+ ` ${out} = load i32, ptr ${out}.p`,
78
+ ];
79
+ }
80
+ export function unionPeekLines(nullable, u, out) {
81
+ // A plain copy of the pointer (NULL included) under the template's name.
82
+ if (nullable)
83
+ return [` ${out} = getelementptr i8, ptr ${u}, i64 0`];
84
+ return [
85
+ ` ${out}.p = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 5`,
86
+ ` ${out} = load ptr, ptr ${out}.p`,
87
+ ];
88
+ }
89
+ //# sourceMappingURL=union-repr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union-repr.js","sourceRoot":"","sources":["../../../src/backend/llvm/union-repr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { IrFunction, IrModule } from "../../ir/ir.js";
2
+ import { type LlClassMeta } from "./classes.js";
3
+ /** Virtual dispatch normally keeps the owned ABI: the caller passes +1 and
4
+ * the method's owned entry releases what its body borrows. When every
5
+ * implementation of a slot has a borrowing body for the same parameter
6
+ * (call-lifetimes proves this per function, independent of the caller), the
7
+ * slot borrows that parameter instead: call sites pass it like a direct call
8
+ * to a borrowing body, so a receiver that survives the call is neither
9
+ * retained nor released (and, being cycle-capable, not buffered as a
10
+ * candidate either). Implementations that borrow more parameters than the
11
+ * slot get an adapter that releases the difference.
12
+ *
13
+ * Shared by the emitter and the self-hosted layout stage, so both store the
14
+ * same vtable entries. */
15
+ export declare class VirtualBorrows {
16
+ private readonly functions;
17
+ private readonly borrowed;
18
+ /** Parameters every implementation of a vtable slot borrows, keyed by
19
+ * `root\0slot index`, and each implementation's slot key. */
20
+ private readonly slotBorrowed;
21
+ private readonly implSlot;
22
+ constructor(mod: IrModule, classMeta: ReadonlyMap<string, LlClassMeta>, functions: ReadonlyMap<string, IrFunction>, borrowed: ReadonlyMap<string, ReadonlySet<number>>);
23
+ /** The borrowed parameters of a hierarchy's vtable slot (empty: owned). */
24
+ slot(rootName: string, slotIndex: number): ReadonlySet<number>;
25
+ /** The borrowed parameters of the slot an implementation fills. */
26
+ implSlotBorrowed(implFn: string): ReadonlySet<number>;
27
+ /** The vtable entry for one implementation: its owned entry for an owned
28
+ * slot, its borrowing body when that borrows exactly the slot's
29
+ * parameters, otherwise its virtual adapter (emitOwnedCallAdapter). */
30
+ entry(implFn: string): string;
31
+ }
@@ -0,0 +1,82 @@
1
+ import { mangleBorrowedFunction, mangleFunction } from "../mangle.js";
2
+ import { vtEntriesFor } from "./classes.js";
3
+ const NO_BORROWED = new Set();
4
+ /** Virtual dispatch normally keeps the owned ABI: the caller passes +1 and
5
+ * the method's owned entry releases what its body borrows. When every
6
+ * implementation of a slot has a borrowing body for the same parameter
7
+ * (call-lifetimes proves this per function, independent of the caller), the
8
+ * slot borrows that parameter instead: call sites pass it like a direct call
9
+ * to a borrowing body, so a receiver that survives the call is neither
10
+ * retained nor released (and, being cycle-capable, not buffered as a
11
+ * candidate either). Implementations that borrow more parameters than the
12
+ * slot get an adapter that releases the difference.
13
+ *
14
+ * Shared by the emitter and the self-hosted layout stage, so both store the
15
+ * same vtable entries. */
16
+ export class VirtualBorrows {
17
+ functions;
18
+ borrowed;
19
+ /** Parameters every implementation of a vtable slot borrows, keyed by
20
+ * `root\0slot index`, and each implementation's slot key. */
21
+ slotBorrowed = new Map();
22
+ implSlot = new Map();
23
+ constructor(mod, classMeta, functions, borrowed) {
24
+ this.functions = functions;
25
+ this.borrowed = borrowed;
26
+ const impls = new Map();
27
+ const emitted = new Set((mod.classes ?? []).filter((c) => !c.runtime).map((c) => c.name));
28
+ for (const meta of classMeta.values()) {
29
+ if (!meta.hierarchy || !emitted.has(meta.def.name))
30
+ continue;
31
+ vtEntriesFor(meta).forEach(({ slot, impl }, index) => {
32
+ if (impl === null)
33
+ return;
34
+ const key = `${meta.root.def.name}\0${index}`;
35
+ const name = `%${impl.def.name}.${slot.method}`;
36
+ let set = impls.get(key);
37
+ if (!set)
38
+ impls.set(key, (set = new Set()));
39
+ set.add(name);
40
+ this.implSlot.set(name, key);
41
+ });
42
+ }
43
+ for (const [key, names] of impls) {
44
+ let common = null;
45
+ for (const name of names) {
46
+ const fn = this.functions.get(name);
47
+ const own = this.borrowed.get(name);
48
+ if (!fn || !own || fn.captures !== undefined || fn.async || fn.generator) {
49
+ common = [];
50
+ break;
51
+ }
52
+ common = (common ?? [...own]).filter((index) => own.has(index));
53
+ }
54
+ if (common !== null && common.length > 0)
55
+ this.slotBorrowed.set(key, new Set(common));
56
+ }
57
+ }
58
+ /** The borrowed parameters of a hierarchy's vtable slot (empty: owned). */
59
+ slot(rootName, slotIndex) {
60
+ return this.slotBorrowed.get(`${rootName}\0${slotIndex}`) ?? NO_BORROWED;
61
+ }
62
+ /** The borrowed parameters of the slot an implementation fills. */
63
+ implSlotBorrowed(implFn) {
64
+ const key = this.implSlot.get(implFn);
65
+ if (key === undefined)
66
+ return NO_BORROWED;
67
+ return this.slotBorrowed.get(key) ?? NO_BORROWED;
68
+ }
69
+ /** The vtable entry for one implementation: its owned entry for an owned
70
+ * slot, its borrowing body when that borrows exactly the slot's
71
+ * parameters, otherwise its virtual adapter (emitOwnedCallAdapter). */
72
+ entry(implFn) {
73
+ const slot = this.implSlotBorrowed(implFn);
74
+ if (slot.size === 0)
75
+ return mangleFunction(implFn);
76
+ const own = this.borrowed.get(implFn);
77
+ return own.size === slot.size
78
+ ? mangleBorrowedFunction(implFn)
79
+ : `${mangleBorrowedFunction(implFn)}.virtual`;
80
+ }
81
+ }
82
+ //# sourceMappingURL=virtual-borrows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-borrows.js","sourceRoot":"","sources":["../../../src/backend/llvm/virtual-borrows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type IrExpr, type IrFunction, type IrLocal } from "../../ir/ir.js";
2
+ /** What the emitter knows about a projection's storage. */
3
+ export interface WalkBorrowHost {
4
+ /** The local holds one plain reference pointer (instances, records,
5
+ * arrays, strings, nullable-pointer unions). Tagged union boxes, closures
6
+ * and dynamic values keep ownership. */
7
+ pointerLocal(local: IrLocal): boolean;
8
+ /** emitReadReceiver yields this expression's pointer without acquiring a
9
+ * reference (class casts, nullable wraps, plain field reads, checked
10
+ * ternaries). */
11
+ borrowsWithoutOwning(e: IrExpr): boolean;
12
+ /** The callee returns a borrowed walk of its arguments (findWalkBorrows'
13
+ * returnsWalk); a call to it with walk arguments is itself a walk. */
14
+ borrowedReturn?(callee: string): boolean;
15
+ /** Parameters that may become candidates; once calling conventions are
16
+ * fixed, only borrowed parameters qualify. Defaults to every parameter. */
17
+ parameterAllowed?(localId: string): boolean;
18
+ }
19
+ export interface WalkFacts {
20
+ locals: ReadonlySet<string>;
21
+ /** Every return yields a walk (or a throw), so the body can return its
22
+ * pointer without a reference: no try statement, at least one return. */
23
+ returnsWalk: boolean;
24
+ }
25
+ /** Locals (including rebound parameters) that may hold borrowed pointers
26
+ * for their whole lifetime: every definition (declaration or statement
27
+ * assignment) is a projection of an unwritten parameter or of another such
28
+ * local, for example the parent walk `let p = node.parent; while (p.parent)
29
+ * p = p.parent;`. A rebound parameter in the result keeps the borrowed
30
+ * calling convention.
31
+ *
32
+ * Soundness rests on the whole body preserving heap edges (the caller
33
+ * passes only functions in ReferenceEffects.functions): neither the body
34
+ * nor anything it calls removes a field, element or global reference, so
35
+ * every object reachable from a parameter at entry stays reachable (and
36
+ * alive) until the function returns. Such a local therefore needs no
37
+ * retain on definition, no release on rebinding and none at scope exit.
38
+ * Whole-value uses (returns, stores, owned arguments) still retain their
39
+ * own copies when they read the binding. Other locals may be rebound
40
+ * freely: they never root a walk, so releasing their old values cannot free
41
+ * an object the walk reaches. */
42
+ export declare function findWalkBorrows(fn: IrFunction, host: WalkBorrowHost): ReadonlySet<string>;
43
+ export declare function analyzeWalks(fn: IrFunction, host: WalkBorrowHost): WalkFacts;
@@ -0,0 +1,150 @@
1
+ import { isRefCounted } from "../../ir/ir.js";
2
+ import { everyStmtList } from "../../ir/traverse.js";
3
+ /** Locals (including rebound parameters) that may hold borrowed pointers
4
+ * for their whole lifetime: every definition (declaration or statement
5
+ * assignment) is a projection of an unwritten parameter or of another such
6
+ * local, for example the parent walk `let p = node.parent; while (p.parent)
7
+ * p = p.parent;`. A rebound parameter in the result keeps the borrowed
8
+ * calling convention.
9
+ *
10
+ * Soundness rests on the whole body preserving heap edges (the caller
11
+ * passes only functions in ReferenceEffects.functions): neither the body
12
+ * nor anything it calls removes a field, element or global reference, so
13
+ * every object reachable from a parameter at entry stays reachable (and
14
+ * alive) until the function returns. Such a local therefore needs no
15
+ * retain on definition, no release on rebinding and none at scope exit.
16
+ * Whole-value uses (returns, stores, owned arguments) still retain their
17
+ * own copies when they read the binding. Other locals may be rebound
18
+ * freely: they never root a walk, so releasing their old values cannot free
19
+ * an object the walk reaches. */
20
+ export function findWalkBorrows(fn, host) {
21
+ return analyzeWalks(fn, host).locals;
22
+ }
23
+ export function analyzeWalks(fn, host) {
24
+ const result = new Set();
25
+ if (fn.async || fn.generator || fn.captures || fn.classCaptures)
26
+ return { locals: result, returnsWalk: false };
27
+ const returns = [];
28
+ let guarded = false;
29
+ const params = new Set(fn.params.map((param) => param.localId));
30
+ const locals = new Map(fn.locals.map((local) => [local.id, local]));
31
+ const definitions = new Map();
32
+ // Locals written in any other way (expression assignments, loop and catch
33
+ // bindings, captures) keep the ordinary owned representation.
34
+ const excluded = new Set();
35
+ const define = (id, value) => {
36
+ let list = definitions.get(id);
37
+ if (!list)
38
+ definitions.set(id, (list = []));
39
+ list.push(value);
40
+ };
41
+ everyStmtList(fn.body, {
42
+ stmt: (s) => {
43
+ switch (s.kind) {
44
+ case "varDecl":
45
+ define(s.localId, s.init);
46
+ break;
47
+ case "assign":
48
+ define(s.localId, s.value);
49
+ break;
50
+ case "forOf":
51
+ excluded.add(s.localId);
52
+ break;
53
+ case "rethrow":
54
+ excluded.add(s.localId);
55
+ break;
56
+ case "tryCatch":
57
+ guarded = true;
58
+ if (s.catchLocalId !== null)
59
+ excluded.add(s.catchLocalId);
60
+ break;
61
+ case "return":
62
+ returns.push(s.value);
63
+ break;
64
+ }
65
+ return true;
66
+ },
67
+ expr: (e) => {
68
+ switch (e.kind) {
69
+ case "assignExpr":
70
+ case "incDec":
71
+ excluded.add(e.localId);
72
+ break;
73
+ case "closure":
74
+ case "classRef":
75
+ for (const id of e.captures ?? [])
76
+ excluded.add(id);
77
+ break;
78
+ }
79
+ return true;
80
+ },
81
+ });
82
+ const plain = (id) => {
83
+ const local = locals.get(id);
84
+ return (!!local &&
85
+ !local.boxed &&
86
+ !local.tdz &&
87
+ !excluded.has(id) &&
88
+ host.pointerLocal(local) &&
89
+ (!params.has(id) || host.parameterAllowed?.(id) !== false));
90
+ };
91
+ // Parameters are roots only while no definition rebinds them. A
92
+ // parameter rebound by statement assignments alone (`t = t.regular`) is a
93
+ // candidate like any local: its incoming value is the caller's borrow.
94
+ const roots = new Set([...params].filter((id) => !definitions.has(id) && plain(id)));
95
+ const candidates = new Set();
96
+ for (const [id, values] of definitions) {
97
+ if (!plain(id))
98
+ continue;
99
+ if (params.has(id) && values.some((value) => value === null))
100
+ continue;
101
+ candidates.add(id);
102
+ }
103
+ // A walk projects roots or candidates through reads that never acquire a
104
+ // reference. Drop candidates until every definition is such a walk.
105
+ const walk = (e) => {
106
+ switch (e.kind) {
107
+ case "varRef":
108
+ return roots.has(e.localId) || candidates.has(e.localId);
109
+ case "fieldGet":
110
+ case "recordGet":
111
+ return host.borrowsWithoutOwning(e) && walk(e.obj);
112
+ case "unionNarrow":
113
+ case "downcast":
114
+ case "upcast":
115
+ return host.borrowsWithoutOwning(e) && walk(e.value);
116
+ case "unionWrap":
117
+ if (!host.borrowsWithoutOwning(e))
118
+ return false;
119
+ return e.value.kind === "unitLit" || walk(e.value);
120
+ // Each arm is itself a walk (or a throw), which emitReadReceiver reads
121
+ // without owning.
122
+ case "ternary":
123
+ return host.borrowsWithoutOwning(e) && walkOrThrow(e.then) && walkOrThrow(e.else_);
124
+ // A borrowed result is reachable from walk arguments.
125
+ case "call":
126
+ return (host.borrowedReturn?.(e.callee) === true &&
127
+ host.borrowsWithoutOwning(e) &&
128
+ e.args.every((arg) => !isRefCounted(arg.type) || walk(arg)));
129
+ default:
130
+ return false;
131
+ }
132
+ };
133
+ const walkOrThrow = (e) => (e.kind === "libCall" && e.fn === "error.nodeThrow") || walk(e);
134
+ for (let changed = true; changed;) {
135
+ changed = false;
136
+ for (const id of candidates) {
137
+ if (definitions.get(id).every((value) => value === null || walk(value)))
138
+ continue;
139
+ candidates.delete(id);
140
+ changed = true;
141
+ }
142
+ }
143
+ for (const id of candidates)
144
+ result.add(id);
145
+ const returnsWalk = !guarded &&
146
+ returns.length > 0 &&
147
+ returns.every((value) => value !== null && walkOrThrow(value));
148
+ return { locals: result, returnsWalk };
149
+ }
150
+ //# sourceMappingURL=walk-borrows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-borrows.js","sourceRoot":"","sources":["../../../src/backend/llvm/walk-borrows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,119 @@
1
+ import { expect, test } from "vitest";
2
+ import { F64, VOID } from "../../ir/ir.js";
3
+ import { analyzeWalks, findWalkBorrows } from "./walk-borrows.js";
4
+ const loc = { file: "walk.ts", start: 0, end: 0 };
5
+ const NODE = { kind: "object", className: "Node" };
6
+ const ref = (localId) => ({ kind: "varRef", localId, type: NODE, loc });
7
+ const parent = (obj) => ({
8
+ kind: "fieldGet",
9
+ obj,
10
+ className: "Node",
11
+ field: "parent",
12
+ type: NODE,
13
+ loc,
14
+ });
15
+ const decl = (localId, init) => ({
16
+ kind: "varDecl",
17
+ localId,
18
+ init,
19
+ loc,
20
+ });
21
+ const assign = (localId, value) => ({
22
+ kind: "assign",
23
+ localId,
24
+ value,
25
+ loc,
26
+ });
27
+ const local = (id, mutable = true) => ({ id, name: id, type: NODE, mutable });
28
+ function fn(body, locals, params = ["node"]) {
29
+ return {
30
+ name: "walk",
31
+ params: params.map((id) => ({ localId: id, name: id, type: NODE })),
32
+ locals: [...params, ...locals].map((id) => local(id)),
33
+ body,
34
+ returnType: VOID,
35
+ loc,
36
+ };
37
+ }
38
+ const host = {
39
+ pointerLocal: (l) => l.type.kind === "object",
40
+ borrowsWithoutOwning: () => true,
41
+ };
42
+ test("parent walks rooted at unwritten parameters borrow", () => {
43
+ const body = [
44
+ decl("p", parent(ref("node"))),
45
+ decl("next", parent(ref("p"))),
46
+ assign("p", ref("next")),
47
+ decl("unset", null),
48
+ assign("unset", parent(parent(ref("p")))),
49
+ ];
50
+ expect(findWalkBorrows(fn(body, ["p", "next", "unset"]), host)).toEqual(new Set(["p", "next", "unset"]));
51
+ });
52
+ const call = { kind: "call", callee: "make", args: [], type: NODE, loc };
53
+ test("parameters rebound only to walks keep borrowing", () => {
54
+ const body = [assign("node", parent(ref("node"))), decl("up", parent(ref("node")))];
55
+ expect(findWalkBorrows(fn(body, ["up"]), host)).toEqual(new Set(["node", "up"]));
56
+ // A parameter re-declared without an initializer is left alone.
57
+ expect(findWalkBorrows(fn([decl("node", null)], []), host).size).toBe(0);
58
+ });
59
+ test("rebound parameters, owned sources and other writers keep ownership", () => {
60
+ const body = [
61
+ // A parameter rebound to an owned value is no root, and neither is its walk.
62
+ assign("node", call),
63
+ decl("fromParam", parent(ref("node"))),
64
+ // A call result is owned, and the failure propagates transitively.
65
+ decl("owned", call),
66
+ decl("viaOwned", parent(ref("owned"))),
67
+ decl("viaViaOwned", ref("viaOwned")),
68
+ // An expression-position write excludes the local.
69
+ decl("written", parent(ref("other"))),
70
+ {
71
+ kind: "exprStmt",
72
+ expr: { kind: "assignExpr", localId: "written", value: ref("other"), type: NODE, loc },
73
+ loc,
74
+ },
75
+ decl("kept", parent(ref("other"))),
76
+ ];
77
+ const result = findWalkBorrows(fn(body, ["fromParam", "owned", "viaOwned", "viaViaOwned", "written", "kept"], ["node", "other"]), host);
78
+ expect(result).toEqual(new Set(["kept"]));
79
+ });
80
+ test("scalar locals, owning projections and suspending bodies are never walks", () => {
81
+ const scalar = fn([decl("p", parent(ref("node")))], ["p"]);
82
+ scalar.locals[1] = { id: "p", name: "p", type: F64, mutable: true };
83
+ expect(findWalkBorrows(scalar, host).size).toBe(0);
84
+ const owning = fn([decl("p", parent(ref("node")))], ["p"]);
85
+ expect(findWalkBorrows(owning, { ...host, borrowsWithoutOwning: () => false }).size).toBe(0);
86
+ const suspending = { ...fn([decl("p", parent(ref("node")))], ["p"]), async: true };
87
+ expect(findWalkBorrows(suspending, host).size).toBe(0);
88
+ });
89
+ test("returns of walks, including calls to borrowed-return callees, return borrowed", () => {
90
+ const ret = (value) => ({ kind: "return", value, loc });
91
+ const accessor = { kind: "call", callee: "fileOf", args: [ref("node")], type: NODE, loc };
92
+ const borrowedHost = { ...host, borrowedReturn: (callee) => callee === "fileOf" };
93
+ const walking = fn([decl("p", accessor), ret(parent(ref("p")))], ["p"]);
94
+ expect(analyzeWalks(walking, borrowedHost)).toEqual({
95
+ locals: new Set(["p"]),
96
+ returnsWalk: true,
97
+ });
98
+ // Without the callee fact the call result is owned.
99
+ expect(analyzeWalks(walking, host)).toEqual({ locals: new Set(), returnsWalk: false });
100
+ // Every return must walk, a try statement disqualifies, and parameters
101
+ // outside the borrowing convention are no roots.
102
+ const mixed = fn([ret(parent(ref("node"))), ret(call)], []);
103
+ expect(analyzeWalks(mixed, borrowedHost).returnsWalk).toBe(false);
104
+ const guarded = fn([
105
+ {
106
+ kind: "tryCatch",
107
+ tryBody: [ret(ref("node"))],
108
+ catchBody: null,
109
+ catchLocalId: null,
110
+ finallyBody: [],
111
+ loc,
112
+ },
113
+ ], []);
114
+ expect(analyzeWalks(guarded, borrowedHost).returnsWalk).toBe(false);
115
+ const owned = fn([ret(parent(ref("node")))], []);
116
+ expect(analyzeWalks(owned, { ...borrowedHost, parameterAllowed: () => false }).returnsWalk).toBe(false);
117
+ expect(analyzeWalks(owned, borrowedHost).returnsWalk).toBe(true);
118
+ });
119
+ //# sourceMappingURL=walk-borrows.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-borrows.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/walk-borrows.test.ts"],"names":[],"mappings":"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"}