@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,697 @@
|
|
|
1
|
+
import { controlFlowGraphOf, dominatorTreeOf, naturalLoopsOf } from './dominance.js';
|
|
2
|
+
import { loopInvariantHoistsOf } from './hoist.js';
|
|
3
|
+
import { borrowSafeOperationsOf } from './borrow-effects.js';
|
|
4
|
+
import { operandsOfIrOperation, resultOfIrOperation } from './queries.js';
|
|
5
|
+
export const emptyDenseLoopPlan = { arrays: [], groups: [], accesses: new Map(), lengths: new Map() };
|
|
6
|
+
/**
|
|
7
|
+
* Whether a window's array is one this body can actually dereference: a plain
|
|
8
|
+
* cell needs the target's own storage answer; a value defined before the loop
|
|
9
|
+
* needs nothing (it is simply named); and a ROW needs its own key already
|
|
10
|
+
* settled to a real integer -- an un-narrowed `number` key is not an element
|
|
11
|
+
* access at all (`ir/integers.ts`) -- on top of the same question for the
|
|
12
|
+
* array it is a row of.
|
|
13
|
+
*/
|
|
14
|
+
const referenceIsAdmitted = (reference, integerValues, admitsCell) => {
|
|
15
|
+
if (reference.kind === 'cell')
|
|
16
|
+
return admitsCell(reference.declaration);
|
|
17
|
+
if (reference.kind === 'value')
|
|
18
|
+
return true;
|
|
19
|
+
return integerValues.has(reference.key.value) && referenceIsAdmitted(reference.holder, integerValues, admitsCell);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Narrows `denseLoopsOf`'s raw plan to the windows this body may actually
|
|
23
|
+
* render.
|
|
24
|
+
*
|
|
25
|
+
* A window not admitted here is never a refusal: the array still renders
|
|
26
|
+
* through the ordinary indexed path, which is always correct, and this only
|
|
27
|
+
* decides which windows get the additional fast one. Three things a plan
|
|
28
|
+
* built from the IR alone cannot settle are decided here, and only the first
|
|
29
|
+
* is about this backend's own storage rather than about the program:
|
|
30
|
+
*
|
|
31
|
+
* - whether this body already has a plain name for the cells a window
|
|
32
|
+
* reaches through (`admitsCell`);
|
|
33
|
+
* - whether the integer census narrowed every index a window's accesses
|
|
34
|
+
* read -- an un-narrowed `number` key is not an element access at all --
|
|
35
|
+
* except a WRAPPED window, which is exempt: its own admission already
|
|
36
|
+
* proves the array non-empty and hole-free (`DenseArray.wrapped`), so a
|
|
37
|
+
* remainder by that length or by a literal modulus needs no narrowed index
|
|
38
|
+
* to be a real one; one un-narrowed access anywhere in an ordinary window
|
|
39
|
+
* takes the WHOLE window down, since every access shares the one pointer
|
|
40
|
+
* the narrowing proof is about;
|
|
41
|
+
* - and, once the two above have dropped some accesses, whether anything is
|
|
42
|
+
* left of a window at all: an array with no surviving access has no
|
|
43
|
+
* pointer worth materializing, and a flag chain with no claimed window
|
|
44
|
+
* below it has nothing to compute either -- a flag ands its enclosing
|
|
45
|
+
* loop's, so every group on a claimed window's chain has to exist even
|
|
46
|
+
* when nothing indexes anything in that loop, and no group outside that
|
|
47
|
+
* chain is needed at all.
|
|
48
|
+
*/
|
|
49
|
+
export const admittedDenseLoopPlanOf = (plan, integerValues, admitsCell) => {
|
|
50
|
+
if (plan.arrays.length === 0)
|
|
51
|
+
return { arrays: [], groups: new Map(), accesses: new Map(), lengths: new Map() };
|
|
52
|
+
const admitted = new Set(plan.arrays
|
|
53
|
+
.filter((array) => admitsCell(array.counter) && referenceIsAdmitted(array.reference, integerValues, admitsCell))
|
|
54
|
+
.map((array) => array.ordinal));
|
|
55
|
+
for (const [operation, access] of plan.accesses) {
|
|
56
|
+
const array = plan.arrays[access.array];
|
|
57
|
+
if (operation.kind !== 'get' && operation.kind !== 'set')
|
|
58
|
+
admitted.delete(access.array);
|
|
59
|
+
else if (!array?.wrapped && array?.typed === null && !integerValues.has(operation.key.value))
|
|
60
|
+
admitted.delete(access.array);
|
|
61
|
+
}
|
|
62
|
+
const accesses = new Map();
|
|
63
|
+
const claimed = new Set();
|
|
64
|
+
for (const [operation, access] of plan.accesses) {
|
|
65
|
+
if (!admitted.has(access.array))
|
|
66
|
+
continue;
|
|
67
|
+
accesses.set(operation, access);
|
|
68
|
+
claimed.add(access.array);
|
|
69
|
+
}
|
|
70
|
+
const arrays = plan.arrays.filter((array) => claimed.has(array.ordinal));
|
|
71
|
+
const lengths = new Map([...plan.lengths].filter(([, ordinal]) => claimed.has(ordinal)));
|
|
72
|
+
const groups = new Map();
|
|
73
|
+
for (const array of arrays)
|
|
74
|
+
for (const access of accesses.values()) {
|
|
75
|
+
if (access.array !== array.ordinal)
|
|
76
|
+
continue;
|
|
77
|
+
for (let at = access.flag; at !== null;) {
|
|
78
|
+
const group = plan.groups[at];
|
|
79
|
+
if (!group || groups.has(at))
|
|
80
|
+
break;
|
|
81
|
+
groups.set(at, group);
|
|
82
|
+
at = group.parent;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { arrays, groups, accesses, lengths };
|
|
86
|
+
};
|
|
87
|
+
export const denseLoopsOf = (body) => {
|
|
88
|
+
// A try region renders as one assembled chunk, so a preheader inside one has
|
|
89
|
+
// no single place for the setup to land -- the same restriction `hoist.ts`
|
|
90
|
+
// takes, and for the same reason.
|
|
91
|
+
if (body.tryRegions.length > 0 || (body.iteratorCloseRegions?.length ?? 0) > 0)
|
|
92
|
+
return emptyDenseLoopPlan;
|
|
93
|
+
const graph = controlFlowGraphOf(body);
|
|
94
|
+
const dominance = dominatorTreeOf(body);
|
|
95
|
+
const loops = naturalLoopsOf(graph, dominance);
|
|
96
|
+
if (loops.length === 0)
|
|
97
|
+
return emptyDenseLoopPlan;
|
|
98
|
+
const location = new Map();
|
|
99
|
+
const operationOf = new Map();
|
|
100
|
+
const readsCell = new Map();
|
|
101
|
+
const constantTexts = new Map();
|
|
102
|
+
const cellWrites = new Map();
|
|
103
|
+
const usesOf = new Map();
|
|
104
|
+
const blockOfOperation = new Map();
|
|
105
|
+
for (const blockId of body.blockOrder) {
|
|
106
|
+
const block = body.blocks.get(blockId);
|
|
107
|
+
if (!block)
|
|
108
|
+
continue;
|
|
109
|
+
for (const operation of block.operations) {
|
|
110
|
+
blockOfOperation.set(operation, blockId);
|
|
111
|
+
const result = 'result' in operation ? operation.result : null;
|
|
112
|
+
if (result) {
|
|
113
|
+
location.set(result.id, blockId);
|
|
114
|
+
operationOf.set(result.id, operation);
|
|
115
|
+
}
|
|
116
|
+
if (operation.kind === 'constant')
|
|
117
|
+
constantTexts.set(operation.result.id, operation.text);
|
|
118
|
+
if (operation.kind === 'binding-read')
|
|
119
|
+
readsCell.set(operation.result.id, operation.declaration);
|
|
120
|
+
if (operation.kind === 'binding-write') {
|
|
121
|
+
const written = cellWrites.get(operation.declaration) ?? [];
|
|
122
|
+
written.push({ value: operation.value, block: blockId });
|
|
123
|
+
cellWrites.set(operation.declaration, written);
|
|
124
|
+
}
|
|
125
|
+
for (const operand of operandsOfIrOperation(operation)) {
|
|
126
|
+
const sites = usesOf.get(operand.value) ?? [];
|
|
127
|
+
sites.push({ operation, block: blockId });
|
|
128
|
+
usesOf.set(operand.value, sites);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// A terminator's own operand is a use like any other: an array named by a
|
|
132
|
+
// branch condition is an array this window cannot account for.
|
|
133
|
+
const terminator = block.terminator;
|
|
134
|
+
if (terminator.kind === 'branch') {
|
|
135
|
+
const sites = usesOf.get(terminator.condition.value) ?? [];
|
|
136
|
+
usesOf.set(terminator.condition.value, sites);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// A value the emitter HOISTS is defined where the hoist puts it, not where
|
|
140
|
+
// the IR wrote it: `i * N` and the row load `a[i]` both live in the inner
|
|
141
|
+
// loop's own body until `ir/hoist.ts` moves them to its preheader, and asking
|
|
142
|
+
// the raw IR where they are answers "inside the loop" for every one of them.
|
|
143
|
+
// `emitBody` runs the same plan, and renders it before this setup.
|
|
144
|
+
for (const [blockId, operations] of loopInvariantHoistsOf(body).into)
|
|
145
|
+
for (const operation of operations) {
|
|
146
|
+
blockOfOperation.set(operation, blockId);
|
|
147
|
+
const result = resultOfIrOperation(operation);
|
|
148
|
+
if (result)
|
|
149
|
+
location.set(result.id, blockId);
|
|
150
|
+
}
|
|
151
|
+
const arrays = [];
|
|
152
|
+
const accesses = new Map();
|
|
153
|
+
const groups = [];
|
|
154
|
+
const definedOutside = (value, blocks) => {
|
|
155
|
+
const where = location.get(value);
|
|
156
|
+
return where === undefined || !blocks.has(where);
|
|
157
|
+
};
|
|
158
|
+
// A value the preheader may NAME: defined before the loop, so it is both
|
|
159
|
+
// unchanged by the loop (SSA) and already assigned where the setup renders.
|
|
160
|
+
// A cell the loop never writes is not enough -- the READ of it can be one of
|
|
161
|
+
// the loop's own operations, and naming that value in the preheader emits a
|
|
162
|
+
// use of a variable no statement has assigned yet.
|
|
163
|
+
const found = loops.map((loop) => loopWindowsOf(loop, body, graph, loops, {
|
|
164
|
+
body,
|
|
165
|
+
values: body.values,
|
|
166
|
+
readsCell,
|
|
167
|
+
constantTexts,
|
|
168
|
+
cellWrites,
|
|
169
|
+
usesOf,
|
|
170
|
+
operationOf,
|
|
171
|
+
definedOutside
|
|
172
|
+
}));
|
|
173
|
+
const groupOfLoop = new Map();
|
|
174
|
+
for (const [index, loop] of found.entries()) {
|
|
175
|
+
if (loop === null)
|
|
176
|
+
continue;
|
|
177
|
+
// Innermost-first, so an inner loop is numbered before the outer one it
|
|
178
|
+
// ands: the ordinals are identities, not an emission order.
|
|
179
|
+
groupOfLoop.set(index, groups.length);
|
|
180
|
+
groups.push({ ordinal: groups.length, parent: null, preheader: loop.preheader });
|
|
181
|
+
}
|
|
182
|
+
for (const [index, group] of groupOfLoop) {
|
|
183
|
+
const inner = loops[index];
|
|
184
|
+
if (!inner)
|
|
185
|
+
continue;
|
|
186
|
+
const enclosing = loops.findIndex((outer, at) => at !== index && outer.blocks.has(inner.header) && groupOfLoop.has(at));
|
|
187
|
+
const parent = enclosing < 0 ? null : (groupOfLoop.get(enclosing) ?? null);
|
|
188
|
+
groups[group] = { ordinal: group, parent, preheader: groups[group]?.preheader ?? inner.header };
|
|
189
|
+
}
|
|
190
|
+
/** The flag an access renders behind: the innermost enclosing loop that has one. */
|
|
191
|
+
const flagAt = (blockId) => {
|
|
192
|
+
for (const [index, loop] of loops.entries()) {
|
|
193
|
+
if (!loop.blocks.has(blockId))
|
|
194
|
+
continue;
|
|
195
|
+
const group = groupOfLoop.get(index);
|
|
196
|
+
if (group !== undefined)
|
|
197
|
+
return group;
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
};
|
|
201
|
+
const blocksOfArray = new Map();
|
|
202
|
+
for (const [index, loop] of found.entries()) {
|
|
203
|
+
const group = groupOfLoop.get(index);
|
|
204
|
+
if (loop === null || group === undefined)
|
|
205
|
+
continue;
|
|
206
|
+
for (const candidate of loop.candidates) {
|
|
207
|
+
const ordinal = arrays.length;
|
|
208
|
+
const blocks = loops[index]?.blocks;
|
|
209
|
+
if (blocks)
|
|
210
|
+
blocksOfArray.set(ordinal, blocks);
|
|
211
|
+
arrays.push({
|
|
212
|
+
ordinal,
|
|
213
|
+
group,
|
|
214
|
+
reference: candidate.reference,
|
|
215
|
+
element: candidate.element,
|
|
216
|
+
typed: candidate.typed,
|
|
217
|
+
preheader: loop.preheader,
|
|
218
|
+
wrapped: candidate.wrapped,
|
|
219
|
+
modulus: candidate.modulus,
|
|
220
|
+
bases: candidate.bases,
|
|
221
|
+
counter: loop.counter,
|
|
222
|
+
bound: loop.bound,
|
|
223
|
+
inclusive: loop.inclusive,
|
|
224
|
+
step: loop.step,
|
|
225
|
+
widened: loop.widened
|
|
226
|
+
});
|
|
227
|
+
for (const operation of candidate.operations) {
|
|
228
|
+
const flag = flagAt(blockOfOperation.get(operation) ?? loop.preheader);
|
|
229
|
+
if (flag === null)
|
|
230
|
+
continue;
|
|
231
|
+
accesses.set(operation, { array: ordinal, flag });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// A window whose array is reached THROUGH one (`grid[i]`) names it behind a
|
|
236
|
+
// null check, and the preheader has no unconditional place to read a length.
|
|
237
|
+
// A read the loop does not contain is already outside it -- and substituting
|
|
238
|
+
// the preheader's name for one that renders BEFORE the preheader would name a
|
|
239
|
+
// variable no statement has assigned yet, so `location` (which the hoist pass
|
|
240
|
+
// updates) is what decides membership, not the block the IR wrote it in.
|
|
241
|
+
const lengths = new Map();
|
|
242
|
+
for (const array of arrays) {
|
|
243
|
+
// A constant modulus has no length to hoist: the divisor is already in the
|
|
244
|
+
// emitted text, and `gea::Divisor`'s prepared reciprocal answers a question
|
|
245
|
+
// a literal never asks.
|
|
246
|
+
if (!array.wrapped || array.modulus !== null || array.reference.kind === 'element')
|
|
247
|
+
continue;
|
|
248
|
+
const blocks = blocksOfArray.get(array.ordinal);
|
|
249
|
+
if (!blocks)
|
|
250
|
+
continue;
|
|
251
|
+
const cell = array.reference.kind === 'cell' ? array.reference.declaration : null;
|
|
252
|
+
const held = array.reference.kind === 'value' ? array.reference.operand.value : null;
|
|
253
|
+
for (const [result, operation] of operationOf) {
|
|
254
|
+
if (operation.kind !== 'get' || constantTexts.get(operation.key.value) !== 'length')
|
|
255
|
+
continue;
|
|
256
|
+
// The re-check every sibling `'length'` site in this file keeps
|
|
257
|
+
// (line ~560, ~610, `wrapsOwnLength` above) and this one omitted: a
|
|
258
|
+
// `get` whose key merely RENDERS as the text "length" says nothing on
|
|
259
|
+
// its own about what kind of receiver it reads. The receiver-identity
|
|
260
|
+
// test below (`readsCell.get(receiver) === cell` / `receiver === held`)
|
|
261
|
+
// already only matches a value this loop's own `arrays` census settled
|
|
262
|
+
// as `array-object` -- `array.reference` is never anything else once
|
|
263
|
+
// `wrapped` is true -- so this is a defensive restatement of a fact
|
|
264
|
+
// already implied, not a new refusal; kept for the same reason the
|
|
265
|
+
// siblings state it locally rather than leaving it to be re-derived
|
|
266
|
+
// from a different function's invariant.
|
|
267
|
+
if (operation.receiver.representation.kind !== 'array-object')
|
|
268
|
+
continue;
|
|
269
|
+
const where = location.get(result);
|
|
270
|
+
if (where === undefined || !blocks.has(where))
|
|
271
|
+
continue;
|
|
272
|
+
const receiver = operation.receiver.value;
|
|
273
|
+
if (cell !== null ? readsCell.get(receiver) === cell : receiver === held)
|
|
274
|
+
lengths.set(result, array.ordinal);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return { arrays, groups, accesses, lengths };
|
|
278
|
+
};
|
|
279
|
+
const loopWindowsOf = (loop, body, graph, loops, context) => {
|
|
280
|
+
const outside = (graph.predecessors.get(loop.header) ?? []).filter((predecessor) => !loop.blocks.has(predecessor));
|
|
281
|
+
const preheader = outside.length === 1 ? outside[0] : undefined;
|
|
282
|
+
if (preheader === undefined)
|
|
283
|
+
return null;
|
|
284
|
+
const header = body.blocks.get(loop.header);
|
|
285
|
+
if (header?.terminator.kind !== 'branch')
|
|
286
|
+
return null;
|
|
287
|
+
const test = context.operationOf.get(header.terminator.condition.value);
|
|
288
|
+
if (test?.kind !== 'compute' || test.form !== 'binary')
|
|
289
|
+
return null;
|
|
290
|
+
if (test.operator !== '<' && test.operator !== '<=')
|
|
291
|
+
return null;
|
|
292
|
+
const [left, right] = test.operands;
|
|
293
|
+
if (!left || !right)
|
|
294
|
+
return null;
|
|
295
|
+
const counter = context.readsCell.get(left.value);
|
|
296
|
+
if (counter === undefined || !context.definedOutside(right.value, loop.blocks))
|
|
297
|
+
return null;
|
|
298
|
+
// Exactly one advance, by an amount the preheader can name. Several
|
|
299
|
+
// advances, or a step the loop itself computes, and "the counter never
|
|
300
|
+
// exceeds the bound" stops being something the preheader can check.
|
|
301
|
+
const steps = (context.cellWrites.get(counter) ?? []).filter((write) => loop.blocks.has(write.block));
|
|
302
|
+
const advance = steps.length === 1 ? steps[0] : undefined;
|
|
303
|
+
if (!advance)
|
|
304
|
+
return null;
|
|
305
|
+
// ...and reached at most once per turn. A write inside an INNER loop runs an
|
|
306
|
+
// unknown number of times per turn of this one, and then no arithmetic on
|
|
307
|
+
// this loop's own bound says where the counter got to. Structured TypeScript
|
|
308
|
+
// compiles to reducible control flow, so every cycle within this loop is one
|
|
309
|
+
// of `loops`.
|
|
310
|
+
if (loops.some((inner) => inner.header !== loop.header && inner.blocks.has(advance.block) && loop.blocks.has(inner.header)))
|
|
311
|
+
return null;
|
|
312
|
+
const step = stepOf(advance.value, counter, context.operationOf, context.readsCell);
|
|
313
|
+
if (step === undefined)
|
|
314
|
+
return null;
|
|
315
|
+
if (step !== null && !context.definedOutside(step.value, loop.blocks))
|
|
316
|
+
return null;
|
|
317
|
+
const candidates = windowsOfLoop(loop.blocks, body, { ...context, counter });
|
|
318
|
+
if (candidates.length === 0)
|
|
319
|
+
return null;
|
|
320
|
+
return {
|
|
321
|
+
preheader,
|
|
322
|
+
counter,
|
|
323
|
+
bound: right,
|
|
324
|
+
inclusive: test.operator === '<=',
|
|
325
|
+
step,
|
|
326
|
+
widened: advanceReachesAnAccess(loop, body, graph, advance.block, counter),
|
|
327
|
+
candidates
|
|
328
|
+
};
|
|
329
|
+
};
|
|
330
|
+
/**
|
|
331
|
+
* Whether an element access can run after this turn's advance of the counter.
|
|
332
|
+
*
|
|
333
|
+
* True only when the body can reach an access from the counter's own write
|
|
334
|
+
* without going back through the header -- which a `for` loop's latch, whose
|
|
335
|
+
* one successor IS the header, never does.
|
|
336
|
+
*/
|
|
337
|
+
const advanceReachesAnAccess = (loop, body, graph, advanceBlock, counter) => {
|
|
338
|
+
const after = new Set();
|
|
339
|
+
const pending = (graph.successors.get(advanceBlock) ?? []).filter((next) => loop.blocks.has(next) && next !== loop.header);
|
|
340
|
+
while (pending.length > 0) {
|
|
341
|
+
const blockId = pending.pop();
|
|
342
|
+
if (blockId === undefined || after.has(blockId))
|
|
343
|
+
continue;
|
|
344
|
+
after.add(blockId);
|
|
345
|
+
for (const next of graph.successors.get(blockId) ?? [])
|
|
346
|
+
if (loop.blocks.has(next) && next !== loop.header)
|
|
347
|
+
pending.push(next);
|
|
348
|
+
}
|
|
349
|
+
for (const blockId of after) {
|
|
350
|
+
const block = body.blocks.get(blockId);
|
|
351
|
+
if (block?.operations.some((operation) => operation.kind === 'get' || operation.kind === 'set'))
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
const written = body.blocks.get(advanceBlock)?.operations ?? [];
|
|
355
|
+
const at = written.findIndex((operation) => operation.kind === 'binding-write' && operation.declaration === counter);
|
|
356
|
+
return at >= 0 && written.slice(at + 1).some((operation) => operation.kind === 'get' || operation.kind === 'set');
|
|
357
|
+
};
|
|
358
|
+
/** `counter + s` / `counter++`: the amount one turn adds, or `undefined` when the write is not an advance. */
|
|
359
|
+
const stepOf = (written, counter, operationOf, readsCell) => {
|
|
360
|
+
const compute = operationOf.get(written.value);
|
|
361
|
+
if (compute?.kind !== 'compute')
|
|
362
|
+
return undefined;
|
|
363
|
+
if (compute.form === 'update') {
|
|
364
|
+
const target = compute.operands[0];
|
|
365
|
+
return target && readsCell.get(target.value) === counter && compute.operator === '++' ? null : undefined;
|
|
366
|
+
}
|
|
367
|
+
if (compute.form !== 'binary' || compute.operator !== '+')
|
|
368
|
+
return undefined;
|
|
369
|
+
const [left, right] = compute.operands;
|
|
370
|
+
if (!left || !right)
|
|
371
|
+
return undefined;
|
|
372
|
+
if (readsCell.get(left.value) === counter)
|
|
373
|
+
return right;
|
|
374
|
+
if (readsCell.get(right.value) === counter)
|
|
375
|
+
return left;
|
|
376
|
+
return undefined;
|
|
377
|
+
};
|
|
378
|
+
/** One window's identity, so two accesses to the same array in one loop meet. */
|
|
379
|
+
const referenceKey = (reference) => reference.kind === 'cell'
|
|
380
|
+
? `cell:${reference.declaration}`
|
|
381
|
+
: reference.kind === 'value'
|
|
382
|
+
? `value:${reference.operand.value}`
|
|
383
|
+
: `element:${referenceKey(reference.holder)}:${reference.key.value}`;
|
|
384
|
+
/** Every in-loop site that names the storage this reference stands for. */
|
|
385
|
+
const usesOfReference = (reference, context) => {
|
|
386
|
+
if (reference.kind === 'cell')
|
|
387
|
+
return [...context.usesOf.entries()]
|
|
388
|
+
.filter(([value]) => context.readsCell.get(value) === reference.declaration)
|
|
389
|
+
.flatMap(([, sites]) => sites);
|
|
390
|
+
const operand = reference.kind === 'value' ? reference.operand : reference.operand;
|
|
391
|
+
return context.usesOf.get(operand.value) ?? [];
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* The array one access reaches, as something the preheader can name.
|
|
395
|
+
*
|
|
396
|
+
* A cell the loop never writes, a value defined before the loop, or -- one
|
|
397
|
+
* level in -- a row loaded from one of those by a loop-invariant index.
|
|
398
|
+
*/
|
|
399
|
+
const heldArrayOf = (receiver, context, blocks) => {
|
|
400
|
+
const cell = context.readsCell.get(receiver.value);
|
|
401
|
+
if (cell !== undefined) {
|
|
402
|
+
if (!(context.cellWrites.get(cell) ?? []).every((write) => !blocks.has(write.block)))
|
|
403
|
+
return null;
|
|
404
|
+
const reference = { kind: 'cell', declaration: cell, representation: receiver.representation };
|
|
405
|
+
return { reference, watch: [reference], excused: [] };
|
|
406
|
+
}
|
|
407
|
+
if (context.definedOutside(receiver.value, blocks)) {
|
|
408
|
+
const reference = {
|
|
409
|
+
kind: 'value',
|
|
410
|
+
operand: receiver,
|
|
411
|
+
storage: context.values.get(receiver.value) ?? receiver.representation
|
|
412
|
+
};
|
|
413
|
+
return { reference, watch: [reference], excused: [] };
|
|
414
|
+
}
|
|
415
|
+
const load = context.operationOf.get(receiver.value);
|
|
416
|
+
if (load?.kind !== 'get' || load.receiver.representation.kind !== 'array-object')
|
|
417
|
+
return null;
|
|
418
|
+
if (!context.definedOutside(load.key.value, blocks))
|
|
419
|
+
return null;
|
|
420
|
+
const holder = heldArrayOf(load.receiver, context, blocks);
|
|
421
|
+
// One level only: a row of a row would need the preheader to unpack two
|
|
422
|
+
// loads behind two conditions, and nothing in the corpus asks for it.
|
|
423
|
+
if (holder === null || holder.reference.kind === 'element')
|
|
424
|
+
return null;
|
|
425
|
+
const reference = { kind: 'element', holder: holder.reference, key: load.key, operand: receiver };
|
|
426
|
+
return { reference, watch: [reference, holder.reference], excused: [load] };
|
|
427
|
+
};
|
|
428
|
+
/**
|
|
429
|
+
* The arrays this loop touches only through counter-indexed element accesses.
|
|
430
|
+
*
|
|
431
|
+
* Grouped by the array's own identity -- the CELL, not the read: every turn of
|
|
432
|
+
* the loop reads the cell again, so asking where the receiver VALUE was defined
|
|
433
|
+
* answers "inside the loop" for an array the loop plainly never changes.
|
|
434
|
+
*/
|
|
435
|
+
const windowsOfLoop = (blocks, body, context) => {
|
|
436
|
+
const byReference = new Map();
|
|
437
|
+
const nativeOperations = borrowSafeOperationsOf(body);
|
|
438
|
+
// No pointer may outlive a callback that can replace/detach its storage.
|
|
439
|
+
// Numeric typed-array writes alias bytes but cannot invalidate geometry.
|
|
440
|
+
const nativeOnly = [...blocks].every((id) => body.blocks.get(id)?.operations.every((operation) => nativeOperations.has(operation)));
|
|
441
|
+
const noteUnsound = (key) => {
|
|
442
|
+
const found = byReference.get(key);
|
|
443
|
+
if (found)
|
|
444
|
+
found.sound = false;
|
|
445
|
+
};
|
|
446
|
+
for (const blockId of body.blockOrder) {
|
|
447
|
+
if (!blocks.has(blockId))
|
|
448
|
+
continue;
|
|
449
|
+
const block = body.blocks.get(blockId);
|
|
450
|
+
if (!block)
|
|
451
|
+
continue;
|
|
452
|
+
for (const operation of block.operations) {
|
|
453
|
+
if (operation.kind !== 'get' && operation.kind !== 'set')
|
|
454
|
+
continue;
|
|
455
|
+
const receiver = operation.receiver;
|
|
456
|
+
if (receiver.representation.kind !== 'array-object' && receiver.representation.kind !== 'typed-array')
|
|
457
|
+
continue;
|
|
458
|
+
// Dense typed-array windows lower to a cached raw T* and static
|
|
459
|
+
// readInBounds/writeInBounds calls. A SharedArrayBuffer view must route
|
|
460
|
+
// every ordinary access through its backing-store synchronization so it
|
|
461
|
+
// cannot race Atomics or an overlapping view.
|
|
462
|
+
if (receiver.representation.kind === 'typed-array' && receiver.representation.buffer === 'shared-array-buffer')
|
|
463
|
+
continue;
|
|
464
|
+
const typed = receiver.representation.kind === 'typed-array' ? receiver.representation.element : null;
|
|
465
|
+
if (typed !== null && !nativeOnly)
|
|
466
|
+
continue;
|
|
467
|
+
const element = receiver.representation.kind === 'array-object' ? receiver.representation.element : { kind: 'scalar', domain: 'number' };
|
|
468
|
+
// `a.length` is a `get` on an array like any element read, and it is the
|
|
469
|
+
// one that is not an ELEMENT access: it has no index to bound, so asking
|
|
470
|
+
// for one answers "cannot bound this" and takes the window down with it.
|
|
471
|
+
if (operation.kind === 'get' && context.constantTexts.get(operation.key.value) === 'length')
|
|
472
|
+
continue;
|
|
473
|
+
const held = heldArrayOf(receiver, context, blocks);
|
|
474
|
+
if (held === null)
|
|
475
|
+
continue;
|
|
476
|
+
const key = referenceKey(held.reference);
|
|
477
|
+
// The array's own length first: an index bounded by the length it is
|
|
478
|
+
// taken modulo needs no number carried to the preheader, and a program
|
|
479
|
+
// that spells both is better served by the shape that checks less.
|
|
480
|
+
const ownLength = wrapsOwnLength(operation.key, receiver, context);
|
|
481
|
+
const modulus = ownLength ? null : constantModulusOf(operation.key, context, block.operations, block.operations.indexOf(operation));
|
|
482
|
+
const wrapped = ownLength || modulus !== null;
|
|
483
|
+
if (typed !== null && (wrapped || held.reference.kind === 'element'))
|
|
484
|
+
continue;
|
|
485
|
+
const base = wrapped ? null : indexBaseOf(operation.key, context, blocks);
|
|
486
|
+
const found = byReference.get(key);
|
|
487
|
+
if (base === undefined) {
|
|
488
|
+
if (found)
|
|
489
|
+
found.sound = false;
|
|
490
|
+
else
|
|
491
|
+
byReference.set(key, { ...held, element, typed, wrapped, modulus, bases: [], operations: [], sound: false });
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
if (!found) {
|
|
495
|
+
byReference.set(key, { ...held, element, typed, wrapped, modulus, bases: [base], operations: [operation], sound: true });
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
// Different addends each contribute a range check to the one cumulative
|
|
499
|
+
// preheader flag. Selecting only one would leave the others unchecked.
|
|
500
|
+
// Wrapped and ordinary accesses still need different geometry proofs.
|
|
501
|
+
// Two constant moduli in one window would need the LARGER checked at the
|
|
502
|
+
// preheader, and taking the larger of a pair says nothing about a third
|
|
503
|
+
// that arrives later. Widening the window is a change of proof, not of
|
|
504
|
+
// bookkeeping, so a second modulus takes the window down exactly as a
|
|
505
|
+
// second base does.
|
|
506
|
+
if (found.wrapped !== wrapped || found.modulus !== modulus)
|
|
507
|
+
found.sound = false;
|
|
508
|
+
else {
|
|
509
|
+
if (!found.bases.some((known) => (known?.value ?? null) === (base?.value ?? null)))
|
|
510
|
+
found.bases.push(base);
|
|
511
|
+
found.operations.push(operation);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// Every OTHER use of the array inside the loop disqualifies the window: a
|
|
516
|
+
// `push`, a call taking it, a store of it somewhere else -- each one can
|
|
517
|
+
// resize the storage the pointer names, and none of them is something a
|
|
518
|
+
// bound on the INDEX says anything about.
|
|
519
|
+
for (const [key, window] of byReference) {
|
|
520
|
+
if (!window.sound)
|
|
521
|
+
continue;
|
|
522
|
+
for (const held of window.watch)
|
|
523
|
+
for (const site of usesOfReference(held, context)) {
|
|
524
|
+
if (!blocks.has(site.block))
|
|
525
|
+
continue;
|
|
526
|
+
if (window.operations.includes(site.operation) || window.excused.includes(site.operation))
|
|
527
|
+
continue;
|
|
528
|
+
// A read of the array's own `length` is not a use of the STORAGE: it
|
|
529
|
+
// cannot resize anything, and it is exactly what a wrapped window's
|
|
530
|
+
// index is computed from -- so counting it would make the one shape
|
|
531
|
+
// that needs it impossible to admit.
|
|
532
|
+
if (site.operation.kind === 'get' && context.constantTexts.get(site.operation.key.value) === 'length')
|
|
533
|
+
continue;
|
|
534
|
+
noteUnsound(key);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
return [...byReference.values()].filter((window) => window.sound && window.operations.length > 0);
|
|
538
|
+
};
|
|
539
|
+
/**
|
|
540
|
+
* Whether an index is a REMAINDER by this very array's `length`.
|
|
541
|
+
*
|
|
542
|
+
* `x % a.length` is in `[0, a.length)` for every dividend, so an access keyed
|
|
543
|
+
* by one needs no bound of its own -- which is the whole point, because the
|
|
544
|
+
* bound is what a per-access size read would cost. The receiver of the length
|
|
545
|
+
* read has to be the SAME value the access itself indexes: `a[x % b.length]`
|
|
546
|
+
* proves nothing about `a`.
|
|
547
|
+
*
|
|
548
|
+
* The zero-length case is the one the arithmetic does not cover -- `x % 0` is
|
|
549
|
+
* NaN, which is no index at all -- and it is the preheader's `size() > 0` that
|
|
550
|
+
* rules it out, not this.
|
|
551
|
+
*/
|
|
552
|
+
const wrapsOwnLength = (key, receiver, context) => {
|
|
553
|
+
const compute = context.operationOf.get(key.value);
|
|
554
|
+
if (compute?.kind !== 'compute' || compute.form !== 'binary' || compute.operator !== '%')
|
|
555
|
+
return false;
|
|
556
|
+
const divisor = compute.operands[1];
|
|
557
|
+
if (!divisor)
|
|
558
|
+
return false;
|
|
559
|
+
const read = context.operationOf.get(divisor.value);
|
|
560
|
+
if (read?.kind !== 'get' || context.constantTexts.get(read.key.value) !== 'length')
|
|
561
|
+
return false;
|
|
562
|
+
if (read.receiver.representation.kind !== 'array-object')
|
|
563
|
+
return false;
|
|
564
|
+
// The same ARRAY, which is not the same SSA value: every turn of the loop
|
|
565
|
+
// reads the cell again, so `ring.length` and `ring[...]` name two different
|
|
566
|
+
// values of one cell. Comparing the cell is what the window is grouped by
|
|
567
|
+
// anyway (`referenceKey`), and the window already requires that the loop
|
|
568
|
+
// never writes it.
|
|
569
|
+
const own = context.readsCell.get(receiver.value);
|
|
570
|
+
const divisorCell = context.readsCell.get(read.receiver.value);
|
|
571
|
+
return read.receiver.value === receiver.value || (own !== undefined && own === divisorCell);
|
|
572
|
+
};
|
|
573
|
+
/**
|
|
574
|
+
* The positive integer an index is taken modulo, when the divisor is a
|
|
575
|
+
* CONSTANT -- `table[i % 16]`.
|
|
576
|
+
*
|
|
577
|
+
* The same arithmetic `wrapsOwnLength` relies on: `x % n` lies in `[0, n)` for
|
|
578
|
+
* every dividend whenever `n > 0`. What this does NOT prove is that `n` is
|
|
579
|
+
* inside the array, because a constant says nothing about a length; the
|
|
580
|
+
* preheader's `size() >= n` is what closes that, and `DenseArray.modulus`
|
|
581
|
+
* carries the number there.
|
|
582
|
+
*
|
|
583
|
+
* Rejects anything that is not a plain positive integer literal. A fractional
|
|
584
|
+
* or negative divisor is not a modulus a window can be proved from, and a text
|
|
585
|
+
* this cannot read is simply not one of these.
|
|
586
|
+
*/
|
|
587
|
+
const constantModulusOf = (key, context, operations, at) => {
|
|
588
|
+
const compute = remainderBehind(key, context, operations, at);
|
|
589
|
+
if (compute?.kind !== 'compute' || compute.form !== 'binary' || compute.operator !== '%')
|
|
590
|
+
return null;
|
|
591
|
+
const divisor = compute.operands[1];
|
|
592
|
+
if (!divisor)
|
|
593
|
+
return null;
|
|
594
|
+
const text = context.constantTexts.get(divisor.value);
|
|
595
|
+
if (text === undefined)
|
|
596
|
+
return null;
|
|
597
|
+
const value = Number(text);
|
|
598
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
599
|
+
return null;
|
|
600
|
+
return value;
|
|
601
|
+
};
|
|
602
|
+
/**
|
|
603
|
+
* Where an index's value was computed, seeing through a binding.
|
|
604
|
+
*
|
|
605
|
+
* `const slot = i % 16; table[slot] = v; return table[(slot + 1) % 16]` writes
|
|
606
|
+
* the remainder into a cell and indexes with a READ of it, so the store's key
|
|
607
|
+
* is a `binding-read` and the load's key is the `%` itself. Asking only the
|
|
608
|
+
* operation the key names would make those two accesses disagree about the
|
|
609
|
+
* window's shape, and a window whose accesses disagree is no window -- which is
|
|
610
|
+
* how the two halves of an ordinary table update came to prove nothing.
|
|
611
|
+
*
|
|
612
|
+
* The write it resolves to is the LAST one this block made before the access,
|
|
613
|
+
* which is the definition the read observes: within a block, operations run in
|
|
614
|
+
* order and a binding is the only thing that writes a binding. It deliberately
|
|
615
|
+
* looks no further -- a write in another block would need dominance, and the
|
|
616
|
+
* shape this exists for puts both in the body it indexes from.
|
|
617
|
+
*/
|
|
618
|
+
const remainderBehind = (key, context, operations, at) => {
|
|
619
|
+
const direct = context.operationOf.get(key.value);
|
|
620
|
+
if (direct?.kind === 'compute')
|
|
621
|
+
return direct;
|
|
622
|
+
const cell = context.readsCell.get(key.value);
|
|
623
|
+
if (cell === undefined)
|
|
624
|
+
return undefined;
|
|
625
|
+
let seen;
|
|
626
|
+
for (let index = 0; index < at; index += 1) {
|
|
627
|
+
const candidate = operations[index];
|
|
628
|
+
if (candidate?.kind === 'binding-write' && candidate.declaration === cell)
|
|
629
|
+
seen = context.operationOf.get(candidate.value.value);
|
|
630
|
+
}
|
|
631
|
+
return seen;
|
|
632
|
+
};
|
|
633
|
+
/**
|
|
634
|
+
* The loop-invariant addend an index carries, `null` for the bare counter, and
|
|
635
|
+
* `undefined` for an index this cannot bound.
|
|
636
|
+
*/
|
|
637
|
+
const indexBaseOf = (key, context, blocks) => {
|
|
638
|
+
if (context.readsCell.get(key.value) === context.counter)
|
|
639
|
+
return null;
|
|
640
|
+
const parallel = parallelCounterBaseOf(key, context, blocks);
|
|
641
|
+
if (parallel !== undefined)
|
|
642
|
+
return parallel;
|
|
643
|
+
const compute = context.operationOf.get(key.value);
|
|
644
|
+
if (compute?.kind !== 'compute' || compute.form !== 'binary' || compute.operator !== '+')
|
|
645
|
+
return undefined;
|
|
646
|
+
const [left, right] = compute.operands;
|
|
647
|
+
if (!left || !right)
|
|
648
|
+
return undefined;
|
|
649
|
+
if (context.readsCell.get(left.value) === context.counter && context.definedOutside(right.value, blocks))
|
|
650
|
+
return right;
|
|
651
|
+
if (context.readsCell.get(right.value) === context.counter && context.definedOutside(left.value, blocks))
|
|
652
|
+
return left;
|
|
653
|
+
return undefined;
|
|
654
|
+
};
|
|
655
|
+
/** Two counters advanced together by one differ by their initial offset.
|
|
656
|
+
* Requiring a zero primary seed and adjacent advances avoids synthesizing
|
|
657
|
+
* arithmetic or assuming that a conditional/inner-loop advance ran. */
|
|
658
|
+
const parallelCounterBaseOf = (key, context, blocks) => {
|
|
659
|
+
const secondary = context.readsCell.get(key.value);
|
|
660
|
+
if (secondary === undefined || secondary === context.counter)
|
|
661
|
+
return undefined;
|
|
662
|
+
const primaryWrites = context.cellWrites.get(context.counter) ?? [];
|
|
663
|
+
const secondaryWrites = context.cellWrites.get(secondary) ?? [];
|
|
664
|
+
const primarySeeds = primaryWrites.filter((write) => !blocks.has(write.block));
|
|
665
|
+
const secondarySeeds = secondaryWrites.filter((write) => !blocks.has(write.block));
|
|
666
|
+
const primarySteps = primaryWrites.filter((write) => blocks.has(write.block));
|
|
667
|
+
const secondarySteps = secondaryWrites.filter((write) => blocks.has(write.block));
|
|
668
|
+
const isLiteral = (value, text) => {
|
|
669
|
+
const operation = context.operationOf.get(value.value);
|
|
670
|
+
return operation?.kind === 'constant' && operation.literal === 'number' && operation.text === text;
|
|
671
|
+
};
|
|
672
|
+
if (primarySeeds.length === 0 || !primarySeeds.every((seed) => isLiteral(seed.value, '0')))
|
|
673
|
+
return undefined;
|
|
674
|
+
if (secondarySeeds.length !== 1 || primarySteps.length !== 1 || secondarySteps.length !== 1)
|
|
675
|
+
return undefined;
|
|
676
|
+
const seed = secondarySeeds[0];
|
|
677
|
+
const primary = primarySteps[0];
|
|
678
|
+
const other = secondarySteps[0];
|
|
679
|
+
if (primary.block !== other.block || !context.definedOutside(seed.value.value, blocks))
|
|
680
|
+
return undefined;
|
|
681
|
+
const unitStep = (value, cell) => {
|
|
682
|
+
const step = stepOf(value, cell, context.operationOf, context.readsCell);
|
|
683
|
+
return step === null || (step !== undefined && isLiteral(step, '1'));
|
|
684
|
+
};
|
|
685
|
+
if (!unitStep(primary.value, context.counter) || !unitStep(other.value, secondary))
|
|
686
|
+
return undefined;
|
|
687
|
+
const operations = context.body.blocks.get(primary.block)?.operations ?? [];
|
|
688
|
+
const first = operations.findIndex((operation) => operation.kind === 'binding-write' && operation.declaration === context.counter);
|
|
689
|
+
const second = operations.findIndex((operation) => operation.kind === 'binding-write' && operation.declaration === secondary);
|
|
690
|
+
if (first < 0 || second < 0)
|
|
691
|
+
return undefined;
|
|
692
|
+
if (operations
|
|
693
|
+
.slice(Math.min(first, second) + 1, Math.max(first, second))
|
|
694
|
+
.some((operation) => operation.kind === 'get' || operation.kind === 'set'))
|
|
695
|
+
return undefined;
|
|
696
|
+
return seed.value;
|
|
697
|
+
};
|