@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,822 @@
1
+ import { walkRepresentation } from '../representation/model.js';
2
+ import { integerLinearMagnitude, narrowableIntegersOf, widenIntegerMagnitude } from './integers.js';
3
+ import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
4
+ /**
5
+ * A field's identity across the whole program: the struct that declares the
6
+ * member, and the source key.
7
+ *
8
+ * Keyed by struct NAME rather than by shape id because the struct name is what
9
+ * the C++ declaration is spelled from -- a class is `cppClassName`, a record is
10
+ * `cppRecordStructName`, and only the caller knows which. A slot that could not
11
+ * be matched to the member being rendered would narrow every read of it and
12
+ * leave the storage a double.
13
+ */
14
+ export const integerStorageSlot = (structName, key) => `${structName} ${key}`;
15
+ /**
16
+ * One FORMAL's identity across the whole program: the body it belongs to, and
17
+ * its position.
18
+ *
19
+ * A parameter is storage in exactly the sense a field is: one slot, written by
20
+ * every call site and read by the body. `bench/comparison/fixtures/fibonacci.ts`
21
+ * is the whole argument -- its `n` is only ever `40`, `n - 1` and `n - 2`, and
22
+ * the hand-written baseline beside it declares `static long long fib(int n)`.
23
+ * A census that stopped at fields would leave that body doing its compare, its
24
+ * two subtractions and its recursion in doubles.
25
+ *
26
+ * Spelled with a `#` where a field's slot has a space, so the two families of
27
+ * slot share one map without a key of either ever reading as the other.
28
+ */
29
+ export const integerParameterSlot = (owner, ordinal) => `${String(owner)}#${ordinal}`;
30
+ /**
31
+ * A body's RESULT, as one slot the same way its formals are.
32
+ *
33
+ * The half without which narrowing a formal can cost more than it saves: with
34
+ * `tick(n)` computing in a `long long` and still DECLARED to return a double,
35
+ * every call converts on the way out and its caller adds the result to a double
36
+ * -- measured on `bench/comparison/fixtures/method_calls.ts`, that one
37
+ * conversion put the fixture 33% behind where it had been before either half
38
+ * landed. Written by every `return` in the body and read at every call site
39
+ * whose callee this census resolved.
40
+ */
41
+ export const integerResultSlot = (owner) => `${String(owner)}#result`;
42
+ /** The struct half of a slot, for the disqualifications that are struct-wide. Empty for a formal's slot, which no struct owns. */
43
+ const structOfSlot = (slot) => {
44
+ const boundary = slot.indexOf(' ');
45
+ return boundary < 0 ? '' : slot.slice(0, boundary);
46
+ };
47
+ /**
48
+ * The operations that may mention a struct-typed value without becoming a
49
+ * second authority over what its members physically are.
50
+ *
51
+ * Everything here either moves the whole value (a cell, a phi, an argument, an
52
+ * array element), tests it, or is one of the three this census models directly
53
+ * (`get`/`set`/`define-own-property` with a constant key, and
54
+ * `allocate-record`). Every other spelling -- `Object.values` building a
55
+ * `std::vector<double>` out of the members, `own-property-keys`, a spread, an
56
+ * `await` -- reads or writes a member through a type it decided for itself, and
57
+ * a member this census narrowed would silently disagree with it. So the struct
58
+ * is struck instead: the accounting has to be COMPLETE before a slot's writes
59
+ * are a proof rather than a sample.
60
+ */
61
+ const accountedOperations = new Set([
62
+ 'get',
63
+ 'set',
64
+ 'define-own-property',
65
+ 'allocate-record',
66
+ 'allocate-array-object',
67
+ 'binding-read',
68
+ 'binding-write',
69
+ 'phi',
70
+ 'parameter',
71
+ 'receiver',
72
+ 'constant',
73
+ 'compute',
74
+ 'test',
75
+ 'call',
76
+ 'construct',
77
+ 'super-initialize'
78
+ ]);
79
+ /**
80
+ * Operations that move a whole value and never spell one of its members.
81
+ *
82
+ * A JSX slot and a capture list both take the value and put it somewhere this
83
+ * census does not read -- a host element's property, a capture struct -- which
84
+ * is why neither is in `accountedOperations`. For a CLASS carrier that is not a
85
+ * second authority over anything: the carrier is a pointer (`Ref<T>`), the
86
+ * thing at the other end is the one struct this compilation renders, and
87
+ * whatever slot it is moved into is spelled from the same representation. So a
88
+ * class mentioned in one of these positions is accounted for, and it is the
89
+ * difference between narrowing `examples/apps/weather`'s store and striking it
90
+ * -- eleven integer flags, every one of them handed to a `<View>` prop and
91
+ * captured by an effect, and therefore `Signal<double>` on a core with no
92
+ * double FPU.
93
+ *
94
+ * A RECORD in the same position is a different question and stays struck: a
95
+ * host reads a `style={{...}}` record's members through the type IT declares,
96
+ * which is exactly the second authority `excludedStructs` exists for.
97
+ */
98
+ const wholeValueMoves = new Set(['element-prop', 'element-child', 'allocate-callable', 'allocate-constructor']);
99
+ /**
100
+ * The Array, Map and Set methods that move their element arguments WHOLE and
101
+ * never spell one of the element's members.
102
+ *
103
+ * A call the census cannot attribute to a body strikes the struct of every
104
+ * operand, because an unknown callee could read or write a member through a
105
+ * type it chose itself. A container method is not unknown: `push` copies the
106
+ * record into a cell, `get` copies it back out, `forEach` hands it whole to a
107
+ * program callback (whose own body the census reads, and whose escape the
108
+ * operand walk records). Without this list `ring.push({x, y, z})` alone kept
109
+ * `object_create`'s three members doubles.
110
+ *
111
+ * Deliberately NOT here: anything that reads members through a conversion of
112
+ * its own -- `join`, `toString`, `toLocaleString`, and `sort` without a
113
+ * comparator (which compares by ToString) -- and every method of a
114
+ * non-container host (`Object.values`, `JSON.stringify`, `console.log`
115
+ * reach their argument's members through the dynamic protocol, which is the
116
+ * box accounting's business, not this list's).
117
+ */
118
+ const wholeElementMethods = new Set([
119
+ 'push',
120
+ 'pop',
121
+ 'shift',
122
+ 'unshift',
123
+ 'splice',
124
+ 'slice',
125
+ 'concat',
126
+ 'fill',
127
+ 'reverse',
128
+ 'at',
129
+ 'indexOf',
130
+ 'lastIndexOf',
131
+ 'includes',
132
+ 'find',
133
+ 'findIndex',
134
+ 'findLast',
135
+ 'findLastIndex',
136
+ 'some',
137
+ 'every',
138
+ 'forEach',
139
+ 'map',
140
+ 'filter',
141
+ 'reduce',
142
+ 'reduceRight',
143
+ 'flat',
144
+ 'flatMap',
145
+ 'copyWithin',
146
+ 'entries',
147
+ 'keys',
148
+ 'values',
149
+ 'with',
150
+ 'toReversed',
151
+ 'toSpliced',
152
+ 'sort',
153
+ 'get',
154
+ 'set',
155
+ 'has',
156
+ 'add',
157
+ 'delete',
158
+ 'clear'
159
+ ]);
160
+ /**
161
+ * Every carrier that holds something invocable.
162
+ *
163
+ * A formal's slot is only as complete as the set of calls that write it, so a
164
+ * callable this census cannot follow is a call site it cannot see. These are
165
+ * the carriers that hold one; where each is allowed to APPEAR is decided in
166
+ * `scanBody`.
167
+ */
168
+ const callableCarriers = new Set([
169
+ 'function',
170
+ 'function-family',
171
+ 'function-value-family',
172
+ 'function-value-dispatch',
173
+ 'function-and-constructor',
174
+ 'constructor-family',
175
+ 'constructor-value-dispatch'
176
+ ]);
177
+ /**
178
+ * The bodies a callee carrier NAMES, or `null` when the carrier alone does not
179
+ * say.
180
+ *
181
+ * Most direct calls do not have a naming carrier: a module function is a cell
182
+ * whose carrier is `function-value-dispatch`, and it is `buildDirectCallableIndex`
183
+ * -- the same authority the emitter calls the body by name from -- that says
184
+ * which one body that cell holds. So this answers what the representation
185
+ * states, and `scanBody` asks the index for the rest.
186
+ */
187
+ const calleeOwnersOf = (representation) => {
188
+ if (representation.kind === 'function')
189
+ return [String(representation.functionId)];
190
+ if (representation.kind === 'function-family')
191
+ return representation.members.map(String);
192
+ return null;
193
+ };
194
+ const isNumberScalar = (representation) => representation.kind === 'scalar' && representation.domain === 'number';
195
+ const sameMagnitude = (left, right) => {
196
+ if (left === undefined || left.kind !== right.kind)
197
+ return false;
198
+ if (left.kind === 'bounded' && right.kind === 'bounded')
199
+ return left.limit === right.limit;
200
+ return left.kind === 'linear' && right.kind === 'linear' && left.coefficient === right.coefficient;
201
+ };
202
+ /**
203
+ * How far one write steps the slot it reads, when that is all it does.
204
+ *
205
+ * `fib`'s formal is written by `40`, by `n - 1` and by `n - 2`, and the last
206
+ * two READ the slot they write. Derived the ordinary way those two are circular
207
+ * -- the slot's bound is the previous round's bound plus one, which climbs a
208
+ * round at a time and never settles -- and the census would refuse a formal
209
+ * whose whole range is `[0, 40]`. Recognized as a step, they are exactly what
210
+ * `integerLinearMagnitude` already models for a loop counter, and the same
211
+ * argument bounds them.
212
+ */
213
+ const selfStepOf = (scan, slot, value) => {
214
+ const step = scan.steps.get(value);
215
+ if (step === undefined || (step.operator !== '+' && step.operator !== '-'))
216
+ return null;
217
+ if (scan.reads.get(step.left) !== slot && scan.slotCells.get(step.left) !== slot)
218
+ return null;
219
+ const constant = scan.constants.get(step.right);
220
+ return constant === undefined ? null : Math.abs(constant);
221
+ };
222
+ /**
223
+ * Whether one write of a body's OWN result is the sum of two of its own calls.
224
+ *
225
+ * `fib` returns `fib(n - 1) + fib(n - 2)`, and derived the ordinary way that is
226
+ * the same circularity `selfStepOf` was written for, only doubling instead of
227
+ * climbing: the slot's bound is twice the previous round's, so eight rounds
228
+ * multiply it by 256 and it never settles. The census then refuses a result
229
+ * whose whole range is `[0, 2^40]` and `fib` keeps a double.
230
+ *
231
+ * Recognized as a recursion, the bound is the same argument the file already
232
+ * makes for a loop counter. Such a body returns a sum of BASE-case values, one
233
+ * per leaf call, so a result of `M` needs at least `M / B` calls with `B` the
234
+ * base's own bound -- the value grows by at most `B` per call, exactly what
235
+ * `integerLinearMagnitude(B)` means, and the coefficient cap is what refuses a
236
+ * base big enough to reach 2^53 in few enough calls to matter.
237
+ *
238
+ * Only `+`, and deliberately: `f(n - 1) * f(n - 2)` reaches 2^53 in ~53 nested
239
+ * frames, and no argument about call counts bounds it.
240
+ */
241
+ const selfSumOf = (scan, slot, value) => {
242
+ if (`${scan.owner}#result` !== slot)
243
+ return false;
244
+ const sum = scan.steps.get(value);
245
+ if (sum === undefined || sum.operator !== '+')
246
+ return false;
247
+ return scan.reads.get(sum.left) === slot && scan.reads.get(sum.right) === slot;
248
+ };
249
+ const emptyFacts = { reads: new Map(), integral: new Set(), magnitudes: new Map() };
250
+ export const emptyIntegerStorageCensus = { slots: new Set(), factsOf: () => emptyFacts };
251
+ /** How many times each pass may re-derive before it gives up and refuses every slot. */
252
+ const settlingRounds = 8;
253
+ const scanBody = (body, question, disqualified) => {
254
+ const owner = String(body.sourceOwner);
255
+ const constantTexts = new Map();
256
+ const reads = new Map();
257
+ const writes = new Map();
258
+ const steps = new Map();
259
+ const constants = new Map();
260
+ const cellReads = new Map();
261
+ const allocatedCallables = new Map();
262
+ const methodReads = new Map();
263
+ const cellWrites = new Map();
264
+ const slotCells = new Map();
265
+ let returns = null;
266
+ let returnCount = 0;
267
+ let returnsNumber = true;
268
+ const boxedStructs = new Set();
269
+ const boxedSlots = new Set();
270
+ const boxedValues = new Set();
271
+ let boxOpaque = false;
272
+ const escapedCallables = new Set();
273
+ // Two walks: a key is a `constant` operation and nothing orders it before the
274
+ // access that names it, so the texts have to be complete before any access is
275
+ // read.
276
+ //
277
+ // The same pre-pass records what each value was DEFINED as, and the source of
278
+ // every conversion, because a box is asked what it carries and the answer is
279
+ // never at the box itself: a value's carrier at the use site is already the
280
+ // `dynamic` one, and its payload is whatever it was before the conversion.
281
+ const definedRepresentations = new Map();
282
+ const convertSources = new Map();
283
+ for (const blockId of body.blockOrder) {
284
+ for (const operation of body.blocks.get(blockId)?.operations ?? []) {
285
+ const produced = resultOfIrOperation(operation);
286
+ if (produced !== null)
287
+ definedRepresentations.set(produced.id, produced.representation);
288
+ if (operation.kind === 'convert')
289
+ convertSources.set(operation.result.id, operation.source.value);
290
+ if (operation.kind === 'binding-read')
291
+ cellReads.set(operation.result.id, operation.declaration);
292
+ if (operation.kind === 'allocate-callable')
293
+ allocatedCallables.set(operation.result.id, String(operation.functionId));
294
+ if (operation.kind !== 'constant')
295
+ continue;
296
+ constantTexts.set(operation.result.id, operation.text);
297
+ if (operation.literal !== 'number')
298
+ continue;
299
+ const numeric = Number(operation.text);
300
+ if (Number.isFinite(numeric) && Number.isInteger(numeric))
301
+ constants.set(operation.result.id, numeric);
302
+ }
303
+ }
304
+ /**
305
+ * What a boxed value carries, or `null` when this census cannot say.
306
+ *
307
+ * A conversion into the dynamic carrier is followed to its source, because
308
+ * that source's carrier IS the payload -- `throw new Error(...)` boxes a
309
+ * record, and the record is one operand back. A value whose definition is
310
+ * already dynamic and is not a conversion (a member read off a boxed
311
+ * receiver) has no payload anything names, and `null` is the honest answer:
312
+ * `boxOpaque` turns it into a refusal rather than a guess.
313
+ */
314
+ const boxPayloadOf = (value) => {
315
+ const seen = new Set();
316
+ let at = value;
317
+ while (at !== undefined && !seen.has(at)) {
318
+ seen.add(at);
319
+ const representation = definedRepresentations.get(at);
320
+ if (representation === undefined)
321
+ return null;
322
+ if (representation.kind !== 'dynamic')
323
+ return representation;
324
+ at = convertSources.get(at);
325
+ }
326
+ return null;
327
+ };
328
+ const write = (slot, value) => {
329
+ const existing = writes.get(slot) ?? [];
330
+ existing.push(value);
331
+ writes.set(slot, existing);
332
+ };
333
+ // A second pre-pass: a member read needs its key's text, which the first one
334
+ // is what completes. The same pass names the CONTAINER methods read off an
335
+ // Array, Map or Set -- see `wholeElementMethods`.
336
+ const containerMethodReads = new Map();
337
+ for (const blockId of body.blockOrder) {
338
+ for (const operation of body.blocks.get(blockId)?.operations ?? []) {
339
+ if (operation.kind !== 'get')
340
+ continue;
341
+ const key = constantTexts.get(operation.key.value);
342
+ if (key === undefined)
343
+ continue;
344
+ const receiver = operation.receiver.representation;
345
+ if (receiver.kind === 'class-ref') {
346
+ const method = question.methodBodies.get(`${receiver.declaration} ${key}`);
347
+ if (method !== undefined)
348
+ methodReads.set(operation.result.id, String(method));
349
+ continue;
350
+ }
351
+ const container = receiver.kind === 'optional' ? receiver.payload : receiver;
352
+ if ((container.kind === 'array-object' || container.kind === 'keyed-collection') && wholeElementMethods.has(key))
353
+ containerMethodReads.set(operation.result.id, key);
354
+ }
355
+ }
356
+ const calleeOwners = (callee) => {
357
+ const named = calleeOwnersOf(callee.representation);
358
+ if (named !== null)
359
+ return named;
360
+ // A method reaches its body through the callable the site allocates, whose
361
+ // carrier is the dispatching one every callable cell has. The operation
362
+ // that built it names the body outright.
363
+ const method = methodReads.get(callee.value);
364
+ if (method !== undefined)
365
+ return [method];
366
+ const allocated = allocatedCallables.get(callee.value);
367
+ if (allocated !== undefined)
368
+ return [allocated];
369
+ const cell = cellReads.get(callee.value);
370
+ if (cell === undefined)
371
+ return null;
372
+ const resolved = question.directCallees.get(cell);
373
+ return resolved === undefined ? null : [String(resolved)];
374
+ };
375
+ /**
376
+ * Record a callable leaving accountable position.
377
+ *
378
+ * `into` is the cell a `binding-write` puts it in, and the one exemption:
379
+ * `question.directCallees` resolving that cell to the very function the
380
+ * operand names is what makes a call through it attributed rather than
381
+ * indirect, which is the ordinary shape of a top-level declaration and its
382
+ * module binding.
383
+ */
384
+ const escapes = (operand, into) => {
385
+ const owners = calleeOwners(operand);
386
+ if (owners === null)
387
+ return;
388
+ const held = into === null ? undefined : question.directCallees.get(into);
389
+ if (held !== undefined && owners.length === 1 && owners[0] === String(held))
390
+ return;
391
+ for (const owner of owners)
392
+ escapedCallables.add(owner);
393
+ };
394
+ const slotOf = (receiver, key) => {
395
+ const text = constantTexts.get(key.value);
396
+ if (text === undefined) {
397
+ // An INDEX into an Array, or any key into a dictionary, addresses an
398
+ // element, not a member: `ring[i] = point` moves the whole record in and
399
+ // `ring[i]` moves the whole record out, and the record's members were
400
+ // written where it was allocated. A member is only ever reached through
401
+ // a second `get`/`set` on the element, which this census reads on its
402
+ // own. Reading the element access as "any member" struck every struct
403
+ // an Array held whenever the program indexed the Array by a variable --
404
+ // `object_create`'s whole ring, whose three members are exactly the
405
+ // ones this census exists to narrow. A STRING key into an Array can
406
+ // still name one of its extension fields, so it keeps the strike.
407
+ const carrier = receiver.representation.kind === 'optional' ? receiver.representation.payload : receiver.representation;
408
+ if (carrier.kind === 'dictionary' || (carrier.kind === 'array-object' && isNumberScalar(key.representation)))
409
+ return null;
410
+ // A key this compilation cannot name reaches ANY member, so no member of
411
+ // this struct is one the census still accounts for.
412
+ for (const held of walkRepresentation(receiver.representation))
413
+ for (const name of question.structFamilyOf(held))
414
+ disqualified.add(name);
415
+ return null;
416
+ }
417
+ const structName = question.fieldStructNameOf(receiver.representation, text);
418
+ if (structName === null) {
419
+ // A union access may write any of its arms. Until this census models
420
+ // that multi-slot write, none of those slots has a complete write set.
421
+ for (const held of walkRepresentation(receiver.representation)) {
422
+ const owner = question.fieldStructNameOf(held, text);
423
+ if (owner !== null)
424
+ disqualified.add(integerStorageSlot(owner, text));
425
+ }
426
+ return null;
427
+ }
428
+ const slot = integerStorageSlot(structName, text);
429
+ const stored = question.fieldRepresentationOf(receiver.representation, text);
430
+ if (stored === null || !isNumberScalar(stored))
431
+ disqualified.add(slot);
432
+ return question.excludedStructs.has(structName) ? null : slot;
433
+ };
434
+ // Every struct this operation mentions, in any role. A struct named by an
435
+ // operation the census does not model is one whose members some other
436
+ // authority spells, and it is struck rather than narrowed.
437
+ // What a `convert` does to the structs it names is read off its two
438
+ // carriers, the same way the printer decides which recipe to render. A
439
+ // conversion that carries the object WHOLE -- a by-value record read as a
440
+ // view of itself, an instance upcast to its base, a record wrapped into the
441
+ // optional or union arm that holds it, or unwrapped back out -- never spells
442
+ // a member's type, so the C++ compiler keeps every access to the one struct
443
+ // consistent and nothing about its slots changes. A recast into a DIFFERENT
444
+ // struct copies member by member: the source is read through the type its
445
+ // struct declares (a plain copy, which C++ converts), but the target's
446
+ // members are written by values this census never sees, so that struct is
447
+ // struck. Anything else naming a struct -- a box, a carrier this cannot
448
+ // place -- strikes it, exactly as an unaccounted operation would.
449
+ const carries = (holder, name) => {
450
+ for (const held of walkRepresentation(holder))
451
+ if (question.structNameOf(held) === name)
452
+ return true;
453
+ return false;
454
+ };
455
+ const accountConvert = (source, result) => {
456
+ const from = question.structNameOf(source);
457
+ const to = question.structNameOf(result);
458
+ if (from === null && to === null)
459
+ return;
460
+ if (from !== null && to !== null) {
461
+ if (from === to || (source.kind === 'class-ref' && result.kind === 'class-ref'))
462
+ return;
463
+ disqualified.add(to);
464
+ return;
465
+ }
466
+ if (from !== null && !carries(result, from))
467
+ disqualified.add(from);
468
+ if (to !== null && !carries(source, to))
469
+ disqualified.add(to);
470
+ };
471
+ const account = (operation) => {
472
+ const result = resultOfIrOperation(operation);
473
+ const roles = [...operandsOfIrOperation(operation), ...(result ? [{ value: result.id, representation: result.representation }] : [])];
474
+ // What each box in this body PUTS AT RISK, rather than the fact that the
475
+ // body boxes at all -- see `boxedStructs` and `boxOpaque`.
476
+ for (const operand of roles) {
477
+ if (operand.representation.kind !== 'dynamic')
478
+ continue;
479
+ boxedValues.add(operand.value);
480
+ const payload = boxPayloadOf(operand.value);
481
+ if (payload === null) {
482
+ boxOpaque = true;
483
+ continue;
484
+ }
485
+ // The payload is walked rather than merely named: `Value::box(Tag::String,
486
+ // ...)` -- which is every `console.log` -- carries no struct at all and
487
+ // puts nothing at risk, while an Array of records carries each of them
488
+ // without the array itself naming one.
489
+ for (const held of walkRepresentation(payload)) {
490
+ if (held.kind === 'dynamic' || held.kind === 'unresolved') {
491
+ boxOpaque = true;
492
+ continue;
493
+ }
494
+ for (const named of question.structFamilyOf(held))
495
+ boxedStructs.add(named);
496
+ }
497
+ }
498
+ // A callable is accounted for only while every mention of it is a call site
499
+ // or a move into the cell that resolves to it: those are the two positions
500
+ // from which the census can still see -- or follow -- every invocation.
501
+ // Anywhere else (an argument to a host function, a record member, an array
502
+ // element) it can be invoked by something this census never reads.
503
+ for (const operand of operandsOfIrOperation(operation)) {
504
+ if (!callableCarriers.has(operand.representation.kind))
505
+ continue;
506
+ if ((operation.kind === 'call' || operation.kind === 'construct') && operation.callee.value === operand.value)
507
+ continue;
508
+ escapes(operand, operation.kind === 'binding-write' ? operation.declaration : null);
509
+ }
510
+ // A call to a container method (`ring.push(point)`, `seen.add(point)`)
511
+ // moves its arguments whole -- see `wholeElementMethods` -- so it is
512
+ // accounted the way an element store is, and the callable operands it may
513
+ // also carry were already walked for escapes above.
514
+ if (operation.kind === 'call') {
515
+ const member = containerMethodReads.get(operation.callee.value);
516
+ if (member !== undefined && (member !== 'sort' || operation.arguments.length > 0))
517
+ return;
518
+ }
519
+ // A `construct` needs no callee test: a struct this census can name is one
520
+ // this compilation renders, so its constructor is a body the census reads.
521
+ const accounted = accountedOperations.has(operation.kind) && (operation.kind !== 'call' || calleeOwners(operation.callee) !== null);
522
+ if (accounted)
523
+ return;
524
+ if (operation.kind === 'convert') {
525
+ accountConvert(operation.source.representation, operation.result.representation);
526
+ return;
527
+ }
528
+ const moves = wholeValueMoves.has(operation.kind);
529
+ for (const operand of roles) {
530
+ // A callable signature names its inputs and result without carrying any
531
+ // such instances. Captured values are separate operands of allocation.
532
+ if (callableCarriers.has(operand.representation.kind))
533
+ continue;
534
+ if (moves && operand.representation.kind === 'class-ref')
535
+ continue;
536
+ for (const held of walkRepresentation(operand.representation))
537
+ for (const name of question.structFamilyOf(held))
538
+ disqualified.add(name);
539
+ }
540
+ };
541
+ for (const blockId of body.blockOrder) {
542
+ const block = body.blocks.get(blockId);
543
+ if (!block)
544
+ continue;
545
+ for (const operation of block.operations) {
546
+ account(operation);
547
+ if (operation.kind === 'compute' && operation.form === 'binary') {
548
+ const [left, right] = operation.operands;
549
+ if (left && right)
550
+ steps.set(operation.result.id, { operator: operation.operator, left: left.value, right: right.value });
551
+ }
552
+ if (operation.kind === 'parameter') {
553
+ if (isNumberScalar(operation.result.representation))
554
+ reads.set(operation.result.id, integerParameterSlot(body.sourceOwner, operation.ordinal));
555
+ continue;
556
+ }
557
+ if (operation.kind === 'call') {
558
+ const callees = calleeOwners(operation.callee);
559
+ if (callees === null) {
560
+ // A call this census cannot attribute reaches one of the bodies
561
+ // whose callable escaped, and those already keep their doubles.
562
+ // Nothing is recorded here: the callee got its value from a position
563
+ // the escape walk saw, so naming the reachable set again from a site
564
+ // that says nothing about it could only be less precise.
565
+ continue;
566
+ }
567
+ operation.arguments.forEach((argument, ordinal) => {
568
+ if (!isNumberScalar(argument.representation))
569
+ return;
570
+ for (const callee of callees)
571
+ write(integerParameterSlot(callee, ordinal), argument.value);
572
+ });
573
+ // One callee only: two bodies reaching one call site are two result
574
+ // slots, and this value is exactly one of them.
575
+ const only = callees.length === 1 ? callees[0] : undefined;
576
+ if (only !== undefined && operation.result !== null && isNumberScalar(operation.result.representation)) {
577
+ reads.set(operation.result.id, integerResultSlot(only));
578
+ }
579
+ continue;
580
+ }
581
+ if (operation.kind === 'get') {
582
+ const slot = slotOf(operation.receiver, operation.key);
583
+ if (slot !== null && isNumberScalar(operation.result.representation))
584
+ reads.set(operation.result.id, slot);
585
+ continue;
586
+ }
587
+ if (operation.kind === 'binding-write') {
588
+ const written = cellWrites.get(operation.declaration) ?? [];
589
+ written.push(operation.value.value);
590
+ cellWrites.set(operation.declaration, written);
591
+ }
592
+ if (operation.kind === 'set' || operation.kind === 'define-own-property') {
593
+ const slot = slotOf(operation.receiver, operation.key);
594
+ if (slot === null)
595
+ continue;
596
+ // A write of anything but a plain `number` settles the member's carrier
597
+ // on its own, and narrowing it would make the two disagree.
598
+ if (isNumberScalar(operation.value.representation))
599
+ write(slot, operation.value.value);
600
+ else
601
+ disqualified.add(slot);
602
+ continue;
603
+ }
604
+ if (operation.kind === 'delete') {
605
+ for (const held of walkRepresentation(operation.receiver.representation))
606
+ for (const name of question.structFamilyOf(held))
607
+ disqualified.add(name);
608
+ continue;
609
+ }
610
+ if (operation.kind !== 'allocate-record')
611
+ continue;
612
+ const structName = question.structNameOf(operation.result.representation);
613
+ if (structName === null || question.excludedStructs.has(structName))
614
+ continue;
615
+ for (const field of operation.fields) {
616
+ const slot = integerStorageSlot(structName, field.key);
617
+ const stored = question.fieldRepresentationOf(operation.result.representation, field.key);
618
+ if (stored !== null && isNumberScalar(stored) && isNumberScalar(field.value.representation))
619
+ write(slot, field.value.value);
620
+ else
621
+ disqualified.add(slot);
622
+ }
623
+ }
624
+ if (block.terminator.kind === 'return' && block.terminator.value !== null) {
625
+ // A returned callable is the escape the operand walk cannot see: a
626
+ // factory's arrow reaches its caller through the terminator, and every
627
+ // later mention of it is opaque.
628
+ if (callableCarriers.has(block.terminator.value.representation.kind))
629
+ escapes(block.terminator.value, null);
630
+ returns = block.terminator.value.value;
631
+ returnCount += 1;
632
+ if (isNumberScalar(block.terminator.value.representation))
633
+ write(integerResultSlot(body.sourceOwner), block.terminator.value.value);
634
+ else
635
+ returnsNumber = false;
636
+ }
637
+ }
638
+ // A cell every write of which comes out of ONE slot is that slot, as far as
639
+ // recognizing a step is concerned. More than one slot, or one write from
640
+ // somewhere else, and it is not.
641
+ const cellSlots = new Map();
642
+ for (const [cell, values] of cellWrites) {
643
+ const held = new Set(values.map((value) => reads.get(value)));
644
+ const only = held.size === 1 ? [...held][0] : undefined;
645
+ if (only !== undefined)
646
+ cellSlots.set(cell, only);
647
+ }
648
+ for (const [value, cell] of cellReads) {
649
+ const slot = cellSlots.get(cell);
650
+ if (slot !== undefined)
651
+ slotCells.set(value, slot);
652
+ }
653
+ // After the walk, not during it: a box can precede the read whose slot it
654
+ // names, and `reads` is only complete once every block has been seen.
655
+ for (const value of boxedValues) {
656
+ const slot = reads.get(value);
657
+ if (slot !== undefined)
658
+ boxedSlots.add(slot);
659
+ }
660
+ return {
661
+ owner,
662
+ reads,
663
+ slotCells,
664
+ writes,
665
+ returns: returnCount === 1 ? returns : null,
666
+ returnsNumber: returnsNumber && returnCount > 0,
667
+ boxedStructs,
668
+ boxedSlots,
669
+ boxOpaque,
670
+ steps,
671
+ constants,
672
+ escapedCallables
673
+ };
674
+ };
675
+ export const integerStorageCensusOf = (question) => {
676
+ const disqualified = new Set();
677
+ const scans = new Map();
678
+ for (const body of question.bodies)
679
+ scans.set(String(body.sourceOwner), scanBody(body, question, disqualified));
680
+ // A box whose payload this census cannot name refuses the whole program, the
681
+ // way any box used to. Every box it CAN name strikes its own struct and the
682
+ // slot it was read out of, and nothing else -- see `BodyScan.boxedStructs`.
683
+ if ([...scans.values()].some((scan) => scan.boxOpaque))
684
+ return emptyIntegerStorageCensus;
685
+ const boxedSlots = new Set();
686
+ for (const scan of scans.values()) {
687
+ for (const name of scan.boxedStructs)
688
+ disqualified.add(name);
689
+ for (const slot of scan.boxedSlots)
690
+ boxedSlots.add(slot);
691
+ }
692
+ const bySlot = new Map();
693
+ const record = (slot, write) => {
694
+ const existing = bySlot.get(slot) ?? [];
695
+ existing.push(write);
696
+ bySlot.set(slot, existing);
697
+ };
698
+ for (const scan of scans.values()) {
699
+ for (const [slot, values] of scan.writes)
700
+ for (const value of values)
701
+ record(slot, { owner: scan.owner, value });
702
+ }
703
+ // A class field's default initializer is a body whose return value seeds the
704
+ // member -- see `fieldSeeds`. A seed this census cannot read is a write it
705
+ // cannot account for, so the member keeps its double.
706
+ for (const [slot, seeds] of question.fieldSeeds)
707
+ for (const seed of seeds) {
708
+ const scan = scans.get(String(seed.initializer));
709
+ if (seed.representation === null || !isNumberScalar(seed.representation) || scan === undefined || scan.returns === null)
710
+ disqualified.add(slot);
711
+ else
712
+ record(slot, { owner: scan.owner, value: scan.returns });
713
+ }
714
+ const escaped = new Set();
715
+ for (const scan of scans.values())
716
+ for (const owner of scan.escapedCallables)
717
+ escaped.add(owner);
718
+ // A formal's slot and a result's slot are admitted on the same terms: both
719
+ // are positions in a signature, and both need every call accounted for --
720
+ // which is exactly what an escaped callable takes away, for that body alone.
721
+ const admitsSignatureSlot = (slot) => {
722
+ const boundary = slot.lastIndexOf('#');
723
+ if (boundary <= 0)
724
+ return false;
725
+ const owner = slot.slice(0, boundary);
726
+ if (escaped.has(owner))
727
+ return false;
728
+ if (question.excludedFormalOwners.has(owner) || question.excludedSignatureSlots.has(slot))
729
+ return false;
730
+ // A body that returns anything but a `number` on some path has a result
731
+ // this census cannot narrow, whatever its numeric returns say.
732
+ return slot.slice(boundary + 1) !== 'result' || scans.get(owner)?.returnsNumber === true;
733
+ };
734
+ const admits = (slot) => {
735
+ if (disqualified.has(slot) || boxedSlots.has(slot))
736
+ return false;
737
+ if (slot.indexOf(' ') < 0)
738
+ return admitsSignatureSlot(slot);
739
+ return !disqualified.has(structOfSlot(slot)) && !question.excludedStructs.has(structOfSlot(slot));
740
+ };
741
+ // A slot nothing writes is one nothing can prove, so the candidates are
742
+ // exactly the written ones -- a read-only member keeps its double.
743
+ let integral = new Set([...bySlot.keys()].filter(admits));
744
+ if (integral.size === 0)
745
+ return emptyIntegerStorageCensus;
746
+ let magnitudes = new Map();
747
+ const censusRound = () => {
748
+ const answers = new Map();
749
+ for (const body of question.bodies) {
750
+ const owner = String(body.sourceOwner);
751
+ const scan = scans.get(owner);
752
+ if (scan === undefined || (scan.reads.size === 0 && scan.writes.size === 0 && scan.returns === null))
753
+ continue;
754
+ answers.set(owner, narrowableIntegersOf(body, { reads: scan.reads, integral, magnitudes }));
755
+ }
756
+ return answers;
757
+ };
758
+ // Pass 1 -- integrality, shrinking from "every candidate holds an integer".
759
+ for (let round = 0; round < settlingRounds; round += 1) {
760
+ const answers = censusRound();
761
+ const survivors = new Set();
762
+ for (const slot of integral) {
763
+ const writes = bySlot.get(slot) ?? [];
764
+ if (writes.every((entry) => answers.get(entry.owner)?.integral.has(entry.value) === true))
765
+ survivors.add(slot);
766
+ }
767
+ if (survivors.size === integral.size)
768
+ break;
769
+ integral = survivors;
770
+ if (integral.size === 0)
771
+ return emptyIntegerStorageCensus;
772
+ }
773
+ // Pass 2 -- magnitude, growing from "no slot is bounded". A round that
774
+ // changes nothing is a fixed point of the same equations the values obey; a
775
+ // census that never reaches one refuses, because an unsettled bound is
776
+ // exactly the case where a `long long` and a double stop agreeing.
777
+ let settled = false;
778
+ for (let round = 0; round < settlingRounds; round += 1) {
779
+ const answers = censusRound();
780
+ const next = new Map();
781
+ for (const slot of integral) {
782
+ let magnitude = { kind: 'bounded', limit: 0 };
783
+ let recursive = false;
784
+ for (const entry of bySlot.get(slot) ?? []) {
785
+ const scan = scans.get(entry.owner);
786
+ // A self-recursive sum is bounded by the OTHER writes, so it is skipped
787
+ // here and applied to their join below -- reading it as arithmetic is
788
+ // what makes the slot climb forever.
789
+ if (scan !== undefined && selfSumOf(scan, slot, entry.value)) {
790
+ recursive = true;
791
+ continue;
792
+ }
793
+ const step = scan === undefined ? null : selfStepOf(scan, slot, entry.value);
794
+ const written = step !== null ? integerLinearMagnitude(step) : (answers.get(entry.owner)?.magnitudes.get(entry.value) ?? null);
795
+ magnitude = widenIntegerMagnitude(magnitude, written);
796
+ }
797
+ if (recursive && magnitude !== null)
798
+ magnitude = integerLinearMagnitude(magnitude.kind === 'bounded' ? magnitude.limit : magnitude.coefficient);
799
+ if (magnitude !== null)
800
+ next.set(slot, magnitude);
801
+ }
802
+ const unchanged = next.size === magnitudes.size && [...next].every(([slot, magnitude]) => sameMagnitude(magnitudes.get(slot), magnitude));
803
+ magnitudes = next;
804
+ if (unchanged) {
805
+ settled = true;
806
+ break;
807
+ }
808
+ }
809
+ if (!settled)
810
+ return emptyIntegerStorageCensus;
811
+ const slots = new Set(magnitudes.keys());
812
+ const facts = new Map();
813
+ for (const [owner, scan] of scans) {
814
+ const reads = new Map();
815
+ for (const [value, slot] of scan.reads)
816
+ if (slots.has(slot))
817
+ reads.set(value, slot);
818
+ if (reads.size > 0)
819
+ facts.set(owner, { reads, integral: slots, magnitudes });
820
+ }
821
+ return { slots, factsOf: (owner) => facts.get(String(owner)) ?? emptyFacts };
822
+ };