@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,11 @@
|
|
|
1
|
+
import type { DeclarationId, IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { BindingPlacement } from '../projection/bindings.js';
|
|
3
|
+
import type { ClassLayout } from '../projection/classes.js';
|
|
4
|
+
import type { CallCalleeIdentity, IrBody } from './model.js';
|
|
5
|
+
/**
|
|
6
|
+
* Static methods have projected implementation identities just like instance
|
|
7
|
+
* methods. Publish them only while the constructor object stays inside uses
|
|
8
|
+
* that cannot replace its members. This is a callable identity proof, not a
|
|
9
|
+
* request to bypass the callable's environment or receiver convention.
|
|
10
|
+
*/
|
|
11
|
+
export declare const closedStaticCallablesOf: (bodies: readonly IrBody[], placements: ReadonlyMap<DeclarationId, BindingPlacement>, classes: ReadonlyMap<DeclarationId, ClassLayout>) => ReadonlyMap<IrValueId, CallCalleeIdentity>;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { classMemberOf, classStaticMemberOf } from '../projection/fields.js';
|
|
2
|
+
import { representationKey } from '../representation/model.js';
|
|
3
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
4
|
+
/**
|
|
5
|
+
* Static methods have projected implementation identities just like instance
|
|
6
|
+
* methods. Publish them only while the constructor object stays inside uses
|
|
7
|
+
* that cannot replace its members. This is a callable identity proof, not a
|
|
8
|
+
* request to bypass the callable's environment or receiver convention.
|
|
9
|
+
*/
|
|
10
|
+
export const closedStaticCallablesOf = (bodies, placements, classes) => {
|
|
11
|
+
const operations = bodies.flatMap((body) => body.blockOrder.flatMap((id) => {
|
|
12
|
+
const block = body.blocks.get(id);
|
|
13
|
+
return block ? [...block.operations, block.terminator] : [];
|
|
14
|
+
}));
|
|
15
|
+
const producers = new Map();
|
|
16
|
+
const writes = new Map();
|
|
17
|
+
for (const operation of operations) {
|
|
18
|
+
const result = resultOfIrOperation(operation);
|
|
19
|
+
if (result)
|
|
20
|
+
producers.set(result.id, operation);
|
|
21
|
+
if (operation.kind === 'binding-write') {
|
|
22
|
+
const values = writes.get(operation.declaration) ?? [];
|
|
23
|
+
values.push(operation.value.value);
|
|
24
|
+
writes.set(operation.declaration, values);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const nativeConstructor = (id, declaration, visiting = new Set()) => {
|
|
28
|
+
if (visiting.has(id))
|
|
29
|
+
return false;
|
|
30
|
+
const operation = producers.get(id);
|
|
31
|
+
if (!operation)
|
|
32
|
+
return false;
|
|
33
|
+
if (operation.kind === 'allocate-constructor')
|
|
34
|
+
return operation.declaration === declaration;
|
|
35
|
+
let sources = null;
|
|
36
|
+
if (operation.kind === 'binding-read') {
|
|
37
|
+
const storage = placements.get(operation.declaration)?.storage.kind;
|
|
38
|
+
if (storage === 'local' || storage === 'region')
|
|
39
|
+
sources = writes.get(operation.declaration) ?? null;
|
|
40
|
+
}
|
|
41
|
+
else if (operation.kind === 'phi')
|
|
42
|
+
sources = operation.incoming.map((incoming) => incoming.value.value);
|
|
43
|
+
else if (operation.kind === 'convert' &&
|
|
44
|
+
representationKey(operation.source.representation) === representationKey(operation.result.representation))
|
|
45
|
+
sources = [operation.source.value];
|
|
46
|
+
if (!sources?.length)
|
|
47
|
+
return false;
|
|
48
|
+
visiting.add(id);
|
|
49
|
+
const closed = sources.every((source) => nativeConstructor(source, declaration, visiting));
|
|
50
|
+
visiting.delete(id);
|
|
51
|
+
return closed;
|
|
52
|
+
};
|
|
53
|
+
const membersOf = (value) => {
|
|
54
|
+
if (value.kind === 'constructor-family')
|
|
55
|
+
return value.members;
|
|
56
|
+
// An escaped instance exposes its constructor through its prototype.
|
|
57
|
+
// Treat it as another route to mutation, not as an unrelated payload.
|
|
58
|
+
if (value.kind === 'class-ref')
|
|
59
|
+
return [value.declaration];
|
|
60
|
+
if (value.kind === 'optional')
|
|
61
|
+
return membersOf(value.payload);
|
|
62
|
+
if (value.kind === 'borrowed-ref')
|
|
63
|
+
return membersOf(value.referent);
|
|
64
|
+
if (value.kind === 'tagged-union')
|
|
65
|
+
return value.arms.flatMap((arm) => membersOf(arm.value));
|
|
66
|
+
return [];
|
|
67
|
+
};
|
|
68
|
+
const candidates = new Map();
|
|
69
|
+
for (const operation of operations) {
|
|
70
|
+
if (operation.kind !== 'get' || operation.receiver.representation.kind !== 'constructor-family')
|
|
71
|
+
continue;
|
|
72
|
+
const members = operation.receiver.representation.members;
|
|
73
|
+
// A family with different static implementations needs its own dispatch
|
|
74
|
+
// recipe; the existing static member renderer selects one declaration.
|
|
75
|
+
if (members.length !== 1)
|
|
76
|
+
continue;
|
|
77
|
+
const key = producers.get(operation.key.value);
|
|
78
|
+
if (key?.kind !== 'constant' || key.literal !== 'string')
|
|
79
|
+
continue;
|
|
80
|
+
const receiver = members[0];
|
|
81
|
+
if (!nativeConstructor(operation.receiver.value, receiver))
|
|
82
|
+
continue;
|
|
83
|
+
const site = classStaticMemberOf(classes, receiver, key.text);
|
|
84
|
+
if (site?.kind !== 'method' || site.method.callable === null)
|
|
85
|
+
continue;
|
|
86
|
+
candidates.set(operation.result.id, {
|
|
87
|
+
receiver,
|
|
88
|
+
owner: site.owner,
|
|
89
|
+
identity: { kind: 'exact', functionId: site.method.callable }
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const untrusted = new Set();
|
|
93
|
+
for (const operation of operations) {
|
|
94
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
95
|
+
const members = membersOf(operand.representation);
|
|
96
|
+
if (members.length === 0)
|
|
97
|
+
continue;
|
|
98
|
+
if (operand.representation.kind === 'class-ref' &&
|
|
99
|
+
(operation.kind === 'get' || operation.kind === 'set') &&
|
|
100
|
+
operand.value === operation.receiver.value &&
|
|
101
|
+
(operation.kind !== 'set' || operation.value.value !== operand.value)) {
|
|
102
|
+
const key = producers.get(operation.key.value);
|
|
103
|
+
const member = key?.kind === 'constant' && key.literal === 'string' ? classMemberOf(classes, operand.representation.declaration, key.text) : null;
|
|
104
|
+
if (member?.kind === 'field' || (operation.kind === 'get' && member?.kind === 'method'))
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (operation.kind === 'get' && operand.value === operation.receiver.value && candidates.has(operation.result.id))
|
|
108
|
+
continue;
|
|
109
|
+
if (operation.kind === 'binding-write') {
|
|
110
|
+
const placement = placements.get(operation.declaration);
|
|
111
|
+
if ((placement?.storage.kind === 'local' || placement?.storage.kind === 'region') &&
|
|
112
|
+
placement.representation !== null &&
|
|
113
|
+
representationKey(placement.representation) === representationKey(operand.representation))
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (operation.kind === 'construct' &&
|
|
117
|
+
(operand.value === operation.callee.value || operand.value === operation.newTarget.value) &&
|
|
118
|
+
!operation.arguments.some((argument) => argument.value === operand.value))
|
|
119
|
+
continue;
|
|
120
|
+
if (operation.kind === 'call' &&
|
|
121
|
+
operand.value === operation.receiver?.value &&
|
|
122
|
+
candidates.has(operation.callee.value) &&
|
|
123
|
+
!operation.arguments.some((argument) => argument.value === operand.value))
|
|
124
|
+
continue;
|
|
125
|
+
if ((operation.kind === 'convert' &&
|
|
126
|
+
representationKey(operation.source.representation) === representationKey(operation.result.representation)) ||
|
|
127
|
+
(operation.kind === 'phi' &&
|
|
128
|
+
operation.incoming.every((incoming) => representationKey(incoming.value.representation) === representationKey(operation.result.representation))) ||
|
|
129
|
+
operation.kind === 'test' ||
|
|
130
|
+
(operation.kind === 'compute' &&
|
|
131
|
+
(operation.form === 'typeof' ||
|
|
132
|
+
(operation.form === 'unary' && (operation.operator === 'void' || operation.operator === '!')) ||
|
|
133
|
+
(operation.form === 'equality' && (operation.operator === '===' || operation.operator === '!==')))))
|
|
134
|
+
continue;
|
|
135
|
+
// An unknown consumer can walk the constructor's prototype chain and
|
|
136
|
+
// replace an inherited member on an ancestor as well.
|
|
137
|
+
for (const member of members) {
|
|
138
|
+
let declaration = member;
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
while (declaration !== null && !seen.has(declaration)) {
|
|
141
|
+
untrusted.add(declaration);
|
|
142
|
+
seen.add(declaration);
|
|
143
|
+
declaration = classes.get(declaration)?.base ?? null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return new Map([...candidates].flatMap(([id, candidate]) => {
|
|
149
|
+
// An intermediate constructor can shadow the inherited method without
|
|
150
|
+
// mutating either the receiver or the original declaring constructor.
|
|
151
|
+
let declaration = candidate.receiver;
|
|
152
|
+
const seen = new Set();
|
|
153
|
+
while (declaration !== null && !seen.has(declaration)) {
|
|
154
|
+
if (untrusted.has(declaration))
|
|
155
|
+
return [];
|
|
156
|
+
if (declaration === candidate.owner)
|
|
157
|
+
return [[id, candidate.identity]];
|
|
158
|
+
seen.add(declaration);
|
|
159
|
+
declaration = classes.get(declaration)?.base ?? null;
|
|
160
|
+
}
|
|
161
|
+
return [];
|
|
162
|
+
}));
|
|
163
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { HoistPlan } from './hoist.js';
|
|
3
|
+
import type { IrBody } from './model.js';
|
|
4
|
+
export interface SharedStringLayout {
|
|
5
|
+
readonly ordinal: number;
|
|
6
|
+
readonly initialize: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Share the scan only among reads already proved invariant and relocated to
|
|
9
|
+
* the same preheader. Binding identities are interchangeable only when their
|
|
10
|
+
* reads occur in that same relocation list: a matching declaration elsewhere
|
|
11
|
+
* could observe a different value. This consumes the hoist proof instead of
|
|
12
|
+
* inventing another alias or callback-effect analysis. */
|
|
13
|
+
export declare const sharedStringLayoutsOf: (body: IrBody, hoists: HoistPlan, excluded: ReadonlySet<IrValueId>) => ReadonlyMap<IrValueId, SharedStringLayout>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { stringConstantsOf } from './dead-values.js';
|
|
2
|
+
/** Share the scan only among reads already proved invariant and relocated to
|
|
3
|
+
* the same preheader. Binding identities are interchangeable only when their
|
|
4
|
+
* reads occur in that same relocation list: a matching declaration elsewhere
|
|
5
|
+
* could observe a different value. This consumes the hoist proof instead of
|
|
6
|
+
* inventing another alias or callback-effect analysis. */
|
|
7
|
+
export const sharedStringLayoutsOf = (body, hoists, excluded) => {
|
|
8
|
+
const layouts = new Map();
|
|
9
|
+
const keys = stringConstantsOf(body);
|
|
10
|
+
let ordinal = 0;
|
|
11
|
+
for (const operations of hoists.into.values()) {
|
|
12
|
+
const receivers = new Map();
|
|
13
|
+
for (const operation of operations) {
|
|
14
|
+
if (operation.kind === 'binding-read')
|
|
15
|
+
receivers.set(operation.result.id, `binding:${operation.declaration}`);
|
|
16
|
+
}
|
|
17
|
+
const groups = new Map();
|
|
18
|
+
for (const operation of operations) {
|
|
19
|
+
if (operation.kind !== 'get' || operation.receiver.representation.kind !== 'string' || excluded.has(operation.result.id))
|
|
20
|
+
continue;
|
|
21
|
+
const key = keys.get(operation.key.value);
|
|
22
|
+
if (key !== 'length' && key !== 'charCodeAt')
|
|
23
|
+
continue;
|
|
24
|
+
const identity = receivers.get(operation.receiver.value) ?? `value:${operation.receiver.value}`;
|
|
25
|
+
const group = groups.get(identity) ?? [];
|
|
26
|
+
group.push(operation);
|
|
27
|
+
groups.set(identity, group);
|
|
28
|
+
}
|
|
29
|
+
for (const group of groups.values()) {
|
|
30
|
+
if (group.length < 2 || !group.some((operation) => keys.get(operation.key.value) === 'charCodeAt'))
|
|
31
|
+
continue;
|
|
32
|
+
for (const [index, operation] of group.entries()) {
|
|
33
|
+
layouts.set(operation.result.id, { ordinal, initialize: index === 0 });
|
|
34
|
+
}
|
|
35
|
+
ordinal++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return layouts;
|
|
39
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DeclarationId, IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { IrBody, IrOperand } from './model.js';
|
|
3
|
+
/** Reuse a dominating native string length. The receiver must be the same
|
|
4
|
+
* SSA value, or a read of a cell the caller proves aliases an unchanged
|
|
5
|
+
* formal. No object getters, mutable cells, or assumptions about callees.
|
|
6
|
+
* Relocated/dead reads are excluded: their original CFG position no longer
|
|
7
|
+
* states where (or whether) their result will be available. */
|
|
8
|
+
export declare const stringLengthReuseOf: (body: IrBody, stableFormals: ReadonlySet<DeclarationId>, excluded: ReadonlySet<IrValueId>) => ReadonlyMap<IrValueId, IrOperand>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { dominatorTreeOf } from './dominance.js';
|
|
2
|
+
import { stringConstantsOf } from './dead-values.js';
|
|
3
|
+
/** Reuse a dominating native string length. The receiver must be the same
|
|
4
|
+
* SSA value, or a read of a cell the caller proves aliases an unchanged
|
|
5
|
+
* formal. No object getters, mutable cells, or assumptions about callees.
|
|
6
|
+
* Relocated/dead reads are excluded: their original CFG position no longer
|
|
7
|
+
* states where (or whether) their result will be available. */
|
|
8
|
+
export const stringLengthReuseOf = (body, stableFormals, excluded) => {
|
|
9
|
+
const reuse = new Map();
|
|
10
|
+
if (body.tryRegions.length > 0 || (body.iteratorCloseRegions?.length ?? 0) > 0)
|
|
11
|
+
return reuse;
|
|
12
|
+
const keys = stringConstantsOf(body);
|
|
13
|
+
const receivers = new Map();
|
|
14
|
+
for (const block of body.blocks.values()) {
|
|
15
|
+
for (const operation of block.operations) {
|
|
16
|
+
if (operation.kind === 'binding-read' && stableFormals.has(operation.declaration))
|
|
17
|
+
receivers.set(operation.result.id, `formal:${operation.declaration}`);
|
|
18
|
+
if (operation.kind === 'parameter')
|
|
19
|
+
receivers.set(operation.result.id, `parameter:${operation.ordinal}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const dominance = dominatorTreeOf(body);
|
|
23
|
+
const available = new Map();
|
|
24
|
+
for (const blockId of body.blockOrder) {
|
|
25
|
+
const block = body.blocks.get(blockId);
|
|
26
|
+
if (!block)
|
|
27
|
+
continue;
|
|
28
|
+
for (const operation of block.operations) {
|
|
29
|
+
if (operation.kind !== 'get' ||
|
|
30
|
+
operation.receiver.representation.kind !== 'string' ||
|
|
31
|
+
keys.get(operation.key.value) !== 'length' ||
|
|
32
|
+
excluded.has(operation.result.id))
|
|
33
|
+
continue;
|
|
34
|
+
// Non-formal binding reads deliberately keep their distinct SSA IDs.
|
|
35
|
+
const identity = receivers.get(operation.receiver.value) ?? `value:${operation.receiver.value}`;
|
|
36
|
+
const prior = available.get(identity) ?? [];
|
|
37
|
+
const dominating = prior.find((candidate) => dominance.dominates(candidate.block, blockId));
|
|
38
|
+
if (dominating)
|
|
39
|
+
reuse.set(operation.result.id, dominating.operand);
|
|
40
|
+
else {
|
|
41
|
+
prior.push({ block: blockId, operand: { value: operation.result.id, representation: operation.result.representation } });
|
|
42
|
+
available.set(identity, prior);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return reuse;
|
|
47
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { IrBody, ValueTransfer } from './model.js';
|
|
3
|
+
/**
|
|
4
|
+
* Relocated from `targets/cpp/captures.ts` per
|
|
5
|
+
* the `IrOperand.transfer` step that moved this fact out of the target: the
|
|
6
|
+
* move pipeline reasons only about the lowered IR (SSA uses, cells, control
|
|
7
|
+
* flow), never about how the target renders anything, so it belongs here
|
|
8
|
+
* rather than beside the printer. `cppTypeOf` stays a target import for now
|
|
9
|
+
* -- `ownedFormalInputsOf`'s optional-unwrap check compares two carriers by
|
|
10
|
+
* their C++ SPELLING, which is the target's own historical answer to "does
|
|
11
|
+
* this conversion actually change the representation"; swapping it for
|
|
12
|
+
* `representationKey` would be a behavior change (two representations can
|
|
13
|
+
* share a spelling while differing in fields this key tracks, e.g.
|
|
14
|
+
* `shapeId`), and this refactor's contract is byte-identical output, not a
|
|
15
|
+
* better answer. Collapsing that comparison onto a pure representation
|
|
16
|
+
* predicate is future work, not this step's.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Argument reads whose value is DYING at the call that takes it: the cell is
|
|
20
|
+
* read ONCE in the whole unit, that read is the argument's only use, and every
|
|
21
|
+
* write to the cell is in the body that reads it. Nothing can observe the cell
|
|
22
|
+
* after the call, so the argument MOVES into the callee rather than copying.
|
|
23
|
+
*
|
|
24
|
+
* The copy is not free. A `gea::Ref` argument passed by value increments on the
|
|
25
|
+
* way in and releases on the way out, and the release is a decrement, a branch,
|
|
26
|
+
* and -- on the taken side -- an out-of-line destructor call clang cannot prove
|
|
27
|
+
* unreachable. `binary_trees`' `build` pays that pair twice per node, for the
|
|
28
|
+
* two subtrees it has just built and will never look at again. Measured on
|
|
29
|
+
* `binary_trees` at 1M nodes: 41.9ms as emitted, 40.8ms with the two subtree
|
|
30
|
+
* arguments moved.
|
|
31
|
+
*
|
|
32
|
+
* Each condition is a way the move would be OBSERVED, so none of them can be
|
|
33
|
+
* relaxed for a bigger catch:
|
|
34
|
+
* - a second read anywhere in the unit -- a module-scope cell two bodies read,
|
|
35
|
+
* a cell a closure captures by reference -- would see the emptied cell.
|
|
36
|
+
* - a second use of the same read, `f(x, x)`, moves the first argument out
|
|
37
|
+
* from under the second.
|
|
38
|
+
* - a read or its single use that a loop re-enters moves once and passes an
|
|
39
|
+
* empty `Ref` on every iteration after. A loop-invariant read can live in
|
|
40
|
+
* an acyclic preheader while its SSA value is consumed in the cyclic body,
|
|
41
|
+
* so both blocks must be acyclic.
|
|
42
|
+
* - a write in ANOTHER body means the cell outlives this frame: the read is
|
|
43
|
+
* local but the storage is not.
|
|
44
|
+
*/
|
|
45
|
+
export declare const buildDyingArgumentIndex: (bodies: readonly IrBody[]) => ReadonlySet<IrValueId>;
|
|
46
|
+
/**
|
|
47
|
+
* Single-use SSA storage can move across a branch if the consumer cannot run
|
|
48
|
+
* twice without its defining operation running again. Removing the definition
|
|
49
|
+
* block from the CFG makes that loop-carried-use question explicit. Binding
|
|
50
|
+
* aliases and borrowed formals are excluded later by the emitter's actual
|
|
51
|
+
* storage ownership, rather than inferred from a read's source type.
|
|
52
|
+
*/
|
|
53
|
+
export declare const ownedDyingValuesOf: (body: IrBody) => ReadonlySet<IrValueId>;
|
|
54
|
+
/** Last uses of by-value ABI inputs, grouped by formal rather than SSA read. */
|
|
55
|
+
export declare const ownedFormalInputsOf: (body: IrBody) => {
|
|
56
|
+
readonly arguments: ReadonlySet<IrValueId>;
|
|
57
|
+
readonly conversions: ReadonlySet<IrValueId>;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* The single decision `emit-narrowing.ts`'s `movedValueText` and
|
|
61
|
+
* `emit-callable.ts`'s stable-borrow-entry check used to make twice, verbatim,
|
|
62
|
+
* against the same two whole-program facts above plus the target's own
|
|
63
|
+
* storage-ownership census (`EmitContext.ownedValues` -- carrier ownership
|
|
64
|
+
* class for a capture is a separate, still target-computed Phase 3 step per
|
|
65
|
+
* a program fact of the IR, not of this one). A dying read moves
|
|
66
|
+
* outright (`buildDyingArgumentIndex`); an SSA-dying temporary
|
|
67
|
+
* (`ownedDyingValuesOf`) moves only once storage ownership is proven, since
|
|
68
|
+
* that census alone cannot tell a physical owner from a borrowed alias.
|
|
69
|
+
*/
|
|
70
|
+
export declare const transferOf: (dyingArguments: ReadonlySet<IrValueId>, ownedValues: ReadonlySet<IrValueId>, ownedDyingValues: ReadonlySet<IrValueId>, value: IrValueId) => ValueTransfer;
|
|
71
|
+
/**
|
|
72
|
+
* The formal-conversion half of the same pipeline (`ownedFormalInputsOf`'s
|
|
73
|
+
* `conversions`): a dying by-value parameter that reaches its one use through
|
|
74
|
+
* an optional-unwrap `convert` moves at the CONVERT's result, not at a read of
|
|
75
|
+
* the parameter itself -- `emit.ts`'s `emitConvert` is the one renderer that
|
|
76
|
+
* ever sees that result id, so this is keyed by result rather than by operand.
|
|
77
|
+
*/
|
|
78
|
+
export declare const transfersFormalConversion: (consumingFormalConversions: ReadonlySet<IrValueId>, resultValue: IrValueId) => ValueTransfer;
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { cppTypeOf } from '../targets/cpp/types.js';
|
|
2
|
+
import { controlFlowGraphOf, cyclicBlocksOf } from './dominance.js';
|
|
3
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
4
|
+
/**
|
|
5
|
+
* Relocated from `targets/cpp/captures.ts` per
|
|
6
|
+
* the `IrOperand.transfer` step that moved this fact out of the target: the
|
|
7
|
+
* move pipeline reasons only about the lowered IR (SSA uses, cells, control
|
|
8
|
+
* flow), never about how the target renders anything, so it belongs here
|
|
9
|
+
* rather than beside the printer. `cppTypeOf` stays a target import for now
|
|
10
|
+
* -- `ownedFormalInputsOf`'s optional-unwrap check compares two carriers by
|
|
11
|
+
* their C++ SPELLING, which is the target's own historical answer to "does
|
|
12
|
+
* this conversion actually change the representation"; swapping it for
|
|
13
|
+
* `representationKey` would be a behavior change (two representations can
|
|
14
|
+
* share a spelling while differing in fields this key tracks, e.g.
|
|
15
|
+
* `shapeId`), and this refactor's contract is byte-identical output, not a
|
|
16
|
+
* better answer. Collapsing that comparison onto a pure representation
|
|
17
|
+
* predicate is future work, not this step's.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Argument reads whose value is DYING at the call that takes it: the cell is
|
|
21
|
+
* read ONCE in the whole unit, that read is the argument's only use, and every
|
|
22
|
+
* write to the cell is in the body that reads it. Nothing can observe the cell
|
|
23
|
+
* after the call, so the argument MOVES into the callee rather than copying.
|
|
24
|
+
*
|
|
25
|
+
* The copy is not free. A `gea::Ref` argument passed by value increments on the
|
|
26
|
+
* way in and releases on the way out, and the release is a decrement, a branch,
|
|
27
|
+
* and -- on the taken side -- an out-of-line destructor call clang cannot prove
|
|
28
|
+
* unreachable. `binary_trees`' `build` pays that pair twice per node, for the
|
|
29
|
+
* two subtrees it has just built and will never look at again. Measured on
|
|
30
|
+
* `binary_trees` at 1M nodes: 41.9ms as emitted, 40.8ms with the two subtree
|
|
31
|
+
* arguments moved.
|
|
32
|
+
*
|
|
33
|
+
* Each condition is a way the move would be OBSERVED, so none of them can be
|
|
34
|
+
* relaxed for a bigger catch:
|
|
35
|
+
* - a second read anywhere in the unit -- a module-scope cell two bodies read,
|
|
36
|
+
* a cell a closure captures by reference -- would see the emptied cell.
|
|
37
|
+
* - a second use of the same read, `f(x, x)`, moves the first argument out
|
|
38
|
+
* from under the second.
|
|
39
|
+
* - a read or its single use that a loop re-enters moves once and passes an
|
|
40
|
+
* empty `Ref` on every iteration after. A loop-invariant read can live in
|
|
41
|
+
* an acyclic preheader while its SSA value is consumed in the cyclic body,
|
|
42
|
+
* so both blocks must be acyclic.
|
|
43
|
+
* - a write in ANOTHER body means the cell outlives this frame: the read is
|
|
44
|
+
* local but the storage is not.
|
|
45
|
+
*/
|
|
46
|
+
export const buildDyingArgumentIndex = (bodies) => {
|
|
47
|
+
const reads = new Map();
|
|
48
|
+
const readCounts = new Map();
|
|
49
|
+
const writeBodies = new Map();
|
|
50
|
+
const uses = new Map();
|
|
51
|
+
const passed = new Set();
|
|
52
|
+
const definedIn = new Map();
|
|
53
|
+
const usedIn = new Map();
|
|
54
|
+
for (const body of bodies) {
|
|
55
|
+
for (const [blockId, block] of body.blocks) {
|
|
56
|
+
for (const operation of [...block.operations, block.terminator]) {
|
|
57
|
+
const produced = resultOfIrOperation(operation);
|
|
58
|
+
if (produced !== null)
|
|
59
|
+
definedIn.set(produced.id, blockId);
|
|
60
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
61
|
+
uses.set(operand.value, (uses.get(operand.value) ?? 0) + 1);
|
|
62
|
+
usedIn.set(operand.value, blockId);
|
|
63
|
+
}
|
|
64
|
+
if (operation.kind === 'binding-read') {
|
|
65
|
+
reads.set(operation.result.id, { declaration: operation.declaration, body, block: blockId });
|
|
66
|
+
readCounts.set(operation.declaration, (readCounts.get(operation.declaration) ?? 0) + 1);
|
|
67
|
+
}
|
|
68
|
+
if (operation.kind === 'binding-write') {
|
|
69
|
+
const bodiesOfCell = writeBodies.get(operation.declaration) ?? new Set();
|
|
70
|
+
bodiesOfCell.add(body);
|
|
71
|
+
writeBodies.set(operation.declaration, bodiesOfCell);
|
|
72
|
+
}
|
|
73
|
+
if (operation.kind === 'call' || operation.kind === 'construct') {
|
|
74
|
+
for (const argument of operation.arguments)
|
|
75
|
+
passed.add(argument.value);
|
|
76
|
+
}
|
|
77
|
+
// A field store hands the value over exactly as an argument does, and so
|
|
78
|
+
// does a write into a cell -- the cell keeps what the value held, and a
|
|
79
|
+
// value with one use has nothing left to keep.
|
|
80
|
+
if (operation.kind === 'set' || operation.kind === 'define-own-property')
|
|
81
|
+
passed.add(operation.value.value);
|
|
82
|
+
if (operation.kind === 'binding-write')
|
|
83
|
+
passed.add(operation.value.value);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const cyclic = new Map();
|
|
88
|
+
const dying = new Set();
|
|
89
|
+
// A value the SAME BLOCK defines and then passes is the simplest dying shape
|
|
90
|
+
// there is, and needs no cell reasoning at all: straight-line code redefines
|
|
91
|
+
// it before every use, so a loop cannot carry an emptied one into the next
|
|
92
|
+
// iteration and no other block can name it. `binary_trees`' `build` is
|
|
93
|
+
// exactly this -- the two subtrees it has just recursed for.
|
|
94
|
+
for (const [value, block] of definedIn) {
|
|
95
|
+
if (reads.has(value) || !passed.has(value) || uses.get(value) !== 1)
|
|
96
|
+
continue;
|
|
97
|
+
if (usedIn.get(value) === block)
|
|
98
|
+
dying.add(value);
|
|
99
|
+
}
|
|
100
|
+
for (const [value, read] of reads) {
|
|
101
|
+
if (!passed.has(value) || uses.get(value) !== 1)
|
|
102
|
+
continue;
|
|
103
|
+
if (readCounts.get(read.declaration) !== 1)
|
|
104
|
+
continue;
|
|
105
|
+
const written = writeBodies.get(read.declaration);
|
|
106
|
+
if (written === undefined || written.size !== 1 || !written.has(read.body))
|
|
107
|
+
continue;
|
|
108
|
+
const blocks = cyclic.get(read.body) ?? cyclicBlocksOf(read.body);
|
|
109
|
+
cyclic.set(read.body, blocks);
|
|
110
|
+
const useBlock = usedIn.get(value);
|
|
111
|
+
if (blocks.has(read.block) || (useBlock !== undefined && blocks.has(useBlock)))
|
|
112
|
+
continue;
|
|
113
|
+
dying.add(value);
|
|
114
|
+
}
|
|
115
|
+
return dying;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Single-use SSA storage can move across a branch if the consumer cannot run
|
|
119
|
+
* twice without its defining operation running again. Removing the definition
|
|
120
|
+
* block from the CFG makes that loop-carried-use question explicit. Binding
|
|
121
|
+
* aliases and borrowed formals are excluded later by the emitter's actual
|
|
122
|
+
* storage ownership, rather than inferred from a read's source type.
|
|
123
|
+
*/
|
|
124
|
+
export const ownedDyingValuesOf = (body) => {
|
|
125
|
+
const definitions = new Map();
|
|
126
|
+
const uses = new Map();
|
|
127
|
+
for (const [blockId, block] of body.blocks) {
|
|
128
|
+
for (const operation of [...block.operations, block.terminator]) {
|
|
129
|
+
const result = resultOfIrOperation(operation);
|
|
130
|
+
if (result)
|
|
131
|
+
definitions.set(result.id, blockId);
|
|
132
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
133
|
+
const readers = uses.get(operand.value) ?? [];
|
|
134
|
+
readers.push(blockId);
|
|
135
|
+
uses.set(operand.value, readers);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const graph = controlFlowGraphOf(body);
|
|
140
|
+
const cyclic = cyclicBlocksOf(body);
|
|
141
|
+
const dying = new Set();
|
|
142
|
+
for (const [value, definition] of definitions) {
|
|
143
|
+
const readers = uses.get(value);
|
|
144
|
+
if (readers?.length !== 1)
|
|
145
|
+
continue;
|
|
146
|
+
const use = readers[0];
|
|
147
|
+
if (use === undefined)
|
|
148
|
+
continue;
|
|
149
|
+
// A value defined outside a loop can still have its sole SSA use inside
|
|
150
|
+
// the loop. Moving at that use empties the storage on the first iteration
|
|
151
|
+
// and every later iteration observes a null Ref. The CFG re-entry check
|
|
152
|
+
// below only handles distinct definition/use blocks, so exclude cyclic
|
|
153
|
+
// uses before the same-block fast path as well.
|
|
154
|
+
if (cyclic.has(use))
|
|
155
|
+
continue;
|
|
156
|
+
if (use === definition) {
|
|
157
|
+
dying.add(value);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
// Exceptional region edges are not represented by this CFG.
|
|
161
|
+
if (body.tryRegions.length > 0 || (body.iteratorCloseRegions?.length ?? 0) > 0)
|
|
162
|
+
continue;
|
|
163
|
+
const pending = [...(graph.successors.get(use) ?? [])];
|
|
164
|
+
const visited = new Set();
|
|
165
|
+
let reentered = false;
|
|
166
|
+
while (pending.length > 0) {
|
|
167
|
+
const next = pending.pop();
|
|
168
|
+
if (next === undefined || next === definition || visited.has(next))
|
|
169
|
+
continue;
|
|
170
|
+
if (next === use) {
|
|
171
|
+
reentered = true;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
visited.add(next);
|
|
175
|
+
pending.push(...(graph.successors.get(next) ?? []));
|
|
176
|
+
}
|
|
177
|
+
if (!reentered)
|
|
178
|
+
dying.add(value);
|
|
179
|
+
}
|
|
180
|
+
return dying;
|
|
181
|
+
};
|
|
182
|
+
/** Last uses of by-value ABI inputs, grouped by formal rather than SSA read. */
|
|
183
|
+
export const ownedFormalInputsOf = (body) => {
|
|
184
|
+
const arguments_ = new Set();
|
|
185
|
+
const conversions = new Set();
|
|
186
|
+
if (body.tryRegions.length > 0 || (body.iteratorCloseRegions?.length ?? 0) > 0)
|
|
187
|
+
return { arguments: arguments_, conversions };
|
|
188
|
+
const parameters = new Map();
|
|
189
|
+
for (const block of body.blocks.values()) {
|
|
190
|
+
for (const operation of block.operations) {
|
|
191
|
+
if (operation.kind === 'parameter' && body.abi?.parameters[operation.ordinal]?.ownership !== 'borrowed')
|
|
192
|
+
parameters.set(operation.result.id, operation.ordinal);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const uses = new Map();
|
|
196
|
+
for (const [blockId, block] of body.blocks) {
|
|
197
|
+
for (const [index, operation] of [...block.operations, block.terminator].entries()) {
|
|
198
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
199
|
+
const ordinal = parameters.get(operand.value);
|
|
200
|
+
if (ordinal === undefined)
|
|
201
|
+
continue;
|
|
202
|
+
const readers = uses.get(ordinal) ?? [];
|
|
203
|
+
readers.push({ block: blockId, index, operation, value: operand.value });
|
|
204
|
+
uses.set(ordinal, readers);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const graph = controlFlowGraphOf(body);
|
|
209
|
+
const cyclic = cyclicBlocksOf(body);
|
|
210
|
+
for (const readers of uses.values()) {
|
|
211
|
+
// A binding write may be a formal-cell alias, not a physical copy. Its
|
|
212
|
+
// subsequent binding reads are outside this direct formal-use census.
|
|
213
|
+
if (readers.some((read) => read.operation.kind === 'binding-write'))
|
|
214
|
+
continue;
|
|
215
|
+
for (const read of readers) {
|
|
216
|
+
if (cyclic.has(read.block))
|
|
217
|
+
continue;
|
|
218
|
+
const operation = read.operation;
|
|
219
|
+
if (readers.length === 1 && (operation.kind === 'call' || operation.kind === 'construct')) {
|
|
220
|
+
if (operation.arguments.some((argument) => argument.value === read.value))
|
|
221
|
+
arguments_.add(read.value);
|
|
222
|
+
}
|
|
223
|
+
if (operation.kind !== 'convert')
|
|
224
|
+
continue;
|
|
225
|
+
const source = operation.source.representation;
|
|
226
|
+
const target = operation.result.representation;
|
|
227
|
+
if (source.kind !== 'optional' || (target.kind !== 'string' && target.kind !== 'class-ref'))
|
|
228
|
+
continue;
|
|
229
|
+
if (cppTypeOf(source.payload) !== cppTypeOf(target))
|
|
230
|
+
continue;
|
|
231
|
+
// Same-block reads may be deferred past this operation by the pure
|
|
232
|
+
// expression scheduler. A different block gives a real ordering boundary.
|
|
233
|
+
if (readers.some((other) => other !== read && other.block === read.block))
|
|
234
|
+
continue;
|
|
235
|
+
const reachable = new Set();
|
|
236
|
+
const pending = [...(graph.successors.get(read.block) ?? [])];
|
|
237
|
+
while (pending.length > 0) {
|
|
238
|
+
const next = pending.pop();
|
|
239
|
+
if (next === undefined || reachable.has(next))
|
|
240
|
+
continue;
|
|
241
|
+
reachable.add(next);
|
|
242
|
+
pending.push(...(graph.successors.get(next) ?? []));
|
|
243
|
+
}
|
|
244
|
+
if (readers.some((other) => reachable.has(other.block)))
|
|
245
|
+
continue;
|
|
246
|
+
conversions.add(operation.result.id);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return { arguments: arguments_, conversions };
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* The single decision `emit-narrowing.ts`'s `movedValueText` and
|
|
253
|
+
* `emit-callable.ts`'s stable-borrow-entry check used to make twice, verbatim,
|
|
254
|
+
* against the same two whole-program facts above plus the target's own
|
|
255
|
+
* storage-ownership census (`EmitContext.ownedValues` -- carrier ownership
|
|
256
|
+
* class for a capture is a separate, still target-computed Phase 3 step per
|
|
257
|
+
* a program fact of the IR, not of this one). A dying read moves
|
|
258
|
+
* outright (`buildDyingArgumentIndex`); an SSA-dying temporary
|
|
259
|
+
* (`ownedDyingValuesOf`) moves only once storage ownership is proven, since
|
|
260
|
+
* that census alone cannot tell a physical owner from a borrowed alias.
|
|
261
|
+
*/
|
|
262
|
+
export const transferOf = (dyingArguments, ownedValues, ownedDyingValues, value) => (dyingArguments.has(value) || (ownedValues.has(value) && ownedDyingValues.has(value)) ? 'move' : 'retain');
|
|
263
|
+
/**
|
|
264
|
+
* The formal-conversion half of the same pipeline (`ownedFormalInputsOf`'s
|
|
265
|
+
* `conversions`): a dying by-value parameter that reaches its one use through
|
|
266
|
+
* an optional-unwrap `convert` moves at the CONVERT's result, not at a read of
|
|
267
|
+
* the parameter itself -- `emit.ts`'s `emitConvert` is the one renderer that
|
|
268
|
+
* ever sees that result id, so this is keyed by result rather than by operand.
|
|
269
|
+
*/
|
|
270
|
+
export const transfersFormalConversion = (consumingFormalConversions, resultValue) => consumingFormalConversions.has(resultValue) ? 'move' : 'retain';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DeclarationId, IrValueId } from '../identity/ids.js';
|
|
2
|
+
import { type ComputeOperation, type IrBody, type IrOperand } from './model.js';
|
|
3
|
+
export type TypeQueryOperand = {
|
|
4
|
+
readonly kind: 'tag';
|
|
5
|
+
readonly operand: IrOperand;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: 'literal';
|
|
8
|
+
readonly text: string;
|
|
9
|
+
};
|
|
10
|
+
export interface TypeQueryComparison {
|
|
11
|
+
readonly left: TypeQueryOperand;
|
|
12
|
+
readonly right: TypeQueryOperand;
|
|
13
|
+
readonly unequal: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** A typeof result consumed only by equality tests needs its finite type tag,
|
|
16
|
+
* not a constructed string. This is a snapshot at the query's original site,
|
|
17
|
+
* never a new query at the comparison (the input may have changed meanwhile).
|
|
18
|
+
* Native storage is confined to SSA values and private, single-writer cells
|
|
19
|
+
* whose write dominates every read. Any escape invalidates the entire chain.
|
|
20
|
+
* The caller supplies the existing placement/capture proof, not a new census. */
|
|
21
|
+
export declare const typeQueryResultsOf: (body: IrBody, privateCell: (declaration: DeclarationId) => boolean) => {
|
|
22
|
+
readonly values: ReadonlySet<IrValueId>;
|
|
23
|
+
readonly bindings: ReadonlySet<DeclarationId>;
|
|
24
|
+
readonly comparisons: ReadonlyMap<ComputeOperation, TypeQueryComparison>;
|
|
25
|
+
};
|