@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,1105 @@
1
+ import { representationKey } from '../../../representation/model.js';
2
+ import { hostMemberTemplateOf, isArrayConstantOf } from '../../../representation/host-templates.js';
3
+ import { createCppEmitBlockedError, internSymbolKey, operandText, paddedArguments } from '../emit-context.js';
4
+ import { consoleArgumentsText, toStringRefusal, toStringText } from '../emit-tostring.js';
5
+ import { toNumberRefusal, toNumberText } from '../emit-tonumber.js';
6
+ import { booleanTestText } from '../emit-presence.js';
7
+ import { hostArgumentText, hostMemberReceiverText } from './emit-host-arity.js';
8
+ import { fillHostTemplate, hostMemberOf } from './host-members.js';
9
+ import { cppConstantLiteral, cppRecordFieldName, cppRecordFieldPresenceName, cppRecordStructName, cppResultTypeOf, cppTypeOf } from '../types.js';
10
+ import { awaitedText } from '../prototype/emit-prototype-promise.js';
11
+ import { jsonCallText } from '../emit-json.js';
12
+ import { dateConstructorCallText } from '../prototype/emit-prototype-date.js';
13
+ import { isStringObjectCarrier } from '../prototype/emit-prototype-regexp.js';
14
+ import { cppStringObjectNativeType } from '../regexp-types.js';
15
+ import { errorConstructorNames, isNativeError } from '../error-types.js';
16
+ import { objectMemberText } from './emit-host-object.js';
17
+ import { armAt, armIs } from '../emit-union-properties.js';
18
+ import { memberAccessOperator } from '../emit-carrier-members.js';
19
+ import { recordFieldsOfShape } from '../records.js';
20
+ import { typedArrayTargetSpelling } from '../emit-buffers.js';
21
+ import { alignedValueText } from '../emit-narrowing.js';
22
+ import { thrownValueCarrier } from '../../../ir/lower-exceptions.js';
23
+ import { atomicsCallSupport } from './atomics.js';
24
+ /**
25
+ * Unwraps one leading `optional<string>` (or bare `string`) parameter, or
26
+ * `null` when the convention is not that shape.
27
+ */
28
+ const leadingStringParameter = (abi) => {
29
+ const first = abi.parameters[0]?.value;
30
+ if (first === undefined)
31
+ return null;
32
+ const unwrapped = first.kind === 'optional' ? first.payload : first;
33
+ return unwrapped.kind === 'string' ? unwrapped : null;
34
+ };
35
+ /**
36
+ * `new Error(m)` / `Error(m)`.
37
+ *
38
+ * Only the ABI's own leading message parameter is ever read. A further
39
+ * parameter (`ErrorConstructor`'s `options: ErrorOptions`) is part of the
40
+ * checker's real overload set -- `widestSubsumingAbi` (host-abi.ts) admits it
41
+ * honestly, it is not invented here -- but this implementation does not act on
42
+ * it, and says so rather than pretending to. Dropping it from the emitted
43
+ * call is still sound: an argument the source actually passed was already
44
+ * lowered to its own IR operation before this one runs, so its evaluation (a
45
+ * side effect included) already happened and was already emitted; only
46
+ * *referencing* that operand's value in this call's own text is what is
47
+ * skipped.
48
+ *
49
+ * `[[Call]]` and `[[Construct]]` both produce a fresh `Error` -- ECMA-262's own
50
+ * rule -- so one renderer serves both roles.
51
+ */
52
+ /** The local an `Error` construction with a `cause` is bound to while the cause is installed on it. */
53
+ const errorCauseTargetName = 'gea_error_with_cause';
54
+ /**
55
+ * `new Error(message, { cause })` -- the cause read, with the guard that says
56
+ * whether the options bag actually carries one, or `null` when this is not an
57
+ * options carrier a definite `cause` can be read out of.
58
+ *
59
+ * The same shape `emitSuperInitialize` already reads for `super(m, { cause })`
60
+ * inside a `class X extends Error`, because it is the same installation: a
61
+ * record's absent field is a value beside a PRESENCE FLAG, not an
62
+ * `Optional<T>`, and `ErrorOptions` declares `cause?: unknown`, so every
63
+ * ordinary spelling arrives with the flag. Preserving it matters because
64
+ * ECMA-262 20.5.8.1 installs the own property only when the bag has one, and
65
+ * an error whose `cause` is `undefined` is a different object from one with no
66
+ * `cause` at all -- which `gea::runtime::Error::gea_readOwnField` answers from
67
+ * its own flag.
68
+ */
69
+ const errorCauseInstall = (ctx, options) => {
70
+ const carrier = options.representation;
71
+ const optionsText = operandText(ctx, options);
72
+ const outerGuard = carrier.kind === 'optional' ? `${optionsText}.has_value()` : null;
73
+ const payload = carrier.kind === 'optional' ? carrier.payload : carrier;
74
+ const payloadText = carrier.kind === 'optional' ? `(*${optionsText})` : optionsText;
75
+ if (payload.kind !== 'record' && payload.kind !== 'record-with-index' && payload.kind !== 'native-record-ref')
76
+ return null;
77
+ const fields = payload.kind === 'native-record-ref'
78
+ ? payload.native === null
79
+ ? recordFieldsOfShape(ctx.deriver, payload.shapeId)
80
+ : null
81
+ : payload.fields;
82
+ const cause = fields?.find((field) => field.key === 'cause');
83
+ if (cause === undefined || cause.value.kind !== 'dynamic')
84
+ return null;
85
+ const access = memberAccessOperator(payload.ownership);
86
+ const guards = [outerGuard, cause.required ? null : `${payloadText}${access}${cppRecordFieldPresenceName('cause')}`].filter((guard) => guard !== null);
87
+ return { guard: guards.length > 0 ? guards.join(' && ') : null, text: `${payloadText}${access}${cppRecordFieldName('cause')}` };
88
+ };
89
+ const renderErrorCreate = ({ ctx, protocol, abi, args, role, result }) => {
90
+ // The struct this construction MINTS is the one the program holds, not the
91
+ // one the declaration names: `create<ErrorRecord>` is a template, and an
92
+ // `as`-asserted construction publishes a wider record than
93
+ // `ErrorConstructor`'s own return type (see `HostInvocationRequest.result`).
94
+ // The declaration's carrier is the fallback for a call whose graph published
95
+ // no result at all -- `new Error(m)` as a bare statement.
96
+ const minted = result ?? abi.result;
97
+ if (isNativeError(minted)) {
98
+ const name = errorConstructorNames.get(protocol);
99
+ if (name === undefined)
100
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `no intrinsic error constructor is registered for ${protocol}`);
101
+ const message = args[0];
102
+ const text = message === undefined ? 'gea::Optional<std::string>{}' : operandText(ctx, message);
103
+ const created = `gea::host::createRuntimeError("${name}", ${text})`;
104
+ const options = args[1];
105
+ if (options === undefined || options.representation.kind === 'undefined')
106
+ return created;
107
+ const install = errorCauseInstall(ctx, options);
108
+ if (install === null) {
109
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `Error options carried as "${representationKey(options.representation)}" need a presence-preserving cause property read`);
110
+ }
111
+ // An immediately invoked lambda because the construction is an expression
112
+ // and the installation is a statement -- the guard cannot be folded into a
113
+ // conditional operator without evaluating `createRuntimeError` twice.
114
+ const statement = `${install.guard === null ? '' : `if (${install.guard}) `}${errorCauseTargetName}->setCause(${install.text});`;
115
+ return `([&]() { auto ${errorCauseTargetName} = ${created}; ${statement} return ${errorCauseTargetName}; }())`;
116
+ }
117
+ // Two carrier kinds spell one C++ type here. `native-record-ref` names a
118
+ // shape the deriver registered; `record` carries the fields inline -- which
119
+ // is what an `as RangeError & { code: string }` intersection derives, since
120
+ // its members are stated at the assertion rather than by a declared
121
+ // interface. Both are `gea::Ref<gea_record_type_N>` when the record is
122
+ // counted, which is the only ownership `create` can produce: it returns a
123
+ // `gea::Ref`, so a by-value record would be a different type entirely.
124
+ if ((minted.kind !== 'native-record-ref' && minted.kind !== 'record') || minted.ownership !== 'shared-refcount') {
125
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" ${role} result carries a "${representationKey(minted)}" carrier, but this implementation only mints a counted record`);
126
+ }
127
+ if (abi.receiver !== null) {
128
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" ${role} convention declares a receiver, which this implementation does not carry`);
129
+ }
130
+ if (leadingStringParameter(abi) === null) {
131
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" ${role} convention's leading parameter is not an optional string message, which is the only shape this implementation was built for`);
132
+ }
133
+ const message = args[0];
134
+ if (!message) {
135
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" ${role} with no message argument -- the ABI's own leading parameter was not projected`);
136
+ }
137
+ // A free function template, not a stored function pointer: a pointer inside
138
+ // `gea_runtime.h` cannot name a program's own generated struct, which is
139
+ // declared after that header is included. Instantiating at the call site,
140
+ // where the struct name is already in scope, sidesteps it entirely -- the
141
+ // same convention `gea::jsx::create<Node>(tag)` uses.
142
+ return `gea::host::${protocol}::create<${cppRecordStructName(minted.shapeId)}>(${operandText(ctx, message)})`;
143
+ };
144
+ /**
145
+ * `String(x)` -- ECMAScript `ToString` called as a function.
146
+ *
147
+ * The convention this dispatches on is the ARGUMENT's carrier, not the
148
+ * declared parameter's. `lib.es5.d.ts` types `String(value?: any)`, so the ABI
149
+ * derived from the declaration says `(optional(dynamic)) -> string` for every
150
+ * call -- which describes what the *declaration* permits, not what this call
151
+ * passes. `String(count)` where `count` is a `number` passes a `double`, and
152
+ * rendering it as a boxed dynamic would manufacture the very box the argument
153
+ * does not have. The declaration bounds what is legal; the operand says what
154
+ * is actually there, and the second is what has an implementation.
155
+ */
156
+ const renderToString = ({ ctx, protocol, abi, args, role, result }) => {
157
+ if (role === 'construct') {
158
+ // `new String(x)` mints the WRAPPER OBJECT (ECMA-262 22.1.5), never the
159
+ // primitive `role === 'call'` below produces -- so `result` (the carrier
160
+ // this call site actually holds, per `HostInvocationRequest`'s own
161
+ // comment) must be the String-object native-record-ref, not `abi.result`
162
+ // (`StringConstructor`'s declared `new (value?: any): String`, which
163
+ // resolves the same way but is not what a graph publishing no result at
164
+ // all would leave this checking against).
165
+ const minted = result ?? abi.result;
166
+ if (!isStringObjectCarrier(minted)) {
167
+ throw createCppEmitBlockedError(`host-invocation:${protocol}`, `a "${protocol}" construct result carries "${representationKey(minted)}", not the String-object carrier`);
168
+ }
169
+ const argument = args[0];
170
+ // `new String()` with no argument wraps the empty string -- ECMA-262
171
+ // 22.1.5.1 step 2's `ToString(value)` of an absent `value` is `undefined`,
172
+ // which ToStrings to `"undefined"`... except step 1 special-cases zero
173
+ // arguments to `s = ""` directly, never reaching ToString at all.
174
+ const stringified = argument
175
+ ? toStringText(operandText(ctx, argument), argument.representation, ctx.classes, ctx.deriver)
176
+ : cppConstantLiteral('', 'string', { kind: 'string' });
177
+ if (stringified === null)
178
+ throw createCppEmitBlockedError(`host-invocation:${protocol}`, toStringRefusal(argument.representation, ctx.classes, ctx.deriver));
179
+ return `gea::makeRef<${cppStringObjectNativeType}>(${stringified})`;
180
+ }
181
+ if (abi.result.kind !== 'string') {
182
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" call result carries "${abi.result.kind}", not a string`);
183
+ }
184
+ const argument = args[0];
185
+ // `String()` with no argument is the empty string, which is a constant and
186
+ // needs no conversion at all.
187
+ if (!argument)
188
+ return cppConstantLiteral('', 'string', { kind: 'string' });
189
+ const carrier = argument.representation;
190
+ const converted = toStringText(operandText(ctx, argument), carrier, ctx.classes, ctx.deriver, true);
191
+ if (converted === null)
192
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, toStringRefusal(carrier, ctx.classes, ctx.deriver));
193
+ return converted;
194
+ };
195
+ /**
196
+ * `Number(x)` -- ECMAScript `ToNumber` called as a function.
197
+ *
198
+ * Dispatches on the argument's carrier for the same reason `renderToString`
199
+ * does: `lib.es5.d.ts` declares `Number(value?: any)`, so the derived
200
+ * convention says `(optional(dynamic)) -> number` at every call site and
201
+ * describes the declaration rather than the call.
202
+ *
203
+ * `Number()` with no argument is `0`, not `NaN` -- the empty-argument case is
204
+ * its own rule in the specification, and it is not the same as
205
+ * `Number(undefined)`.
206
+ */
207
+ const renderToNumber = ({ ctx, protocol, abi, args, role }) => {
208
+ if (role !== 'call') {
209
+ throw createCppEmitBlockedError(`host-invocation:${protocol}`, `"new ${protocol}" constructs a Number *object* -- a wrapper with identity, distinct from the primitive ` +
210
+ 'ToNumber produces -- and no Number object carrier is implemented');
211
+ }
212
+ if (!(abi.result.kind === 'scalar' && abi.result.domain === 'number')) {
213
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" call result carries "${representationKey(abi.result)}", not a number`);
214
+ }
215
+ const argument = args[0];
216
+ if (!argument)
217
+ return cppConstantLiteral('0', 'number', { kind: 'scalar', domain: 'number' });
218
+ const carrier = argument.representation;
219
+ // Number() explicitly permits BigInt-to-Number; ordinary ToNumber does not.
220
+ if (carrier.kind === 'scalar' && carrier.domain === 'bigint')
221
+ return `(${operandText(ctx, argument)}).toNumber()`;
222
+ // One table, `emit-tonumber.ts`, for every carrier -- including the two this
223
+ // used to refuse outright. An `optional` states which absence it carries and
224
+ // a `tagged-union` states its arms, so both convert by dispatching on what
225
+ // the carrier already knows rather than by boxing the value to ask it at run
226
+ // time.
227
+ const converted = toNumberText(operandText(ctx, argument), carrier);
228
+ if (converted === null)
229
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, toNumberRefusal(carrier));
230
+ return converted;
231
+ };
232
+ const renderBigInt = ({ ctx, args, role }) => {
233
+ if (role !== 'call')
234
+ throw createCppEmitBlockedError('host-invocation:BigIntConstructor', 'BigInt is callable but is not a constructor');
235
+ const argument = args[0];
236
+ if (!argument)
237
+ throw createCppEmitBlockedError(`host-invocation:BigIntConstructor${role === 'call' ? '.call' : ''}`, 'BigInt requires an argument');
238
+ const carrier = argument.representation;
239
+ const text = operandText(ctx, argument);
240
+ if (carrier.kind === 'scalar') {
241
+ const input = carrier.domain === 'bigint' ? text : `static_cast<${carrier.domain === 'boolean' ? 'bool' : 'double'}>(${text})`;
242
+ return `gea::host::BigIntConstructor::create(${input})`;
243
+ }
244
+ if (carrier.kind === 'string')
245
+ return `gea::host::BigIntConstructor::create(std::string(${text}))`;
246
+ if (carrier.kind === 'dynamic')
247
+ return `gea::host::BigIntConstructor::create(${text})`;
248
+ throw createCppEmitBlockedError(`host-invocation:BigIntConstructor${role === 'call' ? '.call' : ''}`, `BigInt conversion from ${representationKey(carrier)} is not implemented`);
249
+ };
250
+ /**
251
+ * `Boolean(x)` / `Boolean()` -- ECMA-262 20.3.1.1, which is `ToBoolean` and
252
+ * nothing else.
253
+ *
254
+ * `booleanTestText` (emit-presence.ts) already IS `ToBoolean` for every carrier
255
+ * this backend has: it is what `if (x)` renders through, arm by arm for a
256
+ * tagged union, and by presence-and-payload for an optional. So the `Boolean`
257
+ * handle's own call has a real implementation the moment it is routed here --
258
+ * no new runtime half, and no separate truthiness rule that could disagree with
259
+ * the one every conditional already uses.
260
+ *
261
+ * `new Boolean(x)` is refused for the same reason `new Number(x)` is: it
262
+ * constructs a wrapper OBJECT with identity, which is a different value from
263
+ * the primitive and has no carrier here.
264
+ */
265
+ const renderToBoolean = ({ ctx, protocol, abi, args, role }) => {
266
+ if (role !== 'call') {
267
+ throw createCppEmitBlockedError(`host-invocation:${protocol}`, `"new ${protocol}" constructs a Boolean *object* -- a wrapper with identity, distinct from the primitive ` +
268
+ 'ToBoolean produces -- and no Boolean object carrier is implemented');
269
+ }
270
+ if (!(abi.result.kind === 'scalar' && abi.result.domain === 'boolean')) {
271
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" call result carries "${representationKey(abi.result)}", not a boolean`);
272
+ }
273
+ // `Boolean()` with no argument is `ToBoolean(undefined)`, which is `false`.
274
+ const argument = args[0];
275
+ if (!argument)
276
+ return cppConstantLiteral('false', 'boolean', { kind: 'scalar', domain: 'boolean' });
277
+ return booleanTestText(operandText(ctx, argument), argument.representation);
278
+ };
279
+ /**
280
+ * `Promise.resolve(x)` / `Promise.resolve()` -- ECMA-262 27.2.4.7.
281
+ *
282
+ * A `member` renderer rather than a `hostInvocations` one: the handle invoked
283
+ * here is `Promise`'s *member*, not the `Promise` handle itself (that would be
284
+ * `new Promise(executor)`, which nothing implements). `hostCallText` routes to
285
+ * it on the table's own `arity: 'call-site'` marking, because no fixed
286
+ * template can spell this call: the promise it mints is `gea::Promise<T>` with
287
+ * `T` the payload the checker gave THIS call, which is routinely a
288
+ * program-generated struct.
289
+ *
290
+ * The result's own carrier is the authority for `T`, never the argument's, and
291
+ * the difference is the whole of the spec subtlety. 27.2.4.7 step 2 returns an
292
+ * argument that is already a promise UNCHANGED instead of wrapping it, and the
293
+ * checker states the same rule in the type system: `resolve<T>(value: T)`
294
+ * returns `Promise<Awaited<T>>`, and `Awaited<T>` is `T` exactly when `T` is
295
+ * not a thenable. So "the argument's carrier is the result promise's payload"
296
+ * is not a convenience check -- it IS the proof that this call site is the
297
+ * non-thenable arm, taken from the checker's own answer rather than from a
298
+ * structural guess about what does or does not have a `then`. When the two
299
+ * disagree, `Awaited` unwrapped something, and that is the arm this refuses.
300
+ *
301
+ * `gea::Promise<V>` copies share one PromiseState, so returning the operand
302
+ * preserves the fulfillment/rejection identity required by step 2.
303
+ */
304
+ /**
305
+ * `Promise.all` -- ECMA-262 27.2.4.1.
306
+ *
307
+ * The runtime states the loop; this states what `PromiseResolve` is for ONE
308
+ * element, which is a per-carrier question the runtime cannot ask: a promise
309
+ * arm reads its settled value, a non-thenable is already its own resolution,
310
+ * and a union of both is a discriminant test away from either.
311
+ * `awaitedText` (prototype/emit-prototype-promise.ts) is that one rule, shared
312
+ * with `await`, and it is handed over as a lambda rather than restated here.
313
+ *
314
+ * An argument that is not an Array refuses by name. The specification takes any
315
+ * iterable, and every other iterable this backend carries has its own protocol
316
+ * -- reaching the Array overload with one would be a wrong answer.
317
+ */
318
+ const promiseAllText = (ctx, operation) => {
319
+ const argument = operation.arguments[0];
320
+ if (!argument)
321
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.all', 'a "PromiseConstructor.all" with no argument has nothing to resolve');
322
+ const elements = argument.representation;
323
+ if (elements.kind !== 'array-object') {
324
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.all', `"PromiseConstructor.all" over a "${representationKey(elements)}" argument is not rendered: 27.2.4.1 iterates any ` +
325
+ 'iterable, and only an Array has a stated iteration here');
326
+ }
327
+ const resolved = awaitedText(ctx, 'host/emit-host-invoke.ts:promiseAllText', elements.element, 'gea_element');
328
+ const body = resolved ?? 'gea_element';
329
+ return (`gea::host::PromiseConstructor::all(${operandText(ctx, argument)}, ` +
330
+ `[](const ${cppTypeOf(elements.element)}& gea_element) { return ${body}; })`);
331
+ };
332
+ /**
333
+ * `Promise.race` -- 27.2.4.5. The runtime states the loop and the first-settle
334
+ * rule (see its own doc); this states how ONE element is registered on the
335
+ * result, which is the per-carrier half only the emitter can answer.
336
+ *
337
+ * The difference from `all` just above is the whole reason this is a separate
338
+ * renderer rather than another `awaitedText` caller: `all` READS each element's
339
+ * settled value, and a race must not read an element at all -- reading an
340
+ * unsettled promise waits for it, which is exactly the block
341
+ * `@hono/node-server`'s `readWithoutBlocking` uses a race to avoid. So a
342
+ * promise element is ADOPTED and a non-thenable element resolves the result
343
+ * outright.
344
+ *
345
+ * `adopt` is used only when the payloads are the same C++ type, because that is
346
+ * what `gea::Promise<V>::adopt` takes. A promise of a DIFFERENT payload is
347
+ * registered through `observe`, whose fulfillment handler converts the settled
348
+ * value into the result's own carrier first -- the conversion is
349
+ * `alignedValueText`, the same one every other cross-carrier store goes
350
+ * through, so a race cannot invent a widening nothing else performs.
351
+ */
352
+ const promiseRaceElementText = (ctx, element, value) => {
353
+ const valueType = cppResultTypeOf(value);
354
+ if (element.kind === 'promise') {
355
+ if (cppResultTypeOf(element.value) === valueType)
356
+ return 'gea_result.adopt(gea_element);';
357
+ const settledType = cppTypeOf(element.value);
358
+ const converted = alignedValueText(ctx, 'host/emit-host-invoke.ts:promiseRaceElementText', element.value, value, 'gea_settled');
359
+ if (converted === null)
360
+ return null;
361
+ return (`gea_element.observe([gea_result](const ${settledType}& gea_settled) mutable { gea_result.resolve(${converted}); }, ` +
362
+ '[gea_result](std::exception_ptr gea_reason) mutable { gea_result.reject(gea_reason); });');
363
+ }
364
+ // A non-thenable IS its own resolution (27.2.4.7.1 `PromiseResolve`), so it
365
+ // settles the race the moment it is reached.
366
+ const converted = alignedValueText(ctx, 'host/emit-host-invoke.ts:promiseRaceElementText', element, value, 'gea_element');
367
+ return converted === null ? null : `gea_result.resolve(${converted});`;
368
+ };
369
+ /**
370
+ * The same race over a TUPLE argument, which is what `Promise.race([a, b])`
371
+ * carries whenever the two elements do not share one carrier -- and they
372
+ * routinely do not: `@hono/node-server` races a `Promise<Buffer>` against a
373
+ * `Promise<undefined>`, so the literal is a two-field struct, not an Array.
374
+ *
375
+ * No runtime loop, because there is nothing to loop over: a tuple's arity is a
376
+ * compile-time fact and each position has its OWN carrier, so each gets its own
377
+ * registration. That is not a shortcut around the Array path -- it is the only
378
+ * correct rendering, since one `Adopt` lambda cannot be written for two
379
+ * different element types.
380
+ *
381
+ * Registration order is the tuple's own order, which is the iteration order
382
+ * 27.2.4.5 walks its argument in, so "first settled wins" resolves the same way
383
+ * it does for the Array form.
384
+ */
385
+ const promiseRaceTupleText = (ctx, argument, tuple, value) => {
386
+ const accessor = memberAccessOperator(tuple.ownership);
387
+ const resultType = cppResultTypeOf(value);
388
+ const steps = [];
389
+ for (const [position, field] of tuple.fields.entries()) {
390
+ if (field.key !== String(position) || !field.required)
391
+ return null;
392
+ const body = promiseRaceElementText(ctx, field.value, value);
393
+ if (body === null)
394
+ return null;
395
+ steps.push(`{ const ${cppTypeOf(field.value)}& gea_element = gea_source${accessor}${cppRecordFieldName(field.key)}; ${body} }`);
396
+ }
397
+ if (steps.length === 0)
398
+ return null;
399
+ return (`[&]() -> gea::Promise<${resultType}> { const auto& gea_source = ${operandText(ctx, argument)}; ` +
400
+ `gea::Promise<${resultType}> gea_result; ${steps.join(' ')} return gea_result; }()`);
401
+ };
402
+ const promiseRaceText = (ctx, operation) => {
403
+ const argument = operation.arguments[0];
404
+ const result = operation.result?.representation;
405
+ if (!argument || result?.kind !== 'promise') {
406
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.race', 'a "PromiseConstructor.race" needs one iterable argument and a promise result carrier');
407
+ }
408
+ const elements = argument.representation;
409
+ if (elements.kind === 'record') {
410
+ const tupleText = promiseRaceTupleText(ctx, argument, elements, result.value);
411
+ if (tupleText !== null)
412
+ return tupleText;
413
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.race', `"PromiseConstructor.race" cannot settle a "${representationKey(result.value)}" result from the tuple ` +
414
+ `"${representationKey(elements)}"`);
415
+ }
416
+ if (elements.kind !== 'array-object') {
417
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.race', `"PromiseConstructor.race" over a "${representationKey(elements)}" argument is not rendered: 27.2.4.5 iterates any ` +
418
+ 'iterable, and only an Array has a stated iteration here');
419
+ }
420
+ const body = promiseRaceElementText(ctx, elements.element, result.value);
421
+ if (body === null) {
422
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.race', `"PromiseConstructor.race" cannot settle a "${representationKey(result.value)}" result from a ` +
423
+ `"${representationKey(elements.element)}" element`);
424
+ }
425
+ return (`gea::host::PromiseConstructor::race<${cppResultTypeOf(result.value)}>(${operandText(ctx, argument)}, ` +
426
+ `[](gea::Promise<${cppResultTypeOf(result.value)}>& gea_result, const ${cppTypeOf(elements.element)}& gea_element) { ${body} })`);
427
+ };
428
+ const promiseConstructorText = (ctx, member, operation) => {
429
+ if (member === 'all')
430
+ return promiseAllText(ctx, operation);
431
+ if (member === 'race')
432
+ return promiseRaceText(ctx, operation);
433
+ if (member === 'reject') {
434
+ const result = operation.result?.representation;
435
+ const reason = operation.arguments[0];
436
+ if (result?.kind !== 'promise' || reason === undefined) {
437
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.reject', 'Promise.reject requires one rejection reason and a promise result carrier');
438
+ }
439
+ const carried = alignedValueText(ctx, 'host/emit-host-invoke.ts:371', reason.representation, thrownValueCarrier, operandText(ctx, reason));
440
+ if (carried === null) {
441
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.reject', `Promise.reject reason "${representationKey(reason.representation)}" cannot enter the thrown-value carrier`);
442
+ }
443
+ // `cppResultTypeOf`, not `cppTypeOf`: a promise PAYLOAD is the one
444
+ // position where a bare `void` is the right spelling, which is exactly
445
+ // why `types.ts`'s own `promise` case renders `gea::Promise<...>` through
446
+ // that function. `Promise.reject()` at a `Promise<void>` result is
447
+ // ordinary -- `stream.ts`'s `destroy` path has one -- and asking
448
+ // `cppTypeOf` here crashed emission with "void is not a value carrier and
449
+ // has no physical C++ type" AFTER the program had already certified.
450
+ // `PromiseConstructor::reject<void>` instantiates: it only ever names
451
+ // `gea::Promise<V>::rejected_with`, which carries no fulfilment value.
452
+ return `gea::host::PromiseConstructor::reject<${cppResultTypeOf(result.value)}>(${carried})`;
453
+ }
454
+ if (member !== 'resolve') {
455
+ throw createCppEmitBlockedError(`host-member-call:PromiseConstructor.${member}`, `"PromiseConstructor.${member}" has no rendering; only "resolve", "reject", and "all" are claimed, and an unclaimed member is ` +
456
+ 'refused at its access before this');
457
+ }
458
+ // No result means no payload carrier, and the payload is the only place the
459
+ // `Awaited<T>` answer above can be read from. Deriving `T` from the argument
460
+ // instead would silently wrap a thenable that the spec says to adopt, so a
461
+ // discarded `Promise.resolve(x)` refuses here rather than guessing.
462
+ if (!operation.result) {
463
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', 'a "PromiseConstructor.resolve" whose value is discarded publishes no result carrier, and the promise payload is ' +
464
+ 'the only evidence that the argument is not itself a thenable');
465
+ }
466
+ const result = operation.result.representation;
467
+ if (result.kind !== 'promise') {
468
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', `a "PromiseConstructor.resolve" result carries "${representationKey(result)}", not a promise`);
469
+ }
470
+ const payload = result.value;
471
+ const argument = operation.arguments[0];
472
+ if (operation.arguments.length === 0) {
473
+ // `Promise.resolve()` -- `value` absent, fulfilling with `undefined`,
474
+ // which this backend elides for `void` everywhere else and elides here
475
+ // too rather than standing an `Undefined` payload in for it.
476
+ if (payload.kind !== 'void') {
477
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', `a "PromiseConstructor.resolve" passing no argument must fulfil with undefined, but this call's result payload ` +
478
+ `carries "${representationKey(payload)}"`);
479
+ }
480
+ return 'gea::host::PromiseConstructor::resolve()';
481
+ }
482
+ if (operation.arguments.length !== 1 || !argument) {
483
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', `"PromiseConstructor.resolve" takes one argument or none; this call passes ${operation.arguments.length}`);
484
+ }
485
+ const carrier = argument.representation;
486
+ if (carrier.kind === 'promise') {
487
+ if (representationKey(carrier.value) !== representationKey(payload)) {
488
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', `a "PromiseConstructor.resolve" promise argument carries payload "${representationKey(carrier.value)}" but the result ` +
489
+ `carries "${representationKey(payload)}"`);
490
+ }
491
+ return operandText(ctx, argument);
492
+ }
493
+ // 27.2.4.7 over a value that is EITHER answer. `Promise.resolve(x)` on an
494
+ // `x: T | Promise<T>` is where the checker's `Awaited<T>` collapses the two
495
+ // arms into one payload, and the specification's own rule is a per-value
496
+ // test rather than a type-level one: step 2 RETURNS a promise whose
497
+ // constructor is this one, step 3 wraps anything else. This carrier already
498
+ // keeps that test as its discriminant, so each arm renders the answer the
499
+ // spec gives IT -- the thenable arm adopted by identity, the value arm
500
+ // wrapped -- instead of one of the two answers standing in for both.
501
+ //
502
+ // hono's `resolveCallback` is the shape: two `instanceof` tests above the
503
+ // `return Promise.resolve(str)` leave `str` carried as `string |
504
+ // Promise<string>` while TypeScript types the result `Promise<string>`.
505
+ if (carrier.kind === 'tagged-union') {
506
+ const source = 'gea_promise_resolve_source';
507
+ const minted = `gea::host::PromiseConstructor::resolve<${cppResultTypeOf(payload)}>`;
508
+ const arms = carrier.arms.map((arm, index) => {
509
+ const value = arm.value;
510
+ // A `dynamic` arm is refused for the reason the whole-carrier case below
511
+ // states, and every other disagreement with the payload is the same
512
+ // missing conversion a bare argument would be refused for.
513
+ if (value.kind === 'promise' && representationKey(value.value) === representationKey(payload))
514
+ return armAt(source, index);
515
+ if (value.kind !== 'dynamic' && representationKey(value) === representationKey(payload))
516
+ return `${minted}(${armAt(source, index)})`;
517
+ return null;
518
+ });
519
+ const dispatched = arms.every((arm) => arm !== null)
520
+ ? arms.reduceRight((rest, text, index) => (rest === null ? text : `${armIs(source, index)} ? ${text} : (${rest})`), null)
521
+ : null;
522
+ if (dispatched !== null) {
523
+ return `([&]() -> ${cppTypeOf(result)} { const auto& ${source} = ${operandText(ctx, argument)}; ` + `return ${dispatched}; }())`;
524
+ }
525
+ }
526
+ // A boxed argument the program asserted to the payload type
527
+ // (`Promise.resolve(request[key] as Buffer)`): read out of the box with the
528
+ // exact-type check, which refuses by name a thenable -- or anything else --
529
+ // the assertion did not describe.
530
+ if (carrier.kind === 'dynamic' && payload.kind !== 'dynamic') {
531
+ const unboxed = alignedValueText(ctx, 'promise-resolve-argument', carrier, payload, operandText(ctx, argument));
532
+ if (unboxed !== null)
533
+ return `gea::host::PromiseConstructor::resolve<${cppResultTypeOf(payload)}>(${unboxed})`;
534
+ }
535
+ if (representationKey(carrier) !== representationKey(payload)) {
536
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', `a "PromiseConstructor.resolve" argument carries "${representationKey(carrier)}" but the promise it mints has ` +
537
+ `payload "${representationKey(payload)}"; the checker's own Awaited<T> unwrapped a thenable, whose adoption is not implemented`);
538
+ }
539
+ // The one place the equality above proves nothing: `Awaited<any>` is `any`,
540
+ // so a `dynamic` argument passes it vacuously while the value it carries may
541
+ // still BE a thenable at runtime, which 27.2.4.7 adopts rather than wraps.
542
+ // Non-thenability is what this whole renderer rests on and a declaration of
543
+ // `any` is precisely the program refusing to state it, so this refuses too
544
+ // rather than wrapping on the strength of a check that did not run.
545
+ if (carrier.kind === 'dynamic') {
546
+ throw createCppEmitBlockedError('host-member-call:PromiseConstructor.resolve', 'a "PromiseConstructor.resolve" argument carried as dynamic states no type to prove it is not a thenable, and ' +
547
+ 'Awaited<any> is any, so the payload carries no evidence either');
548
+ }
549
+ // An explicit template argument, never deduction: the argument's C++ text is
550
+ // an expression whose type is the carrier's, and naming the payload outright
551
+ // is what makes the emitted call readable as the carrier the plan selected.
552
+ return `gea::host::PromiseConstructor::resolve<${cppResultTypeOf(payload)}>(${operandText(ctx, argument)})`;
553
+ };
554
+ /**
555
+ * `Symbol()` / `Symbol(description)` -- ECMA-262 20.4.1.1.
556
+ *
557
+ * A fresh symbol every call, by definition, so there is nothing to intern and
558
+ * nothing static: `gea::makeSymbol` mints one. `[[Construct]]` is not a thing
559
+ * `Symbol` has -- `new Symbol()` is a TypeError, and `SymbolConstructor` states
560
+ * no construct signature -- so a construction refuses by name rather than
561
+ * silently rendering the call form.
562
+ *
563
+ * The description parameter is `string | number | undefined`. A string passes
564
+ * through; a number is ToString'd, which is what the spec does (20.4.1.1 step 2
565
+ * calls ToString on a non-undefined description). Every other carrier refuses,
566
+ * including an optional one: `Symbol(undefined)` has description `undefined`,
567
+ * NOT the string `"undefined"`, and a carrier that cannot tell absence from a
568
+ * value cannot pick between those two answers.
569
+ */
570
+ const renderSymbolCall = ({ ctx, args, role }) => {
571
+ if (role === 'construct') {
572
+ throw createCppEmitBlockedError('host-invocation:SymbolConstructor', '"Symbol" is not a constructor; `new Symbol()` throws a TypeError');
573
+ }
574
+ const description = args[0];
575
+ if (description === undefined)
576
+ return 'gea::makeSymbol()';
577
+ const carrier = description.representation;
578
+ if (carrier.kind !== 'string' && !(carrier.kind === 'scalar' && carrier.domain !== 'bigint')) {
579
+ throw createCppEmitBlockedError('host-invocation:SymbolConstructor.call', `a "Symbol" description carried as "${representationKey(carrier)}" cannot be converted without deciding whether an ` +
580
+ 'absent description is `undefined` or the string "undefined"');
581
+ }
582
+ const text = toStringText(operandText(ctx, description), carrier, ctx.classes, ctx.deriver);
583
+ if (text === null)
584
+ throw createCppEmitBlockedError('host-invocation:SymbolConstructor.call', toStringRefusal(carrier, ctx.classes, ctx.deriver));
585
+ return `gea::makeSymbol(${text})`;
586
+ };
587
+ /**
588
+ * `Symbol.for(key)` -- ECMA-262 20.4.2.2.
589
+ *
590
+ * A literal key does not render as a call at all. It is interned into this
591
+ * unit's own table (`internSymbolKey`) and the access becomes a reference to
592
+ * one namespace-scope `inline const gea::Symbol`, so the registry probe happens
593
+ * once per unit rather than once per use -- v1's `__geawebsym_*` answer to the
594
+ * same question, and the reason this member is marked `call-site` in
595
+ * `hostMembers` instead of carrying a fixed template.
596
+ *
597
+ * `ctx.constantTexts` is the only legal source for that literal: it holds each
598
+ * `constant` operation's own text, so a key that came from anywhere else --
599
+ * a variable, a concatenation, a parameter -- is simply absent from it and
600
+ * renders as the runtime `gea::symbolFor` call instead. Both spellings produce
601
+ * the same symbol; only the number of registry probes differs.
602
+ */
603
+ const symbolMemberText = (ctx, member, operation) => {
604
+ if (member !== 'for') {
605
+ throw createCppEmitBlockedError(`host-member-call:SymbolConstructor.${member}`, `"SymbolConstructor.${member}" has no call-site spelling; only "for" is stated here, and "keyFor" renders through ` +
606
+ 'its own fixed template');
607
+ }
608
+ const key = operation.arguments[0];
609
+ if (key === undefined) {
610
+ throw createCppEmitBlockedError('host-member-call:SymbolConstructor.for', '"Symbol.for" takes a key, and this call passes none');
611
+ }
612
+ if (key.representation.kind !== 'string') {
613
+ throw createCppEmitBlockedError('host-member-call:SymbolConstructor.for', `a "Symbol.for" key carried as "${representationKey(key.representation)}" is not a string, and the registry is keyed ` +
614
+ 'by the ToString of the key -- which this backend does not run for a non-string');
615
+ }
616
+ const literal = ctx.constantTexts.get(key.value);
617
+ if (literal !== undefined)
618
+ return internSymbolKey(ctx.symbolKeys, literal);
619
+ return `gea::symbolFor(${operandText(ctx, key)})`;
620
+ };
621
+ const renderPromiseCreate = ({ ctx, args, role, result }) => {
622
+ if (role !== 'construct') {
623
+ throw createCppEmitBlockedError(`host-invocation:PromiseConstructor${role === 'call' ? '.call' : ''}`, 'Promise has no [[Call]] operation; it must be constructed with new');
624
+ }
625
+ if (args.length !== 1 || args[0] === undefined) {
626
+ throw createCppEmitBlockedError('host-invocation:PromiseConstructor', `new Promise requires one executor; this construction passes ${args.length}`);
627
+ }
628
+ if (result?.kind !== 'promise') {
629
+ throw createCppEmitBlockedError('host-invocation:PromiseConstructor', `new Promise publishes "${result === null ? 'nothing' : representationKey(result)}" instead of a promise carrier`);
630
+ }
631
+ const helper = result.value.kind === 'void' ? 'constructVoid' : `construct<${cppTypeOf(result.value)}>`;
632
+ return `gea::host::PromiseConstructor::${helper}(${operandText(ctx, args[0])})`;
633
+ };
634
+ /**
635
+ * The renderer for each protocol whose *handle itself* is invoked.
636
+ *
637
+ * Deliberately small: it is the backend's honest inventory of which host
638
+ * protocols have a real `gea::host` implementation behind an invocation, keyed
639
+ * by the protocol string the checker bound (`nativeHandleMemberText`, in
640
+ * emit-properties.ts, keys its own member dispatch the identical way). Never a
641
+ * guess, and never silently widened to a protocol this file has not written.
642
+ *
643
+ * Exported so `host/native-protocols.ts` can read the key set as one of the
644
+ * tables a native-boundary claim is derived from, rather than restating this
645
+ * inventory as a fourth, hand-typed copy: this map IS the emitter's dispatch,
646
+ * not a description of it, so its keys are proof a protocol here is real.
647
+ */
648
+ export const hostInvocations = new Map([
649
+ ['PromiseConstructor', renderPromiseCreate],
650
+ ['ErrorConstructor', renderErrorCreate],
651
+ // The six NativeError constructors, which 20.5.6.1.1 defines as 20.5.1.1
652
+ // with a different `name` -- one renderer, because the difference is inside
653
+ // `gea::host::<protocol>::create`, which this already spells from the
654
+ // protocol string it was handed.
655
+ ['EvalErrorConstructor', renderErrorCreate],
656
+ ['RangeErrorConstructor', renderErrorCreate],
657
+ ['ReferenceErrorConstructor', renderErrorCreate],
658
+ ['SyntaxErrorConstructor', renderErrorCreate],
659
+ ['TypeErrorConstructor', renderErrorCreate],
660
+ ['URIErrorConstructor', renderErrorCreate],
661
+ ['StringConstructor', renderToString],
662
+ ['NumberConstructor', renderToNumber],
663
+ ['BigIntConstructor', renderBigInt],
664
+ ['BooleanConstructor', renderToBoolean],
665
+ ['SymbolConstructor', renderSymbolCall]
666
+ ]);
667
+ /**
668
+ * The renderer for each protocol whose *member* call is spelled at the call
669
+ * site -- the sibling of `hostInvocations` for the member half.
670
+ *
671
+ * Two maps rather than one because they answer about two different things: a
672
+ * protocol may have an invocable handle, a call-site-spelled member, or both,
673
+ * and `PromiseConstructor` is the case that makes the difference concrete --
674
+ * `Promise.resolve(x)` is implemented, `new Promise(executor)` is not, and one
675
+ * map keyed by protocol could not say so.
676
+ *
677
+ * Exported for the same reason `hostInvocations` is: `host/native-protocols.ts`
678
+ * reads its keys as another table a native-boundary claim is derived from.
679
+ */
680
+ /**
681
+ * `Array.isArray(v)` -- ECMA-262 23.1.2.2, answered from the ARGUMENT'S
682
+ * CARRIER.
683
+ *
684
+ * The predicate is decidable at compile time for every carrier that is not the
685
+ * dynamic box, and the runtime already states both ends of that: `isArray(const
686
+ * Value&)` reads the box's own tag, and `isArray(const Ref<ArrayObject<E>>&)`
687
+ * returns `true` without reading anything. What was missing is everything
688
+ * between -- and in particular a TAGGED UNION, where the answer is exactly the
689
+ * discriminant: hono asks `Array.isArray( init.headers )` with
690
+ * `HeadersInit`-shaped carrier `Dictionary | ArrayObject`, and the union has
691
+ * no `isArray` overload, so the call reached C++ as a hard error.
692
+ *
693
+ * `false` is stated by KIND rather than as a default, so a carrier nobody has
694
+ * thought about refuses instead of being answered wrongly. A typed array is
695
+ * one of the `false`s on purpose: 23.1.2.2 asks whether the value is an Array
696
+ * EXOTIC OBJECT, and a `Uint8Array` is not one -- `Array.isArray(new
697
+ * Uint8Array())` is `false` in the language.
698
+ *
699
+ * An `optional` answers per state: an absent value is `undefined`, which is
700
+ * not an array.
701
+ */
702
+ const isArrayText = (ctx, operation) => {
703
+ const argument = operation.arguments[0];
704
+ if (argument === undefined) {
705
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.isArray', '"Array.isArray" takes a value, and this call passes none');
706
+ }
707
+ const answer = (representation, text) => {
708
+ if (representation.kind === 'dynamic')
709
+ return `gea::host::ArrayConstructor::isArray(${text})`;
710
+ // The one carrier whose KIND is not its answer. A closed tuple is laid
711
+ // out as a record (`derive.ts`: "there is deliberately no tuple carrier"),
712
+ // and `record` is in the kind table's `false` set because an object
713
+ // literal is not an Array exotic object -- but a tuple's value IS one.
714
+ // See `RepresentationDeriver.isTupleShape`.
715
+ if (representation.kind === 'record' && ctx.deriver.isTupleShape(representation.shapeId))
716
+ return 'true';
717
+ // Answered by kind wherever the kind alone answers -- the one table the
718
+ // IR's frame for this call reads too (`representation/host-templates.ts`).
719
+ const constant = isArrayConstantOf(representation.kind);
720
+ if (constant !== null)
721
+ return constant ? 'true' : 'false';
722
+ if (representation.kind === 'optional') {
723
+ const payload = answer(representation.payload, `(*${text})`);
724
+ return payload === 'false' ? 'false' : `(${text}.has_value() ? ${payload} : false)`;
725
+ }
726
+ if (representation.kind === 'tagged-union') {
727
+ // The discriminant IS the answer. Built right to left, and collapsed
728
+ // whenever every arm agrees -- a union of two arrays is `true` with no
729
+ // test at all, and one of two non-arrays is `false`.
730
+ const arms = representation.arms.map((arm, index) => answer(arm.value, armAt(text, index)));
731
+ const first = arms[0];
732
+ if (first !== undefined && arms.every((arm) => arm === first))
733
+ return first;
734
+ const dispatched = arms.reduceRight((rest, arm, index) => (rest === null ? arm : `${armIs(text, index)} ? ${arm} : (${rest})`), null);
735
+ if (dispatched === null)
736
+ return 'false';
737
+ return `(${dispatched})`;
738
+ }
739
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.isArray', `"Array.isArray" of a "${representationKey(representation)}" carrier is not answered here: 23.1.2.2 asks whether the ` +
740
+ 'value is an Array exotic object, and this carrier states neither that it is nor that it cannot be');
741
+ };
742
+ return answer(argument.representation, operandText(ctx, argument));
743
+ };
744
+ /** The statically named `length` field of an ArrayLike record. */
745
+ const arrayLikeLengthText = (ctx, source) => {
746
+ const carrier = source.representation;
747
+ if (carrier.kind !== 'record' && carrier.kind !== 'record-with-index' && carrier.kind !== 'native-record-ref') {
748
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', `Array.from expected a static ArrayLike record and received "${representationKey(carrier)}"`);
749
+ }
750
+ const fields = carrier.kind === 'native-record-ref' && carrier.native === null
751
+ ? recordFieldsOfShape(ctx.deriver, carrier.shapeId)
752
+ : carrier.kind === 'native-record-ref'
753
+ ? null
754
+ : carrier.fields;
755
+ const length = fields?.find((field) => field.key === 'length');
756
+ if (!length || length.value.kind !== 'scalar' || length.value.domain !== 'number') {
757
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', `Array.from received an ArrayLike carrier "${representationKey(carrier)}" whose statically known length is not a number`);
758
+ }
759
+ return `${operandText(ctx, source)}${memberAccessOperator(carrier.ownership)}${cppRecordFieldName('length')}`;
760
+ };
761
+ /** `Array.from(source[, mapfn])`, over the four source carriers the runtime can iterate without a dynamic `@@iterator` lookup. */
762
+ const arrayFromText = (ctx, operation) => {
763
+ const source = operation.arguments[0];
764
+ if (!source)
765
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', '"Array.from" takes a source and this call passes none');
766
+ if (operation.arguments.length > 2) {
767
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', '"Array.from" with a thisArg needs a callback receiver binding this runtime does not carry');
768
+ }
769
+ const result = operation.result?.representation;
770
+ if (!result || result.kind !== 'array-object') {
771
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', `"Array.from" result carries "${result ? representationKey(result) : 'nothing'}", not an array-object`);
772
+ }
773
+ const callback = operation.arguments[1];
774
+ const args = [operandText(ctx, source), ...(callback ? [operandText(ctx, callback)] : [])].join(', ');
775
+ const carrier = source.representation;
776
+ if (carrier.kind === 'array-object')
777
+ return `gea::runtime::array::fromArray(${args})`;
778
+ if (carrier.kind === 'iterator')
779
+ return `gea::runtime::array::fromIterator(${args})`;
780
+ if (carrier.kind === 'typed-array')
781
+ return `gea::runtime::array::fromTypedArray(${args})`;
782
+ if (carrier.kind === 'string')
783
+ return `gea::runtime::array::fromString(${args})`;
784
+ if (carrier.kind === 'record' || carrier.kind === 'record-with-index' || carrier.kind === 'native-record-ref') {
785
+ if (!callback) {
786
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', '"Array.from" of a length-only ArrayLike needs a mapper to produce each element');
787
+ }
788
+ return `gea::runtime::array::fromLength(${arrayLikeLengthText(ctx, source)}, ${operandText(ctx, callback)})`;
789
+ }
790
+ throw createCppEmitBlockedError('host-member-call:ArrayConstructor.from', `"Array.from" of a "${representationKey(carrier)}" source needs an iterable protocol this backend does not lower`);
791
+ };
792
+ /** `%TypedArray%.from(source[, mapfn])`, retaining the concrete result element type from the call's own carrier. */
793
+ const typedArrayFromText = (ctx, operation) => {
794
+ const source = operation.arguments[0];
795
+ if (!source)
796
+ throw createCppEmitBlockedError('host-member-call:TypedArrayConstructor.from', '"TypedArray.from" takes a source and this call passes none');
797
+ if (operation.arguments.length > 2) {
798
+ throw createCppEmitBlockedError('host-member-call:TypedArrayConstructor.from', '"TypedArray.from" with a thisArg needs a callback receiver binding this runtime does not carry');
799
+ }
800
+ const result = operation.result?.representation;
801
+ if (!result || result.kind !== 'typed-array') {
802
+ throw createCppEmitBlockedError('host-member-call:TypedArrayConstructor.from', `"TypedArray.from" result carries "${result ? representationKey(result) : 'nothing'}", not a typed-array`);
803
+ }
804
+ const target = typedArrayTargetSpelling(result);
805
+ const callback = operation.arguments[1];
806
+ const args = [operandText(ctx, source), ...(callback ? [operandText(ctx, callback)] : [])].join(', ');
807
+ const carrier = source.representation;
808
+ if (carrier.kind === 'array-object')
809
+ return `gea::runtime::array::typedArrayFromArray<${target}>(${args})`;
810
+ if (carrier.kind === 'typed-array')
811
+ return `gea::runtime::array::typedArrayFromTypedArray<${target}>(${args})`;
812
+ if (carrier.kind === 'string' && callback)
813
+ return `gea::runtime::array::typedArrayFromString<${target}>(${args})`;
814
+ throw createCppEmitBlockedError('host-member-call:TypedArrayConstructor.from', `"TypedArray.from" of a "${representationKey(carrier)}" source${callback ? '' : ' without a mapper'} is not implemented`);
815
+ };
816
+ /** `ArrayBuffer.isView` -- true precisely for TypedArray and DataView carriers. */
817
+ const isArrayBufferViewText = (ctx, operation) => {
818
+ const argument = operation.arguments[0];
819
+ if (argument === undefined) {
820
+ throw createCppEmitBlockedError('host-member-call:ArrayBufferConstructor.isView', '"ArrayBuffer.isView" takes a value, and this call passes none');
821
+ }
822
+ const answer = (representation, valueText) => {
823
+ if (representation.kind === 'typed-array' || representation.kind === 'data-view')
824
+ return 'true';
825
+ if (representation.kind === 'optional') {
826
+ const payload = answer(representation.payload, `(*${valueText})`);
827
+ return payload === 'false' ? 'false' : `(${valueText}.has_value() ? ${payload} : false)`;
828
+ }
829
+ if (representation.kind === 'tagged-union') {
830
+ const arms = representation.arms.map((arm, index) => answer(arm.value, armAt(valueText, index)));
831
+ const first = arms[0];
832
+ if (first !== undefined && arms.every((arm) => arm === first))
833
+ return first;
834
+ const dispatched = arms.reduceRight((rest, arm, index) => (rest === null ? arm : `${armIs(valueText, index)} ? ${arm} : (${rest})`), null);
835
+ return dispatched === null ? 'false' : `(${dispatched})`;
836
+ }
837
+ if (representation.kind === 'dynamic') {
838
+ throw createCppEmitBlockedError('host-member-call:ArrayBufferConstructor.isView', '"ArrayBuffer.isView" of a dynamic value needs a runtime TypedArray/DataView brand, which gea::Value does not carry');
839
+ }
840
+ return 'false';
841
+ };
842
+ return answer(argument.representation, operandText(ctx, argument));
843
+ };
844
+ /** The finite, checker-authenticated Atomics surface. No dynamic receiver is admitted. */
845
+ const atomicsText = (ctx, member, operation) => {
846
+ const args = operation.arguments;
847
+ const support = atomicsCallSupport(member, args.map((argument) => argument.representation));
848
+ if (!support.supported)
849
+ throw createCppEmitBlockedError(`host-member-call:Atomics.${member}`, support.reason);
850
+ const number = (position) => operandText(ctx, args[position]);
851
+ if (support.kind === 'is-lock-free')
852
+ return `gea::runtime::atomics::isLockFree(${number(0)})`;
853
+ const view = args[0];
854
+ const viewText = operandText(ctx, view);
855
+ if (support.kind === 'fixed') {
856
+ return `gea::runtime::atomics::${support.runtimeMember}(${viewText}, ${args
857
+ .slice(1)
858
+ .map((_argument, position) => number(position + 1))
859
+ .join(', ')})`;
860
+ }
861
+ if (support.kind === 'wait') {
862
+ return `gea::runtime::atomics::wait(${viewText}, ${number(1)}, ${number(2)}, ${args[3] ? number(3) : 'std::numeric_limits<double>::infinity()'})`;
863
+ }
864
+ return `gea::runtime::atomics::notify(${viewText}, ${number(1)}, ${args[2] ? number(2) : 'std::numeric_limits<double>::infinity()'})`;
865
+ };
866
+ export const hostMemberRenderers = new Map([
867
+ ['Atomics', atomicsText],
868
+ ['PromiseConstructor', promiseConstructorText],
869
+ ['SymbolConstructor', symbolMemberText],
870
+ // `Object`'s statics, in their own module: every one of them renders from
871
+ // the RECEIVER's carrier -- a known shape's field list, or a real
872
+ // enumeration of a real own-property table -- which is a different question
873
+ // from the ones the two renderers above answer, and one that runs through
874
+ // all ten claimed members. See `emit-host-object.ts`'s own header.
875
+ ['ObjectConstructor', objectMemberText],
876
+ // `Date.parse`/`Date.UTC`. Their spelling is decided by the call's own
877
+ // argument count (`Date.UTC` takes one to seven), which is exactly what a
878
+ // fixed-arity template row cannot state. `Date.now` is not routed here: it
879
+ // is a `property` row over a real callable.
880
+ ['DateConstructor', dateConstructorCallText],
881
+ // `Array.isArray`, whose whole answer is the argument's carrier -- see
882
+ // `isArrayText`. `ArrayConstructor` has no other claimed member.
883
+ [
884
+ 'ArrayConstructor',
885
+ (ctx, member, operation) => hostMemberTemplateOf('ArrayConstructor', member) === 'array-is-array' ? isArrayText(ctx, operation) : arrayFromText(ctx, operation)
886
+ ],
887
+ ['Int8ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
888
+ ['Uint8ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
889
+ ['Uint8ClampedArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
890
+ ['Int16ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
891
+ ['Uint16ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
892
+ ['Int32ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
893
+ ['Uint32ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
894
+ ['Float32ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
895
+ ['Float64ArrayConstructor', (ctx, _member, operation) => typedArrayFromText(ctx, operation)],
896
+ ['ArrayBufferConstructor', (ctx, _member, operation) => isArrayBufferViewText(ctx, operation)]
897
+ ]);
898
+ /**
899
+ * The call/construct text for a `native-handle` invocation, or a thrown
900
+ * refusal naming exactly what is missing.
901
+ */
902
+ export const nativeHandleInvocationText = (ctx, callee, abi, args, role, result) => {
903
+ const { protocol } = callee;
904
+ // A host that states the whole `new C(...)` expression renders through it.
905
+ // Consulted before the renderers below, and only for a construction: those
906
+ // are this backend's own protocols, whose spelling depends on the call's
907
+ // static types rather than on the class alone, and a plugin row plus a
908
+ // backend renderer for one protocol would be two authorities over one
909
+ // question. Keyed the way every other host row is -- by the carrier the host
910
+ // stated, falling back to the declared name.
911
+ const stated = role === 'construct' ? ctx.hosts.constructors.get(callee.native ?? protocol) : undefined;
912
+ if (stated !== undefined) {
913
+ // A `'pass-through'` row names the single `{args}` slot -- every argument,
914
+ // in order, each as the host takes it -- and has no fixed count to check:
915
+ // which of the host's overloads a call means is decided by C++ from the
916
+ // argument types, exactly the member arm this mirrors (`hostCallText`
917
+ // above). A fixed-number row still gets the strict count check, because its
918
+ // template names exactly that many `{argN}` slots and nothing else can fill
919
+ // the difference.
920
+ if (stated.arity === 'pass-through') {
921
+ const passed = args.map((argument) => hostArgumentText(argument.representation, operandText(ctx, argument))).join(', ');
922
+ const filled = fillHostTemplate(stated.emit, null, [], passed);
923
+ if (filled === null) {
924
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `the "${protocol}" host construct template names a slot this construction cannot fill`);
925
+ }
926
+ return filled;
927
+ }
928
+ // Padded the same way the generic constructor-carrier path is
929
+ // (`paddedArguments`, emit-context.ts): a host's construct template is
930
+ // stated for the checker's full parameter frame, and a call that omits a
931
+ // trailing optional argument (`new MediaRecorder(stream)` against
932
+ // `new (stream, options?)`) is exactly the shape that helper exists for.
933
+ // `stated.arity` still has to match the PADDED count, so a template whose
934
+ // stated arity disagrees with the checker's own frame still refuses by
935
+ // name instead of silently filling the wrong number of slots.
936
+ const argTexts = paddedArguments(abi, args.map((argument) => hostArgumentText(argument.representation, operandText(ctx, argument))), role);
937
+ if (argTexts.length !== stated.arity) {
938
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `constructing "${protocol}" is stated with ${stated.arity} argument slot(s) and this construction passes ` +
939
+ `${argTexts.length}; the host's spelling has nowhere to put the difference`);
940
+ }
941
+ // `null` for the receiver on purpose: a construction has none, so a
942
+ // template that names `{receiver}` was written for the wrong position and
943
+ // `fillHostTemplate` refuses it rather than filling it with nothing.
944
+ const filled = fillHostTemplate(stated.emit, null, argTexts);
945
+ if (filled === null) {
946
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `the "${protocol}" host construct template names a slot this construction cannot fill`);
947
+ }
948
+ return filled;
949
+ }
950
+ const invocation = role === 'call' ? ctx.hosts.invocations.get(`${callee.native ?? protocol}.call`) : undefined;
951
+ if (invocation !== undefined) {
952
+ if (invocation.arity === 'pass-through') {
953
+ const passed = args.map((argument) => hostArgumentText(argument.representation, operandText(ctx, argument))).join(', ');
954
+ const filled = fillHostTemplate(invocation.emit, null, [], passed);
955
+ if (filled === null)
956
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `the "${protocol}" host invocation template names a slot this call cannot fill`);
957
+ return filled;
958
+ }
959
+ const argTexts = paddedArguments(abi, args.map((argument) => hostArgumentText(argument.representation, operandText(ctx, argument))), role);
960
+ if (argTexts.length !== invocation.arity) {
961
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `calling "${protocol}" is stated with ${invocation.arity} argument slot(s) and this call passes ${argTexts.length}; the host's spelling has nowhere to put the difference`);
962
+ }
963
+ const filled = fillHostTemplate(invocation.emit, null, argTexts);
964
+ if (filled === null)
965
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `the "${protocol}" host invocation template names a slot this call cannot fill`);
966
+ return filled;
967
+ }
968
+ const render = hostInvocations.get(protocol);
969
+ if (render === undefined) {
970
+ throw createCppEmitBlockedError(`host-invocation:${protocol}${role === 'call' ? '.call' : ''}`, `a "${protocol}" host handle has no ${role} implementation; only ${[...hostInvocations.keys()].join(', ')} ` +
971
+ `${hostInvocations.size === 1 ? 'is' : 'are'} wired to real gea::host C++`);
972
+ }
973
+ return render({ ctx, protocol, abi, args, role, result });
974
+ };
975
+ /**
976
+ * A host *method* call -- `document.getElementById(id)`, `el.setAttribute(k, v)`.
977
+ *
978
+ * The access itself rendered nothing (`nativeHandleMemberText`, emit-properties.ts)
979
+ * because a host method is not a value: the host states one spelling for the
980
+ * whole call and none for the method on its own. That access recorded which
981
+ * member was reached and how the receiver renders, and this fills the host's
982
+ * template with both. Returns `null` when the callee is not a deferred host
983
+ * member, so the ordinary invoke paths run unchanged.
984
+ */
985
+ export const hostCallText = (ctx, operation) => {
986
+ const numericRest = operation.numericRestHostCall;
987
+ if (numericRest !== undefined) {
988
+ const host = hostMemberOf(ctx.hosts.members, numericRest.protocol, numericRest.member);
989
+ const valid = operation.arguments.every((argument) => argument.representation.kind === 'scalar' && argument.representation.domain === 'number');
990
+ const rendered = host?.kind === 'property' && host.numericRestCall !== undefined && valid
991
+ ? fillHostTemplate(host.numericRestCall, '', [], `{${operation.arguments.map((argument) => `static_cast<double>(${operandText(ctx, argument)})`).join(', ')}}`)
992
+ : null;
993
+ if (rendered === null) {
994
+ throw createCppEmitBlockedError(`host-invocation:${numericRest.protocol}.${numericRest.member}`, 'a borrowed numeric rest frame has no matching host spelling or numeric operands');
995
+ }
996
+ return rendered;
997
+ }
998
+ const callee = operation.callee.representation;
999
+ const read = ctx.hostMemberReads.get(operation.callee.value);
1000
+ if (!read) {
1001
+ // A `native-handle` callee -- `Error(x)`, never `obj.method()` -- invokes
1002
+ // through a qualified free function, not through `.call(...)` on its own
1003
+ // materialized value: a host singleton's handle carries no function
1004
+ // pointer of its own to call through.
1005
+ if (callee.kind !== 'native-handle')
1006
+ return null;
1007
+ if (!callee.call) {
1008
+ throw createCppEmitBlockedError(`host-invocation:${callee.protocol}.call`, `a "${callee.protocol}" host handle carries no [[Call]] convention this program's checker derived for it`);
1009
+ }
1010
+ return nativeHandleInvocationText(ctx, callee, callee.call, operation.arguments, 'call', operation.result?.representation ?? null);
1011
+ }
1012
+ // Spelled here rather than at the access that recorded the member: the
1013
+ // record holds the receiver's operand, and this is the call that fills the
1014
+ // host's template with it (`hostMemberReceiverText`). Taken before the row is
1015
+ // checked so a receiver that refuses still refuses first, exactly as it did
1016
+ // when the access itself spelled it.
1017
+ const receiverText = hostMemberReceiverText(ctx, read);
1018
+ const host = hostMemberOf(ctx.hosts.members, read.protocol, read.member);
1019
+ if (!host || host.kind !== 'method') {
1020
+ throw createCppEmitBlockedError(`host-invocation:${read.protocol}.${read.member}`, `"${read.protocol}.${read.member}" was recorded as a host method but names no method template`);
1021
+ }
1022
+ if (read.protocol === 'JSON') {
1023
+ if (read.member !== 'stringify' && read.member !== 'parse') {
1024
+ throw createCppEmitBlockedError(`host-invocation:JSON.${read.member}`, `"JSON.${read.member}" has no rendering; only "stringify" and "parse" are claimed`);
1025
+ }
1026
+ return jsonCallText(ctx, read.member, operation);
1027
+ }
1028
+ // A member the table itself marks as spelled at the call site, because its
1029
+ // C++ depends on this call's static types and not on the member alone. The
1030
+ // marking says *that* a renderer decides; which one is this map's answer, so
1031
+ // a row marked `call-site` on a protocol nothing here renders refuses by
1032
+ // name rather than falling through to an arity check it has no arity for.
1033
+ if (host.arity === 'call-site') {
1034
+ const render = hostMemberRenderers.get(read.protocol);
1035
+ if (render === undefined) {
1036
+ throw createCppEmitBlockedError(`host-invocation:${read.protocol}.${read.member}`, `"${read.protocol}.${read.member}" is claimed with a call-site spelling, but no renderer in this file states one ` +
1037
+ `for "${read.protocol}"`);
1038
+ }
1039
+ return render(ctx, read.member, operation);
1040
+ }
1041
+ // A variadic member (`console.log`/`console.error`) has no fixed arity to
1042
+ // check against and no positional `{argN}` slots to fill: every argument's
1043
+ // ToString text is joined into ONE value first, and that value fills the
1044
+ // template's single `{args}` slot. A carrier with no ToString refuses by
1045
+ // name here -- exactly `toStringRefusal`'s own message -- rather than
1046
+ // falling back to a boxed carrier. `operation.arguments` is guaranteed to
1047
+ // be N individual operands here, never one packed `array-object` -- see
1048
+ // `ir/lower.ts`'s `calleeReceiverIsNativeHandle` -- UNLESS
1049
+ // `argumentsAreSpread` says otherwise (below).
1050
+ if (host.arity === 'variadic') {
1051
+ // `console.log(...values)`: `ir/lower-invocation.ts` passed the whole
1052
+ // array through as this call's one argument rather than range-copying
1053
+ // it, so the `{args}` slot fills with the array's OWN text -- C++
1054
+ // overload resolution then picks `gea_runtime.h`'s
1055
+ // `console::log(const Ref<ArrayObject<Value>>&)` over the
1056
+ // `std::string`/`std::vector<Value>` overloads the plain per-operand join
1057
+ // below fills instead, the same "let overload resolution decide" posture
1058
+ // this file's own `pass-through` arity already takes.
1059
+ if (operation.argumentsAreSpread) {
1060
+ const [whole] = operation.arguments;
1061
+ if (whole === undefined) {
1062
+ throw createCppEmitBlockedError(`host-member-call:${read.protocol}.${read.member}`, `"${read.protocol}.${read.member}" was recorded as a spread call with no argument to spread`);
1063
+ }
1064
+ const filled = fillHostTemplate(host.emit, receiverText, [], operandText(ctx, whole));
1065
+ if (filled === null) {
1066
+ throw createCppEmitBlockedError(`host-invocation:${read.protocol}.${read.member}`, `the "${read.protocol}.${read.member}" host template names a slot this call cannot fill`);
1067
+ }
1068
+ return filled;
1069
+ }
1070
+ const joined = consoleArgumentsText(ctx, operation.arguments);
1071
+ if ('refused' in joined) {
1072
+ throw createCppEmitBlockedError(`host-member-call:${read.protocol}.${read.member}`, `"${read.protocol}.${read.member}" cannot stringify an argument: ${toStringRefusal(joined.refused, ctx.classes, ctx.deriver)}`);
1073
+ }
1074
+ const filled = fillHostTemplate(host.emit, receiverText, [], joined.text);
1075
+ if (filled === null) {
1076
+ throw createCppEmitBlockedError(`host-invocation:${read.protocol}.${read.member}`, `the "${read.protocol}.${read.member}" host template names a slot this call cannot fill`);
1077
+ }
1078
+ return filled;
1079
+ }
1080
+ // Every argument, in order, each as the host takes it -- and no arity check,
1081
+ // because the row states none: which of the host's overloads this call means
1082
+ // is decided by C++ from the argument types, not by counting them here.
1083
+ if (host.arity === 'pass-through') {
1084
+ const passed = operation.arguments.map((argument) => hostArgumentText(argument.representation, operandText(ctx, argument))).join(', ');
1085
+ const rendered = fillHostTemplate(host.emit, receiverText, [], passed);
1086
+ if (rendered === null) {
1087
+ throw createCppEmitBlockedError(`host-invocation:${read.protocol}.${read.member}`, `the "${read.protocol}.${read.member}" host template names a slot this call cannot fill`);
1088
+ }
1089
+ return rendered;
1090
+ }
1091
+ if (operation.arguments.length !== host.arity) {
1092
+ throw createCppEmitBlockedError(`host-member-call:${read.protocol}.${read.member}`, `"${read.protocol}.${read.member}" is spelled for ${host.arity} argument(s); this call passes ${operation.arguments.length}`);
1093
+ }
1094
+ const filled = fillHostTemplate(host.emit, receiverText,
1095
+ // Each argument as the HOST takes it, not as the program holds it -- the
1096
+ // same crossing a free host function's arguments make (`hostArgumentText`).
1097
+ // A member is not a different boundary: `setVertexBytesLengthAtIndex`
1098
+ // declares `std::vector<double>` exactly as a free thunk would, and the
1099
+ // program's array is an `ArrayObject` either way.
1100
+ operation.arguments.map((argument) => hostArgumentText(argument.representation, operandText(ctx, argument))));
1101
+ if (filled === null) {
1102
+ throw createCppEmitBlockedError(`host-invocation:${read.protocol}.${read.member}`, `the "${read.protocol}.${read.member}" host template names a slot this call cannot fill`);
1103
+ }
1104
+ return filled;
1105
+ };