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