@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,490 @@
|
|
|
1
|
+
import { controlFlowGraphOf, dominatorTreeOf } from './dominance.js';
|
|
2
|
+
import { allOperationsOf } from './model.js';
|
|
3
|
+
/** The absent values a fact rules out, as bits. */
|
|
4
|
+
const UNDEFINED = 1;
|
|
5
|
+
const NULL = 2;
|
|
6
|
+
const BOTH = UNDEFINED | NULL;
|
|
7
|
+
/** The bit a load out of this carrier needs ruled out, or 0 for a carrier with no absence to load past. */
|
|
8
|
+
const neededBitOf = (source) => (source.kind === 'optional' ? (source.absence === 'null' ? NULL : UNDEFINED) : 0);
|
|
9
|
+
/** The absent values a value in this carrier can never be. */
|
|
10
|
+
const excludedByCarrier = (representation) => {
|
|
11
|
+
switch (representation.kind) {
|
|
12
|
+
case 'optional':
|
|
13
|
+
return representation.absence === 'null' ? UNDEFINED : NULL;
|
|
14
|
+
case 'undefined':
|
|
15
|
+
return NULL;
|
|
16
|
+
case 'null':
|
|
17
|
+
return UNDEFINED;
|
|
18
|
+
case 'dynamic':
|
|
19
|
+
return 0;
|
|
20
|
+
case 'borrowed-ref':
|
|
21
|
+
return excludedByCarrier(representation.referent);
|
|
22
|
+
case 'tagged-union': {
|
|
23
|
+
let mask = BOTH;
|
|
24
|
+
for (const arm of representation.arms)
|
|
25
|
+
mask &= excludedByCarrier(arm.value);
|
|
26
|
+
return mask;
|
|
27
|
+
}
|
|
28
|
+
default:
|
|
29
|
+
return BOTH;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Operations that cannot run program code, so a cell another body writes
|
|
34
|
+
* keeps its facts across them. Everything else may call out -- a getter, a
|
|
35
|
+
* coercion's `valueOf`, a generator's resumption -- and drops those facts.
|
|
36
|
+
*/
|
|
37
|
+
const inertKinds = new Set([
|
|
38
|
+
'constant',
|
|
39
|
+
'binding-read',
|
|
40
|
+
'binding-write',
|
|
41
|
+
'parameter',
|
|
42
|
+
'receiver',
|
|
43
|
+
'global-this',
|
|
44
|
+
'phi',
|
|
45
|
+
'test',
|
|
46
|
+
'catch-binding',
|
|
47
|
+
'allocate-ordinary-object',
|
|
48
|
+
'allocate-array-object',
|
|
49
|
+
'allocate-callable',
|
|
50
|
+
'bind-callable',
|
|
51
|
+
'allocate-record',
|
|
52
|
+
'allocate-template-object',
|
|
53
|
+
'allocate-regexp',
|
|
54
|
+
'merge-live-arm-rebuild',
|
|
55
|
+
'iterator-done',
|
|
56
|
+
'jump',
|
|
57
|
+
'branch',
|
|
58
|
+
'switch',
|
|
59
|
+
'return',
|
|
60
|
+
'throw'
|
|
61
|
+
]);
|
|
62
|
+
const runsNoCode = (operation) => inertKinds.has(operation.kind) ||
|
|
63
|
+
(operation.kind === 'compute' &&
|
|
64
|
+
(operation.form === 'typeof' ||
|
|
65
|
+
(operation.form === 'unary' && operation.operator === '!') ||
|
|
66
|
+
((operation.form === 'equality' || operation.form === 'binary') && (operation.operator === '===' || operation.operator === '!=='))));
|
|
67
|
+
const resultOf = (operation) => ('result' in operation && operation.result ? operation.result.id : null);
|
|
68
|
+
/**
|
|
69
|
+
* The value itself and every value it was converted from. A widening or
|
|
70
|
+
* boxing `convert` hands on the SAME value in another carrier, so what is
|
|
71
|
+
* proven of one is proven of the others.
|
|
72
|
+
*/
|
|
73
|
+
const aliasesOf = (definitions, value) => {
|
|
74
|
+
const chain = [value];
|
|
75
|
+
for (let current = definitions.get(value)?.operation; current?.kind === 'convert' && chain.length < 8;) {
|
|
76
|
+
chain.push(current.source.value);
|
|
77
|
+
current = definitions.get(current.source.value)?.operation;
|
|
78
|
+
}
|
|
79
|
+
return chain;
|
|
80
|
+
};
|
|
81
|
+
/** The absent constant a value is, through its conversions, or `null`. */
|
|
82
|
+
const absentConstantOf = (definitions, value) => {
|
|
83
|
+
for (const alias of aliasesOf(definitions, value)) {
|
|
84
|
+
const operation = definitions.get(alias)?.operation;
|
|
85
|
+
if (operation?.kind === 'constant' && (operation.literal === 'undefined' || operation.literal === 'null'))
|
|
86
|
+
return operation.literal;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
};
|
|
90
|
+
/** The absent values `value` can never be: its carrier's own answer, or what the values it merges or converts all rule out. */
|
|
91
|
+
const excludedByValue = (definitions, value, representation, depth = 0) => {
|
|
92
|
+
const own = excludedByCarrier(representation);
|
|
93
|
+
const operation = definitions.get(value)?.operation;
|
|
94
|
+
if (own === BOTH || !operation || depth > 8)
|
|
95
|
+
return own;
|
|
96
|
+
if (operation.kind === 'convert')
|
|
97
|
+
return own | excludedByValue(definitions, operation.source.value, operation.source.representation, depth + 1);
|
|
98
|
+
if (operation.kind === 'phi' && operation.incoming.length > 0)
|
|
99
|
+
return (own |
|
|
100
|
+
operation.incoming.reduce((mask, incoming) => mask & excludedByValue(definitions, incoming.value.value, incoming.value.representation, depth + 1), BOTH));
|
|
101
|
+
return own;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* `a || b` and `a && b` as a branch condition: a two-armed phi one of whose
|
|
105
|
+
* arms is `a` itself, arriving only through one edge of a branch on `a`'s
|
|
106
|
+
* truth, the other arm only through the other. `a || b` is falsy only past
|
|
107
|
+
* `a` falsy and `b` falsy; `a && b` is truthy only past both truthy. The other
|
|
108
|
+
* direction proves nothing. A presence branch (`??`) is not a truth branch and
|
|
109
|
+
* never matches.
|
|
110
|
+
*/
|
|
111
|
+
const logicalFactsWhen = (flow, phiId, polarity, depth) => {
|
|
112
|
+
const definition = flow.definitions.get(phiId);
|
|
113
|
+
const phi = definition?.operation;
|
|
114
|
+
if (!definition || phi?.kind !== 'phi' || phi.incoming.length !== 2)
|
|
115
|
+
return [];
|
|
116
|
+
const join = definition.block;
|
|
117
|
+
for (const [kept, other] of [
|
|
118
|
+
[phi.incoming[0], phi.incoming[1]],
|
|
119
|
+
[phi.incoming[1], phi.incoming[0]]
|
|
120
|
+
])
|
|
121
|
+
for (const guard of aliasesOf(flow.definitions, kept.value.value))
|
|
122
|
+
for (const test of [guard, ...(flow.truthinessTests.get(guard) ?? [])])
|
|
123
|
+
for (const branch of flow.branches.get(test) ?? []) {
|
|
124
|
+
const keptTruthy = flow.arrivesThrough(branch.block, branch.whenTrue, kept.block, join) &&
|
|
125
|
+
flow.arrivesThrough(branch.block, branch.whenFalse, other.block, join);
|
|
126
|
+
const keptFalsy = flow.arrivesThrough(branch.block, branch.whenFalse, kept.block, join) &&
|
|
127
|
+
flow.arrivesThrough(branch.block, branch.whenTrue, other.block, join);
|
|
128
|
+
if (keptTruthy && !polarity)
|
|
129
|
+
return [...factsWhen(flow, test, false, depth + 1), ...factsWhen(flow, other.value.value, false, depth + 1)];
|
|
130
|
+
if (keptFalsy && polarity)
|
|
131
|
+
return [...factsWhen(flow, test, true, depth + 1), ...factsWhen(flow, other.value.value, true, depth + 1)];
|
|
132
|
+
}
|
|
133
|
+
return [];
|
|
134
|
+
};
|
|
135
|
+
/** What a branch on `condition` proves about other values when it goes the `polarity` way. */
|
|
136
|
+
const factsWhen = (flow, condition, polarity, depth = 0) => {
|
|
137
|
+
const operation = flow.definitions.get(condition)?.operation;
|
|
138
|
+
if (!operation || depth > 8)
|
|
139
|
+
return [];
|
|
140
|
+
if (operation.kind === 'phi')
|
|
141
|
+
return logicalFactsWhen(flow, condition, polarity, depth);
|
|
142
|
+
if (operation.kind === 'test') {
|
|
143
|
+
// A truthy value is present; its truth also answers whatever it computed.
|
|
144
|
+
const own = polarity
|
|
145
|
+
? aliasesOf(flow.definitions, operation.value.value).map((subject) => ({
|
|
146
|
+
subject,
|
|
147
|
+
excludes: operation.predicate === 'is-defined' ? UNDEFINED : BOTH
|
|
148
|
+
}))
|
|
149
|
+
: [];
|
|
150
|
+
return operation.predicate === 'to-boolean' ? [...own, ...factsWhen(flow, operation.value.value, polarity, depth + 1)] : own;
|
|
151
|
+
}
|
|
152
|
+
if (operation.kind !== 'compute')
|
|
153
|
+
return [];
|
|
154
|
+
const [left, right] = operation.operands;
|
|
155
|
+
if (operation.form === 'unary' && operation.operator === '!' && left && !right)
|
|
156
|
+
return factsWhen(flow, left.value, !polarity, depth + 1);
|
|
157
|
+
if (operation.form !== 'equality' && operation.form !== 'binary')
|
|
158
|
+
return [];
|
|
159
|
+
if (!left || !right || operation.operands.length !== 2)
|
|
160
|
+
return [];
|
|
161
|
+
const strict = operation.operator === '===' || operation.operator === '!==';
|
|
162
|
+
const negated = operation.operator === '!==' || operation.operator === '!=';
|
|
163
|
+
if (!strict && operation.operator !== '==' && operation.operator !== '!=')
|
|
164
|
+
return [];
|
|
165
|
+
// `x !== c` proves `x` is not `c` when true; `x === c` when false.
|
|
166
|
+
if (polarity !== negated)
|
|
167
|
+
return [];
|
|
168
|
+
const leftAbsence = absentConstantOf(flow.definitions, left.value);
|
|
169
|
+
const rightAbsence = absentConstantOf(flow.definitions, right.value);
|
|
170
|
+
const absence = leftAbsence ?? rightAbsence;
|
|
171
|
+
const subject = leftAbsence ? right : rightAbsence ? left : null;
|
|
172
|
+
if (absence === null || subject === null)
|
|
173
|
+
return [];
|
|
174
|
+
const excludes = strict ? (absence === 'undefined' ? UNDEFINED : NULL) : BOTH;
|
|
175
|
+
return aliasesOf(flow.definitions, subject.value).map((alias) => ({ subject: alias, excludes }));
|
|
176
|
+
};
|
|
177
|
+
const emptyState = () => ({ masks: new Map(), contents: new Map(), truths: new Map() });
|
|
178
|
+
const copyState = (state) => ({
|
|
179
|
+
masks: new Map(state.masks),
|
|
180
|
+
contents: new Map([...state.contents].map(([declaration, values]) => [declaration, new Set(values)])),
|
|
181
|
+
truths: new Map(state.truths)
|
|
182
|
+
});
|
|
183
|
+
const meet = (left, right) => {
|
|
184
|
+
const out = emptyState();
|
|
185
|
+
for (const [declaration, mask] of left.masks) {
|
|
186
|
+
const joined = mask & (right.masks.get(declaration) ?? 0);
|
|
187
|
+
if (joined !== 0)
|
|
188
|
+
out.masks.set(declaration, joined);
|
|
189
|
+
}
|
|
190
|
+
for (const [declaration, values] of left.contents) {
|
|
191
|
+
const other = right.contents.get(declaration);
|
|
192
|
+
const joined = other ? new Set([...values].filter((value) => other.has(value))) : null;
|
|
193
|
+
if (joined && joined.size > 0)
|
|
194
|
+
out.contents.set(declaration, joined);
|
|
195
|
+
}
|
|
196
|
+
for (const [value, truth] of left.truths)
|
|
197
|
+
if (right.truths.get(value) === truth)
|
|
198
|
+
out.truths.set(value, truth);
|
|
199
|
+
return out;
|
|
200
|
+
};
|
|
201
|
+
const sameState = (left, right) => left.masks.size === right.masks.size &&
|
|
202
|
+
[...left.masks].every(([declaration, mask]) => right.masks.get(declaration) === mask) &&
|
|
203
|
+
left.contents.size === right.contents.size &&
|
|
204
|
+
[...left.contents].every(([declaration, values]) => {
|
|
205
|
+
const other = right.contents.get(declaration);
|
|
206
|
+
return other !== undefined && other.size === values.size && [...values].every((value) => other.has(value));
|
|
207
|
+
}) &&
|
|
208
|
+
left.truths.size === right.truths.size &&
|
|
209
|
+
[...left.truths].every(([value, truth]) => right.truths.get(value) === truth);
|
|
210
|
+
/** Every declaration each body writes, so a body can tell which of its cells someone else may change. */
|
|
211
|
+
const writersOf = (bodies) => {
|
|
212
|
+
const writers = new Map();
|
|
213
|
+
for (const body of bodies)
|
|
214
|
+
for (const block of body.blocks.values())
|
|
215
|
+
for (const operation of block.operations) {
|
|
216
|
+
if (operation.kind !== 'binding-write')
|
|
217
|
+
continue;
|
|
218
|
+
const owners = writers.get(operation.declaration) ?? new Set();
|
|
219
|
+
owners.add(body.owner);
|
|
220
|
+
writers.set(operation.declaration, owners);
|
|
221
|
+
}
|
|
222
|
+
return writers;
|
|
223
|
+
};
|
|
224
|
+
const proofsOfBody = (body, writers, proofs) => {
|
|
225
|
+
const definitions = new Map();
|
|
226
|
+
const loads = [];
|
|
227
|
+
for (const block of body.blocks.values())
|
|
228
|
+
allOperationsOf(block).forEach((operation, index) => {
|
|
229
|
+
const result = resultOf(operation);
|
|
230
|
+
if (result !== null)
|
|
231
|
+
definitions.set(result, { operation, block: block.id, index });
|
|
232
|
+
if (operation.kind === 'convert' &&
|
|
233
|
+
neededBitOf(operation.source.representation) !== 0 &&
|
|
234
|
+
operation.result.representation.kind !== 'optional')
|
|
235
|
+
loads.push({ operation, block: block.id });
|
|
236
|
+
});
|
|
237
|
+
if (loads.length === 0)
|
|
238
|
+
return;
|
|
239
|
+
const graph = controlFlowGraphOf(body);
|
|
240
|
+
const dominance = dominatorTreeOf(body);
|
|
241
|
+
const sharedElsewhere = (declaration) => [...(writers.get(declaration) ?? [])].some((owner) => owner !== body.owner);
|
|
242
|
+
const soleEntry = (from, to) => {
|
|
243
|
+
const predecessors = graph.predecessors.get(to) ?? [];
|
|
244
|
+
return predecessors.length === 1 && predecessors[0] === from;
|
|
245
|
+
};
|
|
246
|
+
const branches = new Map();
|
|
247
|
+
const truthinessTests = new Map();
|
|
248
|
+
for (const [id, definition] of definitions)
|
|
249
|
+
if (definition.operation.kind === 'test' && definition.operation.predicate === 'to-boolean') {
|
|
250
|
+
const tested = definition.operation.value.value;
|
|
251
|
+
truthinessTests.set(tested, [...(truthinessTests.get(tested) ?? []), id]);
|
|
252
|
+
}
|
|
253
|
+
for (const block of body.blocks.values()) {
|
|
254
|
+
const terminator = block.terminator;
|
|
255
|
+
if (terminator.kind !== 'branch' || terminator.whenTrue === terminator.whenFalse)
|
|
256
|
+
continue;
|
|
257
|
+
const condition = terminator.condition.value;
|
|
258
|
+
branches.set(condition, [
|
|
259
|
+
...(branches.get(condition) ?? []),
|
|
260
|
+
{ block: block.id, whenTrue: terminator.whenTrue, whenFalse: terminator.whenFalse }
|
|
261
|
+
]);
|
|
262
|
+
}
|
|
263
|
+
const flow = {
|
|
264
|
+
definitions,
|
|
265
|
+
branches,
|
|
266
|
+
truthinessTests,
|
|
267
|
+
arrivesThrough: (from, to, incoming, join) => (incoming === from && to === join) || (soleEntry(from, to) && dominance.dominates(to, incoming))
|
|
268
|
+
};
|
|
269
|
+
// Edge facts: what each branch proves on each of its two edges.
|
|
270
|
+
const edgeFacts = new Map();
|
|
271
|
+
const edgeKey = (from, to) => `${from}->${to}`;
|
|
272
|
+
for (const [condition, sites] of branches)
|
|
273
|
+
for (const site of sites) {
|
|
274
|
+
edgeFacts.set(edgeKey(site.block, site.whenTrue), factsWhen(flow, condition, true));
|
|
275
|
+
edgeFacts.set(edgeKey(site.block, site.whenFalse), factsWhen(flow, condition, false));
|
|
276
|
+
}
|
|
277
|
+
// `guard`: a fact about the loaded value on an edge into a block with no
|
|
278
|
+
// other way in, which dominates the load.
|
|
279
|
+
const guardProves = (value, bit, at) => {
|
|
280
|
+
for (const [key, facts] of edgeFacts) {
|
|
281
|
+
if (!facts.some((fact) => fact.subject === value && (fact.excludes & bit) !== 0))
|
|
282
|
+
continue;
|
|
283
|
+
const [from, to] = key.split('->');
|
|
284
|
+
if (soleEntry(from, to) && dominance.dominates(to, at))
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
return false;
|
|
288
|
+
};
|
|
289
|
+
// `cell`: a forward must-analysis over binding cells. `null` is "not yet
|
|
290
|
+
// reached", the identity of the meet; an unreachable predecessor contributes
|
|
291
|
+
// nothing, so a path the CFG cannot see (an exceptional edge) proves nothing.
|
|
292
|
+
const order = body.blockOrder.filter((id) => dominance.reachable.has(id));
|
|
293
|
+
const entry = body.blockOrder[0];
|
|
294
|
+
const exits = new Map();
|
|
295
|
+
const readMasks = new Map();
|
|
296
|
+
const transfer = (blockId, incoming, record) => {
|
|
297
|
+
const state = copyState(incoming);
|
|
298
|
+
const block = body.blocks.get(blockId);
|
|
299
|
+
if (!block)
|
|
300
|
+
return state;
|
|
301
|
+
for (const operation of allOperationsOf(block)) {
|
|
302
|
+
// A value defined again (a loop's next iteration) is no longer the one
|
|
303
|
+
// any earlier fact was about.
|
|
304
|
+
const result = resultOf(operation);
|
|
305
|
+
if (result !== null) {
|
|
306
|
+
state.truths.delete(result);
|
|
307
|
+
for (const [declaration, values] of state.contents)
|
|
308
|
+
if (values.delete(result) && values.size === 0)
|
|
309
|
+
state.contents.delete(declaration);
|
|
310
|
+
}
|
|
311
|
+
if (operation.kind === 'binding-read') {
|
|
312
|
+
if (record)
|
|
313
|
+
readMasks.set(operation.result.id, state.masks.get(operation.declaration) ?? 0);
|
|
314
|
+
const values = state.contents.get(operation.declaration) ?? new Set();
|
|
315
|
+
values.add(operation.result.id);
|
|
316
|
+
state.contents.set(operation.declaration, values);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (operation.kind === 'binding-write') {
|
|
320
|
+
const mask = excludedByValue(definitions, operation.value.value, operation.value.representation);
|
|
321
|
+
if (mask === 0)
|
|
322
|
+
state.masks.delete(operation.declaration);
|
|
323
|
+
else
|
|
324
|
+
state.masks.set(operation.declaration, mask);
|
|
325
|
+
state.contents.set(operation.declaration, new Set(aliasesOf(definitions, operation.value.value)));
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (!runsNoCode(operation))
|
|
329
|
+
for (const declaration of new Set([...state.masks.keys(), ...state.contents.keys()]))
|
|
330
|
+
if (sharedElsewhere(declaration)) {
|
|
331
|
+
state.masks.delete(declaration);
|
|
332
|
+
state.contents.delete(declaration);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return state;
|
|
336
|
+
};
|
|
337
|
+
const factsMemo = new Map();
|
|
338
|
+
const factsOf = (condition, polarity) => {
|
|
339
|
+
const key = `${condition}|${polarity}`;
|
|
340
|
+
const known = factsMemo.get(key);
|
|
341
|
+
if (known)
|
|
342
|
+
return known;
|
|
343
|
+
const facts = factsWhen(flow, condition, polarity);
|
|
344
|
+
factsMemo.set(key, facts);
|
|
345
|
+
return facts;
|
|
346
|
+
};
|
|
347
|
+
// Past a branch, a fact about a value a cell still holds -- read from it,
|
|
348
|
+
// or just written into it, as `if (m = re.exec(s))` does -- is a fact about
|
|
349
|
+
// the cell.
|
|
350
|
+
const refine = (state, condition, polarity) => {
|
|
351
|
+
for (const fact of factsOf(condition, polarity))
|
|
352
|
+
for (const [declaration, values] of state.contents)
|
|
353
|
+
if (values.has(fact.subject))
|
|
354
|
+
state.masks.set(declaration, (state.masks.get(declaration) ?? 0) | fact.excludes);
|
|
355
|
+
for (const alias of aliasesOf(definitions, condition))
|
|
356
|
+
state.truths.set(alias, polarity);
|
|
357
|
+
return state;
|
|
358
|
+
};
|
|
359
|
+
const entering = (blockId) => {
|
|
360
|
+
if (blockId === entry)
|
|
361
|
+
return emptyState();
|
|
362
|
+
let state = null;
|
|
363
|
+
for (const predecessor of graph.predecessors.get(blockId) ?? []) {
|
|
364
|
+
if (!dominance.reachable.has(predecessor))
|
|
365
|
+
return emptyState();
|
|
366
|
+
const exit = exits.get(edgeKey(predecessor, blockId));
|
|
367
|
+
if (!exit)
|
|
368
|
+
continue;
|
|
369
|
+
state = state === null ? exit : meet(state, exit);
|
|
370
|
+
}
|
|
371
|
+
return state;
|
|
372
|
+
};
|
|
373
|
+
/**
|
|
374
|
+
* The state on `from -> to`. A branch on a phi merged in `from` itself --
|
|
375
|
+
* `a || b`, `a && b` -- is threaded: each incoming path is refined by what
|
|
376
|
+
* its own arm's truth proves, a path whose arm cannot have that truth is
|
|
377
|
+
* dropped, and only then are the paths met. `a === undefined || b ===
|
|
378
|
+
* undefined` falsy proves `b` only along the path that evaluated `b`.
|
|
379
|
+
*/
|
|
380
|
+
const exitOf = (from, to, state) => {
|
|
381
|
+
const terminator = body.blocks.get(from)?.terminator;
|
|
382
|
+
if (terminator?.kind !== 'branch' || terminator.whenTrue === terminator.whenFalse)
|
|
383
|
+
return state;
|
|
384
|
+
const polarity = to === terminator.whenTrue;
|
|
385
|
+
const condition = terminator.condition.value;
|
|
386
|
+
const merged = definitions.get(condition);
|
|
387
|
+
const predecessors = graph.predecessors.get(from) ?? [];
|
|
388
|
+
if (merged?.block === from &&
|
|
389
|
+
merged.operation.kind === 'phi' &&
|
|
390
|
+
predecessors.length === merged.operation.incoming.length &&
|
|
391
|
+
merged.operation.incoming.every((arm) => predecessors.includes(arm.block))) {
|
|
392
|
+
let threaded = null;
|
|
393
|
+
for (const arm of merged.operation.incoming) {
|
|
394
|
+
const reaching = dominance.reachable.has(arm.block) ? exits.get(edgeKey(arm.block, from)) : emptyState();
|
|
395
|
+
if (!reaching)
|
|
396
|
+
continue;
|
|
397
|
+
const armState = transfer(from, reaching, false);
|
|
398
|
+
const arms = aliasesOf(definitions, arm.value.value);
|
|
399
|
+
if (arms.some((value) => armState.truths.get(value) === !polarity))
|
|
400
|
+
continue;
|
|
401
|
+
refine(armState, arm.value.value, polarity);
|
|
402
|
+
threaded = threaded === null ? armState : meet(threaded, armState);
|
|
403
|
+
}
|
|
404
|
+
return threaded === null ? null : refine(threaded, condition, polarity);
|
|
405
|
+
}
|
|
406
|
+
return refine(copyState(state), condition, polarity);
|
|
407
|
+
};
|
|
408
|
+
const publishExits = (blockId, state) => {
|
|
409
|
+
let changed = false;
|
|
410
|
+
for (const successor of graph.successors.get(blockId) ?? []) {
|
|
411
|
+
const exit = exitOf(blockId, successor, state);
|
|
412
|
+
if (exit === null)
|
|
413
|
+
continue;
|
|
414
|
+
const key = edgeKey(blockId, successor);
|
|
415
|
+
const known = exits.get(key);
|
|
416
|
+
if (known && sameState(known, exit))
|
|
417
|
+
continue;
|
|
418
|
+
exits.set(key, exit);
|
|
419
|
+
changed = true;
|
|
420
|
+
}
|
|
421
|
+
return changed;
|
|
422
|
+
};
|
|
423
|
+
let settled = false;
|
|
424
|
+
for (let round = 0; !settled && round < 64; round++) {
|
|
425
|
+
settled = true;
|
|
426
|
+
for (const blockId of order) {
|
|
427
|
+
const incoming = entering(blockId);
|
|
428
|
+
if (incoming === null)
|
|
429
|
+
continue;
|
|
430
|
+
if (publishExits(blockId, transfer(blockId, incoming, false)))
|
|
431
|
+
settled = false;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// An unsettled must-analysis is still optimistic somewhere: it proves nothing.
|
|
435
|
+
if (settled)
|
|
436
|
+
for (const blockId of order) {
|
|
437
|
+
const incoming = entering(blockId);
|
|
438
|
+
if (incoming !== null)
|
|
439
|
+
transfer(blockId, incoming, true);
|
|
440
|
+
}
|
|
441
|
+
for (const { operation, block } of loads) {
|
|
442
|
+
const bit = neededBitOf(operation.source.representation);
|
|
443
|
+
const sources = aliasesOf(definitions, operation.source.value);
|
|
444
|
+
if (sources.some((source) => guardProves(source, bit, block)))
|
|
445
|
+
proofs.set(operation.result.id, 'guard');
|
|
446
|
+
else if (sources.some((source) => definitions.get(source)?.operation.kind === 'binding-read' && ((readMasks.get(source) ?? 0) & bit) !== 0))
|
|
447
|
+
proofs.set(operation.result.id, 'cell');
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
/** The proof, if any, behind every present-optional load in `bodies`, keyed by the load's result. */
|
|
451
|
+
export const presenceProofsOf = (bodies) => {
|
|
452
|
+
const all = [...bodies];
|
|
453
|
+
const writers = writersOf(all);
|
|
454
|
+
const proofs = new Map();
|
|
455
|
+
for (const body of all)
|
|
456
|
+
proofsOfBody(body, writers, proofs);
|
|
457
|
+
return proofs;
|
|
458
|
+
};
|
|
459
|
+
/**
|
|
460
|
+
* `bodies` with every unchecked load no proof reaches marked
|
|
461
|
+
* `presence: 'checked'`. Which conversions read a payload without testing its
|
|
462
|
+
* flag is the target's fact, not this module's -- `readsUnchecked` asks the
|
|
463
|
+
* conversion census that installed them.
|
|
464
|
+
*/
|
|
465
|
+
export const withPresenceChecks = (bodies, readsUnchecked) => {
|
|
466
|
+
const proofs = presenceProofsOf(bodies.values());
|
|
467
|
+
const checked = new Map();
|
|
468
|
+
for (const [key, body] of bodies) {
|
|
469
|
+
let changed = false;
|
|
470
|
+
const blocks = new Map();
|
|
471
|
+
for (const [id, block] of body.blocks) {
|
|
472
|
+
let blockChanged = false;
|
|
473
|
+
const operations = block.operations.map((operation) => {
|
|
474
|
+
if (operation.kind !== 'convert' ||
|
|
475
|
+
operation.presence !== undefined ||
|
|
476
|
+
operation.source.representation.kind !== 'optional' ||
|
|
477
|
+
proofs.has(operation.result.id) ||
|
|
478
|
+
!readsUnchecked(operation))
|
|
479
|
+
return operation;
|
|
480
|
+
blockChanged = true;
|
|
481
|
+
return { ...operation, presence: 'checked' };
|
|
482
|
+
});
|
|
483
|
+
blocks.set(id, blockChanged ? { ...block, operations } : block);
|
|
484
|
+
if (blockChanged)
|
|
485
|
+
changed = true;
|
|
486
|
+
}
|
|
487
|
+
checked.set(key, changed ? { ...body, blocks } : body);
|
|
488
|
+
}
|
|
489
|
+
return checked;
|
|
490
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { DeclarationId, FunctionId, IrValueId, RegionId } from '../identity/ids.js';
|
|
2
|
+
import type { BindingPlacement } from '../projection/bindings.js';
|
|
3
|
+
import { type PlainFieldRead } from './borrow-effects.js';
|
|
4
|
+
import { type CallableIdentityDemand } from './callable-identity-demand.js';
|
|
5
|
+
import { type IrBody } from './model.js';
|
|
6
|
+
/**
|
|
7
|
+
* Whole-program indices a translation unit needs before any of its bodies are
|
|
8
|
+
* rendered: which module-level cells route their call by name, which
|
|
9
|
+
* constructor cells this unit constructs repeatedly, which arguments die into
|
|
10
|
+
* their callee, and which formal parameters may be declared `const&` rather
|
|
11
|
+
* than copied.
|
|
12
|
+
*
|
|
13
|
+
* These used to run inline at the top of `targets/cpp/translation-unit.ts`'s
|
|
14
|
+
* `renderTranslationUnit` (a whole-program index, so it belongs to the IR
|
|
15
|
+
* rather than the target). Nothing here is about C++ text: every one of these
|
|
16
|
+
* questions is answered by walking the lowered IR of every body in the unit,
|
|
17
|
+
* the same way `ir/facts.ts` answers the PER-body questions that used to live
|
|
18
|
+
* beside them in `targets/cpp/emit.ts`. What stays with the target is
|
|
19
|
+
* `targets/cpp/captures.ts`'s `buildCaptureIndex`/`buildDirectCallableIndex`:
|
|
20
|
+
* the first is blocked on `CallOperation.target` (Phase 3, not yet moved),
|
|
21
|
+
* and the second's admission genuinely depends on comparing two carriers'
|
|
22
|
+
* C++ SPELLING (`cppTypeOf`), which is a target decision, not a program one.
|
|
23
|
+
* Both are computed by the caller and handed in.
|
|
24
|
+
*/
|
|
25
|
+
export interface ProgramFacts {
|
|
26
|
+
/** Module-level function cells a call may spell by name, keyed by the receiver-shape/key slot `callableMemberSlot` names. */
|
|
27
|
+
readonly callableMemberCandidates: ReadonlyMap<string, FunctionId>;
|
|
28
|
+
/** Constructor cells this unit constructs through repeatedly, and the class each names. */
|
|
29
|
+
readonly repeatedConstructors: ReadonlyMap<DeclarationId, DeclarationId>;
|
|
30
|
+
/** Argument reads whose value has no use after the call it feeds, so the printer may spell them `std::move(...)`. */
|
|
31
|
+
readonly dyingArguments: ReadonlySet<IrValueId>;
|
|
32
|
+
/** Which parameter positions this body may declare `const T&` instead of `T`. */
|
|
33
|
+
readonly formalsBorrowedIn: (owner: FunctionId | RegionId) => ReadonlySet<number>;
|
|
34
|
+
/**
|
|
35
|
+
* Whether this body calls a callee this program CAN name and has NOT proven
|
|
36
|
+
* effect-free -- as opposed to a callee reached only through an opaque value
|
|
37
|
+
* (a callback parameter), which no whole-program analysis can ever resolve.
|
|
38
|
+
*
|
|
39
|
+
* `ir/borrowed-call-arguments.ts`'s `readonlyBorrowFormalsOf` proves
|
|
40
|
+
* a formal read-only from LOCAL evidence alone (its own cell is never
|
|
41
|
+
* rewritten) and relies on the CALLER supplying a stable actual
|
|
42
|
+
* (`stableBorrowEntryAccepts`) to rule out external mutation. That call-site
|
|
43
|
+
* proof is sound against a truly UNKNOWN callee -- nothing this compiler
|
|
44
|
+
* could learn about it would change what the caller must guarantee -- but it
|
|
45
|
+
* is NOT sound against a KNOWN, in-program callee this compiler already
|
|
46
|
+
* knows is unsafe: `function snapshot(text: string, holder: Holder) {
|
|
47
|
+
* middle(holder); return text }` reaches, through `middle`, a `mutate` that
|
|
48
|
+
* writes `holder.text` -- a field of holder, which is THIS body's OWN other
|
|
49
|
+
* parameter -- and the read-only proof has no way to see that, because it
|
|
50
|
+
* never looks at 'call' operations at all. `borrowEffectsOf`'s `targets` map
|
|
51
|
+
* already resolves such calls to a known `FunctionId`, and its `operations`
|
|
52
|
+
* map already answers whether that particular call was ever proven safe
|
|
53
|
+
* (present in the callee-safe set at the fixed point's end) -- this fact is
|
|
54
|
+
* just that same answer, indexed by owner, so a target-side entry point
|
|
55
|
+
* builder can refuse to treat a read-only formal as borrowable whenever its
|
|
56
|
+
* body still has an unresolved known call in it. An opaque call (no `target`
|
|
57
|
+
* resolves) never sets this: it is the caller-stability proof's job alone.
|
|
58
|
+
*/
|
|
59
|
+
readonly bodyCallsUnsafeKnownCallee: (owner: FunctionId | RegionId) => boolean;
|
|
60
|
+
/** Which callable allocations must mint their function-object identity up front -- see `callable-identity-demand.ts`. */
|
|
61
|
+
readonly callableIdentityDemand: CallableIdentityDemand;
|
|
62
|
+
/** Whether any operation can freeze, seal or redefine a native object's properties -- see `ir/integrity-restrictions.ts`. */
|
|
63
|
+
readonly nativeIntegrityRestricted: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Whether every generated struct's required-field presence bits and
|
|
66
|
+
* attribute triples are program-wide constants: nothing can freeze, seal
|
|
67
|
+
* or redefine (`nativeIntegrityRestricted`) and nothing can delete a
|
|
68
|
+
* declared field (`fixedFieldDeletionsOf`). `records.ts` then states them
|
|
69
|
+
* once per struct instead of once per instance, and a field store skips
|
|
70
|
+
* the presence byte it would otherwise re-set.
|
|
71
|
+
*/
|
|
72
|
+
readonly fixedFieldStateConstant: boolean;
|
|
73
|
+
/** The classes evaluated exactly once, whose method state a struct may hold statically -- see `ir/class-evaluation.ts`. */
|
|
74
|
+
readonly singleEvaluationClasses: ReadonlySet<DeclarationId>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The target's own decisions this census needs mid-order, none of them
|
|
78
|
+
* answerable from the IR alone:
|
|
79
|
+
*
|
|
80
|
+
* - `captureFree`/`isBoxed` come from `targets/cpp/captures.ts`'s whole-unit
|
|
81
|
+
* capture index, which stays in the target (see `ProgramFacts`'s doc).
|
|
82
|
+
* - `isCoroutineBody` is a rendering fact -- whether this backend spells the
|
|
83
|
+
* body's `yield` as `co_yield`, which is what makes a function a C++20
|
|
84
|
+
* coroutine -- not a property the IR states about itself.
|
|
85
|
+
* - `isPrivateLocal` is the binding-placement plan's answer to "does this
|
|
86
|
+
* declaration's storage belong only to this body", which the borrow-effect
|
|
87
|
+
* proof needs to admit a local write as safe.
|
|
88
|
+
*/
|
|
89
|
+
export interface ProgramFactsPolicy {
|
|
90
|
+
readonly captureFree: (functionId: FunctionId) => boolean;
|
|
91
|
+
readonly isBoxed: (declaration: DeclarationId) => boolean;
|
|
92
|
+
readonly isCoroutineBody: (body: IrBody) => boolean;
|
|
93
|
+
readonly isPrivateLocal: (body: IrBody, declaration: DeclarationId) => boolean;
|
|
94
|
+
/** The instance carrier a class lays out, or `null` for one with no native layout -- the class table is the target's. */
|
|
95
|
+
readonly classInstanceOf: (declaration: DeclarationId) => import('../representation/model.js').Representation | null;
|
|
96
|
+
/** Whether `receiver.key` is a plain data-field load -- see `borrow-effects.ts`'s `PlainFieldRead`. */
|
|
97
|
+
readonly plainFieldRead: PlainFieldRead;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Everything a translation unit needs to know about the whole program before
|
|
101
|
+
* it renders a body, in the one dependency order these questions actually
|
|
102
|
+
* have: a callable must be named before repeated construction through it can
|
|
103
|
+
* be counted, and both must exist before the borrow fixed point can ask which
|
|
104
|
+
* calls forward an already-borrowed argument unchanged.
|
|
105
|
+
*/
|
|
106
|
+
export declare const programFactsOf: (bodies: readonly IrBody[], directCallables: ReadonlyMap<DeclarationId, FunctionId>, placements: ReadonlyMap<DeclarationId, BindingPlacement>, policy: ProgramFactsPolicy) => ProgramFacts;
|