@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,55 @@
|
|
|
1
|
+
import type { IrValueId } from '../identity/ids.js';
|
|
2
|
+
import type { IrBlockId, IrBody, IrNonTerminatorOperation } from './model.js';
|
|
3
|
+
/**
|
|
4
|
+
* Loop-invariant operations, and the block each one moves to.
|
|
5
|
+
*
|
|
6
|
+
* `c[i * N + j] += a[i][k] * b[k][j]` recomputes `a[i][k]`, `b[k]` and `i * N`
|
|
7
|
+
* on every turn of the `j` loop, and no C++ compiler will move them out: an
|
|
8
|
+
* element read goes through a handle, and a store through another handle may
|
|
9
|
+
* alias it as far as the optimizer can prove, so the loads have to be repeated.
|
|
10
|
+
* The compiler that DOES know they are invariant is this one -- the index
|
|
11
|
+
* expressions name loop variables it can see are not written in the inner loop
|
|
12
|
+
* -- and hoisting them is what lets clang see a straight-line inner loop it can
|
|
13
|
+
* then vectorize.
|
|
14
|
+
*
|
|
15
|
+
* Two conditions make the move observationally neutral, and both are checked
|
|
16
|
+
* rather than assumed:
|
|
17
|
+
*
|
|
18
|
+
* - **The loop runs at least once.** Moving a load into the preheader runs
|
|
19
|
+
* it even when the body never would, and a load that would not have
|
|
20
|
+
* happened can fault. Only a loop whose counter starts at a known constant
|
|
21
|
+
* below a known constant bound is hoisted out of.
|
|
22
|
+
* - **The operation runs on every iteration.** Its block has to dominate
|
|
23
|
+
* every back edge, or the move turns a conditional load into an
|
|
24
|
+
* unconditional one -- the same fault, one level in.
|
|
25
|
+
*
|
|
26
|
+
* Only operations that read: arithmetic, a cell whose loop writes nothing, and
|
|
27
|
+
* an Array element load, or native immutable-string length/method reads. Never
|
|
28
|
+
* a call, a store, a construction, or a property access that could reach an
|
|
29
|
+
* accessor. Strings need no array-storage alias proof: their values are immutable.
|
|
30
|
+
*/
|
|
31
|
+
export interface HoistPlan {
|
|
32
|
+
/** Operations to render at the head of a block, in dependency order. */
|
|
33
|
+
readonly into: ReadonlyMap<IrBlockId, readonly IrNonTerminatorOperation[]>;
|
|
34
|
+
/** The results of every relocated operation, so its original block skips it. */
|
|
35
|
+
readonly relocated: ReadonlySet<IrValueId>;
|
|
36
|
+
}
|
|
37
|
+
export declare const emptyHoistPlan: HoistPlan;
|
|
38
|
+
export declare const loopInvariantHoistsOf: (body: IrBody) => HoistPlan;
|
|
39
|
+
/**
|
|
40
|
+
* The values a loop cannot change: what clang's licm would lift, stated here.
|
|
41
|
+
*
|
|
42
|
+
* A value defined where no loop re-enters is invariant by position. Inside a
|
|
43
|
+
* loop it still is when nothing the loop does can move it: a constant, a formal,
|
|
44
|
+
* a read of a cell no cyclic block writes, or arithmetic over those. Everything
|
|
45
|
+
* else -- a merge, a call, a load through a receiver -- is not, and is refused
|
|
46
|
+
* rather than guessed at, because the caller's transform is only free for a
|
|
47
|
+
* value that is genuinely computed once.
|
|
48
|
+
*
|
|
49
|
+
* This distinction is the whole difference between restating a loop's BOUND and
|
|
50
|
+
* restating the quantity it is compared against: `x * x + y * y <= 4` in
|
|
51
|
+
* `mandelbrot.ts` reads two cells the loop writes every iteration, and turning
|
|
52
|
+
* its left side into an integer bound cost 13% of that fixture before this
|
|
53
|
+
* existed.
|
|
54
|
+
*/
|
|
55
|
+
export declare const loopInvariantValuesOf: (body: IrBody) => ReadonlySet<IrValueId>;
|
package/dist/ir/hoist.js
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { controlFlowGraphOf, cyclicBlocksOf, dominatorTreeOf, naturalLoopsOf } from './dominance.js';
|
|
2
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
3
|
+
export const emptyHoistPlan = { into: new Map(), relocated: new Set() };
|
|
4
|
+
/** The operators whose C++ spelling reads nothing and traps on nothing. */
|
|
5
|
+
const pureOperators = new Set([
|
|
6
|
+
'+',
|
|
7
|
+
'-',
|
|
8
|
+
'*',
|
|
9
|
+
'/',
|
|
10
|
+
'<',
|
|
11
|
+
'>',
|
|
12
|
+
'<=',
|
|
13
|
+
'>=',
|
|
14
|
+
'===',
|
|
15
|
+
'!==',
|
|
16
|
+
'==',
|
|
17
|
+
'!=',
|
|
18
|
+
'&',
|
|
19
|
+
'|',
|
|
20
|
+
'^',
|
|
21
|
+
'<<',
|
|
22
|
+
'>>',
|
|
23
|
+
'>>>',
|
|
24
|
+
'~',
|
|
25
|
+
'++',
|
|
26
|
+
'--',
|
|
27
|
+
// `%` traps on nothing: a narrowed one only ever reaches
|
|
28
|
+
// `gea::integerRemainder` with a non-zero CONSTANT divisor (the integer
|
|
29
|
+
// census admits no other), and an unnarrowed one is a double `fmod`.
|
|
30
|
+
'%'
|
|
31
|
+
]);
|
|
32
|
+
/**
|
|
33
|
+
* The operation kinds that cannot change what an array answers.
|
|
34
|
+
*
|
|
35
|
+
* Deliberately a whitelist: a kind absent here blocks the move, so a kind
|
|
36
|
+
* added to the IR later is fail-closed rather than silently admitted. `set`,
|
|
37
|
+
* `convert` and every allocation are out on purpose -- a store writes array
|
|
38
|
+
* storage, and a conversion of an unknown value can reach user code.
|
|
39
|
+
*/
|
|
40
|
+
const storageNeutralKinds = new Set([
|
|
41
|
+
'constant',
|
|
42
|
+
'compute',
|
|
43
|
+
'binding-read',
|
|
44
|
+
'binding-write',
|
|
45
|
+
'parameter',
|
|
46
|
+
'receiver',
|
|
47
|
+
'get'
|
|
48
|
+
]);
|
|
49
|
+
export const loopInvariantHoistsOf = (body) => {
|
|
50
|
+
// A try region renders as one `try { } catch { }` chunk assembled from
|
|
51
|
+
// several blocks at once, so a relocation into or out of one has no single
|
|
52
|
+
// place to land. Bodies with a region are left alone entirely.
|
|
53
|
+
if (body.tryRegions.length > 0 || (body.iteratorCloseRegions?.length ?? 0) > 0)
|
|
54
|
+
return emptyHoistPlan;
|
|
55
|
+
const graph = controlFlowGraphOf(body);
|
|
56
|
+
const dominance = dominatorTreeOf(body);
|
|
57
|
+
const loops = naturalLoopsOf(graph, dominance);
|
|
58
|
+
if (loops.length === 0)
|
|
59
|
+
return emptyHoistPlan;
|
|
60
|
+
const constants = new Map();
|
|
61
|
+
const constantTexts = new Map();
|
|
62
|
+
const cellWrites = new Map();
|
|
63
|
+
const readsCell = new Map();
|
|
64
|
+
const location = new Map();
|
|
65
|
+
const operationOf = new Map();
|
|
66
|
+
const conditionOf = new Map();
|
|
67
|
+
for (const blockId of body.blockOrder) {
|
|
68
|
+
const block = body.blocks.get(blockId);
|
|
69
|
+
if (!block)
|
|
70
|
+
continue;
|
|
71
|
+
if (block.terminator.kind === 'branch')
|
|
72
|
+
conditionOf.set(blockId, block.terminator.condition.value);
|
|
73
|
+
for (const operation of block.operations) {
|
|
74
|
+
const result = 'result' in operation ? operation.result : null;
|
|
75
|
+
if (result) {
|
|
76
|
+
location.set(result.id, blockId);
|
|
77
|
+
operationOf.set(result.id, operation);
|
|
78
|
+
}
|
|
79
|
+
if (operation.kind === 'constant')
|
|
80
|
+
constantTexts.set(operation.result.id, operation.text);
|
|
81
|
+
if (operation.kind === 'constant' && operation.literal === 'number') {
|
|
82
|
+
const value = Number(operation.text);
|
|
83
|
+
if (Number.isFinite(value))
|
|
84
|
+
constants.set(operation.result.id, value);
|
|
85
|
+
}
|
|
86
|
+
if (operation.kind === 'binding-read')
|
|
87
|
+
readsCell.set(operation.result.id, operation.declaration);
|
|
88
|
+
if (operation.kind === 'binding-write') {
|
|
89
|
+
const written = cellWrites.get(operation.declaration) ?? [];
|
|
90
|
+
written.push({ value: operation.value, block: blockId });
|
|
91
|
+
cellWrites.set(operation.declaration, written);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Local closure allocation can expose bindings to writes in another body.
|
|
96
|
+
// IR allocation operands alone do not carry the emitter's complete capture
|
|
97
|
+
// layout. Until that proof is published here, keep local reads in place in
|
|
98
|
+
// bodies that create closures/constructors; SSA parameters remain eligible.
|
|
99
|
+
const mayCaptureLocals = [...operationOf.values()].some((operation) => operation.kind === 'allocate-callable' || operation.kind === 'allocate-constructor');
|
|
100
|
+
/** The number this value always holds, through at most one single-assignment cell. */
|
|
101
|
+
const knownNumber = (value) => {
|
|
102
|
+
const literal = constants.get(value);
|
|
103
|
+
if (literal !== undefined)
|
|
104
|
+
return literal;
|
|
105
|
+
const cell = readsCell.get(value);
|
|
106
|
+
if (cell === undefined)
|
|
107
|
+
return null;
|
|
108
|
+
const written = cellWrites.get(cell) ?? [];
|
|
109
|
+
const only = written.length === 1 ? written[0] : undefined;
|
|
110
|
+
return only ? (constants.get(only.value.value) ?? null) : null;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Whether this loop's first test is known to pass.
|
|
114
|
+
*
|
|
115
|
+
* The counter's seed and the bound both have to be constants, and the seed
|
|
116
|
+
* has to satisfy the test. Anything less is a loop that might run zero times,
|
|
117
|
+
* and its preheader is not a place a load may be moved to.
|
|
118
|
+
*/
|
|
119
|
+
const entersAtLeastOnce = (header, blocks) => {
|
|
120
|
+
const condition = conditionOf.get(header);
|
|
121
|
+
if (condition === undefined)
|
|
122
|
+
return false;
|
|
123
|
+
const test = operationOf.get(condition);
|
|
124
|
+
if (test?.kind !== 'compute' || test.form !== 'binary')
|
|
125
|
+
return false;
|
|
126
|
+
const ascending = test.operator === '<' || test.operator === '<=';
|
|
127
|
+
const descending = test.operator === '>' || test.operator === '>=';
|
|
128
|
+
if (!ascending && !descending)
|
|
129
|
+
return false;
|
|
130
|
+
const [left, right] = test.operands;
|
|
131
|
+
if (!left || !right)
|
|
132
|
+
return false;
|
|
133
|
+
const bound = knownNumber(right.value);
|
|
134
|
+
if (bound === null)
|
|
135
|
+
return false;
|
|
136
|
+
const counter = readsCell.get(left.value);
|
|
137
|
+
if (counter === undefined)
|
|
138
|
+
return false;
|
|
139
|
+
// Every write outside the loop is a seed; each one has to be a constant
|
|
140
|
+
// that passes the test, because any of them could be the value the loop
|
|
141
|
+
// starts from.
|
|
142
|
+
const seeds = (cellWrites.get(counter) ?? []).filter((write) => !blocks.has(write.block));
|
|
143
|
+
if (seeds.length === 0)
|
|
144
|
+
return false;
|
|
145
|
+
return seeds.every((seed) => {
|
|
146
|
+
const start = constants.get(seed.value.value);
|
|
147
|
+
if (start === undefined)
|
|
148
|
+
return false;
|
|
149
|
+
if (test.operator === '<')
|
|
150
|
+
return start < bound;
|
|
151
|
+
if (test.operator === '<=')
|
|
152
|
+
return start <= bound;
|
|
153
|
+
if (test.operator === '>')
|
|
154
|
+
return start > bound;
|
|
155
|
+
return start >= bound;
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
/** The single entry into this loop from outside it. */
|
|
159
|
+
const preheaderOf = (header, blocks) => {
|
|
160
|
+
const outside = (graph.predecessors.get(header) ?? []).filter((predecessor) => !blocks.has(predecessor));
|
|
161
|
+
return outside.length === 1 ? (outside[0] ?? null) : null;
|
|
162
|
+
};
|
|
163
|
+
const dominatesEveryLatch = (blockId, header, blocks, tree) => (graph.predecessors.get(header) ?? []).every((latch) => !blocks.has(latch) || tree.dominates(blockId, latch));
|
|
164
|
+
/**
|
|
165
|
+
* Whether running this operation where it never would have run can fault.
|
|
166
|
+
*
|
|
167
|
+
* Only an element LOAD can: its index is a value the loop computed, and off
|
|
168
|
+
* the end of the storage is a read of memory the array does not own. A
|
|
169
|
+
* `length` read, a cell read and arithmetic all answer from something that
|
|
170
|
+
* already exists, so running one an extra time costs a few instructions and
|
|
171
|
+
* changes nothing -- which is what lets them leave a loop whose trip count is
|
|
172
|
+
* a parameter nobody can bound. Those loops are most of them: `for (let i =
|
|
173
|
+
* 0; i < iterations; i++)` is the shape of every fixture's outer loop, and
|
|
174
|
+
* requiring the entry proof for a `ring.length` read left it inside.
|
|
175
|
+
*/
|
|
176
|
+
const immutableStringRead = (operation) => operation.kind === 'get' &&
|
|
177
|
+
operation.receiver.representation.kind === 'string' &&
|
|
178
|
+
['length', 'charCodeAt'].includes(constantTexts.get(operation.key.value) ?? '');
|
|
179
|
+
const mayFault = (operation) => operation.kind === 'get' && !immutableStringRead(operation) && constantTexts.get(operation.key.value) !== 'length';
|
|
180
|
+
/**
|
|
181
|
+
* Whether anything inside this loop can change what an array answers.
|
|
182
|
+
*
|
|
183
|
+
* A `get` on an `array-object` is invariant only while its STORAGE is, and the
|
|
184
|
+
* operand check below proves something strictly weaker: that the HANDLE is
|
|
185
|
+
* defined outside the loop. `wanted.length` in
|
|
186
|
+
*
|
|
187
|
+
* while (wanted.length > 0) { ...; wanted.splice(best, 1) }
|
|
188
|
+
*
|
|
189
|
+
* passes the operand check -- it is the same array every turn -- and hoisting
|
|
190
|
+
* it froze the loop's own condition at the value it had before the loop began.
|
|
191
|
+
* Measured on `examples/apps/maps`: the `while`'s test AND the inner
|
|
192
|
+
* `for (j = 1; j < wanted.length; j++)` bound were both computed once in the
|
|
193
|
+
* preheader, and the app aborted on its first frame reading `grid[11]` of an
|
|
194
|
+
* eleven-element array.
|
|
195
|
+
*
|
|
196
|
+
* So the storage has to be proved unmodified, and what proves it here is a
|
|
197
|
+
* body that writes no array at all: `push`/`splice`/`pop` are CALLS, and a
|
|
198
|
+
* call may reach any array the program can name -- including one this loop
|
|
199
|
+
* never spells, which is why the check is not narrowed to the receiver. The
|
|
200
|
+
* cost is that a loop which stores into one array no longer hoists a load out
|
|
201
|
+
* of another; regaining that needs an alias proof (distinct allocation sites),
|
|
202
|
+
* not a weaker invariance test.
|
|
203
|
+
*/
|
|
204
|
+
const mutatesArrayStorage = (blocks) => {
|
|
205
|
+
for (const blockId of blocks) {
|
|
206
|
+
const block = body.blocks.get(blockId);
|
|
207
|
+
if (!block)
|
|
208
|
+
continue;
|
|
209
|
+
for (const operation of block.operations) {
|
|
210
|
+
if (!storageNeutralKinds.has(operation.kind))
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return false;
|
|
215
|
+
};
|
|
216
|
+
/** Answered once per loop: the walk is over every operation the loop owns. */
|
|
217
|
+
const arrayStorageMutated = new Map();
|
|
218
|
+
const relocated = new Set();
|
|
219
|
+
const into = new Map();
|
|
220
|
+
/** Whether this operation reads only, and reads only things that cannot move. */
|
|
221
|
+
const isPureRead = (operation, blocks) => {
|
|
222
|
+
if (operation.kind === 'constant')
|
|
223
|
+
return true;
|
|
224
|
+
if (operation.kind === 'compute') {
|
|
225
|
+
if (!pureOperators.has(operation.operator))
|
|
226
|
+
return false;
|
|
227
|
+
// Only a non-zero constant divisor: a narrowed `%` becomes an integer
|
|
228
|
+
// division, and moving one whose divisor could be zero would move a trap.
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
if (operation.kind === 'binding-read') {
|
|
232
|
+
if (mayCaptureLocals)
|
|
233
|
+
return false;
|
|
234
|
+
// Invariant only while the loop writes the cell nowhere.
|
|
235
|
+
return (cellWrites.get(operation.declaration) ?? []).every((write) => !blocks.has(write.block));
|
|
236
|
+
}
|
|
237
|
+
if (operation.kind === 'get') {
|
|
238
|
+
// Array elements and immutable string builtins: a record or class receiver can
|
|
239
|
+
// reach an accessor, which is a call, and a call is not something this
|
|
240
|
+
// may run an extra time or in a different order.
|
|
241
|
+
return operation.receiver.representation.kind === 'array-object' || immutableStringRead(operation);
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
};
|
|
245
|
+
const operandsOf = (operation) => {
|
|
246
|
+
if (operation.kind === 'compute')
|
|
247
|
+
return operation.operands;
|
|
248
|
+
if (operation.kind === 'get')
|
|
249
|
+
return [operation.receiver, operation.key];
|
|
250
|
+
return [];
|
|
251
|
+
};
|
|
252
|
+
for (let moving = true; moving;) {
|
|
253
|
+
moving = false;
|
|
254
|
+
for (const loop of loops) {
|
|
255
|
+
const preheader = preheaderOf(loop.header, loop.blocks);
|
|
256
|
+
if (preheader === null)
|
|
257
|
+
continue;
|
|
258
|
+
const entered = entersAtLeastOnce(loop.header, loop.blocks);
|
|
259
|
+
for (const blockId of body.blockOrder) {
|
|
260
|
+
if (!loop.blocks.has(blockId))
|
|
261
|
+
continue;
|
|
262
|
+
if (!dominatesEveryLatch(blockId, loop.header, loop.blocks, dominance))
|
|
263
|
+
continue;
|
|
264
|
+
const block = body.blocks.get(blockId);
|
|
265
|
+
if (!block)
|
|
266
|
+
continue;
|
|
267
|
+
// Everything that renders here NOW: what the block owns, plus whatever
|
|
268
|
+
// an inner loop already moved in. The second half is what lets an
|
|
269
|
+
// operation invariant in two nested loops travel all the way out --
|
|
270
|
+
// it lands in the inner preheader on one round and leaves it on the
|
|
271
|
+
// next.
|
|
272
|
+
for (const operation of [...(into.get(blockId) ?? []), ...block.operations]) {
|
|
273
|
+
const result = 'result' in operation ? operation.result : null;
|
|
274
|
+
if (!result)
|
|
275
|
+
continue;
|
|
276
|
+
if (location.get(result.id) !== blockId)
|
|
277
|
+
continue;
|
|
278
|
+
if (!isPureRead(operation, loop.blocks))
|
|
279
|
+
continue;
|
|
280
|
+
if (mayFault(operation) && !entered)
|
|
281
|
+
continue;
|
|
282
|
+
// An element load and a `length` read both answer from storage this
|
|
283
|
+
// loop may rewrite. `isPureRead` proved the handle invariant; this
|
|
284
|
+
// proves the bytes behind it are too.
|
|
285
|
+
if (operation.kind === 'get' && !immutableStringRead(operation)) {
|
|
286
|
+
const mutated = arrayStorageMutated.get(loop.header) ?? mutatesArrayStorage(loop.blocks);
|
|
287
|
+
arrayStorageMutated.set(loop.header, mutated);
|
|
288
|
+
if (mutated)
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
// A cell read moved ahead of the loop has to name a cell something
|
|
292
|
+
// already assigned; a write that only happens AFTER the loop leaves
|
|
293
|
+
// the variable uninitialized at the new position.
|
|
294
|
+
if (operation.kind === 'binding-read') {
|
|
295
|
+
const written = cellWrites.get(operation.declaration) ?? [];
|
|
296
|
+
if (!written.some((write) => dominance.dominates(write.block, preheader)))
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const invariant = operandsOf(operation).every((operand) => {
|
|
300
|
+
const where = location.get(operand.value);
|
|
301
|
+
return where === undefined || !loop.blocks.has(where);
|
|
302
|
+
});
|
|
303
|
+
if (!invariant)
|
|
304
|
+
continue;
|
|
305
|
+
relocated.add(result.id);
|
|
306
|
+
const previous = into.get(blockId);
|
|
307
|
+
if (previous)
|
|
308
|
+
into.set(blockId, previous.filter((held) => held !== operation));
|
|
309
|
+
location.set(result.id, preheader);
|
|
310
|
+
const landing = into.get(preheader) ?? [];
|
|
311
|
+
landing.push(operation);
|
|
312
|
+
into.set(preheader, landing);
|
|
313
|
+
moving = true;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return { into, relocated };
|
|
319
|
+
};
|
|
320
|
+
/**
|
|
321
|
+
* The values a loop cannot change: what clang's licm would lift, stated here.
|
|
322
|
+
*
|
|
323
|
+
* A value defined where no loop re-enters is invariant by position. Inside a
|
|
324
|
+
* loop it still is when nothing the loop does can move it: a constant, a formal,
|
|
325
|
+
* a read of a cell no cyclic block writes, or arithmetic over those. Everything
|
|
326
|
+
* else -- a merge, a call, a load through a receiver -- is not, and is refused
|
|
327
|
+
* rather than guessed at, because the caller's transform is only free for a
|
|
328
|
+
* value that is genuinely computed once.
|
|
329
|
+
*
|
|
330
|
+
* This distinction is the whole difference between restating a loop's BOUND and
|
|
331
|
+
* restating the quantity it is compared against: `x * x + y * y <= 4` in
|
|
332
|
+
* `mandelbrot.ts` reads two cells the loop writes every iteration, and turning
|
|
333
|
+
* its left side into an integer bound cost 13% of that fixture before this
|
|
334
|
+
* existed.
|
|
335
|
+
*/
|
|
336
|
+
export const loopInvariantValuesOf = (body) => {
|
|
337
|
+
const cyclic = cyclicBlocksOf(body);
|
|
338
|
+
const invariant = new Set();
|
|
339
|
+
const pending = [];
|
|
340
|
+
const writtenInLoop = new Set();
|
|
341
|
+
for (const id of body.blockOrder) {
|
|
342
|
+
const block = body.blocks.get(id);
|
|
343
|
+
if (block === undefined)
|
|
344
|
+
continue;
|
|
345
|
+
for (const operation of block.operations) {
|
|
346
|
+
if (operation.kind === 'binding-write' && cyclic.has(id))
|
|
347
|
+
writtenInLoop.add(operation.declaration);
|
|
348
|
+
const result = resultOfIrOperation(operation);
|
|
349
|
+
if (result === null)
|
|
350
|
+
continue;
|
|
351
|
+
if (!cyclic.has(id))
|
|
352
|
+
invariant.add(result.id);
|
|
353
|
+
else
|
|
354
|
+
pending.push(operation);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
let growing = true;
|
|
358
|
+
while (growing) {
|
|
359
|
+
growing = false;
|
|
360
|
+
for (const operation of pending) {
|
|
361
|
+
const result = resultOfIrOperation(operation);
|
|
362
|
+
if (result === null || invariant.has(result.id))
|
|
363
|
+
continue;
|
|
364
|
+
const stable = operation.kind === 'constant' ||
|
|
365
|
+
operation.kind === 'parameter' ||
|
|
366
|
+
(operation.kind === 'binding-read' && !writtenInLoop.has(operation.declaration)) ||
|
|
367
|
+
(operation.kind === 'compute' && operandsOfIrOperation(operation).every((operand) => invariant.has(operand.value)));
|
|
368
|
+
if (!stable)
|
|
369
|
+
continue;
|
|
370
|
+
invariant.add(result.id);
|
|
371
|
+
growing = true;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return invariant;
|
|
375
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { DeclarationId, FunctionId, RegionId } from '../identity/ids.js';
|
|
2
|
+
import type { IrBody } from './model.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a class's construction is made of, as the two questions below need it.
|
|
5
|
+
*
|
|
6
|
+
* A projection of `ClassLayout` rather than the layout itself, so this stays a
|
|
7
|
+
* fact about the IR: the bodies construction runs, and the class it inherits
|
|
8
|
+
* them from. `targets/cpp/translation-unit.ts` adapts the real layouts.
|
|
9
|
+
*/
|
|
10
|
+
export interface ClassConstruction {
|
|
11
|
+
readonly base: DeclarationId | null;
|
|
12
|
+
/** The written constructor's body, or `null` for the implicit one. */
|
|
13
|
+
readonly constructor: FunctionId | null;
|
|
14
|
+
/** One body per field declared WITH an initializer; a bare declaration runs nothing. */
|
|
15
|
+
readonly initializers: readonly FunctionId[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The two whole-program answers below, carried together because they are only
|
|
19
|
+
* ever useful together: a construction may go when nothing observes it AND the
|
|
20
|
+
* callee it was manufactured for ignores it.
|
|
21
|
+
*/
|
|
22
|
+
export interface InstantiationFacts {
|
|
23
|
+
readonly receiverIgnoringFunctions: ReadonlySet<FunctionId | RegionId>;
|
|
24
|
+
readonly unobservableConstructions: ReadonlySet<DeclarationId>;
|
|
25
|
+
}
|
|
26
|
+
/** Nothing known: every construction observable, every function assumed to read its receiver. */
|
|
27
|
+
export declare const noInstantiationFacts: InstantiationFacts;
|
|
28
|
+
/**
|
|
29
|
+
* Which functions never name their receiver.
|
|
30
|
+
*
|
|
31
|
+
* A gea component is a class whose render method is the whole of it, and the
|
|
32
|
+
* render of a component with no state reads `this` nowhere -- yet the call site
|
|
33
|
+
* still has to hand it one, so a `construct` runs to manufacture a receiver the
|
|
34
|
+
* callee ignores. `examples/apps/weather` builds 12 of them, all at mount, each
|
|
35
|
+
* a `makeRef` plus a walk of its field initializers, for an argument no body
|
|
36
|
+
* reads.
|
|
37
|
+
*
|
|
38
|
+
* A body names its receiver iff it holds a `receiver` operation -- deliberately
|
|
39
|
+
* regardless of whether that operation's own result is read, because the answer
|
|
40
|
+
* decides whether the ARGUMENT may be dropped and a body that loads `this` only
|
|
41
|
+
* to discard it is not worth a second census. Answered per `sourceOwner` rather
|
|
42
|
+
* than per body: monomorphization gives one function several bodies, and a
|
|
43
|
+
* function qualifies only when EVERY copy of it ignores the receiver.
|
|
44
|
+
*/
|
|
45
|
+
export declare const functionsIgnoringTheirReceiver: (bodies: readonly IrBody[]) => ReadonlySet<FunctionId | RegionId>;
|
|
46
|
+
/**
|
|
47
|
+
* Which classes can be constructed without any observable consequence, so a
|
|
48
|
+
* `construct` whose result nothing reads may be deleted whole.
|
|
49
|
+
*
|
|
50
|
+
* A construction runs, in order: the base chain's initialization, this class's
|
|
51
|
+
* field initializers, and its constructor body. Every one of those is a real
|
|
52
|
+
* body that may call, throw, or write to something that outlives the object --
|
|
53
|
+
* a field initialized to `registry.push(this)` is observable no matter how dead
|
|
54
|
+
* the instance is. So the answer is the conjunction over the whole chain, and a
|
|
55
|
+
* body this compilation cannot see at all is a `no`.
|
|
56
|
+
*
|
|
57
|
+
* The receiver of each such body is the object under construction, which is why
|
|
58
|
+
* `unobservableInInitialization` admits writes through it: at that point the
|
|
59
|
+
* object is reachable from nothing else.
|
|
60
|
+
*/
|
|
61
|
+
export declare const classesConstructedUnobservably: (classes: ReadonlyMap<DeclarationId, ClassConstruction>, bodies: readonly IrBody[]) => ReadonlySet<DeclarationId>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { operandsOfIrOperation } from './queries.js';
|
|
2
|
+
/** Nothing known: every construction observable, every function assumed to read its receiver. */
|
|
3
|
+
export const noInstantiationFacts = { receiverIgnoringFunctions: new Set(), unobservableConstructions: new Set() };
|
|
4
|
+
/**
|
|
5
|
+
* Which functions never name their receiver.
|
|
6
|
+
*
|
|
7
|
+
* A gea component is a class whose render method is the whole of it, and the
|
|
8
|
+
* render of a component with no state reads `this` nowhere -- yet the call site
|
|
9
|
+
* still has to hand it one, so a `construct` runs to manufacture a receiver the
|
|
10
|
+
* callee ignores. `examples/apps/weather` builds 12 of them, all at mount, each
|
|
11
|
+
* a `makeRef` plus a walk of its field initializers, for an argument no body
|
|
12
|
+
* reads.
|
|
13
|
+
*
|
|
14
|
+
* A body names its receiver iff it holds a `receiver` operation -- deliberately
|
|
15
|
+
* regardless of whether that operation's own result is read, because the answer
|
|
16
|
+
* decides whether the ARGUMENT may be dropped and a body that loads `this` only
|
|
17
|
+
* to discard it is not worth a second census. Answered per `sourceOwner` rather
|
|
18
|
+
* than per body: monomorphization gives one function several bodies, and a
|
|
19
|
+
* function qualifies only when EVERY copy of it ignores the receiver.
|
|
20
|
+
*/
|
|
21
|
+
export const functionsIgnoringTheirReceiver = (bodies) => {
|
|
22
|
+
const naming = new Set();
|
|
23
|
+
const owners = new Set();
|
|
24
|
+
for (const body of bodies) {
|
|
25
|
+
owners.add(body.sourceOwner);
|
|
26
|
+
for (const block of body.blocks.values())
|
|
27
|
+
for (const operation of block.operations)
|
|
28
|
+
if (operation.kind === 'receiver')
|
|
29
|
+
naming.add(body.sourceOwner);
|
|
30
|
+
}
|
|
31
|
+
const ignoring = new Set();
|
|
32
|
+
for (const owner of owners)
|
|
33
|
+
if (!naming.has(owner))
|
|
34
|
+
ignoring.add(owner);
|
|
35
|
+
return ignoring;
|
|
36
|
+
};
|
|
37
|
+
const primitiveKinds = new Set(['scalar', 'string', 'null', 'undefined', 'symbol']);
|
|
38
|
+
/**
|
|
39
|
+
* Whether this operation, inside a body that is building a brand-new object, is
|
|
40
|
+
* one no other code can observe.
|
|
41
|
+
*
|
|
42
|
+
* Narrower than `dead-values.ts`'s `isEffectFree`, and not shared with it: that
|
|
43
|
+
* predicate answers "may this statement be deleted", which is a question about
|
|
44
|
+
* one operation. This one answers "may the whole construction be deleted",
|
|
45
|
+
* which is a question about everything the construction reaches -- so a `call`
|
|
46
|
+
* is refused here even though its result may be dead, and a `set` is admitted
|
|
47
|
+
* only into the object under construction, which nothing else can see yet.
|
|
48
|
+
*/
|
|
49
|
+
const unobservableInInitialization = (operation, receivers) => {
|
|
50
|
+
switch (operation.kind) {
|
|
51
|
+
case 'constant':
|
|
52
|
+
case 'binding-read':
|
|
53
|
+
case 'parameter':
|
|
54
|
+
case 'receiver':
|
|
55
|
+
case 'phi':
|
|
56
|
+
case 'allocate-record':
|
|
57
|
+
case 'allocate-array-object':
|
|
58
|
+
case 'allocate-callable':
|
|
59
|
+
return true;
|
|
60
|
+
case 'compute':
|
|
61
|
+
case 'convert':
|
|
62
|
+
case 'test':
|
|
63
|
+
return operandsOfIrOperation(operation).every((operand) => primitiveKinds.has(operand.representation.kind));
|
|
64
|
+
// A write into the object being built, and only that: the object has not
|
|
65
|
+
// escaped yet, so nobody can read what this wrote. A write through any
|
|
66
|
+
// other receiver is a real effect and disqualifies the construction.
|
|
67
|
+
case 'set':
|
|
68
|
+
case 'define-own-property':
|
|
69
|
+
return receivers.has(operation.receiver.value);
|
|
70
|
+
default:
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Which classes can be constructed without any observable consequence, so a
|
|
76
|
+
* `construct` whose result nothing reads may be deleted whole.
|
|
77
|
+
*
|
|
78
|
+
* A construction runs, in order: the base chain's initialization, this class's
|
|
79
|
+
* field initializers, and its constructor body. Every one of those is a real
|
|
80
|
+
* body that may call, throw, or write to something that outlives the object --
|
|
81
|
+
* a field initialized to `registry.push(this)` is observable no matter how dead
|
|
82
|
+
* the instance is. So the answer is the conjunction over the whole chain, and a
|
|
83
|
+
* body this compilation cannot see at all is a `no`.
|
|
84
|
+
*
|
|
85
|
+
* The receiver of each such body is the object under construction, which is why
|
|
86
|
+
* `unobservableInInitialization` admits writes through it: at that point the
|
|
87
|
+
* object is reachable from nothing else.
|
|
88
|
+
*/
|
|
89
|
+
export const classesConstructedUnobservably = (classes, bodies) => {
|
|
90
|
+
const byOwner = new Map();
|
|
91
|
+
for (const body of bodies)
|
|
92
|
+
byOwner.set(body.sourceOwner, [...(byOwner.get(body.sourceOwner) ?? []), body]);
|
|
93
|
+
const quiet = new Map();
|
|
94
|
+
const bodyIsQuiet = (fn) => {
|
|
95
|
+
const known = quiet.get(fn);
|
|
96
|
+
if (known !== undefined)
|
|
97
|
+
return known;
|
|
98
|
+
// Recursion through a field initializer that constructs its own class
|
|
99
|
+
// would ask this question of itself; `false` while it is in flight makes
|
|
100
|
+
// the fixed point terminate on the safe side.
|
|
101
|
+
quiet.set(fn, false);
|
|
102
|
+
const found = byOwner.get(fn) ?? [];
|
|
103
|
+
const answer = found.length > 0 &&
|
|
104
|
+
found.every((body) => {
|
|
105
|
+
const receivers = new Set();
|
|
106
|
+
for (const block of body.blocks.values())
|
|
107
|
+
for (const operation of block.operations)
|
|
108
|
+
if (operation.kind === 'receiver')
|
|
109
|
+
receivers.add(operation.result.id);
|
|
110
|
+
return [...body.blocks.values()].every((block) => block.terminator.kind !== 'throw' && block.operations.every((operation) => unobservableInInitialization(operation, receivers)));
|
|
111
|
+
});
|
|
112
|
+
quiet.set(fn, answer);
|
|
113
|
+
return answer;
|
|
114
|
+
};
|
|
115
|
+
const answers = new Map();
|
|
116
|
+
const isQuiet = (declaration) => {
|
|
117
|
+
const known = answers.get(declaration);
|
|
118
|
+
if (known !== undefined)
|
|
119
|
+
return known;
|
|
120
|
+
answers.set(declaration, false);
|
|
121
|
+
const construction = classes.get(declaration);
|
|
122
|
+
// A class this unit holds no construction for: its bodies are elsewhere,
|
|
123
|
+
// and an answer about code nobody here can read is not an answer.
|
|
124
|
+
if (construction === undefined)
|
|
125
|
+
return false;
|
|
126
|
+
const answer = (construction.base === null || isQuiet(construction.base)) &&
|
|
127
|
+
construction.initializers.every(bodyIsQuiet) &&
|
|
128
|
+
(construction.constructor === null || bodyIsQuiet(construction.constructor));
|
|
129
|
+
answers.set(declaration, answer);
|
|
130
|
+
return answer;
|
|
131
|
+
};
|
|
132
|
+
const unobservable = new Set();
|
|
133
|
+
for (const declaration of classes.keys())
|
|
134
|
+
if (isQuiet(declaration))
|
|
135
|
+
unobservable.add(declaration);
|
|
136
|
+
return unobservable;
|
|
137
|
+
};
|