@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,824 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ #pragma once
3
+
4
+ // Adapted from compiler-v1's value_12_proxy_object_internal_ops.h: retain the
5
+ // target, handler, receiver, and invariant checks across every boxed boundary.
6
+ namespace gea {
7
+
8
+ struct DynamicProxy {
9
+ Value target;
10
+ Value handler;
11
+ bool revoked = false;
12
+ friend void geaTraceRefs(const DynamicProxy& value, detail::RefVisitor& visitor) {
13
+ detail::traceRefs(value.target, visitor);
14
+ detail::traceRefs(value.handler, visitor);
15
+ }
16
+ };
17
+
18
+ inline bool isObjectValue(const Value& value) {
19
+ return value.tag() == Value::Tag::Object || value.tag() == Value::Tag::Function;
20
+ }
21
+
22
+ inline Value Value::proxy(Value target, Value handler) {
23
+ if (!isObjectValue(target) || !isObjectValue(handler))
24
+ host::throwRuntimeError("TypeError", "Proxy target and handler must be objects");
25
+ Value value;
26
+ value.tag_ = target.tag();
27
+ value.proxy_ = true;
28
+ value.held_ = gea::makeRef<DynamicProxy>(DynamicProxy{std::move(target), std::move(handler), false});
29
+ return value;
30
+ }
31
+
32
+ inline const DynamicProxy& Value::proxyState() const {
33
+ if (!proxy_) host::throwRuntimeError("TypeError", "Expected a Proxy");
34
+ const auto& state = *gea::refStaticCast<DynamicProxy>(held_);
35
+ if (state.revoked) host::throwRuntimeError("TypeError", "Operation on a revoked Proxy");
36
+ return state;
37
+ }
38
+
39
+ inline void Value::revokeProxy() {
40
+ if (!proxy_) host::throwRuntimeError("TypeError", "Expected a Proxy");
41
+ auto& state = *gea::refStaticCast<DynamicProxy>(held_);
42
+ state.revoked = true;
43
+ state.target = Value();
44
+ state.handler = Value();
45
+ }
46
+
47
+ inline bool Value::isArrayPayload() const {
48
+ return proxy_ ? proxyState().target.isArrayPayload() : metadata_->array;
49
+ }
50
+
51
+ enum class ToPrimitiveHint { Default, Number, String };
52
+
53
+ inline const char* toPrimitiveHintText(ToPrimitiveHint hint) {
54
+ switch (hint) {
55
+ case ToPrimitiveHint::Default: return "default";
56
+ case ToPrimitiveHint::Number: return "number";
57
+ case ToPrimitiveHint::String: return "string";
58
+ }
59
+ return "default";
60
+ }
61
+
62
+ inline Value ordinaryToPrimitive(const Value& value, ToPrimitiveHint hint) {
63
+ const char* first = hint == ToPrimitiveHint::String ? "toString" : "valueOf";
64
+ const char* second = hint == ToPrimitiveHint::String ? "valueOf" : "toString";
65
+ for (const char* name : {first, second}) {
66
+ const PropertyKey key = PropertyKey::string(name);
67
+ const bool isToString = name[0] == 't';
68
+ // A native callable's inherited Function.prototype.toString is one real
69
+ // operation but is not modeled as a boxed callable. Keep its source fact
70
+ // at this boundary; an own replacement still wins through the ordinary
71
+ // property path below.
72
+ const Ref<DynamicObject>& functionProperties = value.functionProperties();
73
+ if (!value.isProxy() && value.tag() == Value::Tag::Function && isToString &&
74
+ (!functionProperties || functionProperties->ownProperty(key) == nullptr))
75
+ return Value::box(Value::Tag::String, value.functionSourceText());
76
+ const bool present = value.hasProperty(key);
77
+ if (!present && isToString &&
78
+ (value.isDynamicObject() || value.isProxy() || value.isDynamicDictionaryPayload())) {
79
+ const Value tag = value.getProperty(PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToStringTag)));
80
+ const std::string tagText = tag.tag() == Value::Tag::String ? tag.as<std::string>() : std::string("Object");
81
+ return Value::box(Value::Tag::String, std::string("[object ") + tagText + "]");
82
+ }
83
+ if (!present) continue;
84
+ const Value method = value.getProperty(key);
85
+ if (method.tag() != Value::Tag::Function) continue;
86
+ const Value result = method.callWithReceiver(value, {});
87
+ if (!isObjectValue(result)) return result;
88
+ }
89
+ host::throwRuntimeError("TypeError", "Cannot convert object to primitive value");
90
+ }
91
+
92
+ inline Value dynamicToPrimitive(const Value& value, ToPrimitiveHint hint = ToPrimitiveHint::Default) {
93
+ if (!isObjectValue(value)) return value;
94
+ const Value exotic = value.getProperty(PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToPrimitive)));
95
+ if (exotic.tag() != Value::Tag::Undefined && exotic.tag() != Value::Tag::Null) {
96
+ if (exotic.tag() != Value::Tag::Function) host::throwRuntimeError("TypeError", "@@toPrimitive is not callable");
97
+ const Value result = exotic.callWithReceiver(value, {Value::box(Value::Tag::String, std::string(toPrimitiveHintText(hint)))});
98
+ if (isObjectValue(result)) host::throwRuntimeError("TypeError", "@@toPrimitive must return a primitive value");
99
+ return result;
100
+ }
101
+ return ordinaryToPrimitive(value, hint);
102
+ }
103
+
104
+ inline std::string dynamicToString(const Value& input) {
105
+ const Value primitive = dynamicToPrimitive(input, ToPrimitiveHint::String);
106
+ if (primitive.tag() == Value::Tag::Symbol) host::throwRuntimeError("TypeError", "Cannot convert a Symbol value to a string");
107
+ return host::detail::toString(primitive);
108
+ }
109
+
110
+ inline double dynamicToNumber(const Value& input) {
111
+ const Value value = dynamicToPrimitive(input, ToPrimitiveHint::Number);
112
+ switch (value.tag()) {
113
+ case Value::Tag::Number: return value.as<double>();
114
+ case Value::Tag::Boolean: return value.as<bool>() ? 1 : 0;
115
+ case Value::Tag::Null: return 0;
116
+ case Value::Tag::Undefined: return std::numeric_limits<double>::quiet_NaN();
117
+ case Value::Tag::String: return host::detail::toNumber(value.as<std::string>());
118
+ default: host::throwRuntimeError("TypeError", "Cannot convert this value to a number");
119
+ }
120
+ }
121
+
122
+ inline Value dynamicAdd(const Value& left, const Value& right) {
123
+ const Value a = dynamicToPrimitive(left);
124
+ const Value b = dynamicToPrimitive(right);
125
+ if (a.tag() == Value::Tag::Symbol || b.tag() == Value::Tag::Symbol)
126
+ host::throwRuntimeError("TypeError", "Cannot convert a Symbol for addition");
127
+ if (a.tag() == Value::Tag::String || b.tag() == Value::Tag::String)
128
+ return Value::box(Value::Tag::String, host::detail::toString(a) + host::detail::toString(b));
129
+ if (a.tag() == Value::Tag::BigInt && b.tag() == Value::Tag::BigInt)
130
+ return Value::box(Value::Tag::BigInt, a.as<BigInt>() + b.as<BigInt>());
131
+ return Value::box(Value::Tag::Number, dynamicToNumber(a) + dynamicToNumber(b));
132
+ }
133
+
134
+ inline Value dynamicArrayPrototypeGet(const PropertyKey& key) {
135
+ if (key.isSymbol()) return Value();
136
+ using Args = gea::Ref<ArrayObject<Value>>;
137
+ using Method = CallableObject<Value(Value, Args)>;
138
+ if (key.text() == "push") {
139
+ static const Value method = Value::boxMethod<1>(Method(+[](void*, Value receiver, Args args) -> Value {
140
+ double length = dynamicToNumber(receiver.getProperty(PropertyKey::string("length")));
141
+ for (std::size_t i = 0; i < args->size(); ++i) receiver.setProperty(PropertyKey::string(std::to_string(static_cast<std::size_t>(length++))), args->at(i));
142
+ receiver.setProperty(PropertyKey::string("length"), Value::box(Value::Tag::Number, length));
143
+ return Value::box(Value::Tag::Number, length);
144
+ }, nullptr));
145
+ return method;
146
+ }
147
+ if (key.text() == "pop") {
148
+ static const Value method = Value::boxMethod<1>(Method(+[](void*, Value receiver, Args) -> Value {
149
+ double length = dynamicToNumber(receiver.getProperty(PropertyKey::string("length")));
150
+ Value result;
151
+ if (length > 0) {
152
+ const auto index = PropertyKey::string(std::to_string(static_cast<std::size_t>(--length)));
153
+ result = receiver.getProperty(index);
154
+ if (!receiver.deleteProperty(index)) host::throwRuntimeError("TypeError", "Cannot delete array element");
155
+ }
156
+ receiver.setProperty(PropertyKey::string("length"), Value::box(Value::Tag::Number, length));
157
+ return result;
158
+ }, nullptr));
159
+ return method;
160
+ }
161
+ if (key.text() == "toString" || key.text() == "join" || key.text() == "map" || key.text() == "filter" || key.text() == "forEach" || key.text() == "slice") {
162
+ static const std::map<std::string, Value> methods = [] {
163
+ std::map<std::string, Value> result;
164
+ for (const char* name : {"join", "map", "filter", "forEach", "slice"}) {
165
+ auto callable = Method(+[](void* environment, Value receiver, Args args) -> Value {
166
+ alignas(void*) unsigned char slot[sizeof(void*)];
167
+ const std::string& method = *gea::unpackEnvironment<std::string>(environment, slot);
168
+ const double rawLength = dynamicToNumber(receiver.getProperty(PropertyKey::string("length")));
169
+ const std::size_t length = rawLength > 0 ? static_cast<std::size_t>(std::min(std::floor(rawLength), 9007199254740991.0)) : 0;
170
+ const Value first = args->size() ? args->at(0) : Value();
171
+ if (method == "join") {
172
+ const std::string separator = first.tag() == Value::Tag::Undefined ? "," : host::detail::toString(first);
173
+ std::string text;
174
+ for (std::size_t i = 0; i < length; ++i) {
175
+ if (i) text += separator;
176
+ const Value item = receiver.getProperty(PropertyKey::string(std::to_string(i)));
177
+ if (item.tag() != Value::Tag::Undefined && item.tag() != Value::Tag::Null) text += host::detail::toString(item);
178
+ }
179
+ return Value::box(Value::Tag::String, text);
180
+ }
181
+ auto output = gea::makeRef<ArrayObject<Value>>();
182
+ if (method == "slice") {
183
+ const auto bound = [&](const Value& value, std::size_t fallback) {
184
+ if (value.tag() == Value::Tag::Undefined) return fallback;
185
+ const double number = dynamicToNumber(value);
186
+ if (std::isnan(number)) return std::size_t{0};
187
+ const double integer = std::trunc(number);
188
+ return static_cast<std::size_t>(std::clamp(integer < 0 ? static_cast<double>(length) + integer : integer, 0.0, static_cast<double>(length)));
189
+ };
190
+ const std::size_t from = bound(first, 0);
191
+ const std::size_t to = bound(args->size() > 1 ? args->at(1) : Value(), length);
192
+ for (std::size_t i = from; i < to; ++i) {
193
+ const auto index = PropertyKey::string(std::to_string(i));
194
+ if (receiver.hasProperty(index)) output->push(receiver.getProperty(index));
195
+ else output->pushHole();
196
+ }
197
+ return Value::box(Value::Tag::Object, output);
198
+ }
199
+ if (first.tag() != Value::Tag::Function) host::throwRuntimeError("TypeError", "Array callback must be callable");
200
+ const Value thisArg = args->size() > 1 ? args->at(1) : Value();
201
+ for (std::size_t i = 0; i < length; ++i) {
202
+ const auto index = PropertyKey::string(std::to_string(i));
203
+ if (!receiver.hasProperty(index)) { if (method == "map") output->pushHole(); continue; }
204
+ const Value item = receiver.getProperty(index);
205
+ const Value returned = first.callWithReceiver(thisArg, {item, Value::box(Value::Tag::Number, static_cast<double>(i)), receiver});
206
+ if (method == "map") output->push(returned);
207
+ if (method == "filter" && host::detail::toBoolean(returned)) output->push(item);
208
+ }
209
+ return method == "forEach" ? Value() : Value::box(Value::Tag::Object, output);
210
+ }, gea::packEnvironment<std::string>(std::string(name)));
211
+ result.emplace(name, Value::boxMethod<1>(callable));
212
+ }
213
+ return result;
214
+ }();
215
+ return methods.at(key.text() == "toString" ? "join" : key.text());
216
+ }
217
+ return Value();
218
+ }
219
+
220
+ // The intrinsic is one ordinary native array with its own method properties.
221
+ // Identity sidecars already carry descriptors on arrays; a new representation
222
+ // or a boxed array would lose that existing native ownership for no reason.
223
+ inline Ref<ArrayObject<Value>> arrayPrototypeObject() {
224
+ static const Ref<ArrayObject<Value>> prototype = [] {
225
+ auto object = makeRef<ArrayObject<Value>>();
226
+ for (const char* name : {"push", "pop", "join", "toString", "map", "filter", "forEach", "slice"}) {
227
+ const auto key = PropertyKey::string(name);
228
+ auto descriptor = PropertyDescriptor::assignment(dynamicArrayPrototypeGet(key));
229
+ descriptor.enumerable = false;
230
+ nativeDynamicDefineProperty(object, key, descriptor);
231
+ }
232
+ return object;
233
+ }();
234
+ return prototype;
235
+ }
236
+
237
+ inline Value propertyKeyValue(const PropertyKey& key) {
238
+ return key.isSymbol()
239
+ ? Value::box(Value::Tag::Symbol, Symbol(static_cast<std::uint32_t>(key.symbolId())))
240
+ : Value::box(Value::Tag::String, key.text());
241
+ }
242
+
243
+ inline Value proxyTrap(const DynamicProxy& state, const char* name) {
244
+ Value trap = state.handler.getProperty(PropertyKey::string(name));
245
+ if (trap.tag() == Value::Tag::Null) return Value();
246
+ if (trap.tag() != Value::Tag::Undefined && trap.tag() != Value::Tag::Function)
247
+ host::throwRuntimeError("TypeError", std::string("Proxy trap is not callable: ") + name);
248
+ return trap;
249
+ }
250
+
251
+ inline PropertyDescriptor proxyDescriptorFrom(const Value& value) {
252
+ if (!isObjectValue(value)) host::throwRuntimeError("TypeError", "A property descriptor must be an object");
253
+ PropertyDescriptor result;
254
+ const auto read = [&](const char* name, bool& present) {
255
+ const auto key = PropertyKey::string(name);
256
+ present = value.hasProperty(key);
257
+ return present ? value.getProperty(key) : Value();
258
+ };
259
+ result.enumerable = host::detail::toBoolean(read("enumerable", result.hasEnumerable));
260
+ result.configurable = host::detail::toBoolean(read("configurable", result.hasConfigurable));
261
+ result.value = read("value", result.hasValue);
262
+ result.writable = host::detail::toBoolean(read("writable", result.hasWritable));
263
+ Value getter = read("get", result.hasGet);
264
+ Value setter = read("set", result.hasSet);
265
+ if (getter.tag() != Value::Tag::Undefined) {
266
+ if (getter.tag() != Value::Tag::Function) host::throwRuntimeError("TypeError", "Descriptor getter must be callable");
267
+ result.getIdentity = getter.identity();
268
+ result.getterValue = getter;
269
+ result.get = [getter](const Value& receiver) { return getter.callWithReceiver(receiver, {}); };
270
+ }
271
+ if (setter.tag() != Value::Tag::Undefined) {
272
+ if (setter.tag() != Value::Tag::Function) host::throwRuntimeError("TypeError", "Descriptor setter must be callable");
273
+ result.setIdentity = setter.identity();
274
+ result.setterValue = setter;
275
+ result.set = [setter](const Value& receiver, const Value& value) { setter.callWithReceiver(receiver, {value}); };
276
+ }
277
+ if (result.isAccessor() && result.isData()) host::throwRuntimeError("TypeError", "Descriptor mixes accessors and a data value");
278
+ return result;
279
+ }
280
+
281
+ inline bool compatibleProxyDescriptor(bool extensible, const PropertyDescriptor& incoming, const PropertyDescriptor* current) {
282
+ DynamicObject scratch;
283
+ const auto key = PropertyKey::string("property");
284
+ if (current) scratch.defineOwnProperty(key, *current);
285
+ if (!extensible) scratch.preventExtensions();
286
+ return scratch.defineOwnProperty(key, incoming);
287
+ }
288
+
289
+ inline bool dynamicProxyDescriptor(const Value& proxy, const PropertyKey& key, PropertyDescriptor& out) {
290
+ const DynamicProxy state = proxy.proxyState();
291
+ Value trap = proxyTrap(state, "getOwnPropertyDescriptor");
292
+ if (trap.tag() == Value::Tag::Undefined) return state.target.ownDescriptor(key, out);
293
+ const Value result = trap.callWithReceiver(state.handler, {state.target, propertyKeyValue(key)});
294
+ PropertyDescriptor current;
295
+ const bool exists = state.target.ownDescriptor(key, current);
296
+ const bool extensible = state.target.isExtensible();
297
+ if (result.tag() == Value::Tag::Undefined) {
298
+ if (exists && (!current.configurable || !extensible)) host::throwRuntimeError("TypeError", "Proxy descriptor trap hid a protected property");
299
+ return false;
300
+ }
301
+ DynamicObject complete;
302
+ complete.defineOwnProperty(key, proxyDescriptorFrom(result));
303
+ out = *complete.ownProperty(key);
304
+ if (!compatibleProxyDescriptor(extensible, out, exists ? &current : nullptr) ||
305
+ (!out.configurable && (!exists || current.configurable || (out.isData() && !out.writable && current.writable))))
306
+ host::throwRuntimeError("TypeError", "Proxy descriptor trap violated a protected property");
307
+ return true;
308
+ }
309
+
310
+ inline void Value::freezeIntegrity() const {
311
+ if (tag_ == Tag::Function) {
312
+ functionProperties()->freezeIntegrity();
313
+ return;
314
+ }
315
+ if (proxy_) host::throwRuntimeError("TypeError", "Object.freeze over a Proxy is not implemented");
316
+ if (dynamic_) {
317
+ asDynamicObject()->freezeIntegrity();
318
+ return;
319
+ }
320
+ if (tag_ != Tag::Object) return;
321
+ if (metadata_->fields != nullptr) metadata_->fields->freezeIndex(const_cast<void*>(held_.get()));
322
+ if (metadata_->elements != nullptr) metadata_->elements->freeze(const_cast<void*>(held_.get()));
323
+ detail::expandoFor(expandoAnchor(), true)->freezeIntegrity();
324
+ }
325
+
326
+ inline bool Value::hasFrozenIntegrity() const {
327
+ if (tag_ == Tag::Function) return functionProperties()->hasFrozenIntegrity();
328
+ if (proxy_) host::throwRuntimeError("TypeError", "Object.isFrozen over a Proxy is not implemented");
329
+ if (dynamic_) return asDynamicObject()->hasFrozenIntegrity();
330
+ // Primitives have no own properties and cannot be extended, so the
331
+ // integrity predicate is vacuously true (ECMA-262 TestIntegrityLevel).
332
+ if (tag_ != Tag::Object) return true;
333
+ const auto expando = detail::expandoFor(expandoAnchor(), false);
334
+ if (!expando || !expando->hasFrozenIntegrity()) return false;
335
+ return metadata_->elements == nullptr || metadata_->elements->frozen(held_.get());
336
+ }
337
+
338
+ inline bool Value::isExtensible() const {
339
+ if (tag_ == Tag::Function) return functionProperties()->extensible();
340
+ if (proxy_) {
341
+ const DynamicProxy state = proxyState();
342
+ Value trap = proxyTrap(state, "isExtensible");
343
+ if (trap.tag() == Tag::Undefined) return state.target.isExtensible();
344
+ const bool result = host::detail::toBoolean(trap.callWithReceiver(state.handler, {state.target}));
345
+ if (result != state.target.isExtensible()) host::throwRuntimeError("TypeError", "Proxy isExtensible trap disagrees with its target");
346
+ return result;
347
+ }
348
+ if (dynamic_) return asDynamicObject()->extensible();
349
+ if (metadata_->fields != nullptr && !metadata_->fields->extensible(held_.get())) return false;
350
+ if (metadata_->elements != nullptr && metadata_->elements->frozen(held_.get())) return false;
351
+ const auto expando = detail::expandoFor(expandoAnchor(), false);
352
+ return !expando || expando->extensible();
353
+ }
354
+
355
+ inline std::vector<PropertyKey> Value::ownPropertyKeys() const {
356
+ if (proxy_) {
357
+ const DynamicProxy state = proxyState();
358
+ Value trap = proxyTrap(state, "ownKeys");
359
+ if (trap.tag() == Tag::Undefined) return state.target.ownPropertyKeys();
360
+ Value result = trap.callWithReceiver(state.handler, {state.target});
361
+ if (!isObjectValue(result)) host::throwRuntimeError("TypeError", "Proxy ownKeys trap must return an object");
362
+ const double rawLength = dynamicToNumber(result.getProperty(PropertyKey::string("length")));
363
+ const std::size_t length = rawLength > 0 ? static_cast<std::size_t>(std::min(std::floor(rawLength), 9007199254740991.0)) : 0;
364
+ std::vector<PropertyKey> keys;
365
+ for (std::size_t i = 0; i < length; ++i) {
366
+ const Value item = result.getProperty(PropertyKey::string(std::to_string(i)));
367
+ if (item.tag() != Tag::String && item.tag() != Tag::Symbol) host::throwRuntimeError("TypeError", "Proxy ownKeys item must be string or symbol");
368
+ const auto key = host::toPropertyKey(item);
369
+ if (std::find(keys.begin(), keys.end(), key) != keys.end()) host::throwRuntimeError("TypeError", "Proxy ownKeys returned duplicate keys");
370
+ keys.push_back(key);
371
+ }
372
+ const bool extensible = state.target.isExtensible();
373
+ const auto targetKeys = state.target.ownPropertyKeys();
374
+ for (const auto& key : targetKeys) {
375
+ PropertyDescriptor descriptor;
376
+ state.target.ownDescriptor(key, descriptor);
377
+ if ((!extensible || !descriptor.configurable) && std::find(keys.begin(), keys.end(), key) == keys.end())
378
+ host::throwRuntimeError("TypeError", "Proxy ownKeys hid a protected key");
379
+ }
380
+ if (!extensible && keys.size() != targetKeys.size()) host::throwRuntimeError("TypeError", "Proxy ownKeys added keys to a non-extensible target");
381
+ return keys;
382
+ }
383
+ if (dynamic_) return asDynamicObject()->ownKeys();
384
+ if (tag_ == Tag::Function) return functionProperties()->ownKeys();
385
+ std::vector<PropertyKey> keys;
386
+ if (tag_ == Tag::String) {
387
+ const std::size_t length = runtime::string::utf16Length(as<std::string>());
388
+ keys.reserve(length + 1);
389
+ for (std::size_t index = 0; index < length; ++index) keys.push_back(PropertyKey::string(std::to_string(index)));
390
+ keys.push_back(PropertyKey::string("length"));
391
+ return keys;
392
+ }
393
+ if (metadata_->fields) metadata_->fields->ownKeys(held_.get(), keys);
394
+ if (metadata_->elements) {
395
+ for (std::size_t i = 0; i < metadata_->elements->length(held_.get()); ++i) {
396
+ Value ignored;
397
+ if (metadata_->elements->element(held_.get(), i, ignored)) keys.push_back(PropertyKey::string(std::to_string(i)));
398
+ }
399
+ keys.push_back(PropertyKey::string("length"));
400
+ }
401
+ const auto expando = detail::expandoFor(expandoAnchor(), false);
402
+ if (expando) for (const auto& key : expando->ownKeys()) keys.push_back(key);
403
+ return detail::ordinaryOwnPropertyKeyOrder(std::move(keys));
404
+ }
405
+
406
+ inline bool Value::defineProperty(const PropertyKey& key, const PropertyDescriptor& descriptor) const {
407
+ if (proxy_) {
408
+ const DynamicProxy state = proxyState();
409
+ Value trap = proxyTrap(state, "defineProperty");
410
+ if (trap.tag() == Tag::Undefined) return state.target.defineProperty(key, descriptor);
411
+ Value object = Value::object();
412
+ if (descriptor.hasValue) object.setProperty(PropertyKey::string("value"), descriptor.value);
413
+ if (descriptor.hasWritable) object.setProperty(PropertyKey::string("writable"), Value::box(Tag::Boolean, descriptor.writable));
414
+ if (descriptor.hasEnumerable) object.setProperty(PropertyKey::string("enumerable"), Value::box(Tag::Boolean, descriptor.enumerable));
415
+ if (descriptor.hasConfigurable) object.setProperty(PropertyKey::string("configurable"), Value::box(Tag::Boolean, descriptor.configurable));
416
+ if (descriptor.hasGet) {
417
+ Value getter = descriptor.getterValue;
418
+ if (getter.tag() == Tag::Undefined && descriptor.get) {
419
+ using Get = PropertyDescriptor::Getter;
420
+ getter = Value::boxMethod(CallableObject<Value(Value)>(+[](void* env, Value receiver) -> Value {
421
+ alignas(void*) unsigned char slot[sizeof(void*)];
422
+ return (*gea::unpackEnvironment<Get>(env, slot))(receiver);
423
+ }, gea::packEnvironment<Get>(descriptor.get)));
424
+ }
425
+ object.setProperty(PropertyKey::string("get"), getter);
426
+ }
427
+ if (descriptor.hasSet) {
428
+ Value setter = descriptor.setterValue;
429
+ if (setter.tag() == Tag::Undefined && descriptor.set) {
430
+ using Set = PropertyDescriptor::Setter;
431
+ setter = Value::boxMethod(CallableObject<void(Value, Value)>(+[](void* env, Value receiver, Value value) {
432
+ alignas(void*) unsigned char slot[sizeof(void*)];
433
+ (*gea::unpackEnvironment<Set>(env, slot))(receiver, value);
434
+ }, gea::packEnvironment<Set>(descriptor.set)));
435
+ }
436
+ object.setProperty(PropertyKey::string("set"), setter);
437
+ }
438
+ if (!host::detail::toBoolean(trap.callWithReceiver(state.handler, {state.target, propertyKeyValue(key), object}))) return false;
439
+ PropertyDescriptor current;
440
+ const bool exists = state.target.ownDescriptor(key, current);
441
+ if (!compatibleProxyDescriptor(state.target.isExtensible(), descriptor, exists ? &current : nullptr) ||
442
+ (descriptor.hasConfigurable && !descriptor.configurable && (!exists || current.configurable)) ||
443
+ (exists && !current.configurable && current.isData() && current.writable && descriptor.hasWritable && !descriptor.writable))
444
+ host::throwRuntimeError("TypeError", "Proxy defineProperty trap violated a protected property");
445
+ return true;
446
+ }
447
+ if (dynamic_) return asDynamicObject()->defineOwnProperty(key, descriptor);
448
+ // `Dictionary<Value>` has its own arm in `getProperty`/`setProperty`/
449
+ // `hasProperty`/`deleteProperty` (see the comment above `nativeFieldOpsFor`'s
450
+ // `TypedStringDictionaryTable` branch) because it is an index-signature
451
+ // store with no fixed field table -- `metadata_->fields` is null for it, so
452
+ // without this arm `defineProperty` fell all the way to the expando sidecar
453
+ // below. That sidecar is keyed on the box's identity, not the dictionary's
454
+ // own entries, so `Reflect.set`/`Object.defineProperty` (both of which route
455
+ // through here) silently wrote a key nothing else ever reads: a direct
456
+ // `dictionary->read(key)` afterwards still saw the old table, unmodified.
457
+ if (metadata_->payloadType == detail::payloadTypeTagFor<gea::Ref<gea::Dictionary<gea::Value>>>()) {
458
+ if (key.isSymbol() || descriptor.isAccessor()) return false;
459
+ const gea::Ref<gea::Dictionary<gea::Value>>& dictionary = as<gea::Ref<gea::Dictionary<gea::Value>>>();
460
+ if (!dictionary) return false;
461
+ if (!descriptor.hasValue) return dictionary->has(key.text());
462
+ (*dictionary)[key.text()] = descriptor.value;
463
+ return true;
464
+ }
465
+ if (tag_ == Tag::Function) return functionProperties()->defineOwnProperty(key, descriptor);
466
+ // The fixed half first, exactly as `nativeDynamicDefineProperty` orders it:
467
+ // a payload that models its own attributes answers for its own keys before
468
+ // an index sidecar or the descriptor comparison below is consulted. Only a
469
+ // payload that states the whole own-field protocol installs this hook, so
470
+ // for every other native the next two branches are unchanged.
471
+ if (metadata_->fields != nullptr && metadata_->fields->matchesField != nullptr &&
472
+ metadata_->fields->matchesField(held_.get(), key)) {
473
+ return metadata_->fields->defineField(const_cast<void*>(held_.get()), key, descriptor, isExtensible());
474
+ }
475
+ if (metadata_->fields != nullptr && metadata_->fields->matchesIndex(held_.get(), key)) {
476
+ return metadata_->fields->defineIndex(const_cast<void*>(held_.get()), key, descriptor, isExtensible());
477
+ }
478
+ PropertyDescriptor current;
479
+ if (ownDescriptor(key, current)) {
480
+ if (!compatibleProxyDescriptor(isExtensible(), descriptor, &current)) return false;
481
+ // Native fields retain their native storage. Attribute changes require a
482
+ // native integrity/descriptor sidecar; never pretend to install one.
483
+ if (descriptor.isAccessor() || (descriptor.hasWritable && descriptor.writable != current.writable) ||
484
+ (descriptor.hasEnumerable && descriptor.enumerable != current.enumerable) ||
485
+ (descriptor.hasConfigurable && descriptor.configurable != current.configurable)) return false;
486
+ if (descriptor.hasValue) { Value self = *this; self.setProperty(key, descriptor.value); }
487
+ return true;
488
+ }
489
+ if (metadata_->elements) {
490
+ std::size_t index = 0;
491
+ if (detail::arrayIndexOfKey(key, index)) {
492
+ if (!descriptor.hasValue || !descriptor.hasWritable || !descriptor.writable || !descriptor.hasEnumerable ||
493
+ !descriptor.enumerable || !descriptor.hasConfigurable || !descriptor.configurable) return false;
494
+ return metadata_->elements->setElement(const_cast<void*>(held_.get()), index, descriptor.value);
495
+ }
496
+ }
497
+ return detail::expandoFor(expandoAnchor(), true)->defineOwnProperty(key, descriptor);
498
+ }
499
+
500
+ inline bool Value::ownDescriptor(const PropertyKey& key, PropertyDescriptor& out) const {
501
+ if (proxy_) return dynamicProxyDescriptor(*this, key, out);
502
+ if (tag_ == Tag::Function) {
503
+ const auto* descriptor = functionProperties()->ownProperty(key);
504
+ if (!descriptor) return false;
505
+ out = *descriptor; return true;
506
+ }
507
+ if (dynamic_) {
508
+ const auto* descriptor = asDynamicObject()->ownProperty(key);
509
+ if (!descriptor) return false;
510
+ out = *descriptor;
511
+ return true;
512
+ }
513
+ // See the matching arm in `defineProperty`: `Dictionary<Value>` answers for
514
+ // its own keys directly rather than through `metadata_->fields`, and
515
+ // `ownDescriptor` needs the same arm `getProperty`/`hasProperty` already
516
+ // have or `Reflect.set`'s existence check (and `for`-`in`/`Object.keys`,
517
+ // which filter through `ownDescriptor`) never see what the table holds.
518
+ if (metadata_->payloadType == detail::payloadTypeTagFor<gea::Ref<gea::Dictionary<gea::Value>>>()) {
519
+ if (key.isSymbol()) return false;
520
+ const gea::Ref<gea::Dictionary<gea::Value>>& dictionary = as<gea::Ref<gea::Dictionary<gea::Value>>>();
521
+ if (!dictionary || !dictionary->has(key.text())) return false;
522
+ out = PropertyDescriptor::assignment(dictionary->read(key.text()));
523
+ return true;
524
+ }
525
+ if (tag_ == Tag::String && detail::stringOwnDescriptor(as<std::string>(), key, out)) return true;
526
+ if (metadata_->fields) {
527
+ if (metadata_->fields->ownDescriptor(held_.get(), key, out)) {
528
+ const auto integrity = detail::expandoFor(expandoAnchor(), false);
529
+ if (integrity && integrity->nativeFieldsFrozen()) out.writable = false;
530
+ return true;
531
+ }
532
+ if (metadata_->fields->ownIndexDescriptor(held_.get(), key, out)) return true;
533
+ if (metadata_->fields->matchesIndex(held_.get(), key)) return false;
534
+ }
535
+ if (metadata_->elements) {
536
+ const auto integrity = detail::expandoFor(expandoAnchor(), false);
537
+ const bool frozen = integrity && integrity->hasFrozenIntegrity();
538
+ if (!key.isSymbol() && key.text() == "length") {
539
+ out = PropertyDescriptor::assignment(Value::box(Tag::Number, static_cast<double>(metadata_->elements->length(held_.get()))));
540
+ out.enumerable = out.configurable = false;
541
+ out.writable = !frozen;
542
+ return true;
543
+ }
544
+ std::size_t index = 0;
545
+ Value found;
546
+ if (detail::arrayIndexOfKey(key, index) && metadata_->elements->element(held_.get(), index, found)) {
547
+ out = PropertyDescriptor::assignment(found);
548
+ if (frozen) out.writable = out.configurable = false;
549
+ return true;
550
+ }
551
+ }
552
+ const auto expando = detail::expandoFor(expandoAnchor(), false);
553
+ const auto* descriptor = expando ? expando->ownProperty(key) : nullptr;
554
+ if (!descriptor) return false;
555
+ out = *descriptor;
556
+ return true;
557
+ }
558
+
559
+ inline Value dynamicProxyCall(const Value& proxy, const Value& receiver, const std::vector<Value>& arguments) {
560
+ const DynamicProxy state = proxy.proxyState();
561
+ Value trap = proxyTrap(state, "apply");
562
+ if (trap.tag() == Value::Tag::Undefined) return state.target.callWithReceiver(receiver, arguments);
563
+ auto array = gea::makeRef<ArrayObject<Value>>();
564
+ for (const Value& argument : arguments) array->push(argument);
565
+ return trap.callWithReceiver(state.handler, {state.target, receiver, Value::box(Value::Tag::Object, array)});
566
+ }
567
+
568
+ inline Value dynamicProxyGet(const Value& proxy, const PropertyKey& key, const Value& receiver) {
569
+ // Copy the references: a trap may revoke this proxy while it is running.
570
+ const DynamicProxy state = proxy.proxyState();
571
+ Value trap = proxyTrap(state, "get");
572
+ if (trap.tag() == Value::Tag::Undefined) return state.target.getProperty(key, receiver);
573
+ Value result = trap.callWithReceiver(state.handler, {state.target, propertyKeyValue(key), receiver});
574
+ PropertyDescriptor descriptor;
575
+ if (state.target.ownDescriptor(key, descriptor) && !descriptor.configurable) {
576
+ if (descriptor.isAccessor() ? !descriptor.get && result.tag() != Value::Tag::Undefined
577
+ : !descriptor.writable && !Value::sameValue(result, descriptor.value))
578
+ host::throwRuntimeError("TypeError", "Proxy get trap violated a non-configurable property");
579
+ }
580
+ return result;
581
+ }
582
+
583
+ inline bool dynamicProxySet(const Value& proxy, const PropertyKey& key, const Value& value, const Value& receiver) {
584
+ DynamicProxy state = proxy.proxyState();
585
+ Value trap = proxyTrap(state, "set");
586
+ if (trap.tag() == Value::Tag::Undefined) return state.target.reflectSet(key, value, receiver);
587
+ if (!host::detail::toBoolean(trap.callWithReceiver(state.handler, {state.target, propertyKeyValue(key), value, receiver}))) return false;
588
+ PropertyDescriptor descriptor;
589
+ if (state.target.ownDescriptor(key, descriptor) && !descriptor.configurable) {
590
+ if (descriptor.isAccessor() ? !descriptor.set : !descriptor.writable && !Value::sameValue(value, descriptor.value))
591
+ host::throwRuntimeError("TypeError", "Proxy set trap violated a non-configurable property");
592
+ }
593
+ return true;
594
+ }
595
+
596
+ inline bool dynamicProxyHas(const Value& proxy, const PropertyKey& key) {
597
+ const DynamicProxy state = proxy.proxyState();
598
+ Value trap = proxyTrap(state, "has");
599
+ if (trap.tag() == Value::Tag::Undefined) return state.target.hasProperty(key);
600
+ const bool result = host::detail::toBoolean(trap.callWithReceiver(state.handler, {state.target, propertyKeyValue(key)}));
601
+ PropertyDescriptor descriptor;
602
+ const auto object = state.target.asDynamicObject();
603
+ if (!result && state.target.ownDescriptor(key, descriptor) && (!descriptor.configurable || (object && !object->extensible())))
604
+ host::throwRuntimeError("TypeError", "Proxy has trap hid a protected property");
605
+ return result;
606
+ }
607
+
608
+ inline bool dynamicProxyDelete(const Value& proxy, const PropertyKey& key) {
609
+ DynamicProxy state = proxy.proxyState();
610
+ Value trap = proxyTrap(state, "deleteProperty");
611
+ if (trap.tag() == Value::Tag::Undefined) return state.target.deleteProperty(key);
612
+ const bool result = host::detail::toBoolean(trap.callWithReceiver(state.handler, {state.target, propertyKeyValue(key)}));
613
+ PropertyDescriptor descriptor;
614
+ const auto object = state.target.asDynamicObject();
615
+ if (result && state.target.ownDescriptor(key, descriptor) && (!descriptor.configurable || (object && !object->extensible())))
616
+ host::throwRuntimeError("TypeError", "Proxy deleteProperty trap hid a protected property");
617
+ return result;
618
+ }
619
+
620
+ inline bool Value::reflectSet(const PropertyKey& key, const Value& value, const Value& receiver) {
621
+ if (!isObjectValue(*this)) host::throwRuntimeError("TypeError", "Reflect.set target must be an object");
622
+ if (proxy_) return dynamicProxySet(*this, key, value, receiver);
623
+ PropertyDescriptor descriptor;
624
+ const bool exists = ownDescriptor(key, descriptor);
625
+ if (!exists && dynamic_ && asDynamicObject()->prototype()) {
626
+ Value parent;
627
+ parent.tag_ = Tag::Object;
628
+ parent.dynamic_ = true;
629
+ parent.held_ = asDynamicObject()->prototype();
630
+ return parent.reflectSet(key, value, receiver);
631
+ }
632
+ if (!exists && metadata_->prototype != nullptr) {
633
+ const auto result = metadata_->prototype->set(const_cast<void*>(held_.get()), key, value, receiver);
634
+ if (result != detail::NativePrototypeOps::SetResult::Absent) {
635
+ return result == detail::NativePrototypeOps::SetResult::Accepted;
636
+ }
637
+ }
638
+ if (exists) {
639
+ if (descriptor.isAccessor()) {
640
+ if (!descriptor.set) return false;
641
+ descriptor.set(receiver, value);
642
+ return true;
643
+ }
644
+ if (!descriptor.writable) return false;
645
+ }
646
+ if (!isObjectValue(receiver)) return false;
647
+ PropertyDescriptor existing;
648
+ if (receiver.ownDescriptor(key, existing)) {
649
+ if (existing.isAccessor() || !existing.writable) return false;
650
+ PropertyDescriptor update;
651
+ update.hasValue = true;
652
+ update.value = value;
653
+ return receiver.defineProperty(key, update);
654
+ }
655
+ return receiver.defineProperty(key, PropertyDescriptor::assignment(value));
656
+ }
657
+
658
+ template <typename T>
659
+ inline Value reflectBox(const T& value) { return detail::DynamicCarrier<std::decay_t<T>>::out(value); }
660
+
661
+ template <typename T, typename K, typename R>
662
+ inline Value reflectGet(const T& target, const K& key, const R& receiver) {
663
+ const Value object = reflectBox(target);
664
+ if (!isObjectValue(object)) host::throwRuntimeError("TypeError", "Reflect.get target must be an object");
665
+ return object.getProperty(host::toPropertyKey(reflectBox(key)), reflectBox(receiver));
666
+ }
667
+ template <typename T, typename K>
668
+ inline Value reflectGet(const T& target, const K& key) { return reflectGet(target, key, target); }
669
+
670
+ template <typename T, typename K, typename V, typename R>
671
+ inline bool reflectSet(const T& target, const K& key, const V& value, const R& receiver) {
672
+ Value object = reflectBox(target);
673
+ return object.reflectSet(host::toPropertyKey(reflectBox(key)), reflectBox(value), reflectBox(receiver));
674
+ }
675
+ template <typename T, typename K, typename V>
676
+ inline bool reflectSet(const T& target, const K& key, const V& value) { return reflectSet(target, key, value, target); }
677
+
678
+ template <typename T, typename K>
679
+ inline bool reflectHas(const T& target, const K& key) {
680
+ const Value object = reflectBox(target);
681
+ if (!isObjectValue(object)) host::throwRuntimeError("TypeError", "Reflect.has target must be an object");
682
+ return object.hasProperty(host::toPropertyKey(reflectBox(key)));
683
+ }
684
+ /**
685
+ * `Reflect.getOwnPropertyDescriptor` -- the own descriptor as a fresh object,
686
+ * or `undefined` when the property is absent.
687
+ *
688
+ * `Value::ownDescriptor` already routes a Proxy through its own
689
+ * `getOwnPropertyDescriptor` trap and enforces the invariants
690
+ * (`dynamicProxyDescriptor`), so this is only the crossing back: the internal
691
+ * `PropertyDescriptor` rendered as the ordinary JavaScript object the language
692
+ * hands the program, with the same field set `Value::defineProperty` writes
693
+ * when it crosses the other way.
694
+ */
695
+ template <typename T, typename K>
696
+ inline Value reflectOwnDescriptor(const T& target, const K& key) {
697
+ const Value object = reflectBox(target);
698
+ if (!isObjectValue(object)) host::throwRuntimeError("TypeError", "Reflect.getOwnPropertyDescriptor target must be an object");
699
+ PropertyDescriptor descriptor;
700
+ if (!object.ownDescriptor(host::toPropertyKey(reflectBox(key)), descriptor)) return Value();
701
+ Value result = Value::object();
702
+ if (descriptor.isAccessor()) {
703
+ result.setProperty(PropertyKey::string("get"), descriptor.getterValue);
704
+ result.setProperty(PropertyKey::string("set"), descriptor.setterValue);
705
+ } else {
706
+ result.setProperty(PropertyKey::string("value"), descriptor.value);
707
+ result.setProperty(PropertyKey::string("writable"), Value::box(Value::Tag::Boolean, descriptor.writable));
708
+ }
709
+ result.setProperty(PropertyKey::string("enumerable"), Value::box(Value::Tag::Boolean, descriptor.enumerable));
710
+ result.setProperty(PropertyKey::string("configurable"), Value::box(Value::Tag::Boolean, descriptor.configurable));
711
+ return result;
712
+ }
713
+
714
+ template <typename T, typename K>
715
+ inline bool reflectDelete(const T& target, const K& key) {
716
+ Value object = reflectBox(target);
717
+ if (!isObjectValue(object)) host::throwRuntimeError("TypeError", "Reflect.deleteProperty target must be an object");
718
+ return object.deleteProperty(host::toPropertyKey(reflectBox(key)));
719
+ }
720
+
721
+ inline std::string objectTagText(const char* tag) {
722
+ return std::string("[object ") + tag + "]";
723
+ }
724
+
725
+ inline std::string objectTagWithOverride(const Value& tag, const char* builtinTag) {
726
+ return tag.tag() == Value::Tag::String ? std::string("[object ") + tag.as<std::string>() + "]" : objectTagText(builtinTag);
727
+ }
728
+
729
+ template <typename T>
730
+ std::string objectTag(const Ref<T>& object, const char* builtinTag, const char* defaultTag = nullptr) {
731
+ if (!object) return objectTagText("Null");
732
+ Value tag;
733
+ const auto key = PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToStringTag));
734
+ if (nativeDynamicRead(object, key, tag)) return objectTagWithOverride(tag, builtinTag);
735
+ return objectTagText(defaultTag ? defaultTag : builtinTag);
736
+ }
737
+
738
+ template <typename Callable>
739
+ std::string callableObjectTag(const Callable& callable, const char* builtinTag, const char* defaultTag) {
740
+ const auto& identity = callable.functionObjectIdentity();
741
+ const auto key = PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToStringTag));
742
+ if (identity && identity->properties) {
743
+ // The native callable only crosses a dynamic boundary if a program-supplied
744
+ // accessor actually needs its `this`. Absent and data properties never box it.
745
+ Value tag;
746
+ if (identity->properties->readWithReceiver(key, [&] { return Value::box(Value::Tag::Function, callable); }, tag))
747
+ return objectTagWithOverride(tag, builtinTag);
748
+ }
749
+ return objectTagText(defaultTag ? defaultTag : builtinTag);
750
+ }
751
+
752
+ template <typename Result, typename... Arguments>
753
+ std::string objectTag(const CallableObject<Result(Arguments...)>& callable, const char* builtinTag, const char* defaultTag = nullptr) {
754
+ return callableObjectTag(callable, builtinTag, defaultTag);
755
+ }
756
+
757
+ template <typename Result, typename... Arguments, typename Constructed, typename... ConstructArguments>
758
+ std::string objectTag(const CallableConstructorObject<Result(Arguments...), Constructed(ConstructArguments...)>& callable,
759
+ const char* builtinTag, const char* defaultTag = nullptr) {
760
+ return callableObjectTag(callable, builtinTag, defaultTag);
761
+ }
762
+
763
+ template <typename T>
764
+ requires (std::is_arithmetic_v<T> || std::is_same_v<T, std::string> || std::is_same_v<T, Symbol> ||
765
+ std::is_same_v<T, BigInt> || std::is_same_v<T, Undefined> || std::is_same_v<T, std::nullptr_t>)
766
+ std::string objectTag(const T&, const char* builtinTag, const char* defaultTag = nullptr) {
767
+ return objectTagText(defaultTag ? defaultTag : builtinTag);
768
+ }
769
+
770
+ inline std::string hostIntrinsicObjectTag(const char* protocol, const char* builtinTag, const char* defaultTag = nullptr) {
771
+ const auto key = PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToStringTag));
772
+ // Non-const binding on purpose: `hostIntrinsicSidecar` hands back a reference into
773
+ // its own function-local static map, never into the argument, but gcc's
774
+ // -Wdangling-reference heuristic fires on a CONST reference bound to a call whose
775
+ // argument is a temporary (the std::string built from `protocol`), and ESP-IDF
776
+ // builds with -Werror. Every emitter-generated sidecar site already spells `auto&`.
777
+ auto& properties = detail::hostIntrinsicSidecar(protocol);
778
+ if (properties.hasOverride(key)) return objectTagWithOverride(properties.get(key), builtinTag);
779
+ return objectTagText(properties.isRemoved(key) || !defaultTag ? builtinTag : defaultTag);
780
+ }
781
+
782
+ inline std::string objectTag(const char*, const char* builtinTag, const char* defaultTag = nullptr) {
783
+ return objectTagText(defaultTag ? defaultTag : builtinTag);
784
+ }
785
+
786
+ inline std::string dynamicIntrinsicObjectTag(const Value& value, const char* builtinTag, const char* defaultTag) {
787
+ PropertyDescriptor descriptor;
788
+ if (!value.ownDescriptor(PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToStringTag)), descriptor))
789
+ return objectTagText(defaultTag);
790
+ const Value tag = descriptor.isAccessor() ? (descriptor.get ? descriptor.get(value) : Value()) : descriptor.value;
791
+ return objectTagWithOverride(tag, builtinTag);
792
+ }
793
+
794
+ inline std::string objectTag(const Value& value, const char* = "Object", const char* = nullptr) {
795
+ const char* builtinTag = "Object";
796
+ switch (value.tag()) {
797
+ case Value::Tag::Undefined: return objectTagText("Undefined");
798
+ case Value::Tag::Null: return objectTagText("Null");
799
+ case Value::Tag::Boolean: return objectTagText("Boolean");
800
+ case Value::Tag::Number: return objectTagText("Number");
801
+ case Value::Tag::String: return objectTagText("String");
802
+ case Value::Tag::Symbol: return objectTagText("Symbol");
803
+ case Value::Tag::BigInt: return objectTagText("BigInt");
804
+ case Value::Tag::Function: builtinTag = "Function"; break;
805
+ case Value::Tag::Object: break;
806
+ }
807
+ // IsArray also validates a proxy before the single observable @@toStringTag
808
+ // read. A proxy around Date does not inherit its target's [[DateValue]] slot.
809
+ if (value.isArrayPayload()) builtinTag = "Array";
810
+ else if (!value.isProxy()) {
811
+ if (host::instanceOfDate(value)) builtinTag = "Date";
812
+ else if (host::instanceOfRegExp(value)) builtinTag = "RegExp";
813
+ else if (host::isRuntimeError(value)) builtinTag = "Error";
814
+ else if (value.isMapPayload()) return dynamicIntrinsicObjectTag(value, "Object", "Map");
815
+ else if (host::instanceOfArrayBuffer(value)) return dynamicIntrinsicObjectTag(value, "Object", "ArrayBuffer");
816
+ }
817
+ return objectTagWithOverride(value.getProperty(PropertyKey::symbol(wellKnownSymbol(detail::WellKnownSymbol::ToStringTag))), builtinTag);
818
+ }
819
+
820
+ inline std::string objectTag(const FunctionValue& value, const char* builtinTag = "Function", const char* defaultTag = nullptr) {
821
+ return objectTag(static_cast<const Value&>(value), builtinTag, defaultTag);
822
+ }
823
+
824
+ } // namespace gea