@geastack/compiler 1.0.15

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 (966) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +149 -0
  3. package/dist/cli-analyze.d.ts +1 -0
  4. package/dist/cli-analyze.js +61 -0
  5. package/dist/cli-coverage.d.ts +1 -0
  6. package/dist/cli-coverage.js +329 -0
  7. package/dist/cli-emit.d.ts +10 -0
  8. package/dist/cli-emit.js +398 -0
  9. package/dist/cli-module-graph.d.ts +18 -0
  10. package/dist/cli-module-graph.js +123 -0
  11. package/dist/cli-package-source.d.ts +5 -0
  12. package/dist/cli-package-source.js +116 -0
  13. package/dist/cli-project.d.ts +2 -0
  14. package/dist/cli-project.js +60 -0
  15. package/dist/cli.d.ts +2 -0
  16. package/dist/cli.js +199 -0
  17. package/dist/compiler.d.ts +228 -0
  18. package/dist/compiler.js +1029 -0
  19. package/dist/conversion/algebra.d.ts +218 -0
  20. package/dist/conversion/algebra.js +155 -0
  21. package/dist/conversion/build.d.ts +67 -0
  22. package/dist/conversion/build.js +1378 -0
  23. package/dist/conversion/derive.d.ts +37 -0
  24. package/dist/conversion/derive.js +260 -0
  25. package/dist/conversion/graph-validation.d.ts +8 -0
  26. package/dist/conversion/graph-validation.js +97 -0
  27. package/dist/conversion/native-callable-adapter.d.ts +13 -0
  28. package/dist/conversion/native-callable-adapter.js +53 -0
  29. package/dist/conversion/native-class-reference.d.ts +12 -0
  30. package/dist/conversion/native-class-reference.js +39 -0
  31. package/dist/conversion/native-payload-transport.d.ts +25 -0
  32. package/dist/conversion/native-payload-transport.js +33 -0
  33. package/dist/conversion/native-selection.d.ts +49 -0
  34. package/dist/conversion/native-selection.js +135 -0
  35. package/dist/conversion/native-sum.d.ts +42 -0
  36. package/dist/conversion/native-sum.js +115 -0
  37. package/dist/conversion/nodes.d.ts +55 -0
  38. package/dist/conversion/nodes.js +91 -0
  39. package/dist/conversion/operand-view.d.ts +14 -0
  40. package/dist/conversion/operand-view.js +20 -0
  41. package/dist/conversion/record-view.d.ts +157 -0
  42. package/dist/conversion/record-view.js +273 -0
  43. package/dist/conversion/registry.d.ts +217 -0
  44. package/dist/conversion/registry.js +1 -0
  45. package/dist/diagnostics/model.d.ts +76 -0
  46. package/dist/diagnostics/model.js +60 -0
  47. package/dist/diagnostics/sweep.d.ts +31 -0
  48. package/dist/diagnostics/sweep.js +112 -0
  49. package/dist/identity/ids.d.ts +179 -0
  50. package/dist/identity/ids.js +212 -0
  51. package/dist/ir/absent-class-arm.d.ts +48 -0
  52. package/dist/ir/absent-class-arm.js +157 -0
  53. package/dist/ir/borrow-effects.d.ts +23 -0
  54. package/dist/ir/borrow-effects.js +151 -0
  55. package/dist/ir/borrowed-call-arguments.d.ts +40 -0
  56. package/dist/ir/borrowed-call-arguments.js +117 -0
  57. package/dist/ir/build.d.ts +168 -0
  58. package/dist/ir/build.js +459 -0
  59. package/dist/ir/call-dispatch.d.ts +38 -0
  60. package/dist/ir/call-dispatch.js +502 -0
  61. package/dist/ir/call-entry.d.ts +142 -0
  62. package/dist/ir/call-entry.js +386 -0
  63. package/dist/ir/callable-class-flow.d.ts +27 -0
  64. package/dist/ir/callable-class-flow.js +1386 -0
  65. package/dist/ir/callable-field-slots.d.ts +22 -0
  66. package/dist/ir/callable-field-slots.js +166 -0
  67. package/dist/ir/callable-identity-demand.d.ts +52 -0
  68. package/dist/ir/callable-identity-demand.js +460 -0
  69. package/dist/ir/callable-member-candidates.d.ts +9 -0
  70. package/dist/ir/callable-member-candidates.js +39 -0
  71. package/dist/ir/callable-records.d.ts +21 -0
  72. package/dist/ir/callable-records.js +411 -0
  73. package/dist/ir/captures.d.ts +26 -0
  74. package/dist/ir/captures.js +335 -0
  75. package/dist/ir/certificate.d.ts +45 -0
  76. package/dist/ir/certificate.js +47 -0
  77. package/dist/ir/certify/carrier-keys.d.ts +73 -0
  78. package/dist/ir/certify/carrier-keys.js +221 -0
  79. package/dist/ir/certify/function-source.d.ts +4 -0
  80. package/dist/ir/certify/function-source.js +28 -0
  81. package/dist/ir/certify/has-property-key.d.ts +88 -0
  82. package/dist/ir/certify/has-property-key.js +116 -0
  83. package/dist/ir/certify/instanceof-key.d.ts +24 -0
  84. package/dist/ir/certify/instanceof-key.js +35 -0
  85. package/dist/ir/certify/property-access-keys.d.ts +172 -0
  86. package/dist/ir/certify/property-access-keys.js +291 -0
  87. package/dist/ir/certify/property-access.d.ts +3 -0
  88. package/dist/ir/certify/property-access.js +597 -0
  89. package/dist/ir/certify/runtime-helper.d.ts +3 -0
  90. package/dist/ir/certify/runtime-helper.js +326 -0
  91. package/dist/ir/certify/typeof-operand.d.ts +14 -0
  92. package/dist/ir/certify/typeof-operand.js +16 -0
  93. package/dist/ir/certify.d.ts +123 -0
  94. package/dist/ir/certify.js +481 -0
  95. package/dist/ir/class-evaluation.d.ts +26 -0
  96. package/dist/ir/class-evaluation.js +50 -0
  97. package/dist/ir/class-static-fields.d.ts +60 -0
  98. package/dist/ir/class-static-fields.js +108 -0
  99. package/dist/ir/construct-entry.d.ts +26 -0
  100. package/dist/ir/construct-entry.js +117 -0
  101. package/dist/ir/dead-values.d.ts +90 -0
  102. package/dist/ir/dead-values.js +184 -0
  103. package/dist/ir/deferral.d.ts +99 -0
  104. package/dist/ir/deferral.js +409 -0
  105. package/dist/ir/dense-loops.d.ts +230 -0
  106. package/dist/ir/dense-loops.js +697 -0
  107. package/dist/ir/dominance.d.ts +82 -0
  108. package/dist/ir/dominance.js +268 -0
  109. package/dist/ir/emission-representations.d.ts +71 -0
  110. package/dist/ir/emission-representations.js +350 -0
  111. package/dist/ir/facts.d.ts +218 -0
  112. package/dist/ir/facts.js +181 -0
  113. package/dist/ir/fixed-data-definition.d.ts +19 -0
  114. package/dist/ir/fixed-data-definition.js +49 -0
  115. package/dist/ir/generator-split.d.ts +38 -0
  116. package/dist/ir/generator-split.js +329 -0
  117. package/dist/ir/hoist.d.ts +55 -0
  118. package/dist/ir/hoist.js +375 -0
  119. package/dist/ir/instantiation.d.ts +61 -0
  120. package/dist/ir/instantiation.js +137 -0
  121. package/dist/ir/integer-storage.d.ts +170 -0
  122. package/dist/ir/integer-storage.js +822 -0
  123. package/dist/ir/integers.d.ts +161 -0
  124. package/dist/ir/integers.js +539 -0
  125. package/dist/ir/integrity-restrictions.d.ts +50 -0
  126. package/dist/ir/integrity-restrictions.js +118 -0
  127. package/dist/ir/local-iterators.d.ts +4 -0
  128. package/dist/ir/local-iterators.js +27 -0
  129. package/dist/ir/lower-allocation.d.ts +4 -0
  130. package/dist/ir/lower-allocation.js +325 -0
  131. package/dist/ir/lower-completion.d.ts +15 -0
  132. package/dist/ir/lower-completion.js +25 -0
  133. package/dist/ir/lower-destructuring.d.ts +5 -0
  134. package/dist/ir/lower-destructuring.js +693 -0
  135. package/dist/ir/lower-element.d.ts +29 -0
  136. package/dist/ir/lower-element.js +111 -0
  137. package/dist/ir/lower-exceptions.d.ts +47 -0
  138. package/dist/ir/lower-exceptions.js +92 -0
  139. package/dist/ir/lower-flow.d.ts +137 -0
  140. package/dist/ir/lower-flow.js +600 -0
  141. package/dist/ir/lower-graph.d.ts +218 -0
  142. package/dist/ir/lower-graph.js +687 -0
  143. package/dist/ir/lower-invocation.d.ts +4 -0
  144. package/dist/ir/lower-invocation.js +514 -0
  145. package/dist/ir/lower-narrow.d.ts +53 -0
  146. package/dist/ir/lower-narrow.js +320 -0
  147. package/dist/ir/lower-operands.d.ts +272 -0
  148. package/dist/ir/lower-operands.js +461 -0
  149. package/dist/ir/lower-property.d.ts +21 -0
  150. package/dist/ir/lower-property.js +132 -0
  151. package/dist/ir/lower-protocol.d.ts +11 -0
  152. package/dist/ir/lower-protocol.js +118 -0
  153. package/dist/ir/lower-short-circuit.d.ts +41 -0
  154. package/dist/ir/lower-short-circuit.js +63 -0
  155. package/dist/ir/lower.d.ts +82 -0
  156. package/dist/ir/lower.js +1346 -0
  157. package/dist/ir/model.d.ts +1474 -0
  158. package/dist/ir/model.js +6 -0
  159. package/dist/ir/native-absent-property.d.ts +3 -0
  160. package/dist/ir/native-absent-property.js +13 -0
  161. package/dist/ir/native-array-transport.d.ts +7 -0
  162. package/dist/ir/native-array-transport.js +46 -0
  163. package/dist/ir/native-callable-bind.d.ts +9 -0
  164. package/dist/ir/native-callable-bind.js +30 -0
  165. package/dist/ir/native-carrier-predicate.d.ts +34 -0
  166. package/dist/ir/native-carrier-predicate.js +49 -0
  167. package/dist/ir/native-class-accessor.d.ts +18 -0
  168. package/dist/ir/native-class-accessor.js +52 -0
  169. package/dist/ir/native-class-construction.d.ts +16 -0
  170. package/dist/ir/native-class-construction.js +71 -0
  171. package/dist/ir/native-class-initialization.d.ts +15 -0
  172. package/dist/ir/native-class-initialization.js +56 -0
  173. package/dist/ir/native-class-origins.d.ts +13 -0
  174. package/dist/ir/native-class-origins.js +237 -0
  175. package/dist/ir/native-dictionary-transport.d.ts +6 -0
  176. package/dist/ir/native-dictionary-transport.js +37 -0
  177. package/dist/ir/native-enumeration.d.ts +14 -0
  178. package/dist/ir/native-enumeration.js +26 -0
  179. package/dist/ir/native-equality.d.ts +10 -0
  180. package/dist/ir/native-equality.js +18 -0
  181. package/dist/ir/native-field-owner.d.ts +37 -0
  182. package/dist/ir/native-field-owner.js +183 -0
  183. package/dist/ir/native-fixed-layout.d.ts +41 -0
  184. package/dist/ir/native-fixed-layout.js +232 -0
  185. package/dist/ir/native-host-construction.d.ts +53 -0
  186. package/dist/ir/native-host-construction.js +62 -0
  187. package/dist/ir/native-key-query.d.ts +4 -0
  188. package/dist/ir/native-key-query.js +38 -0
  189. package/dist/ir/native-merge-transport.d.ts +25 -0
  190. package/dist/ir/native-merge-transport.js +71 -0
  191. package/dist/ir/native-record-index-transport.d.ts +11 -0
  192. package/dist/ir/native-record-index-transport.js +34 -0
  193. package/dist/ir/native-record-index.d.ts +12 -0
  194. package/dist/ir/native-record-index.js +27 -0
  195. package/dist/ir/native-reflect-field.d.ts +5 -0
  196. package/dist/ir/native-reflect-field.js +33 -0
  197. package/dist/ir/native-sequence-transport.d.ts +7 -0
  198. package/dist/ir/native-sequence-transport.js +53 -0
  199. package/dist/ir/numeric-intrinsics.d.ts +13 -0
  200. package/dist/ir/numeric-intrinsics.js +57 -0
  201. package/dist/ir/object-value-conversions.d.ts +20 -0
  202. package/dist/ir/object-value-conversions.js +50 -0
  203. package/dist/ir/physical-class-reflection.d.ts +9 -0
  204. package/dist/ir/physical-class-reflection.js +57 -0
  205. package/dist/ir/presence-proof.d.ts +42 -0
  206. package/dist/ir/presence-proof.js +490 -0
  207. package/dist/ir/program-facts.d.ts +106 -0
  208. package/dist/ir/program-facts.js +319 -0
  209. package/dist/ir/proven-branches.d.ts +16 -0
  210. package/dist/ir/proven-branches.js +219 -0
  211. package/dist/ir/queries.d.ts +41 -0
  212. package/dist/ir/queries.js +213 -0
  213. package/dist/ir/reflection-demand.d.ts +64 -0
  214. package/dist/ir/reflection-demand.js +1394 -0
  215. package/dist/ir/refusal.d.ts +43 -0
  216. package/dist/ir/refusal.js +28 -0
  217. package/dist/ir/shake.d.ts +37 -0
  218. package/dist/ir/shake.js +1078 -0
  219. package/dist/ir/static-callables.d.ts +11 -0
  220. package/dist/ir/static-callables.js +163 -0
  221. package/dist/ir/string-layout-reuse.d.ts +13 -0
  222. package/dist/ir/string-layout-reuse.js +39 -0
  223. package/dist/ir/string-length-reuse.d.ts +8 -0
  224. package/dist/ir/string-length-reuse.js +47 -0
  225. package/dist/ir/transfer.d.ts +78 -0
  226. package/dist/ir/transfer.js +270 -0
  227. package/dist/ir/type-query-results.d.ts +25 -0
  228. package/dist/ir/type-query-results.js +96 -0
  229. package/dist/ir/typed-property-access.d.ts +100 -0
  230. package/dist/ir/typed-property-access.js +161 -0
  231. package/dist/ir/verify.d.ts +19 -0
  232. package/dist/ir/verify.js +355 -0
  233. package/dist/plugins/apple/constructors.d.ts +112 -0
  234. package/dist/plugins/apple/constructors.js +217 -0
  235. package/dist/plugins/apple/host.d.ts +181 -0
  236. package/dist/plugins/apple/host.js +262 -0
  237. package/dist/plugins/apple/jsx.d.ts +2 -0
  238. package/dist/plugins/apple/jsx.js +293 -0
  239. package/dist/plugins/apple/members.d.ts +16 -0
  240. package/dist/plugins/apple/members.js +190 -0
  241. package/dist/plugins/apple/plugin.d.ts +2 -0
  242. package/dist/plugins/apple/plugin.js +156 -0
  243. package/dist/plugins/gea/component-classes.d.ts +25 -0
  244. package/dist/plugins/gea/component-classes.js +162 -0
  245. package/dist/plugins/gea/component-inline.d.ts +13 -0
  246. package/dist/plugins/gea/component-inline.js +532 -0
  247. package/dist/plugins/gea/constructors.d.ts +23 -0
  248. package/dist/plugins/gea/constructors.js +100 -0
  249. package/dist/plugins/gea/contract.d.ts +150 -0
  250. package/dist/plugins/gea/contract.js +195 -0
  251. package/dist/plugins/gea/element-ref.d.ts +31 -0
  252. package/dist/plugins/gea/element-ref.js +45 -0
  253. package/dist/plugins/gea/host.d.ts +520 -0
  254. package/dist/plugins/gea/host.js +762 -0
  255. package/dist/plugins/gea/lower.d.ts +6 -0
  256. package/dist/plugins/gea/lower.js +195 -0
  257. package/dist/plugins/gea/members.d.ts +22 -0
  258. package/dist/plugins/gea/members.js +221 -0
  259. package/dist/plugins/gea/plugin.d.ts +22 -0
  260. package/dist/plugins/gea/plugin.js +307 -0
  261. package/dist/plugins/gea/prelude.d.ts +78 -0
  262. package/dist/plugins/gea/prelude.js +153 -0
  263. package/dist/plugins/gea/producer.d.ts +5 -0
  264. package/dist/plugins/gea/producer.js +52 -0
  265. package/dist/plugins/gea/reactive-slots.d.ts +49 -0
  266. package/dist/plugins/gea/reactive-slots.js +578 -0
  267. package/dist/plugins/gea/render-bridge.d.ts +6 -0
  268. package/dist/plugins/gea/render-bridge.js +281 -0
  269. package/dist/plugins/gea/slots.d.ts +15 -0
  270. package/dist/plugins/gea/slots.js +36 -0
  271. package/dist/plugins/gea/template-analysis.d.ts +151 -0
  272. package/dist/plugins/gea/template-analysis.js +346 -0
  273. package/dist/plugins/gea/user-agent-styles.d.ts +9 -0
  274. package/dist/plugins/gea/user-agent-styles.js +94 -0
  275. package/dist/plugins/installed.d.ts +19 -0
  276. package/dist/plugins/installed.js +21 -0
  277. package/dist/plugins/load.d.ts +7 -0
  278. package/dist/plugins/load.js +207 -0
  279. package/dist/plugins/model.d.ts +735 -0
  280. package/dist/plugins/model.js +47 -0
  281. package/dist/plugins/webgl/host.d.ts +77 -0
  282. package/dist/plugins/webgl/host.js +162 -0
  283. package/dist/plugins/webgl/plugin.d.ts +40 -0
  284. package/dist/plugins/webgl/plugin.js +99 -0
  285. package/dist/preflight/obligations.d.ts +206 -0
  286. package/dist/preflight/obligations.js +36 -0
  287. package/dist/preflight/report.d.ts +20 -0
  288. package/dist/preflight/report.js +61 -0
  289. package/dist/preflight/run.d.ts +39 -0
  290. package/dist/preflight/run.js +403 -0
  291. package/dist/project-preparation.d.ts +33 -0
  292. package/dist/project-preparation.js +314 -0
  293. package/dist/projection/abi.d.ts +82 -0
  294. package/dist/projection/abi.js +349 -0
  295. package/dist/projection/apply-arguments.d.ts +12 -0
  296. package/dist/projection/apply-arguments.js +20 -0
  297. package/dist/projection/bindings.d.ts +250 -0
  298. package/dist/projection/bindings.js +340 -0
  299. package/dist/projection/callee.d.ts +196 -0
  300. package/dist/projection/callee.js +444 -0
  301. package/dist/projection/class-property-presence.d.ts +28 -0
  302. package/dist/projection/class-property-presence.js +58 -0
  303. package/dist/projection/class-prototype.d.ts +5 -0
  304. package/dist/projection/class-prototype.js +23 -0
  305. package/dist/projection/class-storage.d.ts +26 -0
  306. package/dist/projection/class-storage.js +236 -0
  307. package/dist/projection/classes.d.ts +283 -0
  308. package/dist/projection/classes.js +944 -0
  309. package/dist/projection/coercions.d.ts +20 -0
  310. package/dist/projection/coercions.js +33 -0
  311. package/dist/projection/dispatch.d.ts +167 -0
  312. package/dist/projection/dispatch.js +379 -0
  313. package/dist/projection/fields.d.ts +123 -0
  314. package/dist/projection/fields.js +383 -0
  315. package/dist/projection/instance-test.d.ts +78 -0
  316. package/dist/projection/instance-test.js +156 -0
  317. package/dist/projection/slots.d.ts +146 -0
  318. package/dist/projection/slots.js +663 -0
  319. package/dist/projection/synthesized-abi.d.ts +61 -0
  320. package/dist/projection/synthesized-abi.js +94 -0
  321. package/dist/representation/array-index.d.ts +14 -0
  322. package/dist/representation/array-index.js +17 -0
  323. package/dist/representation/callable-object.d.ts +3 -0
  324. package/dist/representation/callable-object.js +6 -0
  325. package/dist/representation/collections.d.ts +84 -0
  326. package/dist/representation/collections.js +139 -0
  327. package/dist/representation/derive.d.ts +159 -0
  328. package/dist/representation/derive.js +2546 -0
  329. package/dist/representation/difference.d.ts +30 -0
  330. package/dist/representation/difference.js +240 -0
  331. package/dist/representation/field-descriptor-policy.d.ts +19 -0
  332. package/dist/representation/field-descriptor-policy.js +39 -0
  333. package/dist/representation/function-constructor.d.ts +13 -0
  334. package/dist/representation/function-constructor.js +9 -0
  335. package/dist/representation/host-abi.d.ts +32 -0
  336. package/dist/representation/host-abi.js +97 -0
  337. package/dist/representation/host-templates.d.ts +67 -0
  338. package/dist/representation/host-templates.js +94 -0
  339. package/dist/representation/intersection.d.ts +84 -0
  340. package/dist/representation/intersection.js +149 -0
  341. package/dist/representation/literal-destination.d.ts +43 -0
  342. package/dist/representation/literal-destination.js +133 -0
  343. package/dist/representation/merge.d.ts +18 -0
  344. package/dist/representation/merge.js +83 -0
  345. package/dist/representation/model.d.ts +1160 -0
  346. package/dist/representation/model.js +1019 -0
  347. package/dist/representation/numeric-index.d.ts +13 -0
  348. package/dist/representation/numeric-index.js +29 -0
  349. package/dist/representation/object-shape.d.ts +109 -0
  350. package/dist/representation/object-shape.js +123 -0
  351. package/dist/representation/optional.d.ts +12 -0
  352. package/dist/representation/optional.js +87 -0
  353. package/dist/representation/plan.d.ts +60 -0
  354. package/dist/representation/plan.js +78 -0
  355. package/dist/representation/policies.d.ts +589 -0
  356. package/dist/representation/policies.js +107 -0
  357. package/dist/representation/primitive-domain.d.ts +1 -0
  358. package/dist/representation/primitive-domain.js +1 -0
  359. package/dist/representation/primitives.d.ts +44 -0
  360. package/dist/representation/primitives.js +78 -0
  361. package/dist/representation/publish.d.ts +49 -0
  362. package/dist/representation/publish.js +648 -0
  363. package/dist/representation/record-fields.d.ts +96 -0
  364. package/dist/representation/record-fields.js +116 -0
  365. package/dist/representation/template-object.d.ts +11 -0
  366. package/dist/representation/template-object.js +26 -0
  367. package/dist/representation/union.d.ts +30 -0
  368. package/dist/representation/union.js +324 -0
  369. package/dist/representation/value-records.d.ts +3 -0
  370. package/dist/representation/value-records.js +307 -0
  371. package/dist/representation/verify.d.ts +17 -0
  372. package/dist/representation/verify.js +221 -0
  373. package/dist/semantics/alias-this-field-declaration-transform.d.ts +4 -0
  374. package/dist/semantics/alias-this-field-declaration-transform.js +207 -0
  375. package/dist/semantics/ambient-type-realization-transform.d.ts +62 -0
  376. package/dist/semantics/ambient-type-realization-transform.js +168 -0
  377. package/dist/semantics/ambient.d.ts +24 -0
  378. package/dist/semantics/ambient.js +119 -0
  379. package/dist/semantics/borrowed-builtin-call-bind-source-transform.d.ts +4 -0
  380. package/dist/semantics/borrowed-builtin-call-bind-source-transform.js +341 -0
  381. package/dist/semantics/callable-origins.d.ts +46 -0
  382. package/dist/semantics/callable-origins.js +354 -0
  383. package/dist/semantics/class-alias.d.ts +7 -0
  384. package/dist/semantics/class-alias.js +37 -0
  385. package/dist/semantics/class-heritage.d.ts +34 -0
  386. package/dist/semantics/class-heritage.js +104 -0
  387. package/dist/semantics/commonjs-wrapper.d.ts +69 -0
  388. package/dist/semantics/commonjs-wrapper.js +231 -0
  389. package/dist/semantics/constructor-slot-subclasses.d.ts +28 -0
  390. package/dist/semantics/constructor-slot-subclasses.js +112 -0
  391. package/dist/semantics/declaration-overlay-transform.d.ts +35 -0
  392. package/dist/semantics/declaration-overlay-transform.js +2157 -0
  393. package/dist/semantics/define-property-source-transform.d.ts +4 -0
  394. package/dist/semantics/define-property-source-transform.js +437 -0
  395. package/dist/semantics/diagnostic-source-preparation.d.ts +24 -0
  396. package/dist/semantics/diagnostic-source-preparation.js +82 -0
  397. package/dist/semantics/documentation-ranges.d.ts +22 -0
  398. package/dist/semantics/documentation-ranges.js +36 -0
  399. package/dist/semantics/dynamic-fallback.d.ts +86 -0
  400. package/dist/semantics/dynamic-fallback.js +249 -0
  401. package/dist/semantics/frontend-timing.d.ts +6 -0
  402. package/dist/semantics/frontend-timing.js +35 -0
  403. package/dist/semantics/frontend.d.ts +504 -0
  404. package/dist/semantics/frontend.js +1157 -0
  405. package/dist/semantics/host-declaration-provenance.d.ts +11 -0
  406. package/dist/semantics/host-declaration-provenance.js +18 -0
  407. package/dist/semantics/host-methods.d.ts +24 -0
  408. package/dist/semantics/host-methods.js +74 -0
  409. package/dist/semantics/host-protocols.d.ts +429 -0
  410. package/dist/semantics/host-protocols.js +1501 -0
  411. package/dist/semantics/inherited-accessor.d.ts +7 -0
  412. package/dist/semantics/inherited-accessor.js +48 -0
  413. package/dist/semantics/interface-families.d.ts +70 -0
  414. package/dist/semantics/interface-families.js +180 -0
  415. package/dist/semantics/interface-implementors.d.ts +53 -0
  416. package/dist/semantics/interface-implementors.js +87 -0
  417. package/dist/semantics/jsdoc-namepath-transform.d.ts +4 -0
  418. package/dist/semantics/jsdoc-namepath-transform.js +85 -0
  419. package/dist/semantics/model/coverage.d.ts +68 -0
  420. package/dist/semantics/model/coverage.js +73 -0
  421. package/dist/semantics/model/edges.d.ts +103 -0
  422. package/dist/semantics/model/edges.js +20 -0
  423. package/dist/semantics/model/graph.d.ts +55 -0
  424. package/dist/semantics/model/graph.js +129 -0
  425. package/dist/semantics/model/operands.d.ts +159 -0
  426. package/dist/semantics/model/operands.js +26 -0
  427. package/dist/semantics/model/operations.d.ts +496 -0
  428. package/dist/semantics/model/operations.js +2 -0
  429. package/dist/semantics/model/primitive-domain.d.ts +26 -0
  430. package/dist/semantics/model/primitive-domain.js +38 -0
  431. package/dist/semantics/model/selected-signature.d.ts +261 -0
  432. package/dist/semantics/model/selected-signature.js +55 -0
  433. package/dist/semantics/model/structural-type-table.d.ts +93 -0
  434. package/dist/semantics/model/structural-type-table.js +237 -0
  435. package/dist/semantics/model/structural-types.d.ts +367 -0
  436. package/dist/semantics/model/structural-types.js +200 -0
  437. package/dist/semantics/module-resolution.d.ts +23 -0
  438. package/dist/semantics/module-resolution.js +227 -0
  439. package/dist/semantics/new-callee-class-tag-source-transform.d.ts +4 -0
  440. package/dist/semantics/new-callee-class-tag-source-transform.js +64 -0
  441. package/dist/semantics/node-project.d.ts +13 -0
  442. package/dist/semantics/node-project.js +107 -0
  443. package/dist/semantics/node-source-hooks.d.ts +1 -0
  444. package/dist/semantics/node-source-hooks.js +63 -0
  445. package/dist/semantics/normalize/absent-globals.d.ts +143 -0
  446. package/dist/semantics/normalize/absent-globals.js +191 -0
  447. package/dist/semantics/normalize/arguments-objects.d.ts +43 -0
  448. package/dist/semantics/normalize/arguments-objects.js +60 -0
  449. package/dist/semantics/normalize/asserted-arm-absence.d.ts +28 -0
  450. package/dist/semantics/normalize/asserted-arm-absence.js +61 -0
  451. package/dist/semantics/normalize/assignment-patterns.d.ts +70 -0
  452. package/dist/semantics/normalize/assignment-patterns.js +147 -0
  453. package/dist/semantics/normalize/bag-absence.d.ts +8 -0
  454. package/dist/semantics/normalize/bag-absence.js +42 -0
  455. package/dist/semantics/normalize/binding-fixpoint.d.ts +36 -0
  456. package/dist/semantics/normalize/binding-fixpoint.js +140 -0
  457. package/dist/semantics/normalize/callback-parameter-contracts.d.ts +16 -0
  458. package/dist/semantics/normalize/callback-parameter-contracts.js +91 -0
  459. package/dist/semantics/normalize/cells/agreement.d.ts +46 -0
  460. package/dist/semantics/normalize/cells/agreement.js +34 -0
  461. package/dist/semantics/normalize/cells/candidates.d.ts +17 -0
  462. package/dist/semantics/normalize/cells/candidates.js +35 -0
  463. package/dist/semantics/normalize/cells/facts.d.ts +19 -0
  464. package/dist/semantics/normalize/cells/facts.js +90 -0
  465. package/dist/semantics/normalize/cells/index.d.ts +10 -0
  466. package/dist/semantics/normalize/cells/index.js +6 -0
  467. package/dist/semantics/normalize/cells/model.d.ts +98 -0
  468. package/dist/semantics/normalize/cells/model.js +2 -0
  469. package/dist/semantics/normalize/cells/policies/bag.d.ts +44 -0
  470. package/dist/semantics/normalize/cells/policies/bag.js +114 -0
  471. package/dist/semantics/normalize/cells/policies/collection.d.ts +42 -0
  472. package/dist/semantics/normalize/cells/policies/collection.js +218 -0
  473. package/dist/semantics/normalize/cells/policies/field.d.ts +28 -0
  474. package/dist/semantics/normalize/cells/policies/field.js +40 -0
  475. package/dist/semantics/normalize/cells/policies/index.d.ts +49 -0
  476. package/dist/semantics/normalize/cells/policies/index.js +58 -0
  477. package/dist/semantics/normalize/cells/policies/local.d.ts +18 -0
  478. package/dist/semantics/normalize/cells/policies/local.js +37 -0
  479. package/dist/semantics/normalize/cells/policies/parameter.d.ts +28 -0
  480. package/dist/semantics/normalize/cells/policies/parameter.js +39 -0
  481. package/dist/semantics/normalize/cells/policies/return.d.ts +26 -0
  482. package/dist/semantics/normalize/cells/policies/return.js +45 -0
  483. package/dist/semantics/normalize/cells/policies/shared.d.ts +33 -0
  484. package/dist/semantics/normalize/cells/policies/shared.js +45 -0
  485. package/dist/semantics/normalize/cells/policy.d.ts +72 -0
  486. package/dist/semantics/normalize/cells/policy.js +18 -0
  487. package/dist/semantics/normalize/cells/registry.d.ts +14 -0
  488. package/dist/semantics/normalize/cells/registry.js +17 -0
  489. package/dist/semantics/normalize/census-refusal.d.ts +62 -0
  490. package/dist/semantics/normalize/census-refusal.js +27 -0
  491. package/dist/semantics/normalize/census.d.ts +109 -0
  492. package/dist/semantics/normalize/census.js +667 -0
  493. package/dist/semantics/normalize/collection-bindings.d.ts +278 -0
  494. package/dist/semantics/normalize/collection-bindings.js +677 -0
  495. package/dist/semantics/normalize/commonjs-module-record.d.ts +21 -0
  496. package/dist/semantics/normalize/commonjs-module-record.js +289 -0
  497. package/dist/semantics/normalize/commonjs-require.d.ts +13 -0
  498. package/dist/semantics/normalize/commonjs-require.js +1527 -0
  499. package/dist/semantics/normalize/contribution.d.ts +63 -0
  500. package/dist/semantics/normalize/contribution.js +172 -0
  501. package/dist/semantics/normalize/dead-typeof-guards.d.ts +64 -0
  502. package/dist/semantics/normalize/dead-typeof-guards.js +152 -0
  503. package/dist/semantics/normalize/deferred-intrinsic-protocols.d.ts +57 -0
  504. package/dist/semantics/normalize/deferred-intrinsic-protocols.js +109 -0
  505. package/dist/semantics/normalize/derived-expression-type.d.ts +1070 -0
  506. package/dist/semantics/normalize/derived-expression-type.js +3463 -0
  507. package/dist/semantics/normalize/evaluation-order.d.ts +16 -0
  508. package/dist/semantics/normalize/evaluation-order.js +37 -0
  509. package/dist/semantics/normalize/field-bindings.d.ts +167 -0
  510. package/dist/semantics/normalize/field-bindings.js +1125 -0
  511. package/dist/semantics/normalize/flow/array-element-continuation.d.ts +27 -0
  512. package/dist/semantics/normalize/flow/array-element-continuation.js +1452 -0
  513. package/dist/semantics/normalize/flow/callable-array-origins.d.ts +42 -0
  514. package/dist/semantics/normalize/flow/callable-array-origins.js +318 -0
  515. package/dist/semantics/normalize/flow/callable-completions.d.ts +45 -0
  516. package/dist/semantics/normalize/flow/callable-completions.js +82 -0
  517. package/dist/semantics/normalize/flow/callable-reach.d.ts +237 -0
  518. package/dist/semantics/normalize/flow/callable-reach.js +7174 -0
  519. package/dist/semantics/normalize/flow/class-family-member-read.d.ts +16 -0
  520. package/dist/semantics/normalize/flow/class-family-member-read.js +992 -0
  521. package/dist/semantics/normalize/flow/collection-value-continuation.d.ts +21 -0
  522. package/dist/semantics/normalize/flow/collection-value-continuation.js +192 -0
  523. package/dist/semantics/normalize/flow/component-solver.d.ts +199 -0
  524. package/dist/semantics/normalize/flow/component-solver.js +587 -0
  525. package/dist/semantics/normalize/flow/computed-key-set.d.ts +84 -0
  526. package/dist/semantics/normalize/flow/computed-key-set.js +660 -0
  527. package/dist/semantics/normalize/flow/export-importers.d.ts +24 -0
  528. package/dist/semantics/normalize/flow/export-importers.js +269 -0
  529. package/dist/semantics/normalize/flow/host-text-sink.d.ts +25 -0
  530. package/dist/semantics/normalize/flow/host-text-sink.js +87 -0
  531. package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.d.ts +84 -0
  532. package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.js +180 -0
  533. package/dist/semantics/normalize/flow/intrinsic-data-definition.d.ts +35 -0
  534. package/dist/semantics/normalize/flow/intrinsic-data-definition.js +140 -0
  535. package/dist/semantics/normalize/flow/invocation-facts.d.ts +98 -0
  536. package/dist/semantics/normalize/flow/invocation-facts.js +257 -0
  537. package/dist/semantics/normalize/flow/member-call-forwarding.d.ts +122 -0
  538. package/dist/semantics/normalize/flow/member-call-forwarding.js +835 -0
  539. package/dist/semantics/normalize/flow/model.d.ts +357 -0
  540. package/dist/semantics/normalize/flow/model.js +177 -0
  541. package/dist/semantics/normalize/flow/native-collection-protocol.d.ts +24 -0
  542. package/dist/semantics/normalize/flow/native-collection-protocol.js +252 -0
  543. package/dist/semantics/normalize/flow/node-path-token.d.ts +3 -0
  544. package/dist/semantics/normalize/flow/node-path-token.js +53 -0
  545. package/dist/semantics/normalize/flow/object-binding-continuation.d.ts +11 -0
  546. package/dist/semantics/normalize/flow/object-binding-continuation.js +42 -0
  547. package/dist/semantics/normalize/flow/origin-authority.d.ts +56 -0
  548. package/dist/semantics/normalize/flow/origin-authority.js +2 -0
  549. package/dist/semantics/normalize/flow/owned-class-receivers.d.ts +35 -0
  550. package/dist/semantics/normalize/flow/owned-class-receivers.js +191 -0
  551. package/dist/semantics/normalize/flow/parameter-values.d.ts +27 -0
  552. package/dist/semantics/normalize/flow/parameter-values.js +251 -0
  553. package/dist/semantics/normalize/flow/proof-hypotheses.d.ts +66 -0
  554. package/dist/semantics/normalize/flow/proof-hypotheses.js +162 -0
  555. package/dist/semantics/normalize/flow/record-alias-closure.d.ts +27 -0
  556. package/dist/semantics/normalize/flow/record-alias-closure.js +298 -0
  557. package/dist/semantics/normalize/flow/seeded-origins.d.ts +43 -0
  558. package/dist/semantics/normalize/flow/seeded-origins.js +54 -0
  559. package/dist/semantics/normalize/flow/source-class-data.d.ts +132 -0
  560. package/dist/semantics/normalize/flow/source-class-data.js +838 -0
  561. package/dist/semantics/normalize/flow/source-class-instanceof.d.ts +13 -0
  562. package/dist/semantics/normalize/flow/source-class-instanceof.js +37 -0
  563. package/dist/semantics/normalize/flow/source-class-static-data.d.ts +16 -0
  564. package/dist/semantics/normalize/flow/source-class-static-data.js +47 -0
  565. package/dist/semantics/normalize/flow/source-construction-frames.d.ts +12 -0
  566. package/dist/semantics/normalize/flow/source-construction-frames.js +118 -0
  567. package/dist/semantics/normalize/flow/source-invocation-frame-layout.d.ts +34 -0
  568. package/dist/semantics/normalize/flow/source-invocation-frame-layout.js +78 -0
  569. package/dist/semantics/normalize/flow/source-invocation-receiver.d.ts +37 -0
  570. package/dist/semantics/normalize/flow/source-invocation-receiver.js +95 -0
  571. package/dist/semantics/normalize/flow/source-prototype-method-identity.d.ts +23 -0
  572. package/dist/semantics/normalize/flow/source-prototype-method-identity.js +81 -0
  573. package/dist/semantics/normalize/flow/source-record-data.d.ts +29 -0
  574. package/dist/semantics/normalize/flow/source-record-data.js +626 -0
  575. package/dist/semantics/normalize/flow/source-value-session.d.ts +77 -0
  576. package/dist/semantics/normalize/flow/source-value-session.js +3089 -0
  577. package/dist/semantics/normalize/flow/targets.d.ts +118 -0
  578. package/dist/semantics/normalize/flow/targets.js +405 -0
  579. package/dist/semantics/normalize/flow/value-flow.d.ts +36 -0
  580. package/dist/semantics/normalize/flow/value-flow.js +823 -0
  581. package/dist/semantics/normalize/flow/value-provenance.d.ts +31 -0
  582. package/dist/semantics/normalize/flow/value-provenance.js +112 -0
  583. package/dist/semantics/normalize/gating.d.ts +51 -0
  584. package/dist/semantics/normalize/gating.js +560 -0
  585. package/dist/semantics/normalize/generic-function-choice.d.ts +31 -0
  586. package/dist/semantics/normalize/generic-function-choice.js +115 -0
  587. package/dist/semantics/normalize/global-host-mutations.d.ts +51 -0
  588. package/dist/semantics/normalize/global-host-mutations.js +5989 -0
  589. package/dist/semantics/normalize/host-effect-contracts.d.ts +77 -0
  590. package/dist/semantics/normalize/host-effect-contracts.js +143 -0
  591. package/dist/semantics/normalize/host-mutation-computed-keys.d.ts +38 -0
  592. package/dist/semantics/normalize/host-mutation-computed-keys.js +26 -0
  593. package/dist/semantics/normalize/host-mutation-key-reader.d.ts +66 -0
  594. package/dist/semantics/normalize/host-mutation-key-reader.js +192 -0
  595. package/dist/semantics/normalize/host-mutation-keys.d.ts +114 -0
  596. package/dist/semantics/normalize/host-mutation-keys.js +183 -0
  597. package/dist/semantics/normalize/identities.d.ts +172 -0
  598. package/dist/semantics/normalize/identities.js +426 -0
  599. package/dist/semantics/normalize/implicit-arguments-tuple.d.ts +97 -0
  600. package/dist/semantics/normalize/implicit-arguments-tuple.js +197 -0
  601. package/dist/semantics/normalize/implicit-arguments.d.ts +11 -0
  602. package/dist/semantics/normalize/implicit-arguments.js +39 -0
  603. package/dist/semantics/normalize/instantiation.d.ts +73 -0
  604. package/dist/semantics/normalize/instantiation.js +399 -0
  605. package/dist/semantics/normalize/intrinsic-property-call.d.ts +18 -0
  606. package/dist/semantics/normalize/intrinsic-property-call.js +69 -0
  607. package/dist/semantics/normalize/intrinsic-prototype.d.ts +41 -0
  608. package/dist/semantics/normalize/intrinsic-prototype.js +87 -0
  609. package/dist/semantics/normalize/intrinsic-static-member.d.ts +14 -0
  610. package/dist/semantics/normalize/intrinsic-static-member.js +23 -0
  611. package/dist/semantics/normalize/jsdoc-type-names.d.ts +32 -0
  612. package/dist/semantics/normalize/jsdoc-type-names.js +512 -0
  613. package/dist/semantics/normalize/keyof.d.ts +32 -0
  614. package/dist/semantics/normalize/keyof.js +110 -0
  615. package/dist/semantics/normalize/local-bindings.d.ts +176 -0
  616. package/dist/semantics/normalize/local-bindings.js +1826 -0
  617. package/dist/semantics/normalize/logical-result-type.d.ts +16 -0
  618. package/dist/semantics/normalize/logical-result-type.js +102 -0
  619. package/dist/semantics/normalize/namespace-paths.d.ts +57 -0
  620. package/dist/semantics/normalize/namespace-paths.js +108 -0
  621. package/dist/semantics/normalize/normalize.d.ts +57 -0
  622. package/dist/semantics/normalize/normalize.js +68 -0
  623. package/dist/semantics/normalize/object-bag-bindings.d.ts +305 -0
  624. package/dist/semantics/normalize/object-bag-bindings.js +1290 -0
  625. package/dist/semantics/normalize/omitted-stated-parameter.d.ts +53 -0
  626. package/dist/semantics/normalize/omitted-stated-parameter.js +59 -0
  627. package/dist/semantics/normalize/open-type-form.d.ts +10 -0
  628. package/dist/semantics/normalize/open-type-form.js +32 -0
  629. package/dist/semantics/normalize/parameter-bindings.d.ts +361 -0
  630. package/dist/semantics/normalize/parameter-bindings.js +3339 -0
  631. package/dist/semantics/normalize/parameter-slot.d.ts +264 -0
  632. package/dist/semantics/normalize/parameter-slot.js +491 -0
  633. package/dist/semantics/normalize/physical-overload-result.d.ts +77 -0
  634. package/dist/semantics/normalize/physical-overload-result.js +99 -0
  635. package/dist/semantics/normalize/primitive-property-absence.d.ts +12 -0
  636. package/dist/semantics/normalize/primitive-property-absence.js +60 -0
  637. package/dist/semantics/normalize/producer-context.d.ts +376 -0
  638. package/dist/semantics/normalize/producer-context.js +1 -0
  639. package/dist/semantics/normalize/producers/allocations.d.ts +3 -0
  640. package/dist/semantics/normalize/producers/allocations.js +863 -0
  641. package/dist/semantics/normalize/producers/binding-kind.d.ts +37 -0
  642. package/dist/semantics/normalize/producers/binding-kind.js +36 -0
  643. package/dist/semantics/normalize/producers/bindings.d.ts +85 -0
  644. package/dist/semantics/normalize/producers/bindings.js +710 -0
  645. package/dist/semantics/normalize/producers/boundary.d.ts +34 -0
  646. package/dist/semantics/normalize/producers/boundary.js +123 -0
  647. package/dist/semantics/normalize/producers/class-lifecycle.d.ts +3 -0
  648. package/dist/semantics/normalize/producers/class-lifecycle.js +902 -0
  649. package/dist/semantics/normalize/producers/computations.d.ts +3 -0
  650. package/dist/semantics/normalize/producers/computations.js +613 -0
  651. package/dist/semantics/normalize/producers/control-loops.d.ts +30 -0
  652. package/dist/semantics/normalize/producers/control-loops.js +91 -0
  653. package/dist/semantics/normalize/producers/control.d.ts +30 -0
  654. package/dist/semantics/normalize/producers/control.js +923 -0
  655. package/dist/semantics/normalize/producers/declaration-lifecycle.d.ts +3 -0
  656. package/dist/semantics/normalize/producers/declaration-lifecycle.js +390 -0
  657. package/dist/semantics/normalize/producers/destructuring.d.ts +45 -0
  658. package/dist/semantics/normalize/producers/destructuring.js +1180 -0
  659. package/dist/semantics/normalize/producers/dynamic-language.d.ts +3 -0
  660. package/dist/semantics/normalize/producers/dynamic-language.js +70 -0
  661. package/dist/semantics/normalize/producers/erasure.d.ts +51 -0
  662. package/dist/semantics/normalize/producers/erasure.js +90 -0
  663. package/dist/semantics/normalize/producers/installed.d.ts +3 -0
  664. package/dist/semantics/normalize/producers/installed.js +55 -0
  665. package/dist/semantics/normalize/producers/invocations.d.ts +35 -0
  666. package/dist/semantics/normalize/producers/invocations.js +1796 -0
  667. package/dist/semantics/normalize/producers/iteration-yield.d.ts +59 -0
  668. package/dist/semantics/normalize/producers/iteration-yield.js +235 -0
  669. package/dist/semantics/normalize/producers/jsx.d.ts +3 -0
  670. package/dist/semantics/normalize/producers/jsx.js +360 -0
  671. package/dist/semantics/normalize/producers/mint.d.ts +39 -0
  672. package/dist/semantics/normalize/producers/mint.js +44 -0
  673. package/dist/semantics/normalize/producers/nullish.d.ts +16 -0
  674. package/dist/semantics/normalize/producers/nullish.js +27 -0
  675. package/dist/semantics/normalize/producers/object-assignment.d.ts +8 -0
  676. package/dist/semantics/normalize/producers/object-assignment.js +204 -0
  677. package/dist/semantics/normalize/producers/object-tag.d.ts +9 -0
  678. package/dist/semantics/normalize/producers/object-tag.js +119 -0
  679. package/dist/semantics/normalize/producers/optional-chain.d.ts +44 -0
  680. package/dist/semantics/normalize/producers/optional-chain.js +75 -0
  681. package/dist/semantics/normalize/producers/properties.d.ts +21 -0
  682. package/dist/semantics/normalize/producers/properties.js +1053 -0
  683. package/dist/semantics/normalize/producers/protocol.d.ts +67 -0
  684. package/dist/semantics/normalize/producers/protocol.js +695 -0
  685. package/dist/semantics/normalize/producers/references.d.ts +53 -0
  686. package/dist/semantics/normalize/producers/references.js +1027 -0
  687. package/dist/semantics/normalize/producers/shared.d.ts +561 -0
  688. package/dist/semantics/normalize/producers/shared.js +1683 -0
  689. package/dist/semantics/normalize/producers/spread-arguments.d.ts +72 -0
  690. package/dist/semantics/normalize/producers/spread-arguments.js +375 -0
  691. package/dist/semantics/normalize/producers/tagged-template.d.ts +5 -0
  692. package/dist/semantics/normalize/producers/tagged-template.js +307 -0
  693. package/dist/semantics/normalize/producers/tuple-spread.d.ts +189 -0
  694. package/dist/semantics/normalize/producers/tuple-spread.js +279 -0
  695. package/dist/semantics/normalize/property-key-domain.d.ts +36 -0
  696. package/dist/semantics/normalize/property-key-domain.js +150 -0
  697. package/dist/semantics/normalize/reachability.d.ts +189 -0
  698. package/dist/semantics/normalize/reachability.js +1057 -0
  699. package/dist/semantics/normalize/reassigned-bindings.d.ts +13 -0
  700. package/dist/semantics/normalize/reassigned-bindings.js +41 -0
  701. package/dist/semantics/normalize/record-storage-families.d.ts +11 -0
  702. package/dist/semantics/normalize/record-storage-families.js +109 -0
  703. package/dist/semantics/normalize/return-bindings.d.ts +260 -0
  704. package/dist/semantics/normalize/return-bindings.js +1311 -0
  705. package/dist/semantics/normalize/return-paths.d.ts +2 -0
  706. package/dist/semantics/normalize/return-paths.js +28 -0
  707. package/dist/semantics/normalize/script-global-redefinition.d.ts +44 -0
  708. package/dist/semantics/normalize/script-global-redefinition.js +75 -0
  709. package/dist/semantics/normalize/specialization.d.ts +201 -0
  710. package/dist/semantics/normalize/specialization.js +1824 -0
  711. package/dist/semantics/normalize/structural-array-element.d.ts +176 -0
  712. package/dist/semantics/normalize/structural-array-element.js +700 -0
  713. package/dist/semantics/normalize/structural-array-read.d.ts +13 -0
  714. package/dist/semantics/normalize/structural-array-read.js +124 -0
  715. package/dist/semantics/normalize/structural-callable.d.ts +12 -0
  716. package/dist/semantics/normalize/structural-callable.js +82 -0
  717. package/dist/semantics/normalize/structural-creation-order.d.ts +32 -0
  718. package/dist/semantics/normalize/structural-creation-order.js +111 -0
  719. package/dist/semantics/normalize/structural-declarations.d.ts +395 -0
  720. package/dist/semantics/normalize/structural-declarations.js +968 -0
  721. package/dist/semantics/normalize/structural-declared-body.d.ts +25 -0
  722. package/dist/semantics/normalize/structural-declared-body.js +147 -0
  723. package/dist/semantics/normalize/structural-generics.d.ts +56 -0
  724. package/dist/semantics/normalize/structural-generics.js +120 -0
  725. package/dist/semantics/normalize/structural-indexed-access.d.ts +11 -0
  726. package/dist/semantics/normalize/structural-indexed-access.js +126 -0
  727. package/dist/semantics/normalize/structural-instantiated-member.d.ts +64 -0
  728. package/dist/semantics/normalize/structural-instantiated-member.js +407 -0
  729. package/dist/semantics/normalize/structural-joins.d.ts +44 -0
  730. package/dist/semantics/normalize/structural-joins.js +143 -0
  731. package/dist/semantics/normalize/structural-layout-relevance.d.ts +29 -0
  732. package/dist/semantics/normalize/structural-layout-relevance.js +391 -0
  733. package/dist/semantics/normalize/structural-layout-type.d.ts +11 -0
  734. package/dist/semantics/normalize/structural-layout-type.js +1468 -0
  735. package/dist/semantics/normalize/structural-leaves.d.ts +49 -0
  736. package/dist/semantics/normalize/structural-leaves.js +125 -0
  737. package/dist/semantics/normalize/structural-local-union.d.ts +13 -0
  738. package/dist/semantics/normalize/structural-local-union.js +133 -0
  739. package/dist/semantics/normalize/structural-members.d.ts +26 -0
  740. package/dist/semantics/normalize/structural-members.js +84 -0
  741. package/dist/semantics/normalize/structural-mutable-method.d.ts +15 -0
  742. package/dist/semantics/normalize/structural-mutable-method.js +109 -0
  743. package/dist/semantics/normalize/structural-parts.d.ts +131 -0
  744. package/dist/semantics/normalize/structural-parts.js +737 -0
  745. package/dist/semantics/normalize/structural-receiver.d.ts +66 -0
  746. package/dist/semantics/normalize/structural-receiver.js +551 -0
  747. package/dist/semantics/normalize/structural-rules.d.ts +112 -0
  748. package/dist/semantics/normalize/structural-rules.js +93 -0
  749. package/dist/semantics/normalize/structural-self-reference.d.ts +150 -0
  750. package/dist/semantics/normalize/structural-self-reference.js +494 -0
  751. package/dist/semantics/normalize/structural.d.ts +202 -0
  752. package/dist/semantics/normalize/structural.js +4218 -0
  753. package/dist/semantics/normalize/unreduced-type-form.d.ts +41 -0
  754. package/dist/semantics/normalize/unreduced-type-form.js +53 -0
  755. package/dist/semantics/normalize/unresolvable-names.d.ts +56 -0
  756. package/dist/semantics/normalize/unresolvable-names.js +140 -0
  757. package/dist/semantics/package-sources.d.ts +16 -0
  758. package/dist/semantics/package-sources.js +365 -0
  759. package/dist/semantics/program.d.ts +151 -0
  760. package/dist/semantics/program.js +667 -0
  761. package/dist/semantics/prototype-install-source-transform.d.ts +4 -0
  762. package/dist/semantics/prototype-install-source-transform.js +341 -0
  763. package/dist/semantics/prototype-object-class-source-transform.d.ts +4 -0
  764. package/dist/semantics/prototype-object-class-source-transform.js +525 -0
  765. package/dist/semantics/prototype-reparenting.d.ts +50 -0
  766. package/dist/semantics/prototype-reparenting.js +317 -0
  767. package/dist/semantics/stable-checker.d.ts +10 -0
  768. package/dist/semantics/stable-checker.js +148 -0
  769. package/dist/semantics/subclass-member-overlay-transform.d.ts +35 -0
  770. package/dist/semantics/subclass-member-overlay-transform.js +1418 -0
  771. package/dist/semantics/symbol-keyed-expando-source-transform.d.ts +4 -0
  772. package/dist/semantics/symbol-keyed-expando-source-transform.js +66 -0
  773. package/dist/semantics/this-constructor-source-transform.d.ts +4 -0
  774. package/dist/semantics/this-constructor-source-transform.js +122 -0
  775. package/dist/semantics/uninstantiable-classes.d.ts +22 -0
  776. package/dist/semantics/uninstantiable-classes.js +75 -0
  777. package/dist/targets/cpp/balanced-units.d.ts +3 -0
  778. package/dist/targets/cpp/balanced-units.js +58 -0
  779. package/dist/targets/cpp/borrowed-call-entry.d.ts +30 -0
  780. package/dist/targets/cpp/borrowed-call-entry.js +68 -0
  781. package/dist/targets/cpp/captures.d.ts +68 -0
  782. package/dist/targets/cpp/captures.js +269 -0
  783. package/dist/targets/cpp/class-layout.d.ts +313 -0
  784. package/dist/targets/cpp/class-layout.js +483 -0
  785. package/dist/targets/cpp/class-properties/computed-method-value.d.ts +25 -0
  786. package/dist/targets/cpp/class-properties/computed-method-value.js +22 -0
  787. package/dist/targets/cpp/class-properties/emit-class-properties.d.ts +216 -0
  788. package/dist/targets/cpp/class-properties/emit-class-properties.js +917 -0
  789. package/dist/targets/cpp/class-properties/native-prototype.d.ts +11 -0
  790. package/dist/targets/cpp/class-properties/native-prototype.js +101 -0
  791. package/dist/targets/cpp/class-ref-transport.d.ts +12 -0
  792. package/dist/targets/cpp/class-ref-transport.js +32 -0
  793. package/dist/targets/cpp/conversions.d.ts +3 -0
  794. package/dist/targets/cpp/conversions.js +2027 -0
  795. package/dist/targets/cpp/deferral-safety.d.ts +82 -0
  796. package/dist/targets/cpp/deferral-safety.js +86 -0
  797. package/dist/targets/cpp/direct-call-receivers.d.ts +37 -0
  798. package/dist/targets/cpp/direct-call-receivers.js +79 -0
  799. package/dist/targets/cpp/document.d.ts +74 -0
  800. package/dist/targets/cpp/document.js +106 -0
  801. package/dist/targets/cpp/emit-allocation.d.ts +60 -0
  802. package/dist/targets/cpp/emit-allocation.js +573 -0
  803. package/dist/targets/cpp/emit-arrays.d.ts +119 -0
  804. package/dist/targets/cpp/emit-arrays.js +1047 -0
  805. package/dist/targets/cpp/emit-binding-reference.d.ts +17 -0
  806. package/dist/targets/cpp/emit-binding-reference.js +120 -0
  807. package/dist/targets/cpp/emit-bindings.d.ts +158 -0
  808. package/dist/targets/cpp/emit-bindings.js +769 -0
  809. package/dist/targets/cpp/emit-buffers.d.ts +156 -0
  810. package/dist/targets/cpp/emit-buffers.js +573 -0
  811. package/dist/targets/cpp/emit-callable.d.ts +230 -0
  812. package/dist/targets/cpp/emit-callable.js +2154 -0
  813. package/dist/targets/cpp/emit-carrier-members.d.ts +406 -0
  814. package/dist/targets/cpp/emit-carrier-members.js +1224 -0
  815. package/dist/targets/cpp/emit-coercion.d.ts +26 -0
  816. package/dist/targets/cpp/emit-coercion.js +39 -0
  817. package/dist/targets/cpp/emit-context.d.ts +1882 -0
  818. package/dist/targets/cpp/emit-context.js +904 -0
  819. package/dist/targets/cpp/emit-dynamic-properties.d.ts +174 -0
  820. package/dist/targets/cpp/emit-dynamic-properties.js +1249 -0
  821. package/dist/targets/cpp/emit-equality.d.ts +39 -0
  822. package/dist/targets/cpp/emit-equality.js +472 -0
  823. package/dist/targets/cpp/emit-exceptions.d.ts +104 -0
  824. package/dist/targets/cpp/emit-exceptions.js +513 -0
  825. package/dist/targets/cpp/emit-field-owner.d.ts +4 -0
  826. package/dist/targets/cpp/emit-field-owner.js +27 -0
  827. package/dist/targets/cpp/emit-in.d.ts +31 -0
  828. package/dist/targets/cpp/emit-in.js +426 -0
  829. package/dist/targets/cpp/emit-instanceof.d.ts +19 -0
  830. package/dist/targets/cpp/emit-instanceof.js +601 -0
  831. package/dist/targets/cpp/emit-integers.d.ts +68 -0
  832. package/dist/targets/cpp/emit-integers.js +184 -0
  833. package/dist/targets/cpp/emit-iterator.d.ts +100 -0
  834. package/dist/targets/cpp/emit-iterator.js +1137 -0
  835. package/dist/targets/cpp/emit-json.d.ts +73 -0
  836. package/dist/targets/cpp/emit-json.js +823 -0
  837. package/dist/targets/cpp/emit-jsx.d.ts +74 -0
  838. package/dist/targets/cpp/emit-jsx.js +806 -0
  839. package/dist/targets/cpp/emit-mixed-binary.d.ts +51 -0
  840. package/dist/targets/cpp/emit-mixed-binary.js +60 -0
  841. package/dist/targets/cpp/emit-namespaces.d.ts +101 -0
  842. package/dist/targets/cpp/emit-namespaces.js +133 -0
  843. package/dist/targets/cpp/emit-narrowing.d.ts +738 -0
  844. package/dist/targets/cpp/emit-narrowing.js +3967 -0
  845. package/dist/targets/cpp/emit-native-equality.d.ts +3 -0
  846. package/dist/targets/cpp/emit-native-equality.js +14 -0
  847. package/dist/targets/cpp/emit-native-selection.d.ts +5 -0
  848. package/dist/targets/cpp/emit-native-selection.js +37 -0
  849. package/dist/targets/cpp/emit-object-tag.d.ts +4 -0
  850. package/dist/targets/cpp/emit-object-tag.js +108 -0
  851. package/dist/targets/cpp/emit-owned-record.d.ts +2 -0
  852. package/dist/targets/cpp/emit-owned-record.js +15 -0
  853. package/dist/targets/cpp/emit-presence.d.ts +78 -0
  854. package/dist/targets/cpp/emit-presence.js +376 -0
  855. package/dist/targets/cpp/emit-properties.d.ts +105 -0
  856. package/dist/targets/cpp/emit-properties.js +1640 -0
  857. package/dist/targets/cpp/emit-record-view.d.ts +20 -0
  858. package/dist/targets/cpp/emit-record-view.js +354 -0
  859. package/dist/targets/cpp/emit-return.d.ts +5 -0
  860. package/dist/targets/cpp/emit-return.js +237 -0
  861. package/dist/targets/cpp/emit-sum-widening.d.ts +10 -0
  862. package/dist/targets/cpp/emit-sum-widening.js +69 -0
  863. package/dist/targets/cpp/emit-tonumber.d.ts +38 -0
  864. package/dist/targets/cpp/emit-tonumber.js +177 -0
  865. package/dist/targets/cpp/emit-tostring.d.ts +92 -0
  866. package/dist/targets/cpp/emit-tostring.js +556 -0
  867. package/dist/targets/cpp/emit-typeof.d.ts +49 -0
  868. package/dist/targets/cpp/emit-typeof.js +317 -0
  869. package/dist/targets/cpp/emit-union-properties.d.ts +181 -0
  870. package/dist/targets/cpp/emit-union-properties.js +1281 -0
  871. package/dist/targets/cpp/emit.d.ts +45 -0
  872. package/dist/targets/cpp/emit.js +2225 -0
  873. package/dist/targets/cpp/error-types.d.ts +4 -0
  874. package/dist/targets/cpp/error-types.js +11 -0
  875. package/dist/targets/cpp/function-source-reads.d.ts +72 -0
  876. package/dist/targets/cpp/function-source-reads.js +148 -0
  877. package/dist/targets/cpp/host/atomics.d.ts +25 -0
  878. package/dist/targets/cpp/host/atomics.js +63 -0
  879. package/dist/targets/cpp/host/core-globals.d.ts +108 -0
  880. package/dist/targets/cpp/host/core-globals.js +158 -0
  881. package/dist/targets/cpp/host/dynamic-argument-members.d.ts +42 -0
  882. package/dist/targets/cpp/host/dynamic-argument-members.js +61 -0
  883. package/dist/targets/cpp/host/emit-host-arity.d.ts +139 -0
  884. package/dist/targets/cpp/host/emit-host-arity.js +232 -0
  885. package/dist/targets/cpp/host/emit-host-invoke.d.ts +91 -0
  886. package/dist/targets/cpp/host/emit-host-invoke.js +1105 -0
  887. package/dist/targets/cpp/host/emit-host-object.d.ts +55 -0
  888. package/dist/targets/cpp/host/emit-host-object.js +2206 -0
  889. package/dist/targets/cpp/host/emit-host-properties.d.ts +69 -0
  890. package/dist/targets/cpp/host/emit-host-properties.js +533 -0
  891. package/dist/targets/cpp/host/emit-host-reflect.d.ts +4 -0
  892. package/dist/targets/cpp/host/emit-host-reflect.js +180 -0
  893. package/dist/targets/cpp/host/emit-host-value.d.ts +120 -0
  894. package/dist/targets/cpp/host/emit-host-value.js +392 -0
  895. package/dist/targets/cpp/host/host-members.d.ts +505 -0
  896. package/dist/targets/cpp/host/host-members.js +819 -0
  897. package/dist/targets/cpp/host/host-method-aliases.d.ts +30 -0
  898. package/dist/targets/cpp/host/host-method-aliases.js +76 -0
  899. package/dist/targets/cpp/host/native-protocols.d.ts +47 -0
  900. package/dist/targets/cpp/host/native-protocols.js +183 -0
  901. package/dist/targets/cpp/host/object-protocol.d.ts +351 -0
  902. package/dist/targets/cpp/host/object-protocol.js +671 -0
  903. package/dist/targets/cpp/host-namespace-reads.d.ts +83 -0
  904. package/dist/targets/cpp/host-namespace-reads.js +113 -0
  905. package/dist/targets/cpp/manifest/capabilities.d.ts +39 -0
  906. package/dist/targets/cpp/manifest/capabilities.js +1484 -0
  907. package/dist/targets/cpp/manifest.d.ts +23 -0
  908. package/dist/targets/cpp/manifest.js +113 -0
  909. package/dist/targets/cpp/native-error-base.d.ts +38 -0
  910. package/dist/targets/cpp/native-error-base.js +74 -0
  911. package/dist/targets/cpp/native-narrowing-transport.d.ts +12 -0
  912. package/dist/targets/cpp/native-narrowing-transport.js +151 -0
  913. package/dist/targets/cpp/native-selection-helpers.d.ts +11 -0
  914. package/dist/targets/cpp/native-selection-helpers.js +46 -0
  915. package/dist/targets/cpp/native-symbol-keys.d.ts +8 -0
  916. package/dist/targets/cpp/native-symbol-keys.js +34 -0
  917. package/dist/targets/cpp/ownership.d.ts +43 -0
  918. package/dist/targets/cpp/ownership.js +38 -0
  919. package/dist/targets/cpp/owning-conversion-input.d.ts +14 -0
  920. package/dist/targets/cpp/owning-conversion-input.js +12 -0
  921. package/dist/targets/cpp/property-read-claims.d.ts +62 -0
  922. package/dist/targets/cpp/property-read-claims.js +23 -0
  923. package/dist/targets/cpp/property-store-claims.d.ts +62 -0
  924. package/dist/targets/cpp/property-store-claims.js +26 -0
  925. package/dist/targets/cpp/prototype/emit-prototype-array.d.ts +111 -0
  926. package/dist/targets/cpp/prototype/emit-prototype-array.js +602 -0
  927. package/dist/targets/cpp/prototype/emit-prototype-date.d.ts +133 -0
  928. package/dist/targets/cpp/prototype/emit-prototype-date.js +515 -0
  929. package/dist/targets/cpp/prototype/emit-prototype-error.d.ts +13 -0
  930. package/dist/targets/cpp/prototype/emit-prototype-error.js +54 -0
  931. package/dist/targets/cpp/prototype/emit-prototype-invoke.d.ts +34 -0
  932. package/dist/targets/cpp/prototype/emit-prototype-invoke.js +1003 -0
  933. package/dist/targets/cpp/prototype/emit-prototype-iterator.d.ts +47 -0
  934. package/dist/targets/cpp/prototype/emit-prototype-iterator.js +250 -0
  935. package/dist/targets/cpp/prototype/emit-prototype-promise.d.ts +46 -0
  936. package/dist/targets/cpp/prototype/emit-prototype-promise.js +143 -0
  937. package/dist/targets/cpp/prototype/emit-prototype-regexp.d.ts +335 -0
  938. package/dist/targets/cpp/prototype/emit-prototype-regexp.js +853 -0
  939. package/dist/targets/cpp/prototype/emit-prototype-string.d.ts +42 -0
  940. package/dist/targets/cpp/prototype/emit-prototype-string.js +252 -0
  941. package/dist/targets/cpp/prototype/prototype-method-reads.d.ts +25 -0
  942. package/dist/targets/cpp/prototype/prototype-method-reads.js +182 -0
  943. package/dist/targets/cpp/reactive-dependencies.d.ts +140 -0
  944. package/dist/targets/cpp/reactive-dependencies.js +432 -0
  945. package/dist/targets/cpp/reactive-origins.d.ts +44 -0
  946. package/dist/targets/cpp/reactive-origins.js +82 -0
  947. package/dist/targets/cpp/records.d.ts +277 -0
  948. package/dist/targets/cpp/records.js +2427 -0
  949. package/dist/targets/cpp/recursive-containers.d.ts +43 -0
  950. package/dist/targets/cpp/recursive-containers.js +144 -0
  951. package/dist/targets/cpp/regexp-types.d.ts +56 -0
  952. package/dist/targets/cpp/regexp-types.js +59 -0
  953. package/dist/targets/cpp/substrate.d.ts +125 -0
  954. package/dist/targets/cpp/substrate.js +12 -0
  955. package/dist/targets/cpp/translation-unit.d.ts +219 -0
  956. package/dist/targets/cpp/translation-unit.js +2063 -0
  957. package/dist/targets/cpp/types.d.ts +280 -0
  958. package/dist/targets/cpp/types.js +1135 -0
  959. package/dist/targets/cpp/virtual-methods.d.ts +95 -0
  960. package/dist/targets/cpp/virtual-methods.js +264 -0
  961. package/package.json +95 -0
  962. package/src/targets/cpp/runtime/gea_dynamic_proxy.h +824 -0
  963. package/src/targets/cpp/runtime/gea_eval.h +1376 -0
  964. package/src/targets/cpp/runtime/gea_native_class_prototype.h +44 -0
  965. package/src/targets/cpp/runtime/gea_runtime.h +29222 -0
  966. package/src/targets/cpp/runtime/gea_runtime_builtins.cpp +55 -0
@@ -0,0 +1,697 @@
1
+ import { controlFlowGraphOf, dominatorTreeOf, naturalLoopsOf } from './dominance.js';
2
+ import { loopInvariantHoistsOf } from './hoist.js';
3
+ import { borrowSafeOperationsOf } from './borrow-effects.js';
4
+ import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
5
+ export const emptyDenseLoopPlan = { arrays: [], groups: [], accesses: new Map(), lengths: new Map() };
6
+ /**
7
+ * Whether a window's array is one this body can actually dereference: a plain
8
+ * cell needs the target's own storage answer; a value defined before the loop
9
+ * needs nothing (it is simply named); and a ROW needs its own key already
10
+ * settled to a real integer -- an un-narrowed `number` key is not an element
11
+ * access at all (`ir/integers.ts`) -- on top of the same question for the
12
+ * array it is a row of.
13
+ */
14
+ const referenceIsAdmitted = (reference, integerValues, admitsCell) => {
15
+ if (reference.kind === 'cell')
16
+ return admitsCell(reference.declaration);
17
+ if (reference.kind === 'value')
18
+ return true;
19
+ return integerValues.has(reference.key.value) && referenceIsAdmitted(reference.holder, integerValues, admitsCell);
20
+ };
21
+ /**
22
+ * Narrows `denseLoopsOf`'s raw plan to the windows this body may actually
23
+ * render.
24
+ *
25
+ * A window not admitted here is never a refusal: the array still renders
26
+ * through the ordinary indexed path, which is always correct, and this only
27
+ * decides which windows get the additional fast one. Three things a plan
28
+ * built from the IR alone cannot settle are decided here, and only the first
29
+ * is about this backend's own storage rather than about the program:
30
+ *
31
+ * - whether this body already has a plain name for the cells a window
32
+ * reaches through (`admitsCell`);
33
+ * - whether the integer census narrowed every index a window's accesses
34
+ * read -- an un-narrowed `number` key is not an element access at all --
35
+ * except a WRAPPED window, which is exempt: its own admission already
36
+ * proves the array non-empty and hole-free (`DenseArray.wrapped`), so a
37
+ * remainder by that length or by a literal modulus needs no narrowed index
38
+ * to be a real one; one un-narrowed access anywhere in an ordinary window
39
+ * takes the WHOLE window down, since every access shares the one pointer
40
+ * the narrowing proof is about;
41
+ * - and, once the two above have dropped some accesses, whether anything is
42
+ * left of a window at all: an array with no surviving access has no
43
+ * pointer worth materializing, and a flag chain with no claimed window
44
+ * below it has nothing to compute either -- a flag ands its enclosing
45
+ * loop's, so every group on a claimed window's chain has to exist even
46
+ * when nothing indexes anything in that loop, and no group outside that
47
+ * chain is needed at all.
48
+ */
49
+ export const admittedDenseLoopPlanOf = (plan, integerValues, admitsCell) => {
50
+ if (plan.arrays.length === 0)
51
+ return { arrays: [], groups: new Map(), accesses: new Map(), lengths: new Map() };
52
+ const admitted = new Set(plan.arrays
53
+ .filter((array) => admitsCell(array.counter) && referenceIsAdmitted(array.reference, integerValues, admitsCell))
54
+ .map((array) => array.ordinal));
55
+ for (const [operation, access] of plan.accesses) {
56
+ const array = plan.arrays[access.array];
57
+ if (operation.kind !== 'get' && operation.kind !== 'set')
58
+ admitted.delete(access.array);
59
+ else if (!array?.wrapped && array?.typed === null && !integerValues.has(operation.key.value))
60
+ admitted.delete(access.array);
61
+ }
62
+ const accesses = new Map();
63
+ const claimed = new Set();
64
+ for (const [operation, access] of plan.accesses) {
65
+ if (!admitted.has(access.array))
66
+ continue;
67
+ accesses.set(operation, access);
68
+ claimed.add(access.array);
69
+ }
70
+ const arrays = plan.arrays.filter((array) => claimed.has(array.ordinal));
71
+ const lengths = new Map([...plan.lengths].filter(([, ordinal]) => claimed.has(ordinal)));
72
+ const groups = new Map();
73
+ for (const array of arrays)
74
+ for (const access of accesses.values()) {
75
+ if (access.array !== array.ordinal)
76
+ continue;
77
+ for (let at = access.flag; at !== null;) {
78
+ const group = plan.groups[at];
79
+ if (!group || groups.has(at))
80
+ break;
81
+ groups.set(at, group);
82
+ at = group.parent;
83
+ }
84
+ }
85
+ return { arrays, groups, accesses, lengths };
86
+ };
87
+ export const denseLoopsOf = (body) => {
88
+ // A try region renders as one assembled chunk, so a preheader inside one has
89
+ // no single place for the setup to land -- the same restriction `hoist.ts`
90
+ // takes, and for the same reason.
91
+ if (body.tryRegions.length > 0 || (body.iteratorCloseRegions?.length ?? 0) > 0)
92
+ return emptyDenseLoopPlan;
93
+ const graph = controlFlowGraphOf(body);
94
+ const dominance = dominatorTreeOf(body);
95
+ const loops = naturalLoopsOf(graph, dominance);
96
+ if (loops.length === 0)
97
+ return emptyDenseLoopPlan;
98
+ const location = new Map();
99
+ const operationOf = new Map();
100
+ const readsCell = new Map();
101
+ const constantTexts = new Map();
102
+ const cellWrites = new Map();
103
+ const usesOf = new Map();
104
+ const blockOfOperation = new Map();
105
+ for (const blockId of body.blockOrder) {
106
+ const block = body.blocks.get(blockId);
107
+ if (!block)
108
+ continue;
109
+ for (const operation of block.operations) {
110
+ blockOfOperation.set(operation, blockId);
111
+ const result = 'result' in operation ? operation.result : null;
112
+ if (result) {
113
+ location.set(result.id, blockId);
114
+ operationOf.set(result.id, operation);
115
+ }
116
+ if (operation.kind === 'constant')
117
+ constantTexts.set(operation.result.id, operation.text);
118
+ if (operation.kind === 'binding-read')
119
+ readsCell.set(operation.result.id, operation.declaration);
120
+ if (operation.kind === 'binding-write') {
121
+ const written = cellWrites.get(operation.declaration) ?? [];
122
+ written.push({ value: operation.value, block: blockId });
123
+ cellWrites.set(operation.declaration, written);
124
+ }
125
+ for (const operand of operandsOfIrOperation(operation)) {
126
+ const sites = usesOf.get(operand.value) ?? [];
127
+ sites.push({ operation, block: blockId });
128
+ usesOf.set(operand.value, sites);
129
+ }
130
+ }
131
+ // A terminator's own operand is a use like any other: an array named by a
132
+ // branch condition is an array this window cannot account for.
133
+ const terminator = block.terminator;
134
+ if (terminator.kind === 'branch') {
135
+ const sites = usesOf.get(terminator.condition.value) ?? [];
136
+ usesOf.set(terminator.condition.value, sites);
137
+ }
138
+ }
139
+ // A value the emitter HOISTS is defined where the hoist puts it, not where
140
+ // the IR wrote it: `i * N` and the row load `a[i]` both live in the inner
141
+ // loop's own body until `ir/hoist.ts` moves them to its preheader, and asking
142
+ // the raw IR where they are answers "inside the loop" for every one of them.
143
+ // `emitBody` runs the same plan, and renders it before this setup.
144
+ for (const [blockId, operations] of loopInvariantHoistsOf(body).into)
145
+ for (const operation of operations) {
146
+ blockOfOperation.set(operation, blockId);
147
+ const result = resultOfIrOperation(operation);
148
+ if (result)
149
+ location.set(result.id, blockId);
150
+ }
151
+ const arrays = [];
152
+ const accesses = new Map();
153
+ const groups = [];
154
+ const definedOutside = (value, blocks) => {
155
+ const where = location.get(value);
156
+ return where === undefined || !blocks.has(where);
157
+ };
158
+ // A value the preheader may NAME: defined before the loop, so it is both
159
+ // unchanged by the loop (SSA) and already assigned where the setup renders.
160
+ // A cell the loop never writes is not enough -- the READ of it can be one of
161
+ // the loop's own operations, and naming that value in the preheader emits a
162
+ // use of a variable no statement has assigned yet.
163
+ const found = loops.map((loop) => loopWindowsOf(loop, body, graph, loops, {
164
+ body,
165
+ values: body.values,
166
+ readsCell,
167
+ constantTexts,
168
+ cellWrites,
169
+ usesOf,
170
+ operationOf,
171
+ definedOutside
172
+ }));
173
+ const groupOfLoop = new Map();
174
+ for (const [index, loop] of found.entries()) {
175
+ if (loop === null)
176
+ continue;
177
+ // Innermost-first, so an inner loop is numbered before the outer one it
178
+ // ands: the ordinals are identities, not an emission order.
179
+ groupOfLoop.set(index, groups.length);
180
+ groups.push({ ordinal: groups.length, parent: null, preheader: loop.preheader });
181
+ }
182
+ for (const [index, group] of groupOfLoop) {
183
+ const inner = loops[index];
184
+ if (!inner)
185
+ continue;
186
+ const enclosing = loops.findIndex((outer, at) => at !== index && outer.blocks.has(inner.header) && groupOfLoop.has(at));
187
+ const parent = enclosing < 0 ? null : (groupOfLoop.get(enclosing) ?? null);
188
+ groups[group] = { ordinal: group, parent, preheader: groups[group]?.preheader ?? inner.header };
189
+ }
190
+ /** The flag an access renders behind: the innermost enclosing loop that has one. */
191
+ const flagAt = (blockId) => {
192
+ for (const [index, loop] of loops.entries()) {
193
+ if (!loop.blocks.has(blockId))
194
+ continue;
195
+ const group = groupOfLoop.get(index);
196
+ if (group !== undefined)
197
+ return group;
198
+ }
199
+ return null;
200
+ };
201
+ const blocksOfArray = new Map();
202
+ for (const [index, loop] of found.entries()) {
203
+ const group = groupOfLoop.get(index);
204
+ if (loop === null || group === undefined)
205
+ continue;
206
+ for (const candidate of loop.candidates) {
207
+ const ordinal = arrays.length;
208
+ const blocks = loops[index]?.blocks;
209
+ if (blocks)
210
+ blocksOfArray.set(ordinal, blocks);
211
+ arrays.push({
212
+ ordinal,
213
+ group,
214
+ reference: candidate.reference,
215
+ element: candidate.element,
216
+ typed: candidate.typed,
217
+ preheader: loop.preheader,
218
+ wrapped: candidate.wrapped,
219
+ modulus: candidate.modulus,
220
+ bases: candidate.bases,
221
+ counter: loop.counter,
222
+ bound: loop.bound,
223
+ inclusive: loop.inclusive,
224
+ step: loop.step,
225
+ widened: loop.widened
226
+ });
227
+ for (const operation of candidate.operations) {
228
+ const flag = flagAt(blockOfOperation.get(operation) ?? loop.preheader);
229
+ if (flag === null)
230
+ continue;
231
+ accesses.set(operation, { array: ordinal, flag });
232
+ }
233
+ }
234
+ }
235
+ // A window whose array is reached THROUGH one (`grid[i]`) names it behind a
236
+ // null check, and the preheader has no unconditional place to read a length.
237
+ // A read the loop does not contain is already outside it -- and substituting
238
+ // the preheader's name for one that renders BEFORE the preheader would name a
239
+ // variable no statement has assigned yet, so `location` (which the hoist pass
240
+ // updates) is what decides membership, not the block the IR wrote it in.
241
+ const lengths = new Map();
242
+ for (const array of arrays) {
243
+ // A constant modulus has no length to hoist: the divisor is already in the
244
+ // emitted text, and `gea::Divisor`'s prepared reciprocal answers a question
245
+ // a literal never asks.
246
+ if (!array.wrapped || array.modulus !== null || array.reference.kind === 'element')
247
+ continue;
248
+ const blocks = blocksOfArray.get(array.ordinal);
249
+ if (!blocks)
250
+ continue;
251
+ const cell = array.reference.kind === 'cell' ? array.reference.declaration : null;
252
+ const held = array.reference.kind === 'value' ? array.reference.operand.value : null;
253
+ for (const [result, operation] of operationOf) {
254
+ if (operation.kind !== 'get' || constantTexts.get(operation.key.value) !== 'length')
255
+ continue;
256
+ // The re-check every sibling `'length'` site in this file keeps
257
+ // (line ~560, ~610, `wrapsOwnLength` above) and this one omitted: a
258
+ // `get` whose key merely RENDERS as the text "length" says nothing on
259
+ // its own about what kind of receiver it reads. The receiver-identity
260
+ // test below (`readsCell.get(receiver) === cell` / `receiver === held`)
261
+ // already only matches a value this loop's own `arrays` census settled
262
+ // as `array-object` -- `array.reference` is never anything else once
263
+ // `wrapped` is true -- so this is a defensive restatement of a fact
264
+ // already implied, not a new refusal; kept for the same reason the
265
+ // siblings state it locally rather than leaving it to be re-derived
266
+ // from a different function's invariant.
267
+ if (operation.receiver.representation.kind !== 'array-object')
268
+ continue;
269
+ const where = location.get(result);
270
+ if (where === undefined || !blocks.has(where))
271
+ continue;
272
+ const receiver = operation.receiver.value;
273
+ if (cell !== null ? readsCell.get(receiver) === cell : receiver === held)
274
+ lengths.set(result, array.ordinal);
275
+ }
276
+ }
277
+ return { arrays, groups, accesses, lengths };
278
+ };
279
+ const loopWindowsOf = (loop, body, graph, loops, context) => {
280
+ const outside = (graph.predecessors.get(loop.header) ?? []).filter((predecessor) => !loop.blocks.has(predecessor));
281
+ const preheader = outside.length === 1 ? outside[0] : undefined;
282
+ if (preheader === undefined)
283
+ return null;
284
+ const header = body.blocks.get(loop.header);
285
+ if (header?.terminator.kind !== 'branch')
286
+ return null;
287
+ const test = context.operationOf.get(header.terminator.condition.value);
288
+ if (test?.kind !== 'compute' || test.form !== 'binary')
289
+ return null;
290
+ if (test.operator !== '<' && test.operator !== '<=')
291
+ return null;
292
+ const [left, right] = test.operands;
293
+ if (!left || !right)
294
+ return null;
295
+ const counter = context.readsCell.get(left.value);
296
+ if (counter === undefined || !context.definedOutside(right.value, loop.blocks))
297
+ return null;
298
+ // Exactly one advance, by an amount the preheader can name. Several
299
+ // advances, or a step the loop itself computes, and "the counter never
300
+ // exceeds the bound" stops being something the preheader can check.
301
+ const steps = (context.cellWrites.get(counter) ?? []).filter((write) => loop.blocks.has(write.block));
302
+ const advance = steps.length === 1 ? steps[0] : undefined;
303
+ if (!advance)
304
+ return null;
305
+ // ...and reached at most once per turn. A write inside an INNER loop runs an
306
+ // unknown number of times per turn of this one, and then no arithmetic on
307
+ // this loop's own bound says where the counter got to. Structured TypeScript
308
+ // compiles to reducible control flow, so every cycle within this loop is one
309
+ // of `loops`.
310
+ if (loops.some((inner) => inner.header !== loop.header && inner.blocks.has(advance.block) && loop.blocks.has(inner.header)))
311
+ return null;
312
+ const step = stepOf(advance.value, counter, context.operationOf, context.readsCell);
313
+ if (step === undefined)
314
+ return null;
315
+ if (step !== null && !context.definedOutside(step.value, loop.blocks))
316
+ return null;
317
+ const candidates = windowsOfLoop(loop.blocks, body, { ...context, counter });
318
+ if (candidates.length === 0)
319
+ return null;
320
+ return {
321
+ preheader,
322
+ counter,
323
+ bound: right,
324
+ inclusive: test.operator === '<=',
325
+ step,
326
+ widened: advanceReachesAnAccess(loop, body, graph, advance.block, counter),
327
+ candidates
328
+ };
329
+ };
330
+ /**
331
+ * Whether an element access can run after this turn's advance of the counter.
332
+ *
333
+ * True only when the body can reach an access from the counter's own write
334
+ * without going back through the header -- which a `for` loop's latch, whose
335
+ * one successor IS the header, never does.
336
+ */
337
+ const advanceReachesAnAccess = (loop, body, graph, advanceBlock, counter) => {
338
+ const after = new Set();
339
+ const pending = (graph.successors.get(advanceBlock) ?? []).filter((next) => loop.blocks.has(next) && next !== loop.header);
340
+ while (pending.length > 0) {
341
+ const blockId = pending.pop();
342
+ if (blockId === undefined || after.has(blockId))
343
+ continue;
344
+ after.add(blockId);
345
+ for (const next of graph.successors.get(blockId) ?? [])
346
+ if (loop.blocks.has(next) && next !== loop.header)
347
+ pending.push(next);
348
+ }
349
+ for (const blockId of after) {
350
+ const block = body.blocks.get(blockId);
351
+ if (block?.operations.some((operation) => operation.kind === 'get' || operation.kind === 'set'))
352
+ return true;
353
+ }
354
+ const written = body.blocks.get(advanceBlock)?.operations ?? [];
355
+ const at = written.findIndex((operation) => operation.kind === 'binding-write' && operation.declaration === counter);
356
+ return at >= 0 && written.slice(at + 1).some((operation) => operation.kind === 'get' || operation.kind === 'set');
357
+ };
358
+ /** `counter + s` / `counter++`: the amount one turn adds, or `undefined` when the write is not an advance. */
359
+ const stepOf = (written, counter, operationOf, readsCell) => {
360
+ const compute = operationOf.get(written.value);
361
+ if (compute?.kind !== 'compute')
362
+ return undefined;
363
+ if (compute.form === 'update') {
364
+ const target = compute.operands[0];
365
+ return target && readsCell.get(target.value) === counter && compute.operator === '++' ? null : undefined;
366
+ }
367
+ if (compute.form !== 'binary' || compute.operator !== '+')
368
+ return undefined;
369
+ const [left, right] = compute.operands;
370
+ if (!left || !right)
371
+ return undefined;
372
+ if (readsCell.get(left.value) === counter)
373
+ return right;
374
+ if (readsCell.get(right.value) === counter)
375
+ return left;
376
+ return undefined;
377
+ };
378
+ /** One window's identity, so two accesses to the same array in one loop meet. */
379
+ const referenceKey = (reference) => reference.kind === 'cell'
380
+ ? `cell:${reference.declaration}`
381
+ : reference.kind === 'value'
382
+ ? `value:${reference.operand.value}`
383
+ : `element:${referenceKey(reference.holder)}:${reference.key.value}`;
384
+ /** Every in-loop site that names the storage this reference stands for. */
385
+ const usesOfReference = (reference, context) => {
386
+ if (reference.kind === 'cell')
387
+ return [...context.usesOf.entries()]
388
+ .filter(([value]) => context.readsCell.get(value) === reference.declaration)
389
+ .flatMap(([, sites]) => sites);
390
+ const operand = reference.kind === 'value' ? reference.operand : reference.operand;
391
+ return context.usesOf.get(operand.value) ?? [];
392
+ };
393
+ /**
394
+ * The array one access reaches, as something the preheader can name.
395
+ *
396
+ * A cell the loop never writes, a value defined before the loop, or -- one
397
+ * level in -- a row loaded from one of those by a loop-invariant index.
398
+ */
399
+ const heldArrayOf = (receiver, context, blocks) => {
400
+ const cell = context.readsCell.get(receiver.value);
401
+ if (cell !== undefined) {
402
+ if (!(context.cellWrites.get(cell) ?? []).every((write) => !blocks.has(write.block)))
403
+ return null;
404
+ const reference = { kind: 'cell', declaration: cell, representation: receiver.representation };
405
+ return { reference, watch: [reference], excused: [] };
406
+ }
407
+ if (context.definedOutside(receiver.value, blocks)) {
408
+ const reference = {
409
+ kind: 'value',
410
+ operand: receiver,
411
+ storage: context.values.get(receiver.value) ?? receiver.representation
412
+ };
413
+ return { reference, watch: [reference], excused: [] };
414
+ }
415
+ const load = context.operationOf.get(receiver.value);
416
+ if (load?.kind !== 'get' || load.receiver.representation.kind !== 'array-object')
417
+ return null;
418
+ if (!context.definedOutside(load.key.value, blocks))
419
+ return null;
420
+ const holder = heldArrayOf(load.receiver, context, blocks);
421
+ // One level only: a row of a row would need the preheader to unpack two
422
+ // loads behind two conditions, and nothing in the corpus asks for it.
423
+ if (holder === null || holder.reference.kind === 'element')
424
+ return null;
425
+ const reference = { kind: 'element', holder: holder.reference, key: load.key, operand: receiver };
426
+ return { reference, watch: [reference, holder.reference], excused: [load] };
427
+ };
428
+ /**
429
+ * The arrays this loop touches only through counter-indexed element accesses.
430
+ *
431
+ * Grouped by the array's own identity -- the CELL, not the read: every turn of
432
+ * the loop reads the cell again, so asking where the receiver VALUE was defined
433
+ * answers "inside the loop" for an array the loop plainly never changes.
434
+ */
435
+ const windowsOfLoop = (blocks, body, context) => {
436
+ const byReference = new Map();
437
+ const nativeOperations = borrowSafeOperationsOf(body);
438
+ // No pointer may outlive a callback that can replace/detach its storage.
439
+ // Numeric typed-array writes alias bytes but cannot invalidate geometry.
440
+ const nativeOnly = [...blocks].every((id) => body.blocks.get(id)?.operations.every((operation) => nativeOperations.has(operation)));
441
+ const noteUnsound = (key) => {
442
+ const found = byReference.get(key);
443
+ if (found)
444
+ found.sound = false;
445
+ };
446
+ for (const blockId of body.blockOrder) {
447
+ if (!blocks.has(blockId))
448
+ continue;
449
+ const block = body.blocks.get(blockId);
450
+ if (!block)
451
+ continue;
452
+ for (const operation of block.operations) {
453
+ if (operation.kind !== 'get' && operation.kind !== 'set')
454
+ continue;
455
+ const receiver = operation.receiver;
456
+ if (receiver.representation.kind !== 'array-object' && receiver.representation.kind !== 'typed-array')
457
+ continue;
458
+ // Dense typed-array windows lower to a cached raw T* and static
459
+ // readInBounds/writeInBounds calls. A SharedArrayBuffer view must route
460
+ // every ordinary access through its backing-store synchronization so it
461
+ // cannot race Atomics or an overlapping view.
462
+ if (receiver.representation.kind === 'typed-array' && receiver.representation.buffer === 'shared-array-buffer')
463
+ continue;
464
+ const typed = receiver.representation.kind === 'typed-array' ? receiver.representation.element : null;
465
+ if (typed !== null && !nativeOnly)
466
+ continue;
467
+ const element = receiver.representation.kind === 'array-object' ? receiver.representation.element : { kind: 'scalar', domain: 'number' };
468
+ // `a.length` is a `get` on an array like any element read, and it is the
469
+ // one that is not an ELEMENT access: it has no index to bound, so asking
470
+ // for one answers "cannot bound this" and takes the window down with it.
471
+ if (operation.kind === 'get' && context.constantTexts.get(operation.key.value) === 'length')
472
+ continue;
473
+ const held = heldArrayOf(receiver, context, blocks);
474
+ if (held === null)
475
+ continue;
476
+ const key = referenceKey(held.reference);
477
+ // The array's own length first: an index bounded by the length it is
478
+ // taken modulo needs no number carried to the preheader, and a program
479
+ // that spells both is better served by the shape that checks less.
480
+ const ownLength = wrapsOwnLength(operation.key, receiver, context);
481
+ const modulus = ownLength ? null : constantModulusOf(operation.key, context, block.operations, block.operations.indexOf(operation));
482
+ const wrapped = ownLength || modulus !== null;
483
+ if (typed !== null && (wrapped || held.reference.kind === 'element'))
484
+ continue;
485
+ const base = wrapped ? null : indexBaseOf(operation.key, context, blocks);
486
+ const found = byReference.get(key);
487
+ if (base === undefined) {
488
+ if (found)
489
+ found.sound = false;
490
+ else
491
+ byReference.set(key, { ...held, element, typed, wrapped, modulus, bases: [], operations: [], sound: false });
492
+ continue;
493
+ }
494
+ if (!found) {
495
+ byReference.set(key, { ...held, element, typed, wrapped, modulus, bases: [base], operations: [operation], sound: true });
496
+ continue;
497
+ }
498
+ // Different addends each contribute a range check to the one cumulative
499
+ // preheader flag. Selecting only one would leave the others unchecked.
500
+ // Wrapped and ordinary accesses still need different geometry proofs.
501
+ // Two constant moduli in one window would need the LARGER checked at the
502
+ // preheader, and taking the larger of a pair says nothing about a third
503
+ // that arrives later. Widening the window is a change of proof, not of
504
+ // bookkeeping, so a second modulus takes the window down exactly as a
505
+ // second base does.
506
+ if (found.wrapped !== wrapped || found.modulus !== modulus)
507
+ found.sound = false;
508
+ else {
509
+ if (!found.bases.some((known) => (known?.value ?? null) === (base?.value ?? null)))
510
+ found.bases.push(base);
511
+ found.operations.push(operation);
512
+ }
513
+ }
514
+ }
515
+ // Every OTHER use of the array inside the loop disqualifies the window: a
516
+ // `push`, a call taking it, a store of it somewhere else -- each one can
517
+ // resize the storage the pointer names, and none of them is something a
518
+ // bound on the INDEX says anything about.
519
+ for (const [key, window] of byReference) {
520
+ if (!window.sound)
521
+ continue;
522
+ for (const held of window.watch)
523
+ for (const site of usesOfReference(held, context)) {
524
+ if (!blocks.has(site.block))
525
+ continue;
526
+ if (window.operations.includes(site.operation) || window.excused.includes(site.operation))
527
+ continue;
528
+ // A read of the array's own `length` is not a use of the STORAGE: it
529
+ // cannot resize anything, and it is exactly what a wrapped window's
530
+ // index is computed from -- so counting it would make the one shape
531
+ // that needs it impossible to admit.
532
+ if (site.operation.kind === 'get' && context.constantTexts.get(site.operation.key.value) === 'length')
533
+ continue;
534
+ noteUnsound(key);
535
+ }
536
+ }
537
+ return [...byReference.values()].filter((window) => window.sound && window.operations.length > 0);
538
+ };
539
+ /**
540
+ * Whether an index is a REMAINDER by this very array's `length`.
541
+ *
542
+ * `x % a.length` is in `[0, a.length)` for every dividend, so an access keyed
543
+ * by one needs no bound of its own -- which is the whole point, because the
544
+ * bound is what a per-access size read would cost. The receiver of the length
545
+ * read has to be the SAME value the access itself indexes: `a[x % b.length]`
546
+ * proves nothing about `a`.
547
+ *
548
+ * The zero-length case is the one the arithmetic does not cover -- `x % 0` is
549
+ * NaN, which is no index at all -- and it is the preheader's `size() > 0` that
550
+ * rules it out, not this.
551
+ */
552
+ const wrapsOwnLength = (key, receiver, context) => {
553
+ const compute = context.operationOf.get(key.value);
554
+ if (compute?.kind !== 'compute' || compute.form !== 'binary' || compute.operator !== '%')
555
+ return false;
556
+ const divisor = compute.operands[1];
557
+ if (!divisor)
558
+ return false;
559
+ const read = context.operationOf.get(divisor.value);
560
+ if (read?.kind !== 'get' || context.constantTexts.get(read.key.value) !== 'length')
561
+ return false;
562
+ if (read.receiver.representation.kind !== 'array-object')
563
+ return false;
564
+ // The same ARRAY, which is not the same SSA value: every turn of the loop
565
+ // reads the cell again, so `ring.length` and `ring[...]` name two different
566
+ // values of one cell. Comparing the cell is what the window is grouped by
567
+ // anyway (`referenceKey`), and the window already requires that the loop
568
+ // never writes it.
569
+ const own = context.readsCell.get(receiver.value);
570
+ const divisorCell = context.readsCell.get(read.receiver.value);
571
+ return read.receiver.value === receiver.value || (own !== undefined && own === divisorCell);
572
+ };
573
+ /**
574
+ * The positive integer an index is taken modulo, when the divisor is a
575
+ * CONSTANT -- `table[i % 16]`.
576
+ *
577
+ * The same arithmetic `wrapsOwnLength` relies on: `x % n` lies in `[0, n)` for
578
+ * every dividend whenever `n > 0`. What this does NOT prove is that `n` is
579
+ * inside the array, because a constant says nothing about a length; the
580
+ * preheader's `size() >= n` is what closes that, and `DenseArray.modulus`
581
+ * carries the number there.
582
+ *
583
+ * Rejects anything that is not a plain positive integer literal. A fractional
584
+ * or negative divisor is not a modulus a window can be proved from, and a text
585
+ * this cannot read is simply not one of these.
586
+ */
587
+ const constantModulusOf = (key, context, operations, at) => {
588
+ const compute = remainderBehind(key, context, operations, at);
589
+ if (compute?.kind !== 'compute' || compute.form !== 'binary' || compute.operator !== '%')
590
+ return null;
591
+ const divisor = compute.operands[1];
592
+ if (!divisor)
593
+ return null;
594
+ const text = context.constantTexts.get(divisor.value);
595
+ if (text === undefined)
596
+ return null;
597
+ const value = Number(text);
598
+ if (!Number.isSafeInteger(value) || value <= 0)
599
+ return null;
600
+ return value;
601
+ };
602
+ /**
603
+ * Where an index's value was computed, seeing through a binding.
604
+ *
605
+ * `const slot = i % 16; table[slot] = v; return table[(slot + 1) % 16]` writes
606
+ * the remainder into a cell and indexes with a READ of it, so the store's key
607
+ * is a `binding-read` and the load's key is the `%` itself. Asking only the
608
+ * operation the key names would make those two accesses disagree about the
609
+ * window's shape, and a window whose accesses disagree is no window -- which is
610
+ * how the two halves of an ordinary table update came to prove nothing.
611
+ *
612
+ * The write it resolves to is the LAST one this block made before the access,
613
+ * which is the definition the read observes: within a block, operations run in
614
+ * order and a binding is the only thing that writes a binding. It deliberately
615
+ * looks no further -- a write in another block would need dominance, and the
616
+ * shape this exists for puts both in the body it indexes from.
617
+ */
618
+ const remainderBehind = (key, context, operations, at) => {
619
+ const direct = context.operationOf.get(key.value);
620
+ if (direct?.kind === 'compute')
621
+ return direct;
622
+ const cell = context.readsCell.get(key.value);
623
+ if (cell === undefined)
624
+ return undefined;
625
+ let seen;
626
+ for (let index = 0; index < at; index += 1) {
627
+ const candidate = operations[index];
628
+ if (candidate?.kind === 'binding-write' && candidate.declaration === cell)
629
+ seen = context.operationOf.get(candidate.value.value);
630
+ }
631
+ return seen;
632
+ };
633
+ /**
634
+ * The loop-invariant addend an index carries, `null` for the bare counter, and
635
+ * `undefined` for an index this cannot bound.
636
+ */
637
+ const indexBaseOf = (key, context, blocks) => {
638
+ if (context.readsCell.get(key.value) === context.counter)
639
+ return null;
640
+ const parallel = parallelCounterBaseOf(key, context, blocks);
641
+ if (parallel !== undefined)
642
+ return parallel;
643
+ const compute = context.operationOf.get(key.value);
644
+ if (compute?.kind !== 'compute' || compute.form !== 'binary' || compute.operator !== '+')
645
+ return undefined;
646
+ const [left, right] = compute.operands;
647
+ if (!left || !right)
648
+ return undefined;
649
+ if (context.readsCell.get(left.value) === context.counter && context.definedOutside(right.value, blocks))
650
+ return right;
651
+ if (context.readsCell.get(right.value) === context.counter && context.definedOutside(left.value, blocks))
652
+ return left;
653
+ return undefined;
654
+ };
655
+ /** Two counters advanced together by one differ by their initial offset.
656
+ * Requiring a zero primary seed and adjacent advances avoids synthesizing
657
+ * arithmetic or assuming that a conditional/inner-loop advance ran. */
658
+ const parallelCounterBaseOf = (key, context, blocks) => {
659
+ const secondary = context.readsCell.get(key.value);
660
+ if (secondary === undefined || secondary === context.counter)
661
+ return undefined;
662
+ const primaryWrites = context.cellWrites.get(context.counter) ?? [];
663
+ const secondaryWrites = context.cellWrites.get(secondary) ?? [];
664
+ const primarySeeds = primaryWrites.filter((write) => !blocks.has(write.block));
665
+ const secondarySeeds = secondaryWrites.filter((write) => !blocks.has(write.block));
666
+ const primarySteps = primaryWrites.filter((write) => blocks.has(write.block));
667
+ const secondarySteps = secondaryWrites.filter((write) => blocks.has(write.block));
668
+ const isLiteral = (value, text) => {
669
+ const operation = context.operationOf.get(value.value);
670
+ return operation?.kind === 'constant' && operation.literal === 'number' && operation.text === text;
671
+ };
672
+ if (primarySeeds.length === 0 || !primarySeeds.every((seed) => isLiteral(seed.value, '0')))
673
+ return undefined;
674
+ if (secondarySeeds.length !== 1 || primarySteps.length !== 1 || secondarySteps.length !== 1)
675
+ return undefined;
676
+ const seed = secondarySeeds[0];
677
+ const primary = primarySteps[0];
678
+ const other = secondarySteps[0];
679
+ if (primary.block !== other.block || !context.definedOutside(seed.value.value, blocks))
680
+ return undefined;
681
+ const unitStep = (value, cell) => {
682
+ const step = stepOf(value, cell, context.operationOf, context.readsCell);
683
+ return step === null || (step !== undefined && isLiteral(step, '1'));
684
+ };
685
+ if (!unitStep(primary.value, context.counter) || !unitStep(other.value, secondary))
686
+ return undefined;
687
+ const operations = context.body.blocks.get(primary.block)?.operations ?? [];
688
+ const first = operations.findIndex((operation) => operation.kind === 'binding-write' && operation.declaration === context.counter);
689
+ const second = operations.findIndex((operation) => operation.kind === 'binding-write' && operation.declaration === secondary);
690
+ if (first < 0 || second < 0)
691
+ return undefined;
692
+ if (operations
693
+ .slice(Math.min(first, second) + 1, Math.max(first, second))
694
+ .some((operation) => operation.kind === 'get' || operation.kind === 'set'))
695
+ return undefined;
696
+ return seed.value;
697
+ };