@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,1019 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Physical carriers.
|
|
4
|
+
*
|
|
5
|
+
* A representation answers "which physical thing holds this value", and it is
|
|
6
|
+
* selected from an already-published semantic result. It is never a second
|
|
7
|
+
* interpretation of the source: if choosing a carrier requires re-reading the
|
|
8
|
+
* program, the semantic layer did not publish enough.
|
|
9
|
+
*
|
|
10
|
+
* `array-object` and `dense-buffer` are deliberately different kinds. A
|
|
11
|
+
* JavaScript-observable Array is an exotic object with hole semantics, an
|
|
12
|
+
* array-index key domain, and `length` define/delete/truncation rules; a dense
|
|
13
|
+
* buffer is a compiler-private storage block with none of that. Letting one
|
|
14
|
+
* kind mean both is what allows a single Array to be a tagged array object in
|
|
15
|
+
* one endpoint and a bare vector in another.
|
|
16
|
+
*/
|
|
17
|
+
/** The only reasons a value may be carried dynamically. */
|
|
18
|
+
export const dynamicReasons = [
|
|
19
|
+
/** Explicit compiler option permits C++ dynamic dispatch without a static specialization. */
|
|
20
|
+
'opt-in-fallback',
|
|
21
|
+
/** `ToString` of a value whose type the program never narrows. */
|
|
22
|
+
'tostring-of-unknown',
|
|
23
|
+
/** A thrown value, which JavaScript does not type. */
|
|
24
|
+
'thrown-error-carrier',
|
|
25
|
+
/** `JSON.parse` with no asserted result type. */
|
|
26
|
+
'unasserted-json-parse',
|
|
27
|
+
/** The program itself declared `any`/`unknown` and never narrowed it. */
|
|
28
|
+
'declared-any-never-narrowed',
|
|
29
|
+
/** A host-authenticated CommonJS module record is deliberately an `any` boundary. */
|
|
30
|
+
'commonjs-module-boundary',
|
|
31
|
+
// The bare `Function` interface (`lib.es5.d.ts`), which states a value is
|
|
32
|
+
// callable and states nothing else: no parameter list, no arity, no result.
|
|
33
|
+
// That is `unknown` for callables, and it is a genuinely dynamic boundary
|
|
34
|
+
// rather than a lowering this compiler has not written yet -- a physical
|
|
35
|
+
// frame cannot be chosen from a signature the program never gave. The
|
|
36
|
+
// checker already reaches this same conclusion on the CALLEE side, where it
|
|
37
|
+
// declines to check a call whose callee is `Function` and answers `any`
|
|
38
|
+
// (see `resolvedCalleeSignatureType`, semantics/normalize/producers/
|
|
39
|
+
// shared.ts); this is the same answer for a `Function`-typed VALUE, so the
|
|
40
|
+
// two are one authority instead of two.
|
|
41
|
+
//
|
|
42
|
+
// Reached by more than an explicit `value: Function` annotation:
|
|
43
|
+
// `typeof x === 'function'` narrows an `unknown` TO `Function`, and
|
|
44
|
+
// `lib.es5.d.ts` types `Object.prototype.constructor` as `Function`. Before
|
|
45
|
+
// this reason existed all three derived to `native-handle(Function@1)` --
|
|
46
|
+
// a host protocol no target can ever register, since there is no C++ type
|
|
47
|
+
// for "some callable" -- so the program refused with an obligation nothing
|
|
48
|
+
// could satisfy instead of boxing the one thing that genuinely is dynamic.
|
|
49
|
+
'untyped-callable',
|
|
50
|
+
// A read of `call`/`apply`/`bind` off a Function object the program itself
|
|
51
|
+
// installed an own property of that name onto. `lib.es5.d.ts` types such a
|
|
52
|
+
// read as `Function.prototype`'s method, which is not what the program will
|
|
53
|
+
// find there: the own property shadows it, and what the own-property table
|
|
54
|
+
// holds is whatever was written, under no declared convention. The renderer
|
|
55
|
+
// already agrees -- `ir/certify/property-access-keys.ts` gives exactly this
|
|
56
|
+
// read the `(prototype-dynamic)` recipe, which emits `callableDynamicGet`
|
|
57
|
+
// and yields a `gea::Value` -- so before this reason existed the carrier and
|
|
58
|
+
// the code emitted for it disagreed about the same read.
|
|
59
|
+
'shadowed-callable-builtin'
|
|
60
|
+
];
|
|
61
|
+
/**
|
|
62
|
+
* A whole numeric property table stores text keys after ToPropertyKey, unlike
|
|
63
|
+
* a numeric sidecar selected from a record's disjoint index signatures. Keep
|
|
64
|
+
* the numeric fast path, but carry other non-Symbol primitives through the
|
|
65
|
+
* table's text protocol. In particular absence names "undefined"/"null";
|
|
66
|
+
* recovering a number would either refuse it or alias a different property.
|
|
67
|
+
*/
|
|
68
|
+
export const dictionaryKeyDomainOf = (declared, key) => {
|
|
69
|
+
if (declared !== 'number' || (key.kind === 'scalar' && key.domain === 'number'))
|
|
70
|
+
return declared;
|
|
71
|
+
const primitiveText = (value) => {
|
|
72
|
+
if (value.kind === 'scalar' || value.kind === 'string' || value.kind === 'null' || value.kind === 'undefined' || value.kind === 'void')
|
|
73
|
+
return true;
|
|
74
|
+
if (value.kind === 'optional')
|
|
75
|
+
return primitiveText(value.payload);
|
|
76
|
+
return value.kind === 'tagged-union' && value.arms.length > 0 && value.arms.every((arm) => primitiveText(arm.value));
|
|
77
|
+
};
|
|
78
|
+
return primitiveText(key) ? 'string' : declared;
|
|
79
|
+
};
|
|
80
|
+
/** Exact ECMAScript Number::toString spelling accepted by a number index signature. */
|
|
81
|
+
export const isCanonicalNumberPropertyKeyText = (text) => {
|
|
82
|
+
const numeric = Number(text);
|
|
83
|
+
return Number.isNaN(numeric) ? text === 'NaN' : String(numeric) === text;
|
|
84
|
+
};
|
|
85
|
+
/** Select the disjoint sidecar addressed by a statically carried property key. */
|
|
86
|
+
export const recordIndexForKeyCarrier = (indexes, key, constantText) => {
|
|
87
|
+
if (key.kind === 'symbol')
|
|
88
|
+
return indexes.find((index) => index.key === 'symbol') ?? null;
|
|
89
|
+
if (key.kind === 'scalar' && key.domain === 'number')
|
|
90
|
+
return indexes.find((index) => index.key === 'string') ?? indexes.find((index) => index.key === 'number') ?? null;
|
|
91
|
+
if (key.kind === 'string') {
|
|
92
|
+
const stringIndex = indexes.find((index) => index.key === 'string');
|
|
93
|
+
if (stringIndex)
|
|
94
|
+
return stringIndex;
|
|
95
|
+
// A number index is a set of PROPERTY KEYS, not a set of finite doubles.
|
|
96
|
+
// Number::toString is the canonicalizer: in particular NaN and both
|
|
97
|
+
// infinities are valid keys, while -0 aliases "0" and "01" is not the
|
|
98
|
+
// canonical spelling of 1.
|
|
99
|
+
const canonical = constantText !== undefined && isCanonicalNumberPropertyKeyText(constantText);
|
|
100
|
+
return canonical ? (indexes.find((index) => index.key === 'number') ?? null) : null;
|
|
101
|
+
}
|
|
102
|
+
if (key.kind === 'tagged-union' &&
|
|
103
|
+
key.arms.every((arm) => arm.value.kind === 'string' || (arm.value.kind === 'scalar' && arm.value.domain === 'number')))
|
|
104
|
+
return indexes.find((index) => index.key === 'string') ?? null;
|
|
105
|
+
return null;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* `passingOf`'s answer for `value` under `ownership` (the ABI's own override
|
|
109
|
+
* for this position, or `null` to ask the carrier's own tier -- mirroring
|
|
110
|
+
* `cppTypeOf`'s optional second argument).
|
|
111
|
+
*
|
|
112
|
+
* `string` and `callable-identity` carry no `ownership` field at all -- a
|
|
113
|
+
* `std::string` always owns its buffer and `gea::Ref<gea::FunctionObjectIdentity>`
|
|
114
|
+
* is `cppTypeOf`'s one hardcoded reference spelling -- so both are named
|
|
115
|
+
* directly rather than falling out of the ownership-tier check below. Every
|
|
116
|
+
* other reference-shaped carrier (`class-ref`, `record`, `record-with-index`,
|
|
117
|
+
* `native-record-ref`, `array-object`, `typed-array`, `array-buffer`,
|
|
118
|
+
* `shared-array-buffer`, `data-view`, `keyed-collection`, `dictionary`) is
|
|
119
|
+
* spelled `gea::Ref<...>` by `cppTypeOf`'s `cppOwnershipWrap` exactly when its
|
|
120
|
+
* effective ownership is `shared-refcount`, which is what `'ownership' in
|
|
121
|
+
* value` plus the tier check reproduces without spelling anything.
|
|
122
|
+
*
|
|
123
|
+
* The one exception this function and `targets/cpp/types.ts`'s
|
|
124
|
+
* `cppAbiParameterType` still apply identically: an ArrayBuffer-family view
|
|
125
|
+
* keeps ITS OWN shared-refcount tier even when a function-value signature
|
|
126
|
+
* stamps the parameter `owned` after publication settled on the standard
|
|
127
|
+
* buffer carrier as shared, because the bytes still have observable reference
|
|
128
|
+
* identity a by-value copy would silently break.
|
|
129
|
+
*/
|
|
130
|
+
export const passingOf = (value, ownership = null) => {
|
|
131
|
+
const aliasing = value.kind === 'array-buffer' || value.kind === 'shared-array-buffer' || value.kind === 'data-view' || value.kind === 'typed-array';
|
|
132
|
+
const effective = aliasing && value.ownership === 'shared-refcount' && ownership === 'owned'
|
|
133
|
+
? value.ownership
|
|
134
|
+
: (ownership ?? ('ownership' in value ? value.ownership : null));
|
|
135
|
+
return value.kind === 'string' || value.kind === 'callable-identity' || effective === 'shared-refcount' ? 'const-ref' : 'by-value';
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* The fixpoint identity a carrier participates in, or `null` for an ordinary
|
|
139
|
+
* acyclic container. Kept in the model so derivation, verification, and the
|
|
140
|
+
* C++ spelling read the same fact instead of each inferring recursion from a
|
|
141
|
+
* traversal of their own.
|
|
142
|
+
*/
|
|
143
|
+
export const recursiveCarrierOf = (representation) => {
|
|
144
|
+
switch (representation.kind) {
|
|
145
|
+
case 'array-object':
|
|
146
|
+
case 'keyed-collection':
|
|
147
|
+
case 'dictionary':
|
|
148
|
+
case 'function-value-dispatch':
|
|
149
|
+
return representation.recursive ?? null;
|
|
150
|
+
case 'native-record-ref':
|
|
151
|
+
return representation.recursive ?? null;
|
|
152
|
+
default:
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* A stable key for a representation.
|
|
158
|
+
*
|
|
159
|
+
* Two carriers are the same carrier exactly when their keys match. This is used
|
|
160
|
+
* to detect the case the architecture forbids outright: one value published
|
|
161
|
+
* with two different carriers in two endpoints.
|
|
162
|
+
*/
|
|
163
|
+
/**
|
|
164
|
+
* Keys already built, by the carrier object that produced them.
|
|
165
|
+
*
|
|
166
|
+
* A carrier is immutable -- every field of every variant is `readonly`, and
|
|
167
|
+
* nothing in this compiler writes one after it is constructed -- so a key is a
|
|
168
|
+
* function of the object's identity and may be remembered by it. That is worth
|
|
169
|
+
* remembering because the key is recursive and inlines its whole subject: the
|
|
170
|
+
* deepest one a measured application produced was 26,467 characters, a
|
|
171
|
+
* `record-with-index` carrying an entire host object's shape, and it was rebuilt
|
|
172
|
+
* from nothing on every call. The same measurement found 112,276 selected
|
|
173
|
+
* results resolving to 2,660 distinct carrier objects, so all but ~2% of the
|
|
174
|
+
* calls ask for a key that already exists.
|
|
175
|
+
*
|
|
176
|
+
* A `WeakMap` rather than a `Map` because the carriers outlive nothing: they
|
|
177
|
+
* belong to the plan, and a strong table here would keep every carrier of every
|
|
178
|
+
* compilation alive for the life of the process.
|
|
179
|
+
*/
|
|
180
|
+
const keysByRepresentation = new WeakMap();
|
|
181
|
+
const abiKeys = new WeakMap();
|
|
182
|
+
/**
|
|
183
|
+
* How a nested carrier contributes to its parent's key.
|
|
184
|
+
*
|
|
185
|
+
* ⛔ This used to be the child's WHOLE key, spliced in as text -- which makes a
|
|
186
|
+
* key a tree serialization of a graph, and that is not merely wasteful, it does
|
|
187
|
+
* not terminate at any useful size. mongodb's `Filter` carrier has three fields
|
|
188
|
+
* that each contain the next level, so every level TRIPLED its parent's key:
|
|
189
|
+
* measured at 1,191 characters at the innermost level, 11 MB eight levels up,
|
|
190
|
+
* 299 MB three levels above that, and then `Array.join` threw
|
|
191
|
+
* `RangeError: Invalid string length` -- V8 caps a string at 536,870,888
|
|
192
|
+
* characters and the full key would have been ~17 GB. The compile died with a
|
|
193
|
+
* stack trace naming a template literal, in a compiler whose whole discipline
|
|
194
|
+
* is to refuse with a reason.
|
|
195
|
+
*
|
|
196
|
+
* `structural-self-reference.ts` closes that particular cycle, so no carrier
|
|
197
|
+
* SHOULD be that deep any more. This is the other half, and it is the half that
|
|
198
|
+
* holds for every future target and every future program: a key is now bounded
|
|
199
|
+
* by the carrier's OWN field count, never by the size of the graph beneath it.
|
|
200
|
+
* Any two distinct sub-carriers still give distinct parent keys -- the digest is
|
|
201
|
+
* over the child's own full key, so a difference anywhere below propagates up
|
|
202
|
+
* through every enclosing digest, exactly as a Merkle chain does.
|
|
203
|
+
*
|
|
204
|
+
* The digest is prefixed with what it stands for (`record#type|1041@a3f9...`)
|
|
205
|
+
* rather than left opaque. A key is read by people: it names the missing
|
|
206
|
+
* primitive in every unmet-obligation row the compass prints, and an obligation
|
|
207
|
+
* that says only `k9f2c...` would trade one unreadable report (8 KB of inlined
|
|
208
|
+
* header fields on ONE line, which is what this produced for hono's `Context`)
|
|
209
|
+
* for another.
|
|
210
|
+
*/
|
|
211
|
+
// `GEA_FULL_KEYS` prints every nested key in full: a digest names WHICH union a
|
|
212
|
+
// refusal is about, never what its arms are, and finding the arm a merge could
|
|
213
|
+
// not reach needs the arms. Read once at load, so the keys are the same
|
|
214
|
+
// everywhere in one run.
|
|
215
|
+
const nestedKeyLimit = process.env['GEA_FULL_KEYS'] ? Number.POSITIVE_INFINITY : 80;
|
|
216
|
+
// Memoized beside `keysByRepresentation`, and for the same reason: the digest
|
|
217
|
+
// is a pure function of the carrier, and a parent key asks for it once per
|
|
218
|
+
// field on every rebuild of a parent that is not itself remembered yet. On
|
|
219
|
+
// TypeScript's own compiler the digest, not the walk, was half the cost of
|
|
220
|
+
// keying a union's arms.
|
|
221
|
+
const nestedKeys = new WeakMap();
|
|
222
|
+
const nestedKey = (representation) => {
|
|
223
|
+
const remembered = nestedKeys.get(representation);
|
|
224
|
+
if (remembered !== undefined)
|
|
225
|
+
return remembered;
|
|
226
|
+
const own = representationKey(representation);
|
|
227
|
+
const built = own.length <= nestedKeyLimit ? own : digestedKey(representation, own);
|
|
228
|
+
nestedKeys.set(representation, built);
|
|
229
|
+
return built;
|
|
230
|
+
};
|
|
231
|
+
const digestedKey = (representation, own) => {
|
|
232
|
+
const shaped = 'shapeId' in representation ? representation.shapeId : undefined;
|
|
233
|
+
const label = shaped === undefined ? representation.kind : `${representation.kind}#${shaped}`;
|
|
234
|
+
return `${label}@${createHash('sha256').update(own).digest('hex').slice(0, 16)}`;
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* The extension half of an `array-object` key: empty for a plain array, so
|
|
238
|
+
* every key written before extensions existed is unchanged, and the field
|
|
239
|
+
* list -- name, requiredness, carrier -- for an extended one. Exported so the
|
|
240
|
+
* emitter names the generated struct by the same identity the carrier has.
|
|
241
|
+
*/
|
|
242
|
+
export const arrayExtensionKey = (extension) => extension === null
|
|
243
|
+
? ''
|
|
244
|
+
: `,{${extension.map((field) => `${field.key}${field.required ? '' : '?'}:${representationKey(field.value)}`).join(',')}}`;
|
|
245
|
+
export const representationKey = (representation) => {
|
|
246
|
+
const remembered = keysByRepresentation.get(representation);
|
|
247
|
+
if (remembered !== undefined)
|
|
248
|
+
return remembered;
|
|
249
|
+
const built = buildRepresentationKey(representation);
|
|
250
|
+
keysByRepresentation.set(representation, built);
|
|
251
|
+
return built;
|
|
252
|
+
};
|
|
253
|
+
const buildRepresentationKey = (representation) => {
|
|
254
|
+
const recursive = recursiveCarrierOf(representation);
|
|
255
|
+
// A recursive carrier is a graph node, not a tree. Its structural identity
|
|
256
|
+
// is the full key: descending into its children would serialize the cycle
|
|
257
|
+
// forever, while replacing it with a digest would hide the declaration/type
|
|
258
|
+
// identity which proves the two paths carry the same native object.
|
|
259
|
+
if (recursive) {
|
|
260
|
+
switch (representation.kind) {
|
|
261
|
+
case 'array-object':
|
|
262
|
+
case 'keyed-collection':
|
|
263
|
+
case 'dictionary':
|
|
264
|
+
return `recursive(${recursive.type},${recursive.container},${representation.ownership})`;
|
|
265
|
+
case 'native-record-ref':
|
|
266
|
+
return `recursive(${recursive.type},${recursive.container},${representation.ownership})`;
|
|
267
|
+
// A callable wrapper is one by-value struct, so its ownership is fixed
|
|
268
|
+
// rather than carried. It is still spelled, because the back edge and
|
|
269
|
+
// the definition must key IDENTICALLY -- that identity is what proves a
|
|
270
|
+
// parameter bound from the reference and an ABI spelled from the
|
|
271
|
+
// definition name the same physical object.
|
|
272
|
+
case 'function-value-dispatch':
|
|
273
|
+
return `recursive(${recursive.type},${recursive.container},owned)`;
|
|
274
|
+
default:
|
|
275
|
+
throw new Error(`recursive marker appeared on non-container ${representation.kind}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
switch (representation.kind) {
|
|
279
|
+
case 'unresolved':
|
|
280
|
+
return `unresolved(${representation.reason})`;
|
|
281
|
+
case 'void':
|
|
282
|
+
case 'string':
|
|
283
|
+
case 'symbol':
|
|
284
|
+
case 'null':
|
|
285
|
+
case 'undefined':
|
|
286
|
+
return representation.kind;
|
|
287
|
+
case 'scalar':
|
|
288
|
+
return `scalar(${representation.domain})`;
|
|
289
|
+
case 'class-ref':
|
|
290
|
+
return `class-ref(${representation.declaration},${representation.ownership})`;
|
|
291
|
+
case 'native-handle':
|
|
292
|
+
// `call`/`construct` are folded into the key -- omitting them would let
|
|
293
|
+
// two handles of the same protocol that disagree on invocability
|
|
294
|
+
// collide under one key, which is exactly the "one value, two carriers"
|
|
295
|
+
// case `representationKey` exists to catch.
|
|
296
|
+
return (`native-handle(${representation.protocol}@${representation.version}` +
|
|
297
|
+
`;call=${representation.call ? abiKey(representation.call) : '-'}` +
|
|
298
|
+
`;construct=${representation.construct ? abiKey(representation.construct) : '-'})`);
|
|
299
|
+
case 'record':
|
|
300
|
+
return `record(${representation.shapeId},${representation.ownership},${representation.fields
|
|
301
|
+
.map((field) => `${field.key}${field.required ? '' : '?'}:${nestedKey(field.value)}`)
|
|
302
|
+
.join(',')};${representation.accessors.map((accessor) => `${accessor.key}=${accessor.getter ?? '-'}/${accessor.setter ?? '-'}`).join(',')})`;
|
|
303
|
+
case 'record-with-index':
|
|
304
|
+
return `record-with-index(${representation.shapeId},${representation.ownership},${representation.fields
|
|
305
|
+
.map((field) => `${field.key}${field.required ? '' : '?'}:${nestedKey(field.value)}`)
|
|
306
|
+
.join(',')};${representation.indexes.map((index) => `index[${index.key}]=${nestedKey(index.value)}`).join(';')})`;
|
|
307
|
+
case 'proxy-object':
|
|
308
|
+
return `proxy-object(${nestedKey(representation.target)},${nestedKey(representation.handler)})`;
|
|
309
|
+
case 'native-record-ref':
|
|
310
|
+
return `native-record-ref(${representation.shapeId},${representation.ownership},${representation.native ?? ''})`;
|
|
311
|
+
case 'borrowed-ref':
|
|
312
|
+
return `borrowed-ref(${nestedKey(representation.referent)})`;
|
|
313
|
+
case 'array-object':
|
|
314
|
+
return `array-object(${nestedKey(representation.element)},${representation.ownership}${arrayExtensionKey(representation.extension)})`;
|
|
315
|
+
case 'dense-buffer':
|
|
316
|
+
return `dense-buffer(${nestedKey(representation.element)})`;
|
|
317
|
+
case 'typed-array':
|
|
318
|
+
return `typed-array(${representation.element},${representation.buffer},${representation.ownership})`;
|
|
319
|
+
case 'array-buffer':
|
|
320
|
+
return `array-buffer(${representation.ownership})`;
|
|
321
|
+
case 'shared-array-buffer':
|
|
322
|
+
return `shared-array-buffer(${representation.ownership})`;
|
|
323
|
+
case 'data-view':
|
|
324
|
+
return `data-view(${representation.ownership})`;
|
|
325
|
+
case 'native-sequence':
|
|
326
|
+
return `native-sequence(${nestedKey(representation.element)})`;
|
|
327
|
+
case 'iterator':
|
|
328
|
+
return `iterator(${nestedKey(representation.element)})`;
|
|
329
|
+
case 'promise':
|
|
330
|
+
return `promise(${nestedKey(representation.value)})`;
|
|
331
|
+
case 'keyed-collection':
|
|
332
|
+
return (`keyed-collection(${representation.family},${nestedKey(representation.key)},` +
|
|
333
|
+
`${representation.value ? nestedKey(representation.value) : '-'},${representation.ownership})`);
|
|
334
|
+
case 'dictionary':
|
|
335
|
+
return `dictionary(${representation.key},${nestedKey(representation.value)},${representation.ownership})`;
|
|
336
|
+
case 'function':
|
|
337
|
+
return `function(${representation.functionId},${abiKey(representation.abi)})`;
|
|
338
|
+
case 'function-family':
|
|
339
|
+
return `function-family(${[...representation.members].sort().join('+')},${abiKey(representation.abi)})`;
|
|
340
|
+
case 'constructor-family':
|
|
341
|
+
return `constructor-family(${[...representation.members].sort().join('+')},${abiKey(representation.abi)})`;
|
|
342
|
+
case 'constructor-value-dispatch':
|
|
343
|
+
return `constructor-value-dispatch(${abiKey(representation.abi)})`;
|
|
344
|
+
case 'function-and-constructor':
|
|
345
|
+
return `function-and-constructor(${abiKey(representation.call)},${abiKey(representation.construct)})`;
|
|
346
|
+
case 'function-value-family':
|
|
347
|
+
return `function-value-family(${[...representation.members].sort().join('+')},${abiKey(representation.abi)},${representation.optional})`;
|
|
348
|
+
case 'function-value-dispatch':
|
|
349
|
+
return `function-value-dispatch(${abiKey(representation.abi)})`;
|
|
350
|
+
case 'callable-identity':
|
|
351
|
+
return 'callable-identity';
|
|
352
|
+
case 'generic-function-set':
|
|
353
|
+
return `generic-function-set(${representation.members.join('+')})`;
|
|
354
|
+
case 'optional':
|
|
355
|
+
return `optional(${nestedKey(representation.payload)},${representation.absence})`;
|
|
356
|
+
case 'tagged-union':
|
|
357
|
+
return `tagged-union(${representation.arms
|
|
358
|
+
.map((arm) => {
|
|
359
|
+
const discriminator = arm.runtimeDiscriminator.kind === 'callable-membership'
|
|
360
|
+
? `callable(${[...arm.runtimeDiscriminator.members].sort().join('+')})`
|
|
361
|
+
: arm.runtimeDiscriminator.kind;
|
|
362
|
+
return `${arm.tag}:${discriminator}:${nestedKey(arm.value)}`;
|
|
363
|
+
})
|
|
364
|
+
.join('|')})`;
|
|
365
|
+
case 'dynamic':
|
|
366
|
+
return `dynamic(${representation.reason})`;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
/** A stable key for a calling convention. */
|
|
370
|
+
export const abiKey = (abi) => {
|
|
371
|
+
const remembered = abiKeys.get(abi);
|
|
372
|
+
if (remembered !== undefined)
|
|
373
|
+
return remembered;
|
|
374
|
+
const built = buildAbiKey(abi);
|
|
375
|
+
abiKeys.set(abi, built);
|
|
376
|
+
return built;
|
|
377
|
+
};
|
|
378
|
+
const buildAbiKey = (abi) => `(${abi.parameters.map((parameter) => `${nestedKey(parameter.value)}/${parameter.ownership}`).join(',')}` +
|
|
379
|
+
`${abi.restFrom === null ? '' : `|rest@${abi.restFrom}`})` +
|
|
380
|
+
`->${nestedKey(abi.result)}` +
|
|
381
|
+
`@${abi.receiver ? nestedKey(abi.receiver) : '-'}`;
|
|
382
|
+
/**
|
|
383
|
+
* Whether a carrier boxes a value that has a static type.
|
|
384
|
+
*
|
|
385
|
+
* Used by the no-boxing gate. `dynamic` is legitimate only for the four
|
|
386
|
+
* declared reasons; every other appearance is a defect to fix at the producer.
|
|
387
|
+
*/
|
|
388
|
+
export const isBoxed = (representation) => representation.kind === 'dynamic';
|
|
389
|
+
/**
|
|
390
|
+
* Every carrier kind ECMAScript's `ToBoolean` can never answer `false` for.
|
|
391
|
+
*
|
|
392
|
+
* Each of these is, in every shape this compiler ever selects for it, a JS
|
|
393
|
+
* Object or a callable -- and an Object is truthy regardless of its contents,
|
|
394
|
+
* empty array, empty record and zero-argument callable included. `native-
|
|
395
|
+
* handle` is deliberately absent even though it is also object-shaped: a host
|
|
396
|
+
* handle self-encodes its own absence as an invalid state
|
|
397
|
+
* (`representation/optional.ts`'s collapse of `T | null` onto one), which
|
|
398
|
+
* *is* a falsy state this fact must not claim away. `tagged-union` is absent
|
|
399
|
+
* from the set itself and handled by recursion in `isDeadMergeContribution`
|
|
400
|
+
* below, because whether one can be falsy depends on its arms, not its kind.
|
|
401
|
+
*/
|
|
402
|
+
const alwaysTruthyKinds = new Set([
|
|
403
|
+
'record',
|
|
404
|
+
'record-with-index',
|
|
405
|
+
'native-record-ref',
|
|
406
|
+
'array-object',
|
|
407
|
+
'dictionary',
|
|
408
|
+
'typed-array',
|
|
409
|
+
'promise',
|
|
410
|
+
// A Map/Set/WeakMap/WeakSet is an ordinary Object for ToBoolean: `new Map()`
|
|
411
|
+
// is truthy with zero entries, exactly as `[]` is.
|
|
412
|
+
'keyed-collection',
|
|
413
|
+
'proxy-object',
|
|
414
|
+
'function',
|
|
415
|
+
'function-family',
|
|
416
|
+
'function-value-family',
|
|
417
|
+
'function-value-dispatch',
|
|
418
|
+
// A function object is truthy whatever its convention -- and the identity
|
|
419
|
+
// carrier is the SAME object, reached through the handle every callable
|
|
420
|
+
// already owns. Its absence lives in the `optional` wrapper around it, as it
|
|
421
|
+
// does for every other callable kind here.
|
|
422
|
+
'callable-identity',
|
|
423
|
+
'generic-function-set',
|
|
424
|
+
'constructor-family',
|
|
425
|
+
'constructor-value-dispatch',
|
|
426
|
+
'function-and-constructor'
|
|
427
|
+
]);
|
|
428
|
+
/**
|
|
429
|
+
* Whether a carrier has no absent state at all -- so `a ?? b` over it never
|
|
430
|
+
* evaluates `b`.
|
|
431
|
+
*
|
|
432
|
+
* Read straight off `alwaysTruthyKinds` because that set is already exactly
|
|
433
|
+
* this fact plus more: every kind in it is an Object or a callable whose
|
|
434
|
+
* absence, where it has one, lives in an `optional` WRAPPER rather than in the
|
|
435
|
+
* carrier itself. The three carriers that self-encode absence are outside the
|
|
436
|
+
* set for reasons its own comment states -- `native-handle` and a
|
|
437
|
+
* shared-refcount `class-ref`, the two `representation/optional.ts` collapses
|
|
438
|
+
* `T | null` onto -- and so are `optional`, `dynamic` and every sum, each of
|
|
439
|
+
* which plainly has one.
|
|
440
|
+
*
|
|
441
|
+
* `constructor-family` is the measured case: node-server's `export const
|
|
442
|
+
* CloseEvent: typeof globalThis.CloseEvent = globalThis.CloseEvent ?? class
|
|
443
|
+
* extends Event {...}`. The plan gives the global read a bare constructor
|
|
444
|
+
* family, which is the census's own statement that the value is there -- a host
|
|
445
|
+
* that says otherwise says so through `semantics/normalize/absent-globals.ts`,
|
|
446
|
+
* which turns the read's type into `undefined` and takes the carrier out of
|
|
447
|
+
* this set. So the fallback class never runs, and asking for a conversion
|
|
448
|
+
* between two unrelated program classes is asking for a value that arm never
|
|
449
|
+
* produces.
|
|
450
|
+
*/
|
|
451
|
+
export const carriesNoAbsence = (representation) => alwaysTruthyKinds.has(representation.kind);
|
|
452
|
+
/**
|
|
453
|
+
* Whether `representation` -- unwrapped once if it is an `optional` -- can
|
|
454
|
+
* only ever be absent, never a live, present-but-falsy value.
|
|
455
|
+
*
|
|
456
|
+
* This is the fact that licenses treating one arm of a merge as dead code
|
|
457
|
+
* rather than a missing conversion: `a && a.b` keeps `a` on the branch where
|
|
458
|
+
* `a` tested falsy, and an Object is never falsy, so when `a`'s own payload
|
|
459
|
+
* is one, the present case cannot be the reason that branch runs -- only
|
|
460
|
+
* `a`'s own absence can, and the checker's own type for the whole `&&`
|
|
461
|
+
* already reflects that by excluding the payload from the join. A bare
|
|
462
|
+
* (non-optional) representation with an always-truthy kind answers `true`
|
|
463
|
+
* too: it has no absence at all, so if it reaches here as the falsy side of
|
|
464
|
+
* an `&&`, the branch is not merely narrowed, it is wholly unreachable.
|
|
465
|
+
*
|
|
466
|
+
* One fact with one asker: `ir/lower-narrow.ts`'s `mergeIncoming` (what a
|
|
467
|
+
* dead arm lowers to). Preflight's `buildMergeNarrowingObligations` asked it
|
|
468
|
+
* too until Phase 1.6 deleted that second decision tree; the obligation ids
|
|
469
|
+
* quoted below are its historical spelling of the same pairs.
|
|
470
|
+
*/
|
|
471
|
+
/**
|
|
472
|
+
* Whether a merge's own carrier has an absent state a dead `&&` arm can be
|
|
473
|
+
* materialized into.
|
|
474
|
+
*
|
|
475
|
+
* The companion fact to `isDeadMergeContribution`: that one says the kept arm
|
|
476
|
+
* contributes nothing but absence, this one says the merge has somewhere to
|
|
477
|
+
* put it. Both authorities need both halves, and both used to spell this one
|
|
478
|
+
* as `kind === 'optional'`.
|
|
479
|
+
*
|
|
480
|
+
* That spelling was too narrow by exactly one carrier, and it is the carrier
|
|
481
|
+
* this file's own `alwaysTruthyKinds` comment already names: `optional.ts`
|
|
482
|
+
* COLLAPSES `T | null` onto a bare `native-handle`, because a host handle
|
|
483
|
+
* self-encodes absence as an invalid state. So a merge whose checker type is
|
|
484
|
+
* `WSInst | null` has carrier `native-handle`, not `optional` -- and the
|
|
485
|
+
* `kind === 'optional'` test then refused a program the collapse itself
|
|
486
|
+
* created.
|
|
487
|
+
*
|
|
488
|
+
* Measured on `examples/dialer`: `if (e.candidate && this.ws)`, with
|
|
489
|
+
* `ws: WebSocketInstance | null`, raised
|
|
490
|
+
* `merge-narrowing:optional(native-record-ref(...),null)->native-handle(...)`,
|
|
491
|
+
* an obligation no conversion could ever satisfy, on a program with zero
|
|
492
|
+
* violations. The C++ side already had the spelling all along --
|
|
493
|
+
* `types.ts`'s `carriesAbsence` answers `true` for `native-handle`, so the
|
|
494
|
+
* constant renders as an empty handle (`gea::host::WebSocket{}`), which is
|
|
495
|
+
* exactly what `emit-narrowing.ts`'s `emptyHandleText` writes for the same
|
|
496
|
+
* carrier on the store path.
|
|
497
|
+
*/
|
|
498
|
+
/**
|
|
499
|
+
* Whether a carrier has an `undefined` state at all -- the question a
|
|
500
|
+
* definedness test asks, asked of the carrier rather than of a value.
|
|
501
|
+
*
|
|
502
|
+
* `targets/cpp/emit-presence.ts`'s `definedTestText` is the same rule as a
|
|
503
|
+
* spelling, and delegates here rather than restating it: a carrier this answers
|
|
504
|
+
* `false` for renders the test as the constant `true`, which is honest -- such a
|
|
505
|
+
* value genuinely cannot be `undefined` -- and is exactly why a lowering that
|
|
506
|
+
* MERGES over a definedness guard has to ask this first. A merge over a
|
|
507
|
+
* constant-true test is not a merge; its absent arm is dead, and building one
|
|
508
|
+
* anyway hands the emitter a branch whose other side can never run.
|
|
509
|
+
*
|
|
510
|
+
* A host handle's own absence stands for `null`, never for `undefined` (see
|
|
511
|
+
* `optionalOf`), so it is defined whatever it holds -- as is every carrier that
|
|
512
|
+
* is simply a value that exists.
|
|
513
|
+
*/
|
|
514
|
+
export const carriesUndefined = (representation) => {
|
|
515
|
+
if (representation.kind === 'undefined' || representation.kind === 'void')
|
|
516
|
+
return true;
|
|
517
|
+
if (representation.kind === 'borrowed-ref')
|
|
518
|
+
return carriesUndefined(representation.referent);
|
|
519
|
+
if (representation.kind === 'optional')
|
|
520
|
+
return representation.absence === 'undefined';
|
|
521
|
+
if (representation.kind === 'tagged-union')
|
|
522
|
+
return representation.arms.some((arm) => carriesUndefined(arm.value));
|
|
523
|
+
return representation.kind === 'dynamic';
|
|
524
|
+
};
|
|
525
|
+
/**
|
|
526
|
+
* Whether `ir/lower-destructuring.ts`'s array-pattern fast path already reads
|
|
527
|
+
* this carrier positionally, in place: a plain array, a positional tuple
|
|
528
|
+
* record (`ir/lower-allocation.ts`'s `lowerTupleLiteral` names the same shape
|
|
529
|
+
* "record" -- there is deliberately no separate tuple carrier), or a tagged
|
|
530
|
+
* union every arm of which is itself one of these two --
|
|
531
|
+
* `preflight/tuple-destructuring.ts`'s uniform tuple-union.
|
|
532
|
+
*/
|
|
533
|
+
export const isArrayPatternCapable = (representation) => {
|
|
534
|
+
if (representation.kind === 'array-object')
|
|
535
|
+
return true;
|
|
536
|
+
if (representation.kind === 'record')
|
|
537
|
+
return representation.fields.every((field, index) => field.key === String(index));
|
|
538
|
+
if (representation.kind === 'tagged-union')
|
|
539
|
+
return representation.arms.every((arm) => isArrayPatternCapable(arm.value));
|
|
540
|
+
return false;
|
|
541
|
+
};
|
|
542
|
+
/**
|
|
543
|
+
* The one arm of a tagged union a nested array-pattern position can read
|
|
544
|
+
* positionally, when every OTHER arm cannot -- `number | number[]`, the
|
|
545
|
+
* per-position element of a plain (non-tuple) array whose own element is
|
|
546
|
+
* itself a union: exactly one arm (the array) supports positional reads, and
|
|
547
|
+
* the other (the number) is exactly the value ECMA-262 7.4.2 `GetIterator`
|
|
548
|
+
* throws a `TypeError` over. `null` for a union with zero such arms, or with
|
|
549
|
+
* MORE than one -- two capable arms (`number[] | string[]`) is a genuine
|
|
550
|
+
* ambiguity this compiler does not resolve, and refusing it is the
|
|
551
|
+
* fail-closed answer, not a guess.
|
|
552
|
+
*/
|
|
553
|
+
export const soleArrayPatternCapableArm = (representation) => {
|
|
554
|
+
if (representation.kind !== 'tagged-union')
|
|
555
|
+
return null;
|
|
556
|
+
let sole = null;
|
|
557
|
+
for (const [index, arm] of representation.arms.entries()) {
|
|
558
|
+
if (!isArrayPatternCapable(arm.value))
|
|
559
|
+
continue;
|
|
560
|
+
if (sole)
|
|
561
|
+
return null;
|
|
562
|
+
sole = { index, arm: arm.value };
|
|
563
|
+
}
|
|
564
|
+
return sole;
|
|
565
|
+
};
|
|
566
|
+
/**
|
|
567
|
+
* The payload under a field value's own `undefined`-optional carrier, or
|
|
568
|
+
* `null` for every other field.
|
|
569
|
+
*
|
|
570
|
+
* Property presence no longer comes from this wrapper. Generated structs keep
|
|
571
|
+
* an independent bit for every `!required` field, because a present property
|
|
572
|
+
* whose value is `undefined` and a missing property are observably different.
|
|
573
|
+
* This helper remains the value-carrier decomposition used where code needs
|
|
574
|
+
* the payload of `T | undefined` itself.
|
|
575
|
+
*/
|
|
576
|
+
export const absentFieldPayload = (field) => !field.required && field.value.kind === 'optional' && field.value.absence === 'undefined' ? field.value.payload : null;
|
|
577
|
+
export const carriesMergeAbsence = (representation) => representation.kind === 'optional' ||
|
|
578
|
+
representation.kind === 'native-handle' ||
|
|
579
|
+
(representation.kind === 'class-ref' && representation.ownership === 'shared-refcount');
|
|
580
|
+
/**
|
|
581
|
+
* Whether a tagged union tags absence in an arm of its own.
|
|
582
|
+
*
|
|
583
|
+
* The one fact an arm cannot see about itself, and the fact that decides
|
|
584
|
+
* whether the arm beside it is the absence-collapsed form of its carrier --
|
|
585
|
+
* see `isDeadMergeArm`.
|
|
586
|
+
*/
|
|
587
|
+
const unionTagsAbsence = (union) => union.arms.some((arm) => arm.value.kind === 'null' || arm.value.kind === 'undefined' || arm.value.kind === 'void');
|
|
588
|
+
/**
|
|
589
|
+
* `isDeadMergeContribution` over a carrier that may sit INSIDE another one,
|
|
590
|
+
* carrying the single fact only that enclosing carrier knows: whether absence
|
|
591
|
+
* is tagged in a place of its own out there.
|
|
592
|
+
*
|
|
593
|
+
* `class-ref(shared-refcount)` and `native-handle` are deliberately outside
|
|
594
|
+
* `alwaysTruthyKinds` because `representation/optional.ts` COLLAPSES `T | null`
|
|
595
|
+
* onto them, so a BARE one is genuinely nullable and that null is a falsy state
|
|
596
|
+
* nothing may claim away. `absenceTaggedOutside` is precisely the proof that
|
|
597
|
+
* the collapse did not happen here, and it arrives two ways:
|
|
598
|
+
*
|
|
599
|
+
* - a union carrying its own `null`/`undefined` arm. Arms are disjoint, so a
|
|
600
|
+
* `present:` arm sitting beside a `null:` arm carries a type null was already
|
|
601
|
+
* removed from. Without this, three's `this.environment &&
|
|
602
|
+
* this.environment.isTexture` over a `Texture | null` field raised
|
|
603
|
+
* `merge-narrowing:tagged-union(undefined|null|present:class-ref(...,shared-
|
|
604
|
+
* refcount))->tagged-union(undefined|null|present:scalar(boolean))` -- an
|
|
605
|
+
* obligation no conversion could satisfy, because all three arms read live
|
|
606
|
+
* and `partialDeadMergeArms` therefore reported no split to rebuild from.
|
|
607
|
+
* - an `optional` WRAPPER around one of them. `optionalOf` collapses these two
|
|
608
|
+
* payloads for `absence === 'null'` and only then, so a surviving wrapper can
|
|
609
|
+
* only be tagged `'undefined'` -- and `union.ts` reaches that wrapper solely
|
|
610
|
+
* when the source union had exactly ONE absent member. Both facts together
|
|
611
|
+
* say `null` was never in the type, so the pointer inside is object-shaped
|
|
612
|
+
* and therefore always truthy. Without this, mongodb's `this.session &&
|
|
613
|
+
* this.session.inTransaction()` -- `session: ClientSession | undefined`, the
|
|
614
|
+
* guard-and-call idiom -- raised `merge-narrowing:optional(class-ref(...,
|
|
615
|
+
* shared-refcount),undefined)->optional(scalar(boolean),undefined)`, 39 rows
|
|
616
|
+
* over three classes, for a merge whose kept arm can only ever be absent.
|
|
617
|
+
*/
|
|
618
|
+
const isDeadMergePayload = (representation, absenceTaggedOutside) => {
|
|
619
|
+
if (representation.kind === 'optional')
|
|
620
|
+
return isDeadMergePayload(representation.payload, true);
|
|
621
|
+
if (representation.kind === 'tagged-union') {
|
|
622
|
+
const tagsAbsence = unionTagsAbsence(representation);
|
|
623
|
+
return representation.arms.every((arm) => isDeadMergePayload(arm.value, tagsAbsence || absenceTaggedOutside));
|
|
624
|
+
}
|
|
625
|
+
if (absenceTaggedOutside && (representation.kind === 'class-ref' || representation.kind === 'native-handle'))
|
|
626
|
+
return true;
|
|
627
|
+
// A class instance is object-shaped and so always truthy -- unless it is the
|
|
628
|
+
// one shape that self-encodes absence, exactly as `native-handle` does. A
|
|
629
|
+
// REFCOUNTED instance is a `gea::Ref<T>` that `optional.ts` collapses
|
|
630
|
+
// `T | null` onto, so a null one is a falsy state this must not claim away.
|
|
631
|
+
if (representation.kind === 'class-ref')
|
|
632
|
+
return representation.ownership !== 'shared-refcount';
|
|
633
|
+
return alwaysTruthyKinds.has(representation.kind);
|
|
634
|
+
};
|
|
635
|
+
export const isDeadMergeContribution = (representation) => isDeadMergePayload(representation, false);
|
|
636
|
+
/**
|
|
637
|
+
* The `||` mirror of `isDeadMergeContribution`: a kept operand with NO truthy
|
|
638
|
+
* state. `a || b` publishes `a` only when `ToBoolean(a)` is true, and a carrier
|
|
639
|
+
* that is only ever `null`/`undefined` (propertyHelper's `verifyProp || name`,
|
|
640
|
+
* where every caller passes `null` or nothing) has no such state, so the
|
|
641
|
+
* kept branch never runs and the merge only ever publishes the evaluated
|
|
642
|
+
* side. Nothing is converted because nothing arrives. Asked by
|
|
643
|
+
* `ir/lower-narrow.ts`'s `mergeIncoming`. Deliberately not extended to an
|
|
644
|
+
* `optional` or a union: those carry a payload that CAN be truthy.
|
|
645
|
+
*/
|
|
646
|
+
export const contributesNoTruthiness = (representation) => representation.kind === 'null' || representation.kind === 'undefined' || representation.kind === 'void';
|
|
647
|
+
/**
|
|
648
|
+
* Whether every falsy state this carrier has is an ABSENCE -- the WHOLE-operand
|
|
649
|
+
* question, as against `isDeadMergeContribution`'s per-arm one.
|
|
650
|
+
*
|
|
651
|
+
* The two differ over exactly the carriers `optional.ts` COLLAPSES `T | null`
|
|
652
|
+
* onto: a bare `class-ref(shared-refcount)` (a `gea::Ref<T>`) and a bare
|
|
653
|
+
* `native-handle`. `isDeadMergeContribution` must refuse those, and its own
|
|
654
|
+
* comment says why -- a null `Ref` is a falsy state, and an ARM proven dead is
|
|
655
|
+
* DROPPED from `partialDeadMergeArms`'s rebuild, so a null flowing through a
|
|
656
|
+
* dropped arm would fall out of the chain into a neighbour's value.
|
|
657
|
+
*
|
|
658
|
+
* Asked of a whole `&&` operand into a merge that carries an absence, nothing
|
|
659
|
+
* is dropped and the answer changes. ECMAScript's `ToBoolean` is `true` for
|
|
660
|
+
* every object, so the only value such a carrier can hold on the branch where
|
|
661
|
+
* it tested falsy is its own null -- and the merge's own absence is where that
|
|
662
|
+
* null belongs. `crash.ts`'s `this.engine && this.endBuffer` (`AudioEngine |
|
|
663
|
+
* null` guarding a `BufferLike | null`) is the shape: the kept operand
|
|
664
|
+
* contributes nothing the merge does not already have a state for, yet
|
|
665
|
+
* `merge-narrowing:class-ref(...)->optional(native-record-ref(...),null)`
|
|
666
|
+
* asked for a conversion no registry could hold.
|
|
667
|
+
*
|
|
668
|
+
* Strictly wider than `isDeadMergeContribution` -- `absenceTaggedOutside` only
|
|
669
|
+
* ever ENABLES the return above -- so every merge the narrower fact licensed
|
|
670
|
+
* is licensed identically here. `ir/lower-narrow.ts`'s `mergeIncoming` asks
|
|
671
|
+
* this one and does not re-derive it.
|
|
672
|
+
*/
|
|
673
|
+
export const contributesOnlyAbsence = (representation) => isDeadMergePayload(representation, true);
|
|
674
|
+
/**
|
|
675
|
+
* The per-arm decomposition of `isDeadMergeContribution`, asked only when the
|
|
676
|
+
* WHOLE answer is neither wholly `true` nor wholly `false`.
|
|
677
|
+
*
|
|
678
|
+
* `isDeadMergeContribution` covers two ends: every arm dead (the kept operand
|
|
679
|
+
* contributes nothing but its own absence -- `mergeIncoming`'s existing
|
|
680
|
+
* bypass) and every arm live (an ordinary conversion, already the general
|
|
681
|
+
* conversion graph's job). This is the middle: SOME arms dead, at least one
|
|
682
|
+
* live -- `results[name]` typed `T[] | string`, where `T[]` can never be the
|
|
683
|
+
* reason a `&&` fell through but `string` can (an empty one).
|
|
684
|
+
*
|
|
685
|
+
* Returns `null` for anything that is not that middle case: not a tagged
|
|
686
|
+
* union at all (once unwrapped of one optional layer, matching
|
|
687
|
+
* `isDeadMergeContribution`'s own unwrap), wholly dead, or wholly live. Each
|
|
688
|
+
* `null` is a real "does not apply", not a missing answer -- the caller falls
|
|
689
|
+
* through to whichever of the two existing paths does apply.
|
|
690
|
+
*
|
|
691
|
+
* One fact, asked from both authorities that must never disagree about it,
|
|
692
|
+
* exactly as `isDeadMergeContribution` and `carriesMergeAbsence` already are:
|
|
693
|
+
* `ir/lower-narrow.ts`'s `mergeIncoming`, which both decides to rebuild via
|
|
694
|
+
* the live-arm proof instead of a general conversion and checks that the
|
|
695
|
+
* rebuild is buildable at all -- every live arm must actually have somewhere
|
|
696
|
+
* to convert to, and the source's own absence, if it has one, needs
|
|
697
|
+
* `carriesMergeAbsence(merged)` to hold it -- blocking the body otherwise.
|
|
698
|
+
*/
|
|
699
|
+
/**
|
|
700
|
+
* Whether `representation` is boolean-shaped: itself `scalar(boolean)`, or an
|
|
701
|
+
* `optional` whose payload is.
|
|
702
|
+
*
|
|
703
|
+
* The signal `ir/lower-narrow.ts`'s `mergeIncoming` checks
|
|
704
|
+
* before licensing `ToBoolean` (`targets/cpp/emit-presence.ts`'s
|
|
705
|
+
* `booleanTestText`) as a live arm's conversion into a `&&` merge's own
|
|
706
|
+
* carrier, rather than requiring a structural, value-preserving one.
|
|
707
|
+
*
|
|
708
|
+
* Sound only here, at a `&&` merge whose own published type already
|
|
709
|
+
* collapsed to boolean-or-absent: ECMA-262's own definition of `&&` decides
|
|
710
|
+
* which operand to keep by `ToBoolean`, so when the checker's inferred type
|
|
711
|
+
* for the WHOLE expression is `boolean | undefined` rather than the kept
|
|
712
|
+
* operand's own type, it has already proven the kept contribution is
|
|
713
|
+
* meaningful only as its truthiness -- an object-shaped arm has no boolean
|
|
714
|
+
* value of its own, but it does have a `ToBoolean` answer, and that answer is
|
|
715
|
+
* exactly what the checker's type says this merge publishes. This is why
|
|
716
|
+
* `partialDeadMergeArms`'s live/dead split still matters here rather than
|
|
717
|
+
* making this a blanket "any carrier converts to boolean" capability: the
|
|
718
|
+
* SAME renderer applies `ToBoolean` only to arms this merge's own narrowing
|
|
719
|
+
* already proved live, one call site's condition and nowhere else -- not a
|
|
720
|
+
* new entry in the general conversion registry, which would let it fire for
|
|
721
|
+
* any unrelated occurrence of the same representation pair.
|
|
722
|
+
*/
|
|
723
|
+
/**
|
|
724
|
+
* Whether a `&&` merge publishes its kept operand's TRUTHINESS rather than
|
|
725
|
+
* its value.
|
|
726
|
+
*
|
|
727
|
+
* The same proof `isBooleanShapedMergeTarget` states for one live arm of a
|
|
728
|
+
* partially-dead tagged union, asked of the kept operand as a WHOLE -- and
|
|
729
|
+
* for the same reason. ECMA-262 decides which operand `&&` keeps by
|
|
730
|
+
* `ToBoolean` in the first place, so when the checker's type for the whole
|
|
731
|
+
* expression is a plain `boolean` while the kept operand's own carrier is
|
|
732
|
+
* not, it has already proven the kept contribution meaningful only as its
|
|
733
|
+
* truthiness. `object && object.isObject3D` over three's `Object3D` is the
|
|
734
|
+
* shape: the merge publishes `boolean`, the kept side is a
|
|
735
|
+
* `class-ref(shared-refcount)` -- nullable, because `optional.ts` collapses
|
|
736
|
+
* `T | null` onto it -- and its `ToBoolean` (`emit-presence.ts`'s
|
|
737
|
+
* `booleanTestText`, total over every carrier) IS the value this branch
|
|
738
|
+
* yields.
|
|
739
|
+
*
|
|
740
|
+
* Deliberately EXACT, not `isBooleanShapedMergeTarget`'s optional-tolerant
|
|
741
|
+
* test: `optional(scalar(boolean))` would need the boolean wrapped back into
|
|
742
|
+
* an optional, a second step `ir/lower-narrow.ts` has no conversion use to
|
|
743
|
+
* name here. A merge that publishes `boolean | undefined` keeps raising its
|
|
744
|
+
* obligation, correctly, rather than being half-answered.
|
|
745
|
+
*
|
|
746
|
+
* Asked by `ir/lower-narrow.ts`'s `mergeIncoming`, the one authority on what
|
|
747
|
+
* a merge arm builds.
|
|
748
|
+
*/
|
|
749
|
+
export const mergesAsTruthiness = (merged) => merged.kind === 'scalar' && merged.domain === 'boolean';
|
|
750
|
+
export const isBooleanShapedMergeTarget = (representation) => {
|
|
751
|
+
const payload = representation.kind === 'optional' ? representation.payload : representation;
|
|
752
|
+
return payload.kind === 'scalar' && payload.domain === 'boolean';
|
|
753
|
+
};
|
|
754
|
+
export const partialDeadMergeArms = (representation) => {
|
|
755
|
+
const candidate = representation.kind === 'optional' ? representation.payload : representation;
|
|
756
|
+
const keptIsOptional = representation.kind === 'optional';
|
|
757
|
+
if (candidate.kind !== 'tagged-union')
|
|
758
|
+
return null;
|
|
759
|
+
const tagsAbsence = unionTagsAbsence(candidate);
|
|
760
|
+
const liveIndices = candidate.arms
|
|
761
|
+
.map((arm, index) => (isDeadMergePayload(arm.value, tagsAbsence || keptIsOptional) ? -1 : index))
|
|
762
|
+
.filter((index) => index >= 0);
|
|
763
|
+
if (liveIndices.length === 0 || liveIndices.length === candidate.arms.length)
|
|
764
|
+
return null;
|
|
765
|
+
return { payload: candidate, liveIndices, keptIsOptional };
|
|
766
|
+
};
|
|
767
|
+
/**
|
|
768
|
+
* The ownership class a carrier crosses a body boundary under, or `null` when
|
|
769
|
+
* it states none a copy can be proven safe under.
|
|
770
|
+
*
|
|
771
|
+
* One function, because everything that spells a `capture:` capability keys
|
|
772
|
+
* the manifest's `captureOwnershipSupport` by this string: `ir/certify.ts`
|
|
773
|
+
* demands it, `targets/cpp/captures.ts` admits it, and
|
|
774
|
+
* `emit-binding-reference.ts` names it in the refusal when admission says no.
|
|
775
|
+
*
|
|
776
|
+
* It used to be two. This one answered `'value'` by `default` and the one in
|
|
777
|
+
* `ir/captures.ts` answered `null` for `unresolved`, `proxy-object`,
|
|
778
|
+
* `borrowed-ref`, `dense-buffer`, `native-sequence`, `iterator` and `promise`
|
|
779
|
+
* -- so certification published `capture:value` for carriers whose admission
|
|
780
|
+
* then refused them by name, the same certify/print disagreement 2.3 fixed
|
|
781
|
+
* four of. The fail-CLOSED answer is the correct one and is what survives: a
|
|
782
|
+
* carrier that names no copy-safe ownership must refuse where the certificate
|
|
783
|
+
* is minted, not where the text is spelled. The hole was invisible only
|
|
784
|
+
* because `AllocateCallableOperation.captures` is still unfilled, so
|
|
785
|
+
* `ir/certify.ts`'s own demand list is empty today.
|
|
786
|
+
*/
|
|
787
|
+
export const ownershipOf = (representation) => {
|
|
788
|
+
switch (representation.kind) {
|
|
789
|
+
case 'void':
|
|
790
|
+
case 'scalar':
|
|
791
|
+
case 'string':
|
|
792
|
+
// `gea::Symbol` is an interned id and nothing aliases one, exactly as for
|
|
793
|
+
// `string` above.
|
|
794
|
+
case 'symbol':
|
|
795
|
+
case 'null':
|
|
796
|
+
case 'undefined':
|
|
797
|
+
case 'function':
|
|
798
|
+
case 'function-family':
|
|
799
|
+
case 'function-value-family':
|
|
800
|
+
case 'function-value-dispatch':
|
|
801
|
+
case 'generic-function-set':
|
|
802
|
+
case 'constructor-family':
|
|
803
|
+
case 'constructor-value-dispatch':
|
|
804
|
+
case 'function-and-constructor':
|
|
805
|
+
// Nothing else aliases a plain value. A callable carrier's own
|
|
806
|
+
// `environment` pointer is a deliberate, permanent leak (see
|
|
807
|
+
// `emitAllocateCallable`), so copying the `{invoke, environment}` pair
|
|
808
|
+
// into another environment is exactly as safe as the original copy.
|
|
809
|
+
return 'value';
|
|
810
|
+
case 'native-handle':
|
|
811
|
+
// A host handle is copied by value and the HOST owns what it names:
|
|
812
|
+
// every carrier a host states for one is a value type -- an id, a small
|
|
813
|
+
// struct, or a standard container -- and none owns the object on the
|
|
814
|
+
// other side of the boundary. A copy in an environment stays good for
|
|
815
|
+
// exactly as long as the host keeps the thing it names.
|
|
816
|
+
return 'value';
|
|
817
|
+
case 'class-ref':
|
|
818
|
+
case 'record':
|
|
819
|
+
case 'record-with-index':
|
|
820
|
+
case 'native-record-ref':
|
|
821
|
+
case 'array-object':
|
|
822
|
+
case 'dictionary':
|
|
823
|
+
case 'typed-array':
|
|
824
|
+
case 'array-buffer':
|
|
825
|
+
case 'shared-array-buffer':
|
|
826
|
+
case 'data-view':
|
|
827
|
+
case 'keyed-collection':
|
|
828
|
+
return representation.ownership;
|
|
829
|
+
case 'optional':
|
|
830
|
+
// `gea::Optional<T>` copies its payload by the same rule `T` copies by;
|
|
831
|
+
// an optional local is not a different capture question from a required
|
|
832
|
+
// one, only a wrapped one.
|
|
833
|
+
return ownershipOf(representation.payload);
|
|
834
|
+
case 'dynamic':
|
|
835
|
+
// The box copies by value and the copy is independent: `gea::Value`'s
|
|
836
|
+
// payload is a `std::shared_ptr<void>`, so a copy is a refcount bump
|
|
837
|
+
// over an immutable-by-construction cell.
|
|
838
|
+
return 'value';
|
|
839
|
+
case 'tagged-union': {
|
|
840
|
+
// A sum is copy-safe only when every arm is: the live arm is a runtime
|
|
841
|
+
// fact. Ask each arm's ownership rule instead of maintaining a second
|
|
842
|
+
// table that could disagree with those same carriers outside a union.
|
|
843
|
+
let weakest = 'value';
|
|
844
|
+
for (const arm of representation.arms) {
|
|
845
|
+
const ownership = ownershipOf(arm.value);
|
|
846
|
+
if (ownership === null)
|
|
847
|
+
return null;
|
|
848
|
+
if (ownership !== 'value')
|
|
849
|
+
weakest = ownership;
|
|
850
|
+
}
|
|
851
|
+
return weakest;
|
|
852
|
+
}
|
|
853
|
+
default:
|
|
854
|
+
// `unresolved`, `proxy-object`, `borrowed-ref`, `dense-buffer`,
|
|
855
|
+
// `native-sequence`, `iterator`, `promise`: none states a copy-safe
|
|
856
|
+
// ownership, either because the carrier has no ownership field to read
|
|
857
|
+
// (a proxy's two-part identity) or because it is explicitly borrowed
|
|
858
|
+
// from somewhere else. Refusing them is the fail-closed answer, not a
|
|
859
|
+
// gap to route around with a box.
|
|
860
|
+
return null;
|
|
861
|
+
}
|
|
862
|
+
};
|
|
863
|
+
/**
|
|
864
|
+
* The `capture:` capability discriminator for a carrier -- what both the
|
|
865
|
+
* demand and the refusal spell.
|
|
866
|
+
*
|
|
867
|
+
* A carrier with no copy-safe ownership still has to name SOMETHING, because
|
|
868
|
+
* a demand keyed on a name the manifest cannot publish is precisely how the
|
|
869
|
+
* refusal stays typed and attributable: `capture:unsupported-proxy-object`
|
|
870
|
+
* says which carrier could not be transported, where a bare `capture:null`
|
|
871
|
+
* would say only that one could not. `null` for the representation itself is
|
|
872
|
+
* a placement that never stated one, which is a different unknown and spells
|
|
873
|
+
* differently.
|
|
874
|
+
*/
|
|
875
|
+
export const captureCapabilityOf = (representation) => representation === null ? 'unstated' : (ownershipOf(representation) ?? `unsupported-${representation.kind}`);
|
|
876
|
+
/**
|
|
877
|
+
* Every carrier reachable inside a representation, including the root.
|
|
878
|
+
*
|
|
879
|
+
* One walk, shared: `verify.ts`'s guards ask "is anything in here unresolved /
|
|
880
|
+
* boxed / a dense buffer", and a probe in the emitter asks "is anything in here
|
|
881
|
+
* unresolved" before it asks for a physical C++ type. Two copies of this switch
|
|
882
|
+
* would answer those questions over different carrier sets, which is precisely
|
|
883
|
+
* how a fail-closed guard silently stops covering a kind.
|
|
884
|
+
*
|
|
885
|
+
* ⛔ `record-with-index` was missing from this switch and fell through to
|
|
886
|
+
* `default`, so nothing inside one was ever visited: mongodb's `Filter` -- a
|
|
887
|
+
* record-with-index whose fields are the whole query -- was invisible to every
|
|
888
|
+
* guard built on this walk.
|
|
889
|
+
*/
|
|
890
|
+
export function* walkRepresentation(representation, visited = new Set()) {
|
|
891
|
+
// With `visited`, a carrier OBJECT is yielded once across every walk that
|
|
892
|
+
// shares the set. The derive memo hands every reader of one structural
|
|
893
|
+
// type the same object, so a record's field carriers, a union's arms and
|
|
894
|
+
// the selections that embed them are one DAG, not a forest of trees --
|
|
895
|
+
// and a per-node question asked of that DAG is answered once per node.
|
|
896
|
+
if (visited.has(representation))
|
|
897
|
+
return;
|
|
898
|
+
visited.add(representation);
|
|
899
|
+
yield representation;
|
|
900
|
+
const walk = (inner) => walkRepresentation(inner, visited);
|
|
901
|
+
switch (representation.kind) {
|
|
902
|
+
case 'record':
|
|
903
|
+
for (const field of representation.fields)
|
|
904
|
+
yield* walk(field.value);
|
|
905
|
+
return;
|
|
906
|
+
case 'record-with-index':
|
|
907
|
+
for (const field of representation.fields)
|
|
908
|
+
yield* walk(field.value);
|
|
909
|
+
for (const index of representation.indexes)
|
|
910
|
+
yield* walk(index.value);
|
|
911
|
+
return;
|
|
912
|
+
case 'proxy-object':
|
|
913
|
+
yield* walk(representation.target);
|
|
914
|
+
yield* walk(representation.handler);
|
|
915
|
+
return;
|
|
916
|
+
case 'borrowed-ref':
|
|
917
|
+
yield* walk(representation.referent);
|
|
918
|
+
return;
|
|
919
|
+
case 'array-object':
|
|
920
|
+
yield* walk(representation.element);
|
|
921
|
+
for (const field of representation.extension ?? [])
|
|
922
|
+
yield* walk(field.value);
|
|
923
|
+
return;
|
|
924
|
+
case 'dense-buffer':
|
|
925
|
+
case 'native-sequence':
|
|
926
|
+
yield* walk(representation.element);
|
|
927
|
+
return;
|
|
928
|
+
case 'iterator':
|
|
929
|
+
yield* walk(representation.element);
|
|
930
|
+
yield* walk(representation.resume);
|
|
931
|
+
yield* walk(representation.completion);
|
|
932
|
+
return;
|
|
933
|
+
case 'promise':
|
|
934
|
+
yield* walk(representation.value);
|
|
935
|
+
return;
|
|
936
|
+
case 'keyed-collection':
|
|
937
|
+
yield* walk(representation.key);
|
|
938
|
+
if (representation.value)
|
|
939
|
+
yield* walk(representation.value);
|
|
940
|
+
return;
|
|
941
|
+
case 'dictionary':
|
|
942
|
+
yield* walk(representation.value);
|
|
943
|
+
return;
|
|
944
|
+
case 'optional':
|
|
945
|
+
yield* walk(representation.payload);
|
|
946
|
+
return;
|
|
947
|
+
case 'tagged-union':
|
|
948
|
+
for (const arm of representation.arms)
|
|
949
|
+
yield* walk(arm.value);
|
|
950
|
+
return;
|
|
951
|
+
case 'function':
|
|
952
|
+
case 'function-family':
|
|
953
|
+
case 'constructor-family':
|
|
954
|
+
case 'constructor-value-dispatch':
|
|
955
|
+
case 'function-value-family':
|
|
956
|
+
case 'function-value-dispatch':
|
|
957
|
+
for (const parameter of representation.abi.parameters)
|
|
958
|
+
yield* walk(parameter.value);
|
|
959
|
+
yield* walk(representation.abi.result);
|
|
960
|
+
if (representation.abi.receiver)
|
|
961
|
+
yield* walk(representation.abi.receiver);
|
|
962
|
+
return;
|
|
963
|
+
case 'function-and-constructor':
|
|
964
|
+
for (const abi of [representation.call, representation.construct]) {
|
|
965
|
+
for (const parameter of abi.parameters)
|
|
966
|
+
yield* walk(parameter.value);
|
|
967
|
+
yield* walk(abi.result);
|
|
968
|
+
if (abi.receiver)
|
|
969
|
+
yield* walk(abi.receiver);
|
|
970
|
+
}
|
|
971
|
+
return;
|
|
972
|
+
case 'unresolved':
|
|
973
|
+
case 'void':
|
|
974
|
+
case 'scalar':
|
|
975
|
+
case 'string':
|
|
976
|
+
case 'symbol':
|
|
977
|
+
case 'null':
|
|
978
|
+
case 'undefined':
|
|
979
|
+
case 'class-ref':
|
|
980
|
+
case 'native-handle':
|
|
981
|
+
case 'native-record-ref':
|
|
982
|
+
case 'typed-array':
|
|
983
|
+
case 'array-buffer':
|
|
984
|
+
case 'shared-array-buffer':
|
|
985
|
+
case 'data-view':
|
|
986
|
+
case 'dynamic':
|
|
987
|
+
case 'generic-function-set':
|
|
988
|
+
case 'callable-identity':
|
|
989
|
+
return;
|
|
990
|
+
default: {
|
|
991
|
+
const unhandled = representation;
|
|
992
|
+
throw new Error(`unhandled representation in traversal: ${String(unhandled)}`);
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* Whether a carrier holds lattice bottom anywhere inside it.
|
|
998
|
+
*
|
|
999
|
+
* `unresolved` has no physical type, and `targets/cpp/types.ts`'s `cppTypeOf`
|
|
1000
|
+
* throws on one rather than inventing a slot -- correctly, since a carrier that
|
|
1001
|
+
* was never selected must not materialize as a default-constructed value. That
|
|
1002
|
+
* makes it a hazard for the emitter's *probes*: a function asking "could this
|
|
1003
|
+
* record be recast to an array?" is asking a question with a legitimate `false`
|
|
1004
|
+
* answer, and it must not blow up the compile to find out. Asking this first is
|
|
1005
|
+
* how such a probe stays a probe.
|
|
1006
|
+
*/
|
|
1007
|
+
export const containsUnresolved = (representation) => {
|
|
1008
|
+
for (const found of walkRepresentation(representation))
|
|
1009
|
+
if (found.kind === 'unresolved')
|
|
1010
|
+
return true;
|
|
1011
|
+
return false;
|
|
1012
|
+
};
|
|
1013
|
+
/**
|
|
1014
|
+
* The carrier every `throw` converts its value into: ECMAScript does not
|
|
1015
|
+
* type a thrown value, so this is the one genuinely dynamic boundary the
|
|
1016
|
+
* language itself states. The catch side reads it back without conversion
|
|
1017
|
+
* (`ir/lower-exceptions.ts`).
|
|
1018
|
+
*/
|
|
1019
|
+
export const thrownValueCarrier = { kind: 'dynamic', reason: 'thrown-error-carrier' };
|