@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,39 @@
1
+ import type { Representation } from '../../representation/model.js';
2
+ /**
3
+ * The JavaScript answer for a comparison between two string CONSTANTS.
4
+ *
5
+ * A `string` constant is emitted as a C++ string literal, and a C++ string
6
+ * literal is a `const char[N]` -- an initializer the carrier converts from, not
7
+ * a value of the carrier. That is invisible everywhere except between two of
8
+ * them, where `("object") != ("undefined")` compares two array ADDRESSES.
9
+ * Whether two literals even have distinct addresses is up to the linker, so
10
+ * `("a") == ("a")` is permitted to answer false; clang says as much
11
+ * (`-Warray-compare`, `-Wstring-compare`) and it was emitted by every gea app,
12
+ * because `@geastack/core`'s runtime guards its host globals with `typeof X !==
13
+ * "undefined"` and `typeof` had already folded to a constant.
14
+ *
15
+ * Both operands are known here, so this is not a runtime question. Answering it
16
+ * in the source language is also the only way to answer it correctly: relational
17
+ * comparison of strings is by UTF-16 code unit (ECMA-262 7.2.13), which is what
18
+ * comparing the two contents here does, while `std::string`'s `<` compares
19
+ * UTF-8 bytes and disagrees outside the BMP.
20
+ *
21
+ * Only reached when BOTH sides are constants. One constant against a real value
22
+ * is already correct -- `std::string == "literal"` selects the `const char *`
23
+ * overload and compares contents -- so it is left alone.
24
+ */
25
+ export declare const constantStringComparisonText: (operator: string, left: string, right: string) => string | null;
26
+ export declare const callableIdentityEqualityText: (operator: string, left: {
27
+ readonly text: string;
28
+ readonly representation: Representation;
29
+ }, right: {
30
+ readonly text: string;
31
+ readonly representation: Representation;
32
+ }) => string | null;
33
+ export declare const strictEqualityText: (operator: string, left: {
34
+ readonly text: string;
35
+ readonly representation: Representation;
36
+ }, right: {
37
+ readonly text: string;
38
+ readonly representation: Representation;
39
+ }) => string | null;
@@ -0,0 +1,472 @@
1
+ import { representationKey } from '../../representation/model.js';
2
+ import { absenceComparisonText } from './emit-presence.js';
3
+ import { emptyArraySentinelText, widenedStoreText } from './emit-narrowing.js';
4
+ import { typeofTextFor } from './emit-typeof.js';
5
+ /**
6
+ * `===` and `!==` where one side is a sum -- ECMA-262 7.2.16 IsStrictlyEqual.
7
+ *
8
+ * "Sum" is both of this backend's: a `tagged-union`, and an `optional`, whose
9
+ * two arms are discriminated by `has_value()` rather than by an index.
10
+ *
11
+ * The generic binary path cannot answer these. Two carriers that differ send it
12
+ * to its mixed-carrier refusal, and two `gea::TaggedUnion`s that agree send it
13
+ * to `binaryOperatorFor`, which has no `==` for a sum: the C++ type holds a raw
14
+ * byte buffer plus an index, so the compiler-generated comparison it does not
15
+ * have would be comparing padding.
16
+ *
17
+ * 7.2.16 is a two-step rule and both steps are decidable here. Step 1 -- "if
18
+ * Type(x) is not Type(y), return false" -- is the discriminant, which a tagged
19
+ * union carries as its own index and a concrete operand carries in its carrier.
20
+ * Step 2 is the arm's own comparison. So `name === 'error'` over a
21
+ * `string | symbol` is `name.is<0>() && name.get<0>() == "error"`, exactly, and
22
+ * a concrete operand whose carrier matches NO arm is the constant `false`
23
+ * without reading anything.
24
+ *
25
+ * Deliberately `===`/`!==` only. `==` is 7.2.15, which converts -- a union arm
26
+ * against a number would run `ToPrimitive`/`ToNumber`, and choosing which side
27
+ * converts is the conversion algebra's decision, not this file's.
28
+ */
29
+ /**
30
+ * Whether C++ `==` on this carrier IS JavaScript's `===` for the values it holds.
31
+ *
32
+ * Not a general "is comparable" test: what has to hold is that the two agree.
33
+ * `std::string` and `double` compare by value, which is 7.2.16 for a string and
34
+ * a number (`NaN != NaN` and `+0 == -0` are the same in both languages), and a
35
+ * `shared_ptr` compares by address, which is 7.2.16's reference identity for an
36
+ * object. A `native-handle` is left out even though it has a `bool` conversion:
37
+ * a host's own struct states no `==` at all, and inventing one would compare
38
+ * whatever the wrapper happens to hold.
39
+ */
40
+ const armComparesByValue = (representation) => {
41
+ if (representation.kind === 'string' || representation.kind === 'scalar' || representation.kind === 'symbol')
42
+ return true;
43
+ if (representation.kind === 'class-ref' ||
44
+ representation.kind === 'native-record-ref' ||
45
+ representation.kind === 'record' ||
46
+ representation.kind === 'record-with-index' ||
47
+ representation.kind === 'array-object' ||
48
+ representation.kind === 'dictionary' ||
49
+ representation.kind === 'typed-array' ||
50
+ representation.kind === 'array-buffer' ||
51
+ representation.kind === 'shared-array-buffer' ||
52
+ representation.kind === 'data-view' ||
53
+ representation.kind === 'keyed-collection') {
54
+ return representation.ownership === 'shared-refcount';
55
+ }
56
+ return false;
57
+ };
58
+ /** An arm that IS an absent value: two operands both holding it are equal without reading anything. */
59
+ const isAbsentArm = (representation) => representation.kind === 'null' || representation.kind === 'undefined';
60
+ const callableIdentityCarrier = (representation) => representation.kind === 'function-value-dispatch' || representation.kind === 'function-and-constructor';
61
+ const negate = (operator, text) => operator === '!==' ? (text === 'true' ? 'false' : text === 'false' ? 'true' : `!(${text})`) : text;
62
+ /** One arm's comparison against a same-carrier value, or `null` when this backend cannot state it. */
63
+ /**
64
+ * The answer for two carriers that are not the same key, when neither is a sum
65
+ * to walk -- `'false'` where 7.2.16 step 1 settles it ("If Type(x) is not
66
+ * Type(y), return false"), and `null`, a REFUSAL, where it does not.
67
+ *
68
+ * Two callables are the case that makes the distinction load-bearing. Their
69
+ * C++ carriers differ whenever monomorphization gave one declaration two
70
+ * copies, or an adapter re-spelled a signature -- and `gea::CallableObject`
71
+ * carries a `Ref<FunctionObjectIdentity>` across exactly those transforms on
72
+ * purpose, precisely so that all of them remain ONE ECMAScript function
73
+ * object. So a differing carrier key proves nothing about identity here, and
74
+ * folding to `false` answers a question the carriers were never entitled to
75
+ * settle.
76
+ *
77
+ * Measured: `stack[0] === Impl.a` over a namespace-qualified generic function
78
+ * rendered as the constant `false` while node answers `true`, which turned
79
+ * `test/runtime/generic-state-function-array.ts`'s loop condition into an
80
+ * infinite loop. The identical program written with NON-generic functions --
81
+ * one copy, one carrier -- refused fail-closed at the mixed-carrier boundary
82
+ * instead, which is what made the fold visible as a fail-OPEN: the same
83
+ * comparison was refused in the shape that had no answer and answered wrongly
84
+ * in the shape that had two carriers for one function object.
85
+ *
86
+ * `typeofTextFor` is the one authority for "what type does the language say
87
+ * this carrier holds", already keyed by complete representation for the
88
+ * `typeof` operator itself; asking it here rather than restating a second
89
+ * table is what keeps the two from ever disagreeing.
90
+ */
91
+ const foldedCarrierMismatchText = (left, right) => {
92
+ const leftType = typeofTextFor(left);
93
+ const rightType = typeofTextFor(right);
94
+ if (leftType === null || rightType === null)
95
+ return null;
96
+ return leftType === rightType ? null : 'false';
97
+ };
98
+ const armEqualityText = (arm, leftText, rightText) => {
99
+ if (isAbsentArm(arm))
100
+ return 'true';
101
+ const callable = callableIdentityEqualityText('===', { text: leftText, representation: arm }, { text: rightText, representation: arm });
102
+ if (callable !== null)
103
+ return callable;
104
+ // A sum nested in a sum (`undefined | null | (string | number | boolean)`,
105
+ // the shape a three-way absence gives a union payload) is the same
106
+ // question one level down.
107
+ if (arm.kind === 'tagged-union' || arm.kind === 'optional') {
108
+ return strictEqualityText('===', { text: leftText, representation: arm }, { text: rightText, representation: arm });
109
+ }
110
+ return armComparesByValue(arm) ? `${leftText} == ${rightText}` : null;
111
+ };
112
+ /**
113
+ * The JavaScript answer for a comparison between two string CONSTANTS.
114
+ *
115
+ * A `string` constant is emitted as a C++ string literal, and a C++ string
116
+ * literal is a `const char[N]` -- an initializer the carrier converts from, not
117
+ * a value of the carrier. That is invisible everywhere except between two of
118
+ * them, where `("object") != ("undefined")` compares two array ADDRESSES.
119
+ * Whether two literals even have distinct addresses is up to the linker, so
120
+ * `("a") == ("a")` is permitted to answer false; clang says as much
121
+ * (`-Warray-compare`, `-Wstring-compare`) and it was emitted by every gea app,
122
+ * because `@geastack/core`'s runtime guards its host globals with `typeof X !==
123
+ * "undefined"` and `typeof` had already folded to a constant.
124
+ *
125
+ * Both operands are known here, so this is not a runtime question. Answering it
126
+ * in the source language is also the only way to answer it correctly: relational
127
+ * comparison of strings is by UTF-16 code unit (ECMA-262 7.2.13), which is what
128
+ * comparing the two contents here does, while `std::string`'s `<` compares
129
+ * UTF-8 bytes and disagrees outside the BMP.
130
+ *
131
+ * Only reached when BOTH sides are constants. One constant against a real value
132
+ * is already correct -- `std::string == "literal"` selects the `const char *`
133
+ * overload and compares contents -- so it is left alone.
134
+ */
135
+ export const constantStringComparisonText = (operator, left, right) => {
136
+ if (operator === '===' || operator === '==')
137
+ return left === right ? 'true' : 'false';
138
+ if (operator === '!==' || operator === '!=')
139
+ return left === right ? 'false' : 'true';
140
+ if (operator === '<')
141
+ return left < right ? 'true' : 'false';
142
+ if (operator === '>')
143
+ return left > right ? 'true' : 'false';
144
+ if (operator === '<=')
145
+ return left <= right ? 'true' : 'false';
146
+ if (operator === '>=')
147
+ return left >= right ? 'true' : 'false';
148
+ return null;
149
+ };
150
+ /** The array carrier a comparison's other side holds: itself, its optional payload, or its one array arm. */
151
+ const arrayCarrierWithin = (representation) => {
152
+ if (representation.kind === 'array-object')
153
+ return representation;
154
+ if (representation.kind === 'optional')
155
+ return arrayCarrierWithin(representation.payload);
156
+ if (representation.kind === 'tagged-union') {
157
+ const arrays = representation.arms.flatMap((arm) => (arm.value.kind === 'array-object' ? [arm.value] : []));
158
+ const only = arrays[0];
159
+ return arrays.length === 1 && only ? only : null;
160
+ }
161
+ return null;
162
+ };
163
+ /**
164
+ * Two CALLABLES compared by allocation identity, or `null` when neither pair
165
+ * of carriers is one.
166
+ *
167
+ * `CallableObject` retains one shared function-object owner through every ABI
168
+ * adapter, so comparing that owner is exact across two different C++ template
169
+ * instantiations -- which is the whole reason it cannot be an `operator==`:
170
+ * the two sides need not have the same C++ type, and often do not.
171
+ * `function-and-constructor` is the same identity carrier under another name;
172
+ * `gea::CallableConstructorObject` lays out `invoke`/`environment`/
173
+ * `environmentOwner`/`functionObject` exactly like `gea::CallableObject`,
174
+ * because a source function usable both as `f()` and `new f()` is still one
175
+ * allocation with one identity.
176
+ *
177
+ * Loose equality has the same answer: both operands already have ECMAScript
178
+ * Function type, so 7.2.15 falls through to 7.2.16 unchanged.
179
+ *
180
+ * Lives here rather than inline in `emit.ts` so that every path reaching an
181
+ * equality asks it -- the bare pair, and the one an OPTIONAL wraps.
182
+ * `stateStack[stackIndex] !== State.done` is the second: under
183
+ * `noUncheckedIndexedAccess` the element read is `State | undefined`, so the
184
+ * comparison arrives as `optional(callable)` against `callable`, recurses into
185
+ * the payload, and found no answer at all while this rule lived somewhere the
186
+ * recursion could not reach. It then fell to the arm-key test, which requires
187
+ * the two carriers to spell the SAME key -- and the whole point of comparing
188
+ * the owner is that they need not.
189
+ */
190
+ const constructorIdentityCarrier = (representation) => representation.kind === 'constructor-family' || representation.kind === 'constructor-value-dispatch';
191
+ /**
192
+ * Two CLASS CONSTRUCTORS compared by identity, or `null` when the pair is not
193
+ * two constructor carriers.
194
+ *
195
+ * `gea::ConstructorObject` carries no function-object owner: a class object
196
+ * is its construct pointer and the environment that pointer closes over, so
197
+ * two values naming the same class hold the same pair and two naming
198
+ * different classes differ in the pointer. That is exact for the shape a
199
+ * CommonJS record hands around -- `require('./box') !== require('./box')` is
200
+ * two copies of one module's `exports` -- and mirrors the callable rule's
201
+ * environment test: a class statement evaluated twice yields two objects,
202
+ * distinguished by their environments.
203
+ *
204
+ * A class evaluation's environment is its own freshly allocated state
205
+ * (`gea::allocateNativeClassMethodEnvironment`), so when there is one it alone
206
+ * is the identity: a subclass stored into its base's constructor slot is
207
+ * reached through an upcasting construct pointer (`gea::upcastConstructor`)
208
+ * and is still the same class object.
209
+ *
210
+ * A monomorphized copy has its own construct pointer, so a family naming a
211
+ * specialization copy is refused rather than answered `false` for two names
212
+ * of one generic class. The two sides need not spell the same C++ type, hence
213
+ * the `void*` view of each pointer rather than an `operator==`.
214
+ */
215
+ const constructorIdentityEqualityText = (operator, left, right) => {
216
+ if (!constructorIdentityCarrier(left.representation) || !constructorIdentityCarrier(right.representation))
217
+ return null;
218
+ for (const side of [left.representation, right.representation])
219
+ if (side.kind === 'constructor-family' && side.members.some((member) => member.includes('@')))
220
+ return null;
221
+ const equal = `([](const auto& gea_left, const auto& gea_right) -> bool { ` +
222
+ `if (gea_left.environment != nullptr) return gea_left.environment == gea_right.environment; ` +
223
+ `return reinterpret_cast<const void*>(gea_left.construct_) == reinterpret_cast<const void*>(gea_right.construct_) && ` +
224
+ `gea_right.environment == nullptr; })(${left.text}, ${right.text})`;
225
+ return operator === '!==' || operator === '!=' ? `!${equal}` : equal;
226
+ };
227
+ export const callableIdentityEqualityText = (operator, left, right) => {
228
+ if (!['===', '!==', '==', '!='].includes(operator))
229
+ return null;
230
+ const constructors = constructorIdentityEqualityText(operator, left, right);
231
+ if (constructors !== null)
232
+ return constructors;
233
+ if (!callableIdentityCarrier(left.representation) || !callableIdentityCarrier(right.representation))
234
+ return null;
235
+ // TWO tests, in the order ECMAScript's own answer requires.
236
+ //
237
+ // A function with NO captured environment is one object however many
238
+ // monomorphic copies the compiler made of it, so the copies' shared source
239
+ // declaration is the identity -- that is what `declarationIdentity` holds and
240
+ // what `identifyCallable` installs. Without this, `State.done` compiled as
241
+ // `..._206_0` and `..._206_1` compares two allocations and answers `false`
242
+ // for two names of one function.
243
+ //
244
+ // A function that DOES carry an environment is a fresh object per
245
+ // evaluation: `function outer() { return function inner() {} }` returns a
246
+ // different `inner` every call, and both share one declaration. So the
247
+ // environment test guards the declaration test, and everything else falls
248
+ // through to the allocation comparison -- exact across two C++
249
+ // instantiations, because `CallableObject`'s copy propagates the owner, which
250
+ // is the same reason this cannot be an `operator==`.
251
+ //
252
+ // The allocation comparison reads through `functionObjectIdentity()`, not
253
+ // the `functionObject` field directly: a heap-environment closure anchors
254
+ // its identity lazily in its environment block (`gea_runtime.h`'s
255
+ // `EnvironmentIdentityHeader`) and mints nothing at allocation, so the field
256
+ // itself may still be empty on BOTH sides here even though they are the
257
+ // same function object. `functionObjectIdentity()` is what resolves that --
258
+ // through the override, the anchor, or a fallback mint -- and this is the
259
+ // first point anything actually asks, so it is also where the mint (if any
260
+ // is still needed at all) legitimately happens.
261
+ //
262
+ // Written as one generic lambda so each side's text is mentioned once: the
263
+ // operand this reaches through an optional payload is a whole nested
264
+ // conditional, and spelling it six times is unreadable emitted code.
265
+ const equal = `([](const auto& gea_left, const auto& gea_right) -> bool { ` +
266
+ `if (gea_left.environment == nullptr && gea_right.environment == nullptr) { ` +
267
+ `const void* gea_left_decl = gea::callableDeclarationIdentityOf(gea_left.functionObjectIdentity()); ` +
268
+ `const void* gea_right_decl = gea::callableDeclarationIdentityOf(gea_right.functionObjectIdentity()); ` +
269
+ `if (gea_left_decl != nullptr && gea_right_decl != nullptr) return gea_left_decl == gea_right_decl; } ` +
270
+ `const auto& gea_left_identity = gea_left.functionObjectIdentity(); ` +
271
+ `return static_cast<bool>(gea_left_identity) && gea_left_identity == gea_right.functionObjectIdentity(); })` +
272
+ `(${left.text}, ${right.text})`;
273
+ return operator === '!==' || operator === '!=' ? `!${equal}` : equal;
274
+ };
275
+ export const strictEqualityText = (operator, left, right) => {
276
+ if (operator !== '===' && operator !== '!==')
277
+ return null;
278
+ // The box on either side. Answered before the sums below because a
279
+ // `dynamic` operand settles the comparison whatever the other side is: the
280
+ // tag `Value` carries IS 7.2.16's Type(x), so step 1 is a runtime test
281
+ // rather than a static one, and no carrier the other side could have makes
282
+ // that any less true.
283
+ //
284
+ // A concrete operand is boxed to meet it, which is not a coercion: boxing
285
+ // records the JavaScript type the carrier already had (`dynamicTagFor`), so
286
+ // `signal.aborted === true` compares a Boolean tag against a Boolean tag and
287
+ // answers false for a `signal.aborted` holding the string "true", exactly as
288
+ // the language says. A carrier `widenedStoreText` cannot box has no
289
+ // JavaScript type this backend can name, and refusing is then the only
290
+ // answer that is not a guess.
291
+ const dynamicSide = left.representation.kind === 'dynamic' || right.representation.kind === 'dynamic';
292
+ if (dynamicSide) {
293
+ const box = (side, against) => side.representation.kind === 'dynamic' ? side.text : widenedStoreText(against, side.representation, side.text);
294
+ const leftText = box(left, right.representation);
295
+ const rightText = box(right, left.representation);
296
+ if (leftText === null || rightText === null)
297
+ return null;
298
+ return negate(operator, `gea::Value::strictEquals(${leftText}, ${rightText})`);
299
+ }
300
+ // An OPTIONAL on exactly one side. `gea::Optional<T>` is a sum too -- two
301
+ // arms, with `has_value()` for the discriminant instead of an index -- so
302
+ // 7.2.16 reads exactly as it does below: step 1 is the presence test, since
303
+ // an absent optional's Type is Undefined/Null and a present value of any
304
+ // other type never shares it, and step 2 is the payload's own comparison.
305
+ //
306
+ // `boolean | undefined === true` is what reaches here, and before this it
307
+ // reached `emitCompute`'s mixed-carrier refusal instead -- "optional and
308
+ // scalar need a conversion this emitter has no recipe for". There is no
309
+ // conversion to install: the comparison is not one.
310
+ //
311
+ // Against `null`/`undefined` this is never reached: `absenceComparisonText`
312
+ // answers those first. Two optionals compare their absence tags before
313
+ // reading either payload: undefined equals undefined, while undefined does
314
+ // not equal null, regardless of their payload carriers.
315
+ // `elements === emptyArray`: a `never[]` side compares against the other
316
+ // side's own array carrier, as the one empty array of that element type
317
+ // (`emptyArraySentinelText`) -- the identity that comparison exists to
318
+ // test. Only that side is rewritten; the recursion then sees two carriers
319
+ // of one key, or an optional/union holding one.
320
+ // Asked WITHOUT requiring the two carriers to spell one key. Two monomorphic
321
+ // copies of one source function have different keys and are the same
322
+ // JavaScript function object, which is exactly the pair
323
+ // `stateStack[stackIndex] !== State.done` compares once the element read's
324
+ // `State | undefined` has been unwrapped.
325
+ const callableIdentity = callableIdentityEqualityText(operator, left, right);
326
+ if (callableIdentity !== null)
327
+ return callableIdentity;
328
+ const sentinelSide = (side, against) => {
329
+ if (side.representation.kind !== 'array-object' || side.representation.element.kind !== 'undefined')
330
+ return null;
331
+ const target = arrayCarrierWithin(against);
332
+ if (target === null || representationKey(target) === representationKey(side.representation))
333
+ return null;
334
+ const text = emptyArraySentinelText(side.representation, target, side.text);
335
+ return text === null ? null : { text, representation: target };
336
+ };
337
+ const leftAsSentinel = sentinelSide(left, right.representation);
338
+ if (leftAsSentinel !== null)
339
+ return strictEqualityText(operator, leftAsSentinel, right);
340
+ const rightAsSentinel = sentinelSide(right, left.representation);
341
+ if (rightAsSentinel !== null)
342
+ return strictEqualityText(operator, left, rightAsSentinel);
343
+ const leftOptional = left.representation.kind === 'optional' ? left.representation : null;
344
+ const rightOptional = right.representation.kind === 'optional' ? right.representation : null;
345
+ if (leftOptional && rightOptional) {
346
+ const leftPayload = { text: `(*${left.text})`, representation: leftOptional.payload };
347
+ const rightPayload = { text: `(*${right.text})`, representation: rightOptional.payload };
348
+ const compared = strictEqualityText('===', leftPayload, rightPayload) ??
349
+ (representationKey(leftOptional.payload) === representationKey(rightOptional.payload)
350
+ ? armEqualityText(leftOptional.payload, leftPayload.text, rightPayload.text)
351
+ : null);
352
+ if (compared === null)
353
+ return null;
354
+ const absent = leftOptional.absence === rightOptional.absence ? `!(${right.text}).has_value()` : 'false';
355
+ return negate(operator, `((${left.text}).has_value() ? ((${right.text}).has_value() && (${compared})) : (${absent}))`);
356
+ }
357
+ if ((leftOptional === null) !== (rightOptional === null)) {
358
+ const optional = leftOptional ?? rightOptional;
359
+ if (!optional)
360
+ return null;
361
+ const optionalText = leftOptional ? left.text : right.text;
362
+ const other = leftOptional ? right : left;
363
+ const present = `(${optionalText}).has_value()`;
364
+ // The payload may itself be a sum. Comparing its carrier key with a
365
+ // concrete operand would incorrectly fold Optional<string | T[]> ===
366
+ // 'plain' to false. Recursively dispatch the live payload, keeping the
367
+ // presence test outside so no absent payload is read.
368
+ const payload = { text: `(*${optionalText})`, representation: optional.payload };
369
+ const compared = strictEqualityText('===', payload, other) ??
370
+ (representationKey(optional.payload) === representationKey(other.representation)
371
+ ? armEqualityText(optional.payload, payload.text, other.text)
372
+ : optional.payload.kind === 'tagged-union' || other.representation.kind === 'tagged-union'
373
+ ? null
374
+ : foldedCarrierMismatchText(optional.payload, other.representation));
375
+ if (compared === null)
376
+ return null;
377
+ const absent = absenceComparisonText('===', { text: optional.absence, representation: { kind: optional.absence } }, other);
378
+ if (absent !== null && absent !== 'false') {
379
+ return negate(operator, `(${present} ? (${compared}) : (${absent}))`);
380
+ }
381
+ return negate(operator, compared === 'true' ? present : `(${present} && (${compared}))`);
382
+ }
383
+ const leftUnion = left.representation.kind === 'tagged-union' ? left.representation : null;
384
+ const rightUnion = right.representation.kind === 'tagged-union' ? right.representation : null;
385
+ if (!leftUnion && !rightUnion) {
386
+ // Shared native object storage compares by reference identity even when
387
+ // neither operand needs a discriminant. Leave primitive literal folding
388
+ // to the existing binary path (C++ string literals compare addresses).
389
+ const value = left.representation;
390
+ // An upcast changes the layout carrier, not the object's identity. Ref's
391
+ // cross-type equality already compares the held native object addresses.
392
+ if (value.kind === 'class-ref' &&
393
+ value.ownership === 'shared-refcount' &&
394
+ right.representation.kind === 'class-ref' &&
395
+ right.representation.ownership === 'shared-refcount') {
396
+ return negate(operator, `${left.text} == ${right.text}`);
397
+ }
398
+ if ('ownership' in value &&
399
+ value.ownership === 'shared-refcount' &&
400
+ representationKey(value) === representationKey(right.representation)) {
401
+ const compared = armEqualityText(value, left.text, right.text);
402
+ return compared === null ? null : negate(operator, compared);
403
+ }
404
+ return null;
405
+ }
406
+ // Two sums: equal exactly when the same arm is live in both and that arm's
407
+ // own comparison says so. Written as a chain over the arms rather than a
408
+ // memcmp of the storage, which would compare padding, and rather than a
409
+ // single `index()` test, which would call two different strings equal.
410
+ if (leftUnion && rightUnion) {
411
+ if (representationKey(left.representation) !== representationKey(right.representation))
412
+ return null;
413
+ const arms = [];
414
+ for (const [index, arm] of leftUnion.arms.entries()) {
415
+ const compared = armEqualityText(arm.value, `${left.text}.get<${index}>()`, `${right.text}.get<${index}>()`);
416
+ if (compared === null)
417
+ return null;
418
+ arms.push(`${left.text}.is<${index}>() && ${right.text}.is<${index}>() ? (${compared}) : `);
419
+ if (arm.value.kind !== 'class-ref' && !callableIdentityCarrier(arm.value))
420
+ continue;
421
+ // Upcasting before storage can put the same object in a different
422
+ // class arm of the same sum. Discriminant inequality is not identity.
423
+ for (const [otherIndex, otherArm] of rightUnion.arms.entries()) {
424
+ if (otherIndex === index ||
425
+ (!(arm.value.kind === 'class-ref' && otherArm.value.kind === 'class-ref') &&
426
+ !(callableIdentityCarrier(arm.value) && callableIdentityCarrier(otherArm.value))))
427
+ continue;
428
+ const crossClass = strictEqualityText('===', { text: `${left.text}.get<${index}>()`, representation: arm.value }, { text: `${right.text}.get<${otherIndex}>()`, representation: otherArm.value });
429
+ if (crossClass === null)
430
+ return null;
431
+ arms.push(`${left.text}.is<${index}>() && ${right.text}.is<${otherIndex}>() ? (${crossClass}) : `);
432
+ }
433
+ }
434
+ return negate(operator, `(${arms.join('')}false)`);
435
+ }
436
+ // A sum against a concrete value: step 1 of 7.2.16 is the arm test, and a
437
+ // carrier no arm holds settles the whole comparison before the program runs.
438
+ const union = leftUnion ?? rightUnion;
439
+ const other = leftUnion ? right : left;
440
+ if (!union)
441
+ return null;
442
+ const otherKey = representationKey(other.representation);
443
+ const index = union.arms.findIndex((arm) => representationKey(arm.value) === otherKey);
444
+ const unionText = leftUnion ? left.text : right.text;
445
+ // A union may retain both a base and a derived class arm. Matching the
446
+ // base's carrier key alone would miss that same object in the derived arm.
447
+ if (index < 0 || other.representation.kind === 'class-ref' || callableIdentityCarrier(other.representation)) {
448
+ const nested = [];
449
+ for (const [nestedIndex, arm] of union.arms.entries()) {
450
+ if (arm.value.kind !== 'tagged-union' &&
451
+ arm.value.kind !== 'optional' &&
452
+ !(arm.value.kind === 'class-ref' && other.representation.kind === 'class-ref') &&
453
+ !(callableIdentityCarrier(arm.value) && callableIdentityCarrier(other.representation)))
454
+ continue;
455
+ const compared = strictEqualityText('===', { text: `${unionText}.get<${nestedIndex}>()`, representation: arm.value }, other);
456
+ if (compared === null)
457
+ return null;
458
+ if (compared !== 'false')
459
+ nested.push(`(${unionText}.is<${nestedIndex}>() && (${compared}))`);
460
+ }
461
+ return negate(operator, nested.length ? `(${nested.join(' || ')})` : 'false');
462
+ }
463
+ const arm = union.arms[index];
464
+ if (!arm)
465
+ return null;
466
+ const compared = armEqualityText(arm.value, `${unionText}.get<${index}>()`, other.text);
467
+ if (compared === null)
468
+ return null;
469
+ if (compared === 'true')
470
+ return negate(operator, `${unionText}.is<${index}>()`);
471
+ return negate(operator, `(${unionText}.is<${index}>() && (${compared}))`);
472
+ };
@@ -0,0 +1,104 @@
1
+ import type { IrValueId } from '../../identity/ids.js';
2
+ import type { IrBlockId, IrBody, IrIteratorCloseRegion, IrNonTerminatorOperation, IrOperand, IrTerminatorOperation, IrTryRegion } from '../../ir/model.js';
3
+ import { type EmitContext } from './emit-context.js';
4
+ /**
5
+ * One try statement's block range, rendered as native C++ `try`/`catch` text.
6
+ *
7
+ * The flat block model connects everything by `goto`, but C++ forbids a `goto`
8
+ * that jumps into a `try` block or a `catch` handler from outside it -- the one
9
+ * transition `emit.ts`'s ordinary per-block loop otherwise never has to
10
+ * special-case. `lower-flow.ts` already keeps that one entry a fallthrough
11
+ * rather than a jump (see `RegionBlocks`'s own comment there); this is where the
12
+ * fallthrough is actually rendered, and where the matching `}` of one side and
13
+ * the `catch (...) {`/closing `}` of the other are written by hand instead of by
14
+ * the ordinary per-block loop.
15
+ *
16
+ * Everything else about a region's blocks is ordinary. This used to walk only a
17
+ * straight run of unconditional jumps and refuse the moment it met a branch,
18
+ * on the stated grounds that "nothing in `lower-flow.ts`'s region bookkeeping
19
+ * tracks which *extra* blocks a nested guard/loop would open while a region is
20
+ * active". That was true of `lower-flow.ts` and irrelevant to the question:
21
+ * the blocks a part owns are not bookkeeping to be carried forward, they are
22
+ * a property of the finished graph -- every block reachable from the part's
23
+ * entry without passing through the region's join. `collectPartBlocks` reads
24
+ * that off the sealed body, so a `try` body may now branch, loop and merge
25
+ * like any other code. What C++ actually forbids is narrower than what was
26
+ * being refused, and it is checked directly in `verifyNoInboundJumps`.
27
+ *
28
+ * Two facts make rendering interior blocks safe. Every SSA value is declared at
29
+ * function scope (see the declaration block `emitBody` emits first, and its own
30
+ * comment about `goto` and initialized scopes), so a label inside a `try` never
31
+ * jumps past an initialization. And a `goto` OUT of a try -- to the join, to an
32
+ * enclosing loop, to a `return` -- is perfectly legal C++; only jumping IN is
33
+ * not.
34
+ *
35
+ * `emitOperation`/`emitTerminator`/`labelOf` are parameters rather than imports
36
+ * to avoid a cycle: all three are `emit.ts`'s own, and this module renders a
37
+ * whole set of arbitrary blocks -- their operations, their merge writes and
38
+ * their real terminators -- by calling back into them.
39
+ */
40
+ type EmitOperation = (ctx: EmitContext, lines: string[], operation: IrNonTerminatorOperation) => void;
41
+ type EmitTerminator = (ctx: EmitContext, lines: string[], labels: ReadonlyMap<IrBlockId, string>, isSingleBlock: boolean, terminator: IrTerminatorOperation) => void;
42
+ /** What `renderTryRegion` needs from `emit.ts` to render a region's blocks the same way the ordinary per-block loop renders every other block. */
43
+ export interface RegionRendering {
44
+ readonly emitOperation: EmitOperation;
45
+ readonly emitTerminator: EmitTerminator;
46
+ readonly labelOf: (labels: ReadonlyMap<IrBlockId, string>, block: IrBlockId) => string;
47
+ readonly labels: ReadonlyMap<IrBlockId, string>;
48
+ readonly isSingleBlock: boolean;
49
+ /**
50
+ * The merge writes `emit.ts` computed for the whole body.
51
+ *
52
+ * A branching try body is exactly the shape that produces these -- two arms
53
+ * of an `if` writing one merged variable -- and the write belongs in the
54
+ * predecessor, which is an interior block of this region. Rendering the
55
+ * region without them would drop the write and leave the merge holding
56
+ * whatever the declaration default was.
57
+ */
58
+ readonly mergeWrites: ReadonlyMap<IrBlockId, readonly {
59
+ readonly name: string;
60
+ readonly value: IrOperand;
61
+ }[]>;
62
+ /** Every region in this body by its own `tryEntry`, so a nested one can be recognized -- and refused by name -- rather than rendered as ordinary blocks. */
63
+ readonly regionByTryEntry: ReadonlyMap<IrBlockId, IrTryRegion>;
64
+ /**
65
+ * Every iterator-close/finite-destructuring-close region in this body by its
66
+ * own `entry`, for the identical reason `regionByTryEntry` exists: a `for`
67
+ * `(const x of xs) { ... }` or `const [a] = xs` written directly inside a
68
+ * `try` body/handler/finally clause makes that region's entry block one of
69
+ * THIS part's ordinary reachable blocks, and without recognizing it here it
70
+ * rendered as plain statements -- silently dropping the `CompletionGuard`
71
+ * and the inner protective `try`/`catch` IteratorClose needs. A `for`-`of`
72
+ * loop wrapped in a `try` already worked before this map existed, because
73
+ * that shape nests the other way (the loop's own iterator-close region
74
+ * contains the `try`, not the reverse); a source-level `try` wrapping a
75
+ * FINITE destructuring statement is the one shape only `preparePart` sees.
76
+ */
77
+ readonly iteratorCloseRegionByEntry: ReadonlyMap<IrBlockId, IrIteratorCloseRegion>;
78
+ /**
79
+ * Renders one iterator-close region as `emit.ts`'s own per-block loop does
80
+ * for a top-level one -- a callback rather than a direct import, because
81
+ * `emit-iterator.ts` already imports `renderTryRegion` from this module for
82
+ * the opposite nesting (a plain `try` written inside a `for`-`of` body), and
83
+ * importing back would cycle the two modules.
84
+ */
85
+ readonly renderIteratorCloseRegion: (ctx: EmitContext, lines: string[], body: IrBody, region: IrIteratorCloseRegion, rendering: RegionRendering) => readonly IrBlockId[];
86
+ /**
87
+ * The hoist plan's two halves and the block tail, as `emit.ts` writes them
88
+ * for every block it renders itself.
89
+ *
90
+ * A region's blocks are not a different kind of block, and this file's own
91
+ * header says so -- but `renderPart` used to write only operations, merge
92
+ * writes and a terminator, so a hoisted read, a dense window's setup and a
93
+ * counted fill loop were all silently dropped for anything inside a `try`.
94
+ * The first of those is not a missed optimization but a double DEFINITION:
95
+ * the relocated read renders at its destination AND at its origin.
96
+ */
97
+ readonly relocated: ReadonlySet<IrValueId>;
98
+ readonly emitHoistedInto: (ctx: EmitContext, lines: string[], block: IrBlockId) => void;
99
+ /** A dense window's setup and a counted fill loop; `true` when the fill loop replaced the block's terminator. */
100
+ readonly emitBlockTail: (ctx: EmitContext, lines: string[], block: IrBlockId) => boolean;
101
+ }
102
+ /** Renders one region's `try { } catch (...) { }` text and returns every block it consumed, so the caller can skip them in the ordinary per-block loop. */
103
+ export declare const renderTryRegion: (ctx: EmitContext, lines: string[], body: IrBody, region: IrTryRegion, rendering: RegionRendering) => readonly IrBlockId[];
104
+ export {};