@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,769 @@
1
+ import { allOperationsOf } from '../../ir/model.js';
2
+ import { operandsOfIrOperation } from '../../ir/queries.js';
3
+ import { representationKey } from '../../representation/model.js';
4
+ import { carrierDifference, shortCarrierText } from '../../representation/difference.js';
5
+ import { bindingReference, createCppEmitBlockedError, cppFormalName, cppReceiverName, declareCell, defineValue, defineValueAlias, isCppEmitBlockedError, operandText } from './emit-context.js';
6
+ import { alignedValueText, classFamilyLoadText, emptyArraySentinelText, movedValueText } from './emit-narrowing.js';
7
+ import { stringAppendStatement } from './emit-tostring.js';
8
+ import { cppAbiParameterType, cppBoxedType, cppNarrowedIntegerType, cppStringLiteral, cppTypeOf } from './types.js';
9
+ import { receiverBoundCallableText } from './emit-callable.js';
10
+ import { structuralRecordViewText } from './emit-record-view.js';
11
+ import { owningConversionInputText } from './owning-conversion-input.js';
12
+ /**
13
+ * The expression a boxed cell's handle reads as an ordinary value, versus the
14
+ * handle itself.
15
+ *
16
+ * `bindingReference` always names the cell's own storage -- a plain `T`
17
+ * variable, or a `std::shared_ptr<T>` handle when `CaptureSlot.boxed`/
18
+ * `CaptureIndex.isBoxed` says this declaration is shared by aliasing
19
+ * (`emit-callable.ts`'s field-copy line wants exactly that raw handle, to
20
+ * copy the pointer into a deeper environment unchanged). Every OTHER use of
21
+ * the cell -- a read, or the assignment target of a write -- wants the
22
+ * pointee, not the pointer, so those two call sites dereference here instead
23
+ * of inlining the same parenthesized `*` twice.
24
+ */
25
+ export const cellValueText = (cell) => cell.boxed ? `(*${cell.name})` : cell.name;
26
+ /**
27
+ * A checker-narrowed structural record carried inside one arm of a cell's
28
+ * union. `convertedValueText` can dispatch through representation-only
29
+ * conversions, but a native-record/class arm needs the emitter's layout table
30
+ * to prove and build its structural view. Walk only sum wrappers here and let
31
+ * `structuralRecordViewText` remain the one authority on the leaf conversion.
32
+ */
33
+ const structuralUnionLoadText = (ctx, held, read, text) => {
34
+ // A whole-carrier conversion owns the source discriminant and every live
35
+ // target arm. Searching only structural leaves first can pick a record arm
36
+ // and silently discard still-live primitive/absent arms of the same sum.
37
+ try {
38
+ const converted = alignedValueText(ctx, 'emit-bindings.ts:118', held, read, text);
39
+ if (converted !== null)
40
+ return converted;
41
+ }
42
+ catch (error) {
43
+ if (!isCppEmitBlockedError(error))
44
+ throw error;
45
+ }
46
+ const completeView = structuralRecordViewText(ctx, held, read, text);
47
+ if (completeView !== null)
48
+ return completeView;
49
+ // A target sum must be converted as a whole. A partial structural-arm
50
+ // search cannot prove that it covers all of that target's live members.
51
+ if (read.kind === 'optional' || read.kind === 'tagged-union')
52
+ return null;
53
+ if (held.kind === 'optional')
54
+ return structuralUnionLoadText(ctx, held.payload, read, `(*${text})`);
55
+ if (held.kind !== 'tagged-union')
56
+ return structuralRecordViewText(ctx, held, read, text);
57
+ const candidates = held.arms.flatMap((arm, index) => {
58
+ const loaded = (() => {
59
+ try {
60
+ return structuralUnionLoadText(ctx, arm.value, read, `${text}.get<${index}>()`);
61
+ }
62
+ catch (error) {
63
+ // A union-arm search routinely asks incompatible arms before finding
64
+ // the one the checker proved live. A named conversion refusal rejects
65
+ // that candidate; it does not reject a later arm with a valid view.
66
+ if (isCppEmitBlockedError(error))
67
+ return null;
68
+ throw error;
69
+ }
70
+ })();
71
+ return loaded === null ? [] : [{ index, loaded }];
72
+ });
73
+ const last = candidates[candidates.length - 1];
74
+ if (!last)
75
+ return null;
76
+ let dispatched = last.loaded;
77
+ for (const candidate of candidates.slice(0, -1).reverse()) {
78
+ dispatched = `${text}.is<${candidate.index}>() ? ${candidate.loaded} : (${dispatched})`;
79
+ }
80
+ return candidates.length > 1 ? `(${dispatched})` : dispatched;
81
+ };
82
+ /**
83
+ * Binding cells: the one place the plan's per-result carrier and the
84
+ * projection's per-declaration carrier have to be reconciled.
85
+ *
86
+ * They disagree routinely and legitimately -- control-flow narrowing makes a
87
+ * read narrower than its cell, and a declared union makes a cell wider than its
88
+ * initializer -- so both directions are written out here rather than left to
89
+ * C++ to interpret.
90
+ */
91
+ /**
92
+ * Reading a binding is a load from its cell.
93
+ *
94
+ * The carrier the read publishes and the carrier the cell holds are decided by
95
+ * two different authorities -- the plan selects per result, the placement
96
+ * projects per declaration -- and control-flow narrowing routinely makes them
97
+ * disagree: inside `if (tag)` the checker types `tag` as `string`, so the
98
+ * read's carrier is `string`, while the cell still holds `Optional<string>`
99
+ * because that is what the declaration binds. `if (typeof x === 'string')` does
100
+ * the same to a cell holding a tagged union.
101
+ *
102
+ * Those loads exist and this renders them -- `gea::Optional::operator*`,
103
+ * `gea::TaggedUnion::get`. The proof is the checker's: it established presence,
104
+ * or which arm is live, before this read ever runs, and re-deciding it here
105
+ * would be a second authority answering a settled question with nowhere to go
106
+ * when it disagreed. What this file owns is whether the load exists at all, and
107
+ * it does not decide that either: `targets/cpp/conversions.ts` states the
108
+ * capability, preflight censuses it, and a program whose narrowed read has no
109
+ * installed load is refused before emission rather than here.
110
+ *
111
+ * Every other disagreement is still refused by name. A cell and a read that
112
+ * differ in a way no load explains are two unrelated C++ types, and emitting
113
+ * the bare assignment would hand the C++ compiler a program this one already
114
+ * knows is wrong.
115
+ */
116
+ export const emitBindingRead = (ctx, lines, operation) => {
117
+ if (ctx.typeQueryValues.has(operation.result.id)) {
118
+ const cell = bindingReference(ctx, operation.declaration, 'a type-query snapshot read');
119
+ lines.push(`${defineValue(ctx, operation.result)} = ${cellValueText(cell)};`);
120
+ return;
121
+ }
122
+ // `ctx.bindingReadDeclarations` already names this read's declaration --
123
+ // settled in `EmitBodyFacts`, for every `binding-read` in the body, live or
124
+ // dead (the type-query early return above no longer withholds it).
125
+ //
126
+ // A cell the whole unit writes once, with a callable that captures nothing,
127
+ // holds one body forever, so a CALL through this read is a call by name --
128
+ // but that is a fact about the eventual CALL, not about this read, and
129
+ // `emitBody`'s own up-front walk of `CallOperation.target` already
130
+ // registered it (`ir/call-dispatch.ts`) before this operation ever
131
+ // rendered. Nothing is left for this read to decide here.
132
+ // A cell that holds one host method forever is read as that member: the
133
+ // access that filled it recorded a deferred host read and rendered nothing
134
+ // (`nativeHandleMemberText`), and this read is the same fact one body away.
135
+ // `receiver: null` is what a class object or namespace receiver records
136
+ // there too, which is why the index admits only those.
137
+ if (ctx.hostMethodAliases.has(operation.declaration))
138
+ return;
139
+ // A class object this program introduces no cell for, recorded by
140
+ // `classObjectReadsOf` above: there is nothing to load, and every site that
141
+ // can use the class spells it from its declaration.
142
+ if (ctx.classObjectReads.has(operation.result.id))
143
+ return;
144
+ const placement = ctx.placements.get(operation.declaration);
145
+ // A host's class object produces no C++ at all, the same way a host METHOD
146
+ // access does: there is no cell to load from, and what the program actually
147
+ // does with the class -- constructs it, reads its class members -- is spelled
148
+ // whole by the host at the site that does it. Registering it as a deferred
149
+ // read is what makes a program that instead wants the class as a VALUE refuse
150
+ // by name (`operandText`) rather than name a variable nothing declares.
151
+ if (placement?.storage.kind === 'host-class')
152
+ return;
153
+ // A host singleton is the same physical answer for the same reason: there is
154
+ // no cell to load and no value to hold, only members the host spells whole.
155
+ // Registered in the same map, so the one question every consumer asks --
156
+ // "does this receiver render as a value?" -- keeps one answer.
157
+ if (placement?.storage.kind === 'host-singleton')
158
+ return;
159
+ // A host FUNCTION is not a cell either, and unlike a constant it has no text
160
+ // that stands on its own: what the host states is the function's name, and a
161
+ // name is only C++ where it is called. Registering the read is what lets the
162
+ // call render `gea::apple::AppKit::installRootViewController(vc)` and what
163
+ // makes any OTHER use of it -- storing it, passing it -- refuse by name in
164
+ // `operandText` rather than emit a variable nothing defines.
165
+ // Settled before this body rendered a line, by `host-namespace-reads.ts`'s
166
+ // `hostNamespaceReadsOf`, from this exact `placement.storage.kind` test.
167
+ // Nothing is left for the read to record; it only has to render nothing.
168
+ if (placement?.storage.kind === 'host-function')
169
+ return;
170
+ // A host NAMESPACE is not a cell and has no text of its own either: it is a
171
+ // path, and only the leaf a path reaches is C++. Registering the path is what
172
+ // lets the member access extend or resolve it, and what makes the namespace
173
+ // used as a value refuse by name in `operandText`.
174
+ if (placement?.storage.kind === 'host-namespace')
175
+ return;
176
+ // A host constant is a text, not a cell: the host said what the value is, so
177
+ // the read is that text and nothing declares storage for it.
178
+ if (placement?.storage.kind === 'host-constant') {
179
+ const constantName = defineValue(ctx, operation.result);
180
+ lines.push(`${constantName} = ${placement.storage.emit};`);
181
+ // A constant can also be the root of a member path: the host states
182
+ // `audioContext` as a value AND states its methods under that name, since
183
+ // the methods really are members of that one object. That pairing is
184
+ // recorded in `ctx.hostNamespaceValues` by the same settled fixed point,
185
+ // not here -- the value still renders, which is the whole difference
186
+ // between it and a pure namespace.
187
+ return;
188
+ }
189
+ // The one read of a forwarded cell names the written value -- a withheld
190
+ // expression, or the temporary its producer kept -- and no cell exists.
191
+ const forwarded = ctx.forwardedBindings.get(operation.declaration);
192
+ if (forwarded !== undefined && forwarded.read === operation.result.id) {
193
+ defineValueAlias(ctx, operation.result, operandText(ctx, forwarded.value));
194
+ return;
195
+ }
196
+ const held = placement?.representation;
197
+ const read = operation.result.representation;
198
+ // The carrier travels with the description because the one refusal this can
199
+ // raise -- `native-boundary:external-binding` -- says only that no placement
200
+ // exists, and what the read was going to PRODUCE is the fact that separates
201
+ // a missing host cell from a class object whose own declaration published no
202
+ // binding. Reading that back from raw ids took a whole build.
203
+ const cell = bindingReference(ctx, operation.declaration, `a binding read of ${representationKey(read)}`);
204
+ const cellText = cellValueText(cell);
205
+ // A read whose OWN carrier has exactly one value needs no load: `undefined`
206
+ // and `void` are storage-free (`representation/primitives.ts`), so whatever
207
+ // the cell holds, the value this read produces is that one value. Do this
208
+ // before asking a union conversion to locate an arm: a nested union may
209
+ // encode absence in an enclosing tag rather than expose an exact leaf, but
210
+ // there is still no payload to recover from that tag.
211
+ //
212
+ // The other case is an unreachable branch: a generic narrowed by
213
+ // `instanceof` to a class its own monomorphized copy cannot be gives the
214
+ // narrowed binding an uninhabited intersection, which `derive.ts` answers
215
+ // with `never`'s storage-free carrier. Rendering the singleton is honest in
216
+ // both cases: the branch never runs, and the result has no payload even if it
217
+ // did.
218
+ if (read.kind === 'undefined' || read.kind === 'void') {
219
+ const literalName = defineValue(ctx, operation.result);
220
+ lines.push(`${literalName} = ${cppTypeOf(read)}{};`);
221
+ return;
222
+ }
223
+ // The empty-array sentinel is tried first and only for an array-object
224
+ // pair: `narrowedLoadText` has no shape for it at all and would otherwise be
225
+ // asked a question it can only answer `null` to, same as today. An element
226
+ // DISAGREEMENT is deliberately not bridged here -- see `conversions.ts`'s
227
+ // refusal to install one, and why a copy is never sound for a mutable array.
228
+ const arrayRecast = held?.kind === 'array-object' && read.kind === 'array-object' ? emptyArraySentinelText(held, read, cellText) : null;
229
+ // A cell/read disagreement is not always a narrowing. The placement is the
230
+ // storage authority while the operation publishes the checker's view at
231
+ // this use, and that view can be wider: a scalar cell read as
232
+ // `number | undefined`, or a Scene cell read as `Scene | null |
233
+ // undefined`, needs the same optional/union construction a write uses.
234
+ // `convertedValueText` is the shared superset of narrowed loads and widened
235
+ // stores, so ask it after the array-element recast rather than assuming
236
+ // every disagreement points inward.
237
+ const classUnion = held ? classFamilyLoadText(ctx, held, read, cellText) : null;
238
+ // An unchanged union is the cell itself. Searching its arms for a
239
+ // structural conversion can find one compatible arm, project it with
240
+ // `get<N>()`, and rebuild a fresh union tagged as N. That destroys the
241
+ // original discriminant (`A | B` holding B became an A-tagged value) even
242
+ // though no conversion was requested. Structural arm search is only for a
243
+ // real cell/read carrier disagreement; identity stays with the shared
244
+ // conversion authority below.
245
+ const structural = held?.kind === 'tagged-union' && representationKey(held) !== representationKey(read)
246
+ ? structuralUnionLoadText(ctx, held, read, cellText)
247
+ : null;
248
+ // convertedValueText returns the input expression for identity, not null.
249
+ // Identity must remain "no narrowing" here: otherwise every unchanged read
250
+ // loses the stable-cell alias path below and copies its owning storage.
251
+ const narrowed = held && representationKey(held) === representationKey(read)
252
+ ? null
253
+ : (arrayRecast ?? classUnion ?? structural ?? (held ? alignedValueText(ctx, 'emit-bindings.ts:332', held, read, cellText) : null));
254
+ if (held && narrowed === null && representationKey(held) !== representationKey(read)) {
255
+ throw createCppEmitBlockedError(`conversion:${representationKey(held)}->${representationKey(read)}`, `reads ${operation.declaration} as "${representationKey(read)}" from a cell holding ` +
256
+ `"${representationKey(held)}"; a narrowed read needs the conversion the narrowing proves, which is not installed`);
257
+ }
258
+ // A HOST OBJECT is read by naming its cell, never by copying out of it.
259
+ //
260
+ // `native-handle` is the carrier for a value whose type belongs to the host,
261
+ // and in the source language such a value is an OBJECT: `const ctx =
262
+ // Display.ctx` binds a reference, so `ctx.fillStyle = c` and the
263
+ // `ctx.fillText(...)` on the next line act on one object. Copying the cell
264
+ // into a fresh temporary per read makes each of those a separate C++ value,
265
+ // and a host type that carries state behind its handle then loses it between
266
+ // statements: `gea::embedded::ui::CanvasRenderingContext2D` holds
267
+ // `batchDepth_`, `presentRecording_`, `batchDirty_`, `fillStyle_`,
268
+ // `fontSizePx_` and the present-command buffer, all of which
269
+ // `gea_ir::canvas*` mutates through a `CanvasRenderingContext2D &`. Copied,
270
+ // `beginBatch()` opened a batch on one temporary and `endBatch()` closed a
271
+ // depth-0 one on another, so nothing was ever presented and the app's
272
+ // fillStyle never reached its fillText -- a blank screen with no diagnostic
273
+ // anywhere, because every individual call compiled and ran.
274
+ //
275
+ // Sound only while the cell holds the same object at every use of this read,
276
+ // which is why a body that writes the cell more than once keeps the copy: a
277
+ // reassigned `let` would make the alias name whatever the cell holds LATER,
278
+ // and the copy's staleness is the lesser of the two wrong answers. Reads
279
+ // needing a narrowed load keep the copy too -- that load is a conversion, and
280
+ // a converted value is a new value, not the cell.
281
+ if (read.kind === 'native-handle' && narrowed === null && (ctx.bindingWriteCounts.get(operation.declaration) ?? 0) <= 1) {
282
+ defineValueAlias(ctx, operation.result, cellText);
283
+ return;
284
+ }
285
+ // The same argument, for the same reason, on every OTHER carrier a copy
286
+ // costs something real to make.
287
+ //
288
+ // A `std::shared_ptr` copy is an atomic increment and a matching decrement,
289
+ // and a `std::string` copy is a heap allocation; neither is a copy the C++
290
+ // compiler is allowed to elide, because both are observable -- through the
291
+ // refcount and through the allocator. A `const` array indexed in a loop was
292
+ // paying one atomic pair per iteration purely to name the array its own cell
293
+ // was already holding, and every read of a captured string paid an
294
+ // allocation to hand the same characters to the next operation.
295
+ //
296
+ // Sound under exactly the conditions the host-object case needs, and the
297
+ // reasons are not the same in both directions: a cell written more than once
298
+ // would let the alias see a LATER value than the read did, and a BOXED cell
299
+ // is shared by aliasing with some closure that this body's own write count
300
+ // cannot speak for. A scalar keeps the copy, because `double v = b;` costs
301
+ // nothing after register allocation and the temporary reads better.
302
+ const copyIsMachineWork = read.kind !== 'scalar' && read.kind !== 'null';
303
+ // A per-body write count proves stability only for that frame's own local.
304
+ // Module cells and enclosing-frame cells can change in a called function.
305
+ // Otherwise use the deferral census's effect-free window or snapshot now.
306
+ const stableLocal = placement?.storage.kind === 'local' &&
307
+ placement.storage.owner === ctx.owner &&
308
+ (ctx.bindingWriteCounts.get(operation.declaration) ?? 0) <= 1;
309
+ // A class cell `buildRepeatedConstructorIndex` admitted is written exactly
310
+ // once in the WHOLE unit, by the class evaluation, so no call between this
311
+ // read and its use can change what the cell holds -- the proof a module
312
+ // cell otherwise lacks. Copying a `ConstructorObject` is two `Ref` pairs
313
+ // (its environment owner and its function identity), and `binary_trees`
314
+ // paid them per node: `build` read the class into a temporary, recursed
315
+ // twice, then constructed through the copy.
316
+ const stableClassCell = ctx.repeatedConstructors.has(operation.declaration);
317
+ if (copyIsMachineWork &&
318
+ narrowed === null &&
319
+ !cell.boxed &&
320
+ (stableLocal || stableClassCell || ctx.deferrable.has(operation.result.id))) {
321
+ defineValueAlias(ctx, operation.result, cellText);
322
+ return;
323
+ }
324
+ const name = defineValue(ctx, operation.result);
325
+ lines.push(`${name} = ${narrowed ?? cellText};`);
326
+ };
327
+ /**
328
+ * A cell's own update, written into the cell instead of through a copy of it.
329
+ *
330
+ * `s += 'a'` is `s = s + 'a'` (ECMA-262 13.15.2), and the IR carries it that
331
+ * way: a read of the cell, an addition, a write back. Rendered literally over a
332
+ * `std::string` that is three operations of which two are copies of the whole
333
+ * string, so a loop that appends one character to a growing string does
334
+ * quadratic work -- 100,000 appends copied five gigabytes. `std::string`'s own
335
+ * `operator+=` appends in place, amortized constant, and the two forms differ
336
+ * in nothing else: `s = s + x` and `s += x` are the same characters in the same
337
+ * order, self-append (`s += s`) included, which the standard requires
338
+ * `basic_string::append` to handle.
339
+ *
340
+ * The written value must be a string addition whose first operand is a read of
341
+ * this cell, and the addition itself must be withheld. A withheld old-value
342
+ * read appends directly. A materialized old-value read is admitted only when
343
+ * ownership liveness proves its SSA snapshot dies here; that snapshot grows
344
+ * and moves back into the cell. `string` only: on a `double` the two forms
345
+ * compile to the same instruction, and on any other carrier `+` is not an
346
+ * append.
347
+ */
348
+ const compoundAppendLines = (ctx, operation, target) => {
349
+ if (ctx.placements.get(operation.declaration)?.representation?.kind !== 'string')
350
+ return null;
351
+ const addition = ctx.computeOrigins.get(operation.value.value);
352
+ if (!addition || addition.form !== 'binary' || addition.operator !== '+')
353
+ return null;
354
+ if (addition.result.representation.kind !== 'string' || addition.operands.length < 2)
355
+ return null;
356
+ const [left, ...suffix] = addition.operands;
357
+ if (!left || left.representation.kind !== 'string' || suffix.some((operand) => operand.representation.kind !== 'string'))
358
+ return null;
359
+ if (ctx.bindingReadDeclarations.get(left.value) !== operation.declaration)
360
+ return null;
361
+ if (!ctx.deferredTexts.has(addition.result.id))
362
+ return null;
363
+ // Two spellings of "the old value is the cell itself, not a copy of it": a
364
+ // withheld read renders as the cell's expression, and an ALIASED read
365
+ // (`emitBindingRead`'s `defineValueAlias`, taken when the read is
366
+ // deferrable and copying the string would be machine work) renders as the
367
+ // cell's own name. Both read the cell in place and neither made a snapshot,
368
+ // so both append in place. The alias form is the one `s += 'a'` in a loop
369
+ // takes; when only the withheld form was recognised here the loop fell to
370
+ // `s = concatStrings({s, 'a'})` -- the quadratic copy this function exists
371
+ // to remove, 0.2 ms to 82 ms on `string_concat`.
372
+ if (ctx.deferredTexts.has(left.value) || ctx.valueNames.get(left.value) === target)
373
+ return [stringAppendStatement(ctx, target, suffix)];
374
+ // A call between the read and write forces the old value into a snapshot.
375
+ // Grow a final-use snapshot and move it home, preserving the observable
376
+ // pre-call read without copying the whole prefix again in concatStrings.
377
+ if (!ctx.ownedValues.has(left.value) || !ctx.ownedDyingValues.has(left.value))
378
+ return null;
379
+ const snapshot = operandText(ctx, left);
380
+ return [stringAppendStatement(ctx, snapshot, suffix), `${target} = std::move(${snapshot});`];
381
+ };
382
+ export const emitBindingWrite = (ctx, lines, operation) => {
383
+ const placement = ctx.placements.get(operation.declaration);
384
+ // A namespace cell has nothing to store into, and its initializer is the
385
+ // namespace itself -- the framework's own re-export of a host global
386
+ // (`placeNamespaceAliases`). The write is the alias, and the alias is
387
+ // already the path, so it renders nothing. A write of anything ELSE into
388
+ // that name falls through to `bindingReference`, which refuses it by name.
389
+ if (placement?.storage.kind === 'host-namespace' && ctx.hostNamespaceReads.get(operation.value.value) === placement.storage.linkageName) {
390
+ return;
391
+ }
392
+ // The one write that seeded a formal-cell alias renders nothing: the value is
393
+ // already in the storage the cell now names (`EmitContext.formalCells`), and
394
+ // `gea_arg_0 = gea_arg_0` is the copy this exists to remove.
395
+ if (ctx.formalCells.has(operation.declaration))
396
+ return;
397
+ // The one write that makes a cell a host-method alias stores nothing: the
398
+ // value is a host member with no C++ spelling of its own, and every read of
399
+ // the cell names that member directly (`emitBindingRead`).
400
+ if (ctx.hostMethodAliases.has(operation.declaration))
401
+ return;
402
+ // The one write of a forwarded cell: its one read spells the value instead
403
+ // (`EmitContext.forwardedBindings`), so there is no cell to declare or fill.
404
+ if (ctx.forwardedBindings.get(operation.declaration)?.value.value === operation.value.value)
405
+ return;
406
+ const cell = bindingReference(ctx, operation.declaration, 'a binding write');
407
+ // The value is already published under this very cell's storage, because the
408
+ // operation that produced it wrote INTO the cell rather than into a
409
+ // temporary (`emit-json.ts`'s `jsonStringifyFillLines`). `b = b` is the copy
410
+ // that would undo it, and `b = std::move(b)` is worse.
411
+ if (ctx.valueNames.get(operation.value.value) === cellValueText(cell))
412
+ return;
413
+ // The same two authorities the read reconciles: the placement says what the
414
+ // cell holds, the plan says what the value is. `const x: string | number = 3`
415
+ // stores a `double` into a `TaggedUnion`, and that store has to be written
416
+ // out. Assigning the raw text and trusting C++ to sort it out is what
417
+ // produced `TaggedUnion<std::string, double> = double`, which C++ rejects,
418
+ // and which would have been worse had it been accepted: an implicit
419
+ // conversion there picks an arm nobody chose.
420
+ //
421
+ // This asked `widenedStoreText` alone until 2026-09-03, on the reasoning
422
+ // that a read narrows and a write widens. That is true of the direction a
423
+ // cell's DECLARED type travels and false of the direction a VALUE can: a
424
+ // binding initialized from a dynamic carrier -- `const back = boxed as Point`
425
+ // -- is a write whose value must be NARROWED out of a box before the cell can
426
+ // hold it. Those stores fell through to the raw operand text and emitted
427
+ // `double = gea::Value` / `gea::Ref<Point> = gea::Value`, which only clang
428
+ // caught, and only because `gea::Value` happens to declare no conversion
429
+ // operator. `convertedValueText` is a strict superset of the call this
430
+ // replaces -- its own last line is this same `widenedStoreText` -- so the
431
+ // widening cases are untouched and the narrowing ones stop being dropped.
432
+ const held = ctx.placements.get(operation.declaration)?.representation;
433
+ const rawText = operandText(ctx, operation.value);
434
+ const conversionInput = held ? owningConversionInputText(ctx, operation.value, held, rawText) : rawText;
435
+ const converted = held
436
+ ? (() => {
437
+ try {
438
+ return (alignedValueText(ctx, 'emit-bindings.ts:491', operation.value.representation, held, conversionInput) ??
439
+ structuralRecordViewText(ctx, operation.value.representation, held, rawText));
440
+ }
441
+ catch (error) {
442
+ // A representation-only conversion may reject a record pair before
443
+ // the emitter's layout table gets a chance to prove its structural
444
+ // view. Treat only the named conversion refusal as a failed first
445
+ // candidate; the layout-aware converter remains authoritative for
446
+ // native-record and class-backed records.
447
+ if (!isCppEmitBlockedError(error))
448
+ throw error;
449
+ return structuralRecordViewText(ctx, operation.value.representation, held, rawText);
450
+ }
451
+ })()
452
+ : null;
453
+ // FAIL CLOSED, the same rule `emit-return.ts`'s own ABI-result guard already
454
+ // enforces for a `return`: `convertedValueText` answers `rawText` unchanged
455
+ // whenever the two carriers already agree, so `null` here -- with a `held`
456
+ // carrier actually present -- means no recipe exists for this pair, not that
457
+ // none was needed. Falling through to the bare operand anyway is how a
458
+ // `class-ref` value came to be assigned into a cell placed as an unrelated
459
+ // `record`: certified, preflight-clean, and rejected only by clang with
460
+ // "no viable overloaded '='" pointing at generated code, not at this refusal.
461
+ // A missing conversion is a refusal, not a silently unconverted store.
462
+ // A method read as a value stored into a cell the program declared without
463
+ // a receiver -- `const twice: (n: number) => number = fmt.double`. The
464
+ // receiver travels with the value, recovered from the read itself
465
+ // (`emit-callable.ts`'s `receiverBoundCallableText`); it is asked here
466
+ // rather than inside `convertedValueText` because the answer depends on
467
+ // this emitter's record of which read produced the value, not on the two
468
+ // carriers alone.
469
+ const boundReceiver = held && converted === null ? receiverBoundCallableText(ctx, operation.value, held, rawText) : null;
470
+ if (held && converted === null && boundReceiver === null) {
471
+ throw createCppEmitBlockedError(`conversion:${representationKey(operation.value.representation)}->${representationKey(held)}`,
472
+ // The KIND alone reads as a contradiction whenever both sides share it --
473
+ // "writes a function-value-dispatch into a cell placed as
474
+ // function-value-dispatch" says a value cannot be stored in a cell that
475
+ // holds exactly what it is. What differs is nested, so the difference
476
+ // walk names the position, which is the fact that says what to fix.
477
+ `writes ${operation.declaration} as a ${shortCarrierText(operation.value.representation)} into a cell placed as ` +
478
+ `${shortCarrierText(held)}, and no conversion is installed between them; ` +
479
+ carrierDifference(operation.value.representation, held));
480
+ }
481
+ // A DYING owning value moves into the cell rather than being copied into it.
482
+ // `movedValueText` declines whenever the cell holds something other than what
483
+ // the value holds, so a converted store below is never wrapped.
484
+ const valueText = movedValueText(ctx, operation.value, held ?? null, converted ?? boundReceiver ?? rawText);
485
+ // A file-scope cell is declared once by the translation unit, so every write
486
+ // to it here is an assignment. Re-declaring it in the body that happens to
487
+ // write it first would shadow the file-scope one and leave every other body
488
+ // reading a cell this one never touched. A boxed OWNED cell can also already
489
+ // be declared before its own first write reaches here: a self-referencing
490
+ // closure's allocation pre-declares an empty box so its environment can
491
+ // capture a handle to it (`emit-callable.ts`'s `ensureBoxedSlotDeclared`),
492
+ // and this initializing write then only has to fill it in.
493
+ if (!cell.owned || ctx.declaredBindings.has(operation.declaration)) {
494
+ const append = compoundAppendLines(ctx, operation, cellValueText(cell));
495
+ if (append === null)
496
+ lines.push(`${cellValueText(cell)} = ${valueText};`);
497
+ else
498
+ lines.push(...append);
499
+ // A module symbol may key a struct's declared field; its dispatcher
500
+ // recognizes the symbol by the id registered here (`records.ts`).
501
+ if (held?.kind === 'symbol' && ctx.placements.get(operation.declaration)?.storage.kind === 'region')
502
+ lines.push(`gea::detail::registerDeclaredSymbol(${cppStringLiteral(`sym(${operation.declaration})`)}, ${cellValueText(cell)});`);
503
+ return;
504
+ }
505
+ // The cell's own carrier, not the first value written into it: a cell holding
506
+ // a union that is initialized with one arm is still a union, and declaring it
507
+ // as the arm would make every later write of another arm a type error.
508
+ // A narrowed cell is declared as the integer the census chose, not as the
509
+ // double its carrier spells -- the cell IS the storage, so this is where the
510
+ // choice takes effect. A boxed cell keeps its carrier: the box is shared
511
+ // with frames this census never looked at.
512
+ const heldType = ctx.typeQueryBindings.has(operation.declaration)
513
+ ? 'gea::Value::Tag'
514
+ : ctx.integerBindings.has(operation.declaration) && !cell.boxed
515
+ ? cppNarrowedIntegerType
516
+ : cppTypeOf(held ?? operation.value.representation);
517
+ if (cell.boxed) {
518
+ // The box itself, not its pointee, is what gets declared and allocated: a
519
+ // shared cell is born already holding this first value, so every other
520
+ // frame that later copies the handle -- including a nested closure this
521
+ // very allocation is capturing itself into -- sees a fully-initialized
522
+ // cell and never observes the moment before it existed.
523
+ declareCell(ctx, cell.name, cppBoxedType(held ?? operation.value.representation));
524
+ lines.push(`${cell.name} = gea::makeRef<${heldType}>(${valueText});`);
525
+ }
526
+ else {
527
+ declareCell(ctx, cell.name, heldType);
528
+ lines.push(`${cell.name} = ${valueText};`);
529
+ }
530
+ ctx.declaredBindings.add(operation.declaration);
531
+ };
532
+ /**
533
+ * Allocates captured cells whose writes only initialize them along separate
534
+ * control-flow paths. No one branch write dominates the later closure
535
+ * allocation, so making the first rendered write allocate the handle makes
536
+ * C++ block order decide whether another branch sees a null `Ref`. The capture
537
+ * index carries the dominance proof; allocate only those cells at function
538
+ * entry and let every source write fill the already-shared pointee.
539
+ */
540
+ export const earlyCapturedCellPrologue = (ctx, body) => {
541
+ const lines = [];
542
+ for (const blockId of body.blockOrder) {
543
+ const block = body.blocks.get(blockId);
544
+ if (!block)
545
+ continue;
546
+ for (const operation of block.operations) {
547
+ if (operation.kind !== 'binding-write' || !ctx.captures.requiresEarlyBox(operation.declaration))
548
+ continue;
549
+ if (ctx.declaredBindings.has(operation.declaration))
550
+ continue;
551
+ const placement = ctx.placements.get(operation.declaration);
552
+ if (placement?.storage.kind !== 'local' || placement.storage.owner !== ctx.owner)
553
+ continue;
554
+ const held = placement.representation;
555
+ if (!held || held.kind === 'unresolved' || held.kind === 'void')
556
+ continue;
557
+ const cell = bindingReference(ctx, operation.declaration, 'an early captured cell');
558
+ if (!cell.owned || !cell.boxed)
559
+ continue;
560
+ declareCell(ctx, cell.name, cppBoxedType(held));
561
+ lines.push(`${cell.name} = gea::makeRef<${cppTypeOf(held)}>();`);
562
+ ctx.declaredBindings.add(operation.declaration);
563
+ }
564
+ }
565
+ return lines;
566
+ };
567
+ /**
568
+ * Which of this body's cells are a formal it already holds.
569
+ *
570
+ * A parameter's cell is seeded by one write whose value is the `parameter`
571
+ * operation itself, and where nothing writes it again the cell and the formal
572
+ * are the same value in two storages. Naming the formal removes the second --
573
+ * one `gea::Ref` retain/release, or one `std::string` heap copy, per call.
574
+ *
575
+ * Every condition here is a way the two could be different storages rather
576
+ * than a heuristic. More than one write means a later value the formal would
577
+ * not have. A boxed cell is shared with a closure this body cannot speak for.
578
+ * A cell some other frame owns is not this frame's formal at all. And a
579
+ * narrowed cell is a `long long` where its formal is a `double`, which is the
580
+ * one case where the C++ spellings genuinely disagree -- so they are compared,
581
+ * rather than assumed equal because the representations are.
582
+ */
583
+ export const collectFormalCells = (ctx, prepass, body) => {
584
+ const formals = new Map();
585
+ const seeds = new Map();
586
+ for (const block of body.blocks.values()) {
587
+ for (const operation of allOperationsOf(block)) {
588
+ if (operation.kind === 'parameter') {
589
+ const declared = ctx.abi?.parameters[operation.ordinal];
590
+ if (declared)
591
+ formals.set(operation.result.id, { name: cppFormalName(operation.ordinal), type: cppAbiParameterType(declared) });
592
+ if (ctx.narrowedFormals.has(operation.ordinal))
593
+ prepass.narrowedFormalValues.add(operation.result.id);
594
+ continue;
595
+ }
596
+ if (operation.kind === 'receiver') {
597
+ const declared = ctx.abi?.receiver;
598
+ if (declared)
599
+ formals.set(operation.result.id, { name: cppReceiverName, type: cppTypeOf(declared) });
600
+ continue;
601
+ }
602
+ if (operation.kind === 'binding-write')
603
+ seeds.set(operation.declaration, operation.value);
604
+ }
605
+ }
606
+ for (const [declaration, value] of seeds) {
607
+ const formal = formals.get(value.value);
608
+ if (formal === undefined)
609
+ continue;
610
+ if ((ctx.bindingWriteCounts.get(declaration) ?? 0) !== 1)
611
+ continue;
612
+ if (ctx.integerBindings.has(declaration) || ctx.captures.isBoxed(declaration))
613
+ continue;
614
+ const placement = ctx.placements.get(declaration);
615
+ if (!placement || placement.storage.kind !== 'local' || placement.storage.owner !== ctx.owner)
616
+ continue;
617
+ const held = placement.representation;
618
+ if (!held || held.kind === 'unresolved' || held.kind === 'void')
619
+ continue;
620
+ if (cppTypeOf(held) !== formal.type || representationKey(held) !== representationKey(value.representation))
621
+ continue;
622
+ prepass.formalCells.set(declaration, formal.name);
623
+ }
624
+ };
625
+ /**
626
+ * A call result whose ONLY use is the binding write that immediately follows
627
+ * it, censused before anything renders.
628
+ *
629
+ * `s = JSON.stringify(v)` lowers to a call that mints a fresh `std::string`
630
+ * and a write that copies -- or moves -- that string into `s`'s cell. The
631
+ * string the call built is a heap buffer of the whole document, allocated on
632
+ * every call and freed on the next; a loop that stringifies the same value ten
633
+ * thousand times allocates and frees ten thousand buffers of the same size,
634
+ * when the cell already holds one big enough. Serializing straight INTO the
635
+ * cell reuses its capacity and skips the temporary entirely -- measured on the
636
+ * five stringify fixtures at 5.3% (number array) to 13.7% (records).
637
+ *
638
+ * Only the IMMEDIATELY following write qualifies, and only when the value has
639
+ * no other use: anything between the call and the write could read the cell,
640
+ * and the fill has already emptied it by then. A relocated result is excluded
641
+ * for the same reason -- a loop-invariant call renders in the preheader, which
642
+ * is not in front of the write at all.
643
+ *
644
+ * Who may act on it is `emit-json.ts`'s `jsonStringifyFillLines`; this only
645
+ * says which results are adjacent to their sink.
646
+ */
647
+ export const collectDirectBindingSinks = (prepass, body, relocated) => {
648
+ const uses = new Map();
649
+ for (const block of body.blocks.values()) {
650
+ for (const operation of allOperationsOf(block)) {
651
+ for (const operand of operandsOfIrOperation(operation))
652
+ uses.set(operand.value, (uses.get(operand.value) ?? 0) + 1);
653
+ }
654
+ }
655
+ for (const block of body.blocks.values()) {
656
+ for (const [index, operation] of block.operations.entries()) {
657
+ if (operation.kind !== 'call' || operation.result === null)
658
+ continue;
659
+ if (relocated.has(operation.result.id))
660
+ continue;
661
+ const next = block.operations[index + 1];
662
+ if (!next || next.kind !== 'binding-write' || next.value.value !== operation.result.id)
663
+ continue;
664
+ if (uses.get(operation.result.id) !== 1)
665
+ continue;
666
+ prepass.directBindingSinks.set(operation.result.id, next.declaration);
667
+ }
668
+ }
669
+ };
670
+ /**
671
+ * Which SSA values ARE a PROGRAM class object that this program introduces no
672
+ * cell for.
673
+ *
674
+ * A class object becomes a cell through `bind-class-value` and the name
675
+ * binding minted beside it (`normalize/producers/class-lifecycle.ts`), and the
676
+ * census does not walk a generic declaration the program never instantiates
677
+ * (`normalize/census.ts`: "There is no such function in this program, so
678
+ * nothing is recorded for it"). A program can still NAME such a class -- a
679
+ * `ReadableStream` arm the checker types, never constructed, tested for with
680
+ * `body instanceof ReadableStream` -- and that read then names a declaration
681
+ * nothing introduced.
682
+ *
683
+ * Rendering nothing is the whole answer for that read, because every site that
684
+ * can use a program class spells it from the DECLARATION its carrier names
685
+ * rather than from a cell: `new C` goes through the class's construct
686
+ * convention, `C.m` through the static's own home, and `v instanceof C`
687
+ * through the hierarchy census's recipe -- `emit-instanceof.ts`'s
688
+ * `constructor-family` branch never renders this operand at all. Recorded
689
+ * rather than silently skipped so that a genuine VALUE use -- storing the
690
+ * class object, passing it -- refuses by name in `operandText` instead of
691
+ * crashing on a value no operation defined.
692
+ *
693
+ * Settled before anything renders, from two authorities' settled answers: the
694
+ * placement map and the read's own planned carrier.
695
+ */
696
+ export const classObjectReadsOf = (body, placements) => {
697
+ const reads = new Map();
698
+ for (const block of body.blocks.values()) {
699
+ for (const operation of allOperationsOf(block)) {
700
+ if (operation.kind !== 'binding-read')
701
+ continue;
702
+ if (placements.has(operation.declaration))
703
+ continue;
704
+ if (operation.result.representation.kind !== 'constructor-family')
705
+ continue;
706
+ reads.set(operation.result.id, operation.declaration);
707
+ }
708
+ }
709
+ return reads;
710
+ };
711
+ /**
712
+ * Which SSA values ARE a host class object or singleton rather than hold one.
713
+ *
714
+ * A host's class object produces no C++ at all: there is no cell to load from,
715
+ * and what the program does with the class -- constructs it, reads its class
716
+ * members -- is spelled whole by the host at the site that does it. A
717
+ * singleton is the same physical answer for the same reason. Both are
718
+ * recorded so a program that instead wants the class as a VALUE refuses by
719
+ * name (`operandText`) rather than naming a variable nothing declares, and so
720
+ * `emit-host-properties.ts` can tell a receiver that renders as text from one
721
+ * that renders as nothing at all.
722
+ *
723
+ * Settled before anything renders (invariant 5: no write during render).
724
+ * Every input is already an authority's answer: the seed is
725
+ * `BindingPlacement.storage`, which projection decided, and the three
726
+ * propagation steps carry that identity onto the SSA views a program makes of
727
+ * it -- a `convert` to a native handle, and a store threading its receiver
728
+ * onward. Nothing here asks a printer anything, which is why it was never a
729
+ * render-time write except by history.
730
+ */
731
+ export const hostClassReadsOf = (body, placements) => {
732
+ const reads = new Map();
733
+ for (const block of body.blocks.values()) {
734
+ for (const operation of allOperationsOf(block)) {
735
+ if (operation.kind === 'binding-read') {
736
+ const storage = placements.get(operation.declaration)?.storage;
737
+ if (storage?.kind === 'host-class' || storage?.kind === 'host-singleton') {
738
+ reads.set(operation.result.id, {
739
+ kind: storage.kind === 'host-class' ? 'class' : 'singleton',
740
+ declaration: operation.declaration,
741
+ linkageName: storage.linkageName
742
+ });
743
+ }
744
+ }
745
+ else if (operation.kind === 'convert') {
746
+ // The identity travels onto the new SSA view so its native member path
747
+ // stays available; only a native handle can carry it.
748
+ const inherited = reads.get(operation.source.value);
749
+ if (inherited !== undefined && operation.result.representation.kind === 'native-handle')
750
+ reads.set(operation.result.id, inherited);
751
+ }
752
+ else if (operation.kind === 'set' || operation.kind === 'define-own-property') {
753
+ // A store threads its receiver onward, and a store whose receiver IS
754
+ // the host object is a host property store by construction.
755
+ const inherited = reads.get(operation.receiver.value);
756
+ if (inherited !== undefined && operation.result !== null)
757
+ reads.set(operation.result.id, inherited);
758
+ }
759
+ }
760
+ }
761
+ // `emit-context.ts`'s `unwrapPresentValue` narrows an optional-carried value
762
+ // to a printer-level view whose id is not an SSA value at all, and that view
763
+ // inherits the identity: if the value IS the host object, so is the value
764
+ // proven present. Stated here rather than minted at the narrowing, which is
765
+ // a render-time act; nothing reads the view unless the narrowing made one.
766
+ for (const [value, read] of [...reads])
767
+ reads.set(`${value}:present`, read);
768
+ return reads;
769
+ };